blob: c64d161571de29a4e865f14cb4ae963ec59d4a36 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2004, 2008 Tasktop Technologies and others.
* 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
*
* Contributors:
* Tasktop Technologies - initial API and implementation
*******************************************************************************/
package org.eclipse.mylyn.internal.examples.xml.core;
import java.io.File;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
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.internal.examples.xml.core.util.XmlQueryFilter;
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.TaskAttribute;
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 org.eclipse.osgi.util.NLS;
/**
* @author Steffen Pingel
*/
public class XmlConnector extends AbstractRepositoryConnector {
private static final String DATE_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSSZ";
private static Map<TaskRepository, XmlClient> clientByRepository = new HashMap<TaskRepository, XmlClient>();
private final XmlTaskDataHandler taskDataHandler;
public synchronized XmlClient getClient(TaskRepository repository) {
File location = new File(repository.getProperty(XmlCorePlugin.REPOSITORY_KEY_PATH));
XmlClient client = clientByRepository.get(repository);
if (client == null || !client.getLocation().equals(location)) {
client = new XmlClient(location);
clientByRepository.put(repository, client);
}
return client;
}
public XmlConnector() {
taskDataHandler = new XmlTaskDataHandler(this);
}
@Override
public boolean canCreateNewTask(TaskRepository repository) {
return true;
}
@Override
public boolean canCreateTaskFromKey(TaskRepository repository) {
return true;
}
@Override
public String getConnectorKind() {
return XmlCorePlugin.CONNECTOR_KIND;
}
@Override
public String getLabel() {
return "File-Based XML Tasks (example)";
}
@Override
public String getRepositoryUrlFromTaskUrl(String taskFullUrl) {
// ignore
return null;
}
@Override
public TaskData getTaskData(TaskRepository repository, String taskId, IProgressMonitor monitor)
throws CoreException {
File file = getClient(repository).getTask(taskId, monitor);
// stall a while to allow the UI to update
try {
Thread.sleep(500);
} catch (InterruptedException e) {
}
return taskDataHandler.readTaskData(repository, file, monitor);
}
@Override
public String getTaskIdFromTaskUrl(String taskFullUrl) {
// ignore
return null;
}
@Override
public String getTaskUrl(String repositoryUrl, String taskId) {
// ignore
return null;
}
@Override
public boolean hasTaskChanged(TaskRepository taskRepository, ITask task, TaskData taskData) {
// compares values
//return getTaskMapping(taskData).hasChanges(task);
// compare date on task (local state) and taskData (repository state)
TaskAttribute attribute = taskData.getRoot().getAttribute(TaskAttribute.DATE_MODIFICATION);
if (attribute != null) {
Date dataModificationDate = taskData.getAttributeMapper().getDateValue(attribute);
if (dataModificationDate != null) {
Date taskModificationDate = task.getModificationDate();
if (taskModificationDate != null) {
return !taskModificationDate.equals(dataModificationDate);
}
}
}
return true;
}
@Override
public IStatus performQuery(TaskRepository repository, IRepositoryQuery query, TaskDataCollector collector,
ISynchronizationSession session, IProgressMonitor monitor) {
XmlQueryFilter filter = new XmlQueryFilter(query);
File[] files = getClient(repository).listTasks(monitor);
for (File file : files) {
try {
TaskData taskData = taskDataHandler.readTaskData(repository, file, monitor);
// set to true if repository does not return full task details
//taskData.setPartial(true);
if (filter.accepts(taskData)) {
collector.accept(taskData);
}
} catch (CoreException e) {
return new Status(IStatus.ERROR, XmlCorePlugin.ID_PLUGIN, NLS.bind("Query failed: ''{0}''",
e.getMessage()), e);
}
}
return Status.OK_STATUS;
}
@Override
public void updateRepositoryConfiguration(TaskRepository repository, IProgressMonitor monitor) throws CoreException {
getClient(repository).updateConfiguration(monitor);
}
@Override
public void updateTaskFromTaskData(TaskRepository repository, ITask task, TaskData taskData) {
getTaskMapping(taskData).applyTo(task);
}
@Override
public TaskMapper getTaskMapping(TaskData taskData) {
return new TaskMapper(taskData);
}
@Override
public void preSynchronization(ISynchronizationSession session, IProgressMonitor monitor) throws CoreException {
TaskRepository repository = session.getTaskRepository();
File location = getClient(repository).getLocation();
long lastModified = location.lastModified();
// store time stamp for postSynchronization()
session.setData(lastModified);
String lastSynStampString = repository.getSynchronizationTimeStamp();
if (lastSynStampString != null) {
try {
Date lastSynced = new SimpleDateFormat(DATE_PATTERN).parse(lastSynStampString);
if (lastModified <= lastSynced.getTime()) {
// nothing has changed
//session.setNeedsPerformQueries(false);
}
} catch (ParseException e) {
}
}
// trigger full refresh of tasks if required
// for (ITask task : session.getTasks()) {
// session.markStale(task);
// }
}
@Override
public void postSynchronization(ISynchronizationSession event, IProgressMonitor monitor) throws CoreException {
if (event.getStatus() == null && event.getData() instanceof Long) {
Date date = new Date((Long) event.getData());
String dateString = new SimpleDateFormat(DATE_PATTERN).format(date);
event.getTaskRepository().setSynchronizationTimeStamp(dateString);
}
}
@Override
public AbstractTaskDataHandler getTaskDataHandler() {
return taskDataHandler;
}
}