/* 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 { } }