diff --git a/org.activiti.designer.gui/src/main/java/org/activiti/designer/property/extension/field/CustomPropertyComboboxChoiceField.java b/org.activiti.designer.gui/src/main/java/org/activiti/designer/property/extension/field/CustomPropertyComboboxChoiceField.java index da85a2a5..ec7c34f1 100644 --- a/org.activiti.designer.gui/src/main/java/org/activiti/designer/property/extension/field/CustomPropertyComboboxChoiceField.java +++ b/org.activiti.designer.gui/src/main/java/org/activiti/designer/property/extension/field/CustomPropertyComboboxChoiceField.java @@ -13,14 +13,23 @@ package org.activiti.designer.property.extension.field; +import java.io.BufferedReader; +import java.io.File; +import java.io.FileNotFoundException; +import java.io.FileReader; +import java.io.IOException; import java.lang.reflect.Field; +import java.util.ArrayList; +import java.util.Arrays; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; import org.activiti.bpmn.model.ServiceTask; import org.activiti.designer.integration.servicetask.PropertyType; import org.activiti.designer.integration.servicetask.annotation.PropertyItems; +import org.activiti.designer.integration.servicetask.annotation.PropertyItemsDataSource; import org.activiti.designer.integration.servicetask.validator.RequiredFieldValidator; import org.activiti.designer.property.PropertyCustomServiceTaskSection; import org.eclipse.swt.SWT; @@ -40,6 +49,7 @@ public class CustomPropertyComboboxChoiceField extends AbstractCustomPropertyFie private CCombo comboControl; private PropertyItems propertyItemsAnnotation; + private PropertyItemsDataSource propertyItemsDataSource; private Map values; @@ -102,6 +112,77 @@ public Composite render(final Composite parent, final TabbedPropertySheetWidgetF } } } + + /* + * Load values from the annotation data source and append them to the values and labels. + * + * If necessary, initialize both variables. + */ + if(propertyItemsDataSource == null) { + propertyItemsDataSource = getField().getAnnotation(PropertyItemsDataSource.class); + if(propertyItemsDataSource != null) { + + String filename = propertyItemsDataSource.filename(); + if(filename != null) { + + FileReader fr = null; + BufferedReader br = null; + try { + File file = new File(filename); + if(!file.isFile()) { + throw new IllegalArgumentException("Unable to find file: "+file.getAbsolutePath()); + } + fr = new FileReader(file); + br = new BufferedReader(fr); + + List valueList = new ArrayList(); + String line = null; + while((line=br.readLine()) != null) { + valueList.add(line); + } + + if(values == null) { + values = new HashMap(); + } + + List labelList = new ArrayList(); + + if(labels != null) { + labelList.addAll(Arrays.asList(labels)); + } + + for(int i = 0; i < valueList.size(); i+=2) { + values.put(valueList.get(i+1), valueList.get(i)); + labelList.add(valueList.get(i)); + } + + labels = labelList.toArray(new String[labelList.size()]); + } catch (FileNotFoundException e) { + e.printStackTrace(); + throw new IllegalArgumentException("Unable to find file "+filename); + } catch (IOException e) { + throw new IllegalArgumentException("Unable to read file "+filename); + } finally { + if(br != null) { + try { + br.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + if(fr != null) { + try { + fr.close(); + } catch (IOException e) { + e.printStackTrace(); + } + } + } + } else { + throw new IllegalArgumentException("The filename is mandatory"); + } + } + } comboControl = factory.createCCombo(result, SWT.DROP_DOWN); comboControl.setEnabled(true); diff --git a/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItems.java b/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItems.java index 1b776b3c..a4e9dde7 100644 --- a/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItems.java +++ b/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItems.java @@ -18,6 +18,8 @@ @Target(ElementType.FIELD) public @interface PropertyItems { + public static final String[] DEFAULT_VALUE = new String[] {}; + /** * The items. */ diff --git a/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItemsDataSource.java b/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItemsDataSource.java new file mode 100644 index 00000000..8c8f1867 --- /dev/null +++ b/org.activiti.designer.integration/src/main/java/org/activiti/designer/integration/servicetask/annotation/PropertyItemsDataSource.java @@ -0,0 +1,21 @@ +/** + * + */ +package org.activiti.designer.integration.servicetask.annotation; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +/** + * @author André Macedo + * @version 1 + * @since 5.16.0 + * + */ +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface PropertyItemsDataSource { + abstract String filename(); +}