de.belaso.mongolyn.ui.RepositoryConnector.java Source code

Java tutorial

Introduction

Here is the source code for de.belaso.mongolyn.ui.RepositoryConnector.java

Source

/* 
   Copyright (C) 2011, Christian Trutz <christian.trutz@belaso.de>
    
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Public License v1.0
   which accompanies this distribution, and is available at
   http://www.eclipse.org/legal/epl-v10.html
 */
package de.belaso.mongolyn.ui;

import org.bson.types.ObjectId;
import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.mylyn.tasks.core.AbstractRepositoryConnector;
import org.eclipse.mylyn.tasks.core.IRepositoryQuery;
import org.eclipse.mylyn.tasks.core.ITask;
import org.eclipse.mylyn.tasks.core.TaskRepository;
import org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler;
import org.eclipse.mylyn.tasks.core.data.TaskData;
import org.eclipse.mylyn.tasks.core.data.TaskDataCollector;
import org.eclipse.mylyn.tasks.core.data.TaskMapper;
import org.eclipse.mylyn.tasks.core.sync.ISynchronizationSession;

import com.mongodb.DBCollection;
import com.mongodb.DBCursor;
import com.mongodb.DBObject;

/**
 * 
 * @author Christian Trutz
 * 
 */
public class RepositoryConnector extends AbstractRepositoryConnector {

    //
    public static final String KIND = "mongolyn"; //$NON-NLS-1$

    //
    private final TaskDataHandler taskDataHandler;

    public RepositoryConnector() {
        taskDataHandler = new TaskDataHandler();
    }

    @Override
    public String getConnectorKind() {
        return KIND;
    }

    @Override
    public String getLabel() {
        return Messages.RepositoryConnector_Label;
    }

    @Override
    public AbstractTaskDataHandler getTaskDataHandler() {
        return taskDataHandler;
    }

    @Override
    public boolean canCreateNewTask(TaskRepository repository) {
        return true;
    }

    @Override
    public boolean canCreateTaskFromKey(TaskRepository repository) {
        return true;
    }

    @Override
    public String getRepositoryUrlFromTaskUrl(String taskFullUrl) {
        if (taskFullUrl == null || taskFullUrl.length() == 0)
            return null;
        int lastSlash = taskFullUrl.lastIndexOf('/');
        if (lastSlash != -1 && lastSlash + 1 < taskFullUrl.length())
            return taskFullUrl.substring(0, lastSlash);
        return null;
    }

    @Override
    public String getTaskIdFromTaskUrl(String taskFullUrl) {
        if (taskFullUrl == null || taskFullUrl.length() == 0)
            return null;
        int lastSlash = taskFullUrl.lastIndexOf('/');
        if (lastSlash != -1 && lastSlash + 1 < taskFullUrl.length())
            return taskFullUrl.substring(lastSlash + 1);
        return null;
    }

    @Override
    public String getTaskUrl(String repositoryUrl, String taskId) {
        return repositoryUrl + "/" + taskId;
    }

    @Override
    public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
        // TODO introduce modify date?
        return false;
    }

    @Override
    public TaskData getTaskData(TaskRepository taskRepository, String taskId, IProgressMonitor monitor)
            throws CoreException {
        DBCollection dbCollection = MongolynUtils.getDBCollection(taskRepository);
        DBObject dbObject = dbCollection.findOne(new ObjectId(taskId));
        if (dbObject != null) {
            TaskData taskData = new TaskData(getTaskDataHandler().getAttributeMapper(taskRepository), KIND,
                    taskRepository.getRepositoryUrl(), taskId);
            taskData.setPartial(false);
            taskData.setVersion("1");
            getTaskDataHandler().initializeTaskData(taskRepository, taskData, null, monitor);
            for (String key : dbObject.keySet()) {
                if (!"_id".equals(key))
                    taskData.getRoot().getAttribute(key.replace('_', '.')).setValue(dbObject.get(key).toString());
            }
            return taskData;
        } else {
            throw new CoreException(
                    Activator.INSTANCE.getErrorStatus("MongoDB document " + taskId + " not found."));
        }
    }

    @Override
    public void updateTaskFromTaskData(TaskRepository taskRepository, ITask task, TaskData taskData) {
        if (!taskData.isNew())
            task.setUrl(getTaskUrl(taskRepository.getUrl(), taskData.getTaskId()));
        new TaskMapper(taskData).applyTo(task);
    }

    @Override
    public IStatus performQuery(TaskRepository taskRepository, IRepositoryQuery query, TaskDataCollector collector,
            ISynchronizationSession session, IProgressMonitor monitor) {
        try {
            DBCollection dbCollection = MongolynUtils.getDBCollection(taskRepository);
            DBCursor dbCursor = dbCollection.find();
            while (dbCursor.hasNext()) {
                DBObject dbObject = dbCursor.next();
                TaskData taskData = new TaskData(getTaskDataHandler().getAttributeMapper(taskRepository), KIND,
                        taskRepository.getRepositoryUrl(), dbObject.get("_id").toString());
                taskData.setPartial(false);
                taskData.setVersion("1");
                getTaskDataHandler().initializeTaskData(taskRepository, taskData, null, monitor);
                for (String key : dbObject.keySet()) {
                    if (!"_id".equals(key))
                        taskData.getRoot().getAttribute(key.replace('_', '.'))
                                .setValue(dbObject.get(key).toString());
                }
                collector.accept(taskData);
            }
        } catch (CoreException coreException) {
            // nothing to do
        }
        return Status.OK_STATUS;
    }

    @Override
    public void updateRepositoryConfiguration(TaskRepository taskRepository, IProgressMonitor monitor)
            throws CoreException {
    }

}