/* * 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.GregorianCalendar; import java.util.List; import java.util.Set; import javax.xml.datatype.DatatypeConfigurationException; import javax.xml.datatype.DatatypeFactory; import javax.xml.datatype.XMLGregorianCalendar; import net.brutex.mylyn.sbmconnector.SBMConnectorPlugin; import net.brutex.mylyn.sbmconnector.core.model.SBMField; import net.brutex.mylyn.sbmconnector.core.model.SBMFieldAttributes; import net.brutex.mylyn.sbmconnector.core.model.SBMFieldTypes; import net.brutex.mylyn.sbmconnector.core.model.SBMFieldValue; import net.brutex.mylyn.sbmconnector.core.model.SBMNote; import net.brutex.mylyn.sbmconnector.core.model.SBMStaticFields; import net.brutex.mylyn.sbmconnector.core.model.SBMSystemFields; 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.mylyn.tasks.core.IRepositoryQuery; import org.eclipse.mylyn.tasks.core.ITaskMapping; import org.eclipse.mylyn.tasks.core.RepositoryResponse; 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.TaskAttributeMapper; import org.eclipse.mylyn.tasks.core.data.TaskCommentMapper; import org.eclipse.mylyn.tasks.core.data.TaskData; /** * The Class SBMTicketDataHandler. */ public class SBMTicketDataHandler extends AbstractTaskDataHandler { /** The connector. */ private final SBMRepositoryConnector connector; /** * Instantiates a new SBM ticket data handler. * * @param connector * the connector */ public SBMTicketDataHandler(SBMRepositoryConnector connector) { this.connector = connector; } /* * (non-Javadoc) * * @see * org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler#getAttributeMapper * (org.eclipse.mylyn.tasks.core.TaskRepository) */ @Override public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) { return new SBMTicketAttributeMapper(taskRepository); } /* * (non-Javadoc) * * @see * org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler#initializeTaskData * (org.eclipse.mylyn.tasks.core.TaskRepository, * org.eclipse.mylyn.tasks.core.data.TaskData, * org.eclipse.mylyn.tasks.core.ITaskMapping, * org.eclipse.core.runtime.IProgressMonitor) */ @Override public boolean initializeTaskData(TaskRepository repository, TaskData taskData, ITaskMapping initializationData, IProgressMonitor monitor) throws CoreException { monitor.subTask("Initialising task ..."); taskData.setPartial(true); return true; } /* * (non-Javadoc) * * @see * org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler#postTaskData * (org.eclipse.mylyn.tasks.core.TaskRepository, * org.eclipse.mylyn.tasks.core.data.TaskData, java.util.Set, * org.eclipse.core.runtime.IProgressMonitor) */ @Override public RepositoryResponse postTaskData(TaskRepository repository, TaskData taskData, Set oldAttributes, IProgressMonitor monitor) throws CoreException { // TODO Auto-generated method stub return null; } /** * Convert. * * @param repository the repository * @param ttitem * the ttitem * @param monitor * the monitor * @return the task data * @throws CoreException * the core exception */ public TaskData convert(TaskRepository repository, TTItem ttitem, IProgressMonitor monitor, IRepositoryQuery query) throws CoreException { SBMClient client = SBMRepositoryConnector.getClient(repository); TaskData data = new TaskData(new SBMTicketAttributeMapper(repository), SBMConnectorPlugin.CONNECTOR_KIND, repository .getRepositoryUrl(), ttitem.getGenericItem().getValue() .getItemName().getValue() + " [" + ttitem.getGenericItem().getValue().getItemID() .getValue() + "]"); initializeTaskData(repository, data, null, monitor); String fieldlist = ""; if (repository .hasProperty(SBMRepositorySettingsPage.STRING_TABLEFIELDLIST)) { fieldlist = repository .getProperty(SBMRepositorySettingsPage.STRING_TABLEFIELDLIST); } // Create Fields for all the generic SBM (system) fields monitor.subTask("Creating generic SBM fields..."); for (SBMSystemFields sysfield : SBMSystemFields.values()) { if(!sysfield.hasTaskAttribute()) { // skip the field here, because we do not have a // matching task attribute to map. The field // will be processed in the custom field section continue; } if (!fieldlist.contains("," + sysfield.getValue() + ",")) { // do not process custom field when it has not // been selected by user in repository settings page continue; } // try to initialize the SBM attribute SBMTicketAttribute f = null; TaskAttribute attr = null; try { f = SBMTicketAttribute.valueOf(sysfield.getValue()); } catch (IllegalArgumentException e) { // the field is a valid sbm system field and is set up to // have an equivalent in the task attributes. It must have an // entry in the SBMTicketAttribute class ! continue; // we just skip the field } if (f.getTaskName() != null) { attr = data.getRoot().createMappedAttribute(f.getTaskName()); } else { // again the field is set up to have an task attribute // equivalent, but it is not set up in SBMAttributes correctly continue; } attr.getMetaData().setReadOnly(true); //we do not support writing yet attr.getMetaData().setType(f.getTaskType()); // set the mapped field type attr.getMetaData().setLabel(client.getFieldLabel(ttitem, f.getSBMName())); // get and set the field label if (f.isVisible()) { // field is not hidden, display it by setting KIND_DEFAULT attr.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); } else { // field is hidden attr.getMetaData().setKind(null); } attr.setValue(client.getStaticFieldValue(ttitem, f.getSBMName())); // get and set the field value } monitor.worked(1); //-------------- // Custom fields //-------------- List customfields = client.getFields(client .getTableName(ttitem)); for (SBMField f : customfields) { if (!fieldlist.contains("," + f.getName() + ",")) { // do not process custom field when it has not // been selected by user in repository settings page continue; } try { SBMSystemFields sysfield = SBMSystemFields.valueOf(f.getName()); if( sysfield.hasTaskAttribute()) { // the field has an equivalent in the task attribute // mappings and therefore it can be skipped in the custom // fields section continue; } } catch (IllegalArgumentException e) { //field is not a system field, do nothing } monitor.subTask("Read custom field [" + f.getName() + "]"); TaskAttribute custom = data.getRoot().createAttribute(f.getName()); custom.getMetaData().setType( new SBMTicketAttributeMapper(repository).mapToTaskKey(f .getType())); custom.getMetaData().setLabel(f.getLabel()); custom.getMetaData().setKind(TaskAttribute.KIND_DEFAULT); custom.getMetaData().setReadOnly(true); //set value/ values depending on field type // single selection if (f.getType() == SBMFieldTypes.SELECTION && client.getFieldValue(ttitem, f.getName()) != null) { //List options = client.getValidSet(client // .getTableName(ttitem), f.getName()); //for (SBMFieldValue optionvalue : options) { // custom.putOption(optionvalue.getInternalValue(), // optionvalue.getValue()); //} String val = client.getFieldValue(ttitem, f.getName()) .getValue(); custom.setValue(val); // Multi-Type fields } else if (f.getType() == SBMFieldTypes.MULTIPLE_SELECTION || f.getType() == SBMFieldTypes.MULTIPLE_RELATIONAL || f.getType() == SBMFieldTypes.MULTIPLE_GROUP || f.getType() == SBMFieldTypes.MULTIPLE_USERGROUP) { List values = client.getFieldValues(ttitem, f .getName()); for (SBMFieldValue val : values) { custom.putOption(val.getInternalValue(), val.getValue()); custom.addValue(val.getValue()); } //Date fields } else if (f.getType() == SBMFieldTypes.DATETIME) { String datestring = client.getFieldValue(ttitem, f.getName()).getValue(); long timestamp; try { timestamp = DatatypeFactory.newInstance().newXMLGregorianCalendar(datestring).toGregorianCalendar().getTimeInMillis(); custom.setValue(String.valueOf(timestamp)); } catch (DatatypeConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalArgumentException e) { //date field is probably empty custom.setValue(""); } // any other field type } else if (client.getFieldValue(ttitem, f.getName()) != null) { custom.setValue(client.getFieldValue(ttitem, f.getName()) .getValue()); } } monitor.worked(1); // ---------- // Notes // ---------- monitor.subTask("Read notes."); for (SBMNote n : client.getNotes(ttitem)) { TaskCommentMapper mapper = new TaskCommentMapper(); mapper.setCommentId(n.getId()); mapper.setNumber(Integer.valueOf(n.getId())); mapper.setText(n.getText()); mapper.setCreationDate(n.getCreation()); TaskAttribute a = data.getRoot() .createAttribute("NOTE" + n.getId()); mapper.applyTo(a); } monitor.worked(1); data.setPartial(false); return data; } }