Rev 34 | 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.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<TaskAttribute> 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<SBMField> 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<SBMFieldValue> 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<SBMFieldValue> 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;
}
}