Subversion Repositories XServices

Compare Revisions

Ignore whitespace Rev 39 → Rev 38

/sbm4mylyn/trunk/src/net/brutex/mylyn/sbmconnector/core/SBMClient.java
24,10 → 24,8
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.StringTokenizer;
 
import javax.xml.namespace.QName;
65,7 → 63,6
private TaskRepository repository;
private ObjectFactory of;
private List<TableData> tables = new ArrayList<TableData>();
private Map<String, List<SBMFieldValue>> validsets = new HashMap<String, List<SBMFieldValue>>();
/**
* Instantiates a new SBM client.
105,13 → 102,9
return true;
}
public List<TTItem> getTTItemsByTable(String tablename, String sql_where) throws CoreException {
return getTTItemsByTable(tablename, sql_where, false);
}
/**
* Gets the SBM items from a table. The result size is limited to 500 and the sorting is done
* by TS_ID descending.
* by submit date descending.
*
* @param tablename the tablename
* @param sql_where the sql_where
118,10 → 111,8
* @return the tT items by table
* @throws CoreException the core exception
*/
public List<TTItem> getTTItemsByTable(String tablename, String sql_where, boolean getFullData) throws CoreException {
public List<TTItem> getTTItemsByTable(String tablename, String sql_where) throws CoreException {
List<TTItem> list = new ArrayList<TTItem>();
String sections = "SECTION:FIXED";
if(getFullData) sections = "SECTION:ALL";
if(sql_where==null || sql_where.isEmpty()) sql_where = "TS_ID>0";
try {
list = port.getItemsByQueryWithName(
128,35 → 119,16
getAuth(),
tablename,
"("+sql_where+")",
"TS_ID desc",
null,
sections);
"TS_SUBMITDATE desc",
BigInteger.valueOf(500l), null);
} catch (AEWebservicesFaultFault e) {
throw new CoreException(
new CoreException(
RepositoryStatus.createInternalError(
SBMConnectorPlugin.PLUGIN_ID, e.getMessage(), e));
}
SBMConnectorPlugin.PLUGIN_ID, e.getFaultInfo(), e));
}
return list;
}
public int getResultCount(String tablename, String sql) throws CoreException {
List<TTItem> list = new ArrayList<TTItem>();
try {
list = port.getItemsByQueryWithName(
getAuth(),
tablename,
"("+sql+")",
"TS_ID desc",
null,
"SECTION:NONE");
} catch (AEWebservicesFaultFault e) {
throw new CoreException(
RepositoryStatus.createInternalError(
SBMConnectorPlugin.PLUGIN_ID, e.getMessage(), e));
}
return list.size();
}
/**
* Gets a SBM item specified by its internal identifier ([tableid:recordid])
*
164,11 → 136,6
* @return the tT item
*/
public TTItem getTTItem(String itemid) {
int pos1;
int pos2;
pos1 = itemid.lastIndexOf("[")+1;
pos2 = itemid.lastIndexOf("]");
itemid = itemid.substring(pos1, pos2);
TTItem item = of.createTTItem();
try {
item = port.getItem(getAuth(), itemid, null);
329,7 → 296,7
break;
}
}
return fieldname; //field has not been found
return "label_UNKNOWN";
}
/**
487,7 → 454,6
}
 
public List<SBMFieldValue> getValidSet(String tablename, String fieldname) {
if(validsets.containsKey(tablename+":"+fieldname)) return validsets.get(tablename+":"+fieldname);
List<SBMFieldValue> list = new ArrayList<SBMFieldValue>();
List<TTItem> ttlist = new ArrayList<TTItem>();
String sql = "TS_ID in (select max(TS_ID) from "+tablename+" group by ts_"+fieldname+")";
501,7 → 467,7
for(TTItem ttitem : ttlist) {
list.add(getFieldValue(ttitem, fieldname));
}
validsets.put(tablename+":"+fieldname, list);
return list;
}
}
/sbm4mylyn/trunk/src/net/brutex/mylyn/sbmconnector/core/model/SBMSystemFields.java
File deleted
Property changes:
Deleted: svn:mime-type
-text/plain
\ No newline at end of property
/sbm4mylyn/trunk/src/net/brutex/mylyn/sbmconnector/core/SBMTicketDataHandler.java
19,15 → 19,9
*/
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;
35,13 → 29,10
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;
58,23 → 49,18
 
/** The connector. */
private final SBMRepositoryConnector connector;
 
/**
* Instantiates a new SBM ticket data handler.
*
* @param connector
* the connector
*
* @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)
/* (non-Javadoc)
* @see org.eclipse.mylyn.tasks.core.data.AbstractTaskDataHandler#getAttributeMapper(org.eclipse.mylyn.tasks.core.TaskRepository)
*/
@Override
public TaskAttributeMapper getAttributeMapper(TaskRepository taskRepository) {
81,33 → 67,45
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)
/* (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 ...");
public boolean initializeTaskData(TaskRepository repository, TaskData taskData,
ITaskMapping initializationData, IProgressMonitor monitor)
throws CoreException {
/*TaskAttribute attribute = taskData.getRoot().createAttribute(SBMStaticFields.TITLE);
attribute.getMetaData().setReadOnly(false).setType(TaskAttribute.TYPE_SHORT_TEXT).setLabel("Summary:");
 
/*attribute = taskData.getRoot().createAttribute(SBMStaticFields.DESCRIPTION);
attribute.getMetaData().setReadOnly(false).setType(TaskAttribute.TYPE_LONG_TEXT).setLabel("Description:");
 
attribute = taskData.getRoot().createAttribute(SBMStaticFields.SUBMITDATE);
attribute.getMetaData().setReadOnly(false).setType(TaskAttribute.TYPE_DATETIME).setLabel("Create Date:");
 
 
if (!taskData.isNew()) {
attribute = taskData.getRoot().createAttribute(TaskAttribute.TASK_URL);
attribute.getMetaData().setReadOnly(true).setKind(TaskAttribute.KIND_DEFAULT).setType(
TaskAttribute.TYPE_URL).setLabel("Location:");
File file = client.getTask(taskData.getTaskId(), monitor);
try {
attribute.setValue(file.toURI().toURL().toString());
} catch (MalformedURLException e) {
}
}
 
attribute = taskData.getRoot().createAttribute(TaskAttribute.PRODUCT);
attribute.getMetaData().setReadOnly(false).setKind(TaskAttribute.KIND_DEFAULT).setType(
TaskAttribute.TYPE_SINGLE_SELECT).setLabel("Project");
*/
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)
/* (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,
116,182 → 114,106
// TODO Auto-generated method stub
return null;
}
 
/**
* Convert.
*
* @param repository
* the repository
* @param ttitem
* the ttitem
* @param monitor
* the monitor
*
* @param repository the repository
* @param ttitem the ttitem
* @param monitor the monitor
* @return the task data
* @throws CoreException
* the core exception
* @throws CoreException the core exception
*/
public TaskData convert(TaskRepository repository, TTItem ttitem,
IProgressMonitor monitor, IRepositoryQuery query)
throws CoreException {
public TaskData convert(TaskRepository repository, TTItem ttitem, IProgressMonitor monitor)
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() + "]");
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;
for (SBMTicketAttribute f : SBMTicketAttribute.values()) {
TaskAttribute attr;
if(f.getTaskName()!=null) {
attr = data.getRoot().createMappedAttribute(f.getTaskName());
} else {
attr = data.getRoot().createAttribute(f.getSBMName());
}
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());
SBMStaticFields.valueOf(f.getSBMName()); //check if in static field list
attr.getMetaData().setReadOnly(true);
} 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().setReadOnly(false);
}
attr.getMetaData().setType(f.getTaskType());
attr.getMetaData().setLabel(client.getFieldLabel(ttitem, f.getSBMName()));
if(f.isVisible()) {
attr.getMetaData().setKind(TaskAttribute.KIND_DEFAULT);
} else {
// field is hidden
attr.getMetaData().setKind(null);
}
/*
if(f.getTaskType()==TaskAttribute.TYPE_SINGLE_SELECT) {
List<SBMFieldValue> options =
client.getValidSet(client.getTableName(ttitem), f.getSBMName());
for( SBMFieldValue optionvalue: options) {
attr.putOption(optionvalue.getValue(), optionvalue.getValue());
}
}
*/
attr.setValue(client.getStaticFieldValue(ttitem, f.getSBMName()));
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
//Custom fields
List<SBMField> customfields = client.getFields(client.getTableName(ttitem));
for(SBMField f : customfields) {
if(SBMTicketAttribute.getSBMAttributeBySBMName(f.getName())!=null) {
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()));
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());
custom.getMetaData().setReadOnly(false);
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();
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) {
} 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());
}
} 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)) {
//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());
TaskAttribute a = data.getRoot().createAttribute("NOTE"+n.getId());
mapper.applyTo(a);
}
monitor.worked(1);
 
data.setPartial(false);
return data;
}
/sbm4mylyn/trunk/src/net/brutex/mylyn/sbmconnector/core/SBMTicketAttribute.java
70,8 → 70,7
"label_submitter",
SBMFieldTypes.USER,
TaskAttribute.USER_REPORTER,
TaskAttribute.TYPE_PERSON,
SBMTicketAttribute.HIDDEN), //hidden because has extra part
TaskAttribute.TYPE_PERSON),
SUBMITDATE(
SBMStaticFields.SUBMITDATE.getValue(),
"label_submitdate",
89,8 → 88,7
"label_modifieddate",
SBMFieldTypes.DATETIME,
TaskAttribute.DATE_MODIFICATION,
TaskAttribute.TYPE_DATETIME,
SBMTicketAttribute.HIDDEN), //hidden because has extra part
TaskAttribute.TYPE_DATETIME),
CLOSEDATE(
SBMStaticFields.CLOSEDATE.getValue(),
"label_closedate",
185,13 → 183,4
}
return null;
}
public static boolean hasSBMField(String fieldname) {
for (SBMTicketAttribute attribute : values()) {
if (attribute.getSBMName().equals(fieldname)) {
return true;
}
}
return false;
}
}
/sbm4mylyn/trunk/src/net/brutex/mylyn/sbmconnector/core/SBMRepositoryConnector.java
26,8 → 26,6
 
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;
34,7 → 32,6
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;
45,7 → 42,6
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 {
 
79,7 → 75,7
public boolean canSynchronizeTask(TaskRepository taskRepository, ITask task) {
return true;
}
 
@Override
public String getConnectorKind() {
return SBMConnectorPlugin.CONNECTOR_KIND;
104,7 → 100,7
try {
SBMClient client = getClient(taskRepository);
TTItem item = client.getTTItem(taskId);
data = datahandler.convert(taskRepository, item, monitor, null);
data = datahandler.convert(taskRepository, item, monitor);
 
} finally {
monitor.done();
146,29 → 142,20
public IStatus performQuery(TaskRepository repository,
IRepositoryQuery query, TaskDataCollector collector,
ISynchronizationSession session, IProgressMonitor monitor) {
monitor.subTask("Calculating query result size ...");
try {
monitor.beginTask("Lade Daten", IProgressMonitor.UNKNOWN);
 
SBMClient client = new SBMClient(repository);
int countItem = client.getResultCount(getQueryTable(repository),
query.getAttribute("sql_where"));
monitor.beginTask("", countItem);
monitor.subTask("Loading "+countItem+" items ...");
List<TTItem> list = client.getTTItemsByTable(
getQueryTable(repository), query.getAttribute("sql_where"),
true);
monitor.worked(1);
List<TTItem> list = client.getTTItemsByTable(query
.getAttribute("table"), query.getAttribute("sql_where"));
for (TTItem ttitem : list) {
TaskData data = datahandler.convert(repository, ttitem,
monitor, query);
TaskData data = datahandler
.convert(repository, ttitem, monitor);
collector.accept(data);
monitor.worked(1);
if(monitor.isCanceled()) return Status.CANCEL_STATUS;
}
} catch (CoreException e) {
IStatus status = new Status(IStatus.ERROR, SBMConnectorPlugin.PLUGIN_ID,
e.getMessage(), e);
//StatusManager.getManager().handle(status, StatusManager.BLOCK);
return status;
return new Status(IStatus.ERROR, SBMConnectorPlugin.PLUGIN_ID,
"Query fehlgeschlagen.", e);
} finally {
monitor.done();
}
192,7 → 179,7
public TaskMapper getTaskMapping(TaskData taskData) {
return new TaskMapper(taskData);
}
 
@Override
public AbstractTaskDataHandler getTaskDataHandler() {
return datahandler;
202,17 → 189,12
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;
return false;
}
 
private String getQueryTable(TaskRepository repository) {
return repository
.getProperty(SBMRepositorySettingsPage.STRING_SOLUTIONTABLE);
}
 
}