Subversion Repositories XServices

Rev

Rev 39 | Rev 52 | Go to most recent revision | View as "text/plain" | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

/*
 *   Mylyn Connector for Serena Business Mashups
 *       Copyright 2010 Brian Rosenberger (Brutex Network)
 *
 *   Licensed under the Apache License, Version 2.0 (the "License");
 *   you may not use this file except in compliance with the License.
 *   You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *   Unless required by applicable law or agreed to in writing, software
 *   distributed under the License is distributed on an "AS IS" BASIS,
 *   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *   See the License for the specific language governing permissions and
 *   limitations under the License.
 * 
 *   Serena, TeamTrack and Serena Business Mashup are 
 *       registered trademarks of SERENA Software Inc.
 */
package net.brutex.mylyn.sbmconnector.core;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.brutex.mylyn.sbmconnector.SBMConnectorPlugin;
import net.brutex.mylyn.sbmconnector.core.model.SBMStaticFields;
import net.brutex.mylyn.sbmconnector.ui.SBMRepositoryQueryPage;
import net.brutex.mylyn.sbmconnector.ui.SBMRepositorySettingsPage;
import net.brutex.sbm.wsclient.TTItem;

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.core.runtime.jobs.Job;
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.ui.statushandlers.StatusManager;

public class SBMRepositoryConnector extends AbstractRepositoryConnector {

        private SBMTicketDataHandler datahandler;
        private static Map<TaskRepository, SBMClient> clients = new HashMap<TaskRepository, SBMClient>();

        public SBMRepositoryConnector() {
                this.datahandler = new SBMTicketDataHandler(this);
        }

        public static synchronized SBMClient getClient(TaskRepository repository) {
                SBMClient client = clients.get(repository);
                if (client == null) {
                        client = new SBMClient(repository);
                        clients.put(repository, client);
                }
                return client;
        }

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

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

        @Override
        public boolean canSynchronizeTask(TaskRepository taskRepository, ITask task) {
                return true;
        }

        @Override
        public String getConnectorKind() {
                return SBMConnectorPlugin.CONNECTOR_KIND;
        }

        @Override
        public String getLabel() {
                return SBMConnectorPlugin.LABEL;
        }

        @Override
        public String getRepositoryUrlFromTaskUrl(String taskFullUrl) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public TaskData getTaskData(TaskRepository taskRepository, String taskId,
                        IProgressMonitor monitor) throws CoreException {
                monitor.beginTask("Loading SBM Ticket", IProgressMonitor.UNKNOWN);
                TaskData data = null;
                try {
                        SBMClient client = getClient(taskRepository);
                        TTItem item = client.getTTItem(taskId);
                        data = datahandler.convert(taskRepository, item, monitor, null);

                } finally {
                        monitor.done();
                }
                return data;
        }

        @Override
        public String getTaskIdFromTaskUrl(String taskFullUrl) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public String getTaskUrl(String repositoryUrl, String taskId) {
                // TODO Auto-generated method stub
                return null;
        }

        @Override
        public boolean hasTaskChanged(TaskRepository taskRepository, ITask task,
                        TaskData taskData) {
                TaskAttribute attribute = taskData.getRoot().getAttribute(
                                SBMStaticFields.LASTMODIFIEDDATE.getValue());
                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) {
                        monitor.subTask("Calculating query result size ...");
                try {
                        SBMClient client = new SBMClient(repository);
                        List<String> idlist = client.getResultCount(getQueryTable(repository), 
                                        query.getAttribute("sql_where"));
                        int countItem = idlist.size();
                        monitor.beginTask("", countItem);
                        monitor.subTask("Loading "+countItem+" items ...");
                        
                        //List<TTItem> list = client.getTTItemsByTable(
                        //              getQueryTable(repository), query.getAttribute("sql_where"),
                        //              true);
                        monitor.worked(1);
                        int i = 1;
                        for (String id : idlist) {
                                if(id!=null) {
                                monitor.subTask("Loading item "+i+"/"+countItem+" ...");
                                TTItem ttitem = client.getTTItem("["+id+"]");
                                TaskData data = datahandler.convert(repository, ttitem,
                                                monitor, query);
                                collector.accept(data);
                                }
                                monitor.worked(1);
                                if(monitor.isCanceled()) return Status.CANCEL_STATUS;
                                i++;
                        }
                } catch (CoreException e) {
                        IStatus status =  new Status(IStatus.ERROR, SBMConnectorPlugin.PLUGIN_ID,
                                        e.getMessage(), e);
                        //StatusManager.getManager().handle(status, StatusManager.BLOCK);
                        return status;
                } finally {
                        monitor.done();
                }
                return Status.OK_STATUS;
        }

        @Override
        public void updateRepositoryConfiguration(TaskRepository taskRepository,
                        IProgressMonitor monitor) throws CoreException {
                // TODO Auto-generated method stub

        }

        @Override
        public void updateTaskFromTaskData(TaskRepository taskRepository,
                        ITask task, TaskData taskData) {
                getTaskMapping(taskData).applyTo(task);
        }

        @Override
        public TaskMapper getTaskMapping(TaskData taskData) {
                return new TaskMapper(taskData);
        }

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

        @Override
        public boolean canDeleteTask(TaskRepository repository, ITask task) {
                return false;
        }

        @Override
        public boolean hasRepositoryDueDate(TaskRepository taskRepository,
                        ITask task, TaskData taskData) {
                // TODO Auto-generated method stub
                return false;
        }

        private String getQueryTable(TaskRepository repository) {
                return repository
                                .getProperty(SBMRepositorySettingsPage.STRING_SOLUTIONTABLE);
        }

}