Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to 'org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/AbstractTaskSchema.java')
-rw-r--r--org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/AbstractTaskSchema.java190
1 files changed, 190 insertions, 0 deletions
diff --git a/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/AbstractTaskSchema.java b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/AbstractTaskSchema.java
new file mode 100644
index 000000000..527f40191
--- /dev/null
+++ b/org.eclipse.mylyn.tasks.core/src/org/eclipse/mylyn/internal/tasks/core/data/AbstractTaskSchema.java
@@ -0,0 +1,190 @@
+/*******************************************************************************
+ * Copyright (c) 2011 Tasktop Technologies and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Tasktop Technologies - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.internal.tasks.core.data;
+
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.EnumSet;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.eclipse.core.runtime.Assert;
+import org.eclipse.mylyn.tasks.core.data.TaskAttribute;
+import org.eclipse.mylyn.tasks.core.data.TaskAttributeMetaData;
+import org.eclipse.mylyn.tasks.core.data.TaskData;
+
+/**
+ * @author Steffen Pingel
+ */
+public abstract class AbstractTaskSchema {
+
+ protected class FieldFactory {
+
+ private EnumSet<Flag> flags;
+
+ private String key;
+
+ private String label;
+
+ private String type;
+
+ public FieldFactory(Field source) {
+ this.flags = source.flags;
+ this.key = source.key;
+ this.label = source.label;
+ this.type = source.type;
+ }
+
+ public FieldFactory flags(EnumSet<Flag> flags) {
+ this.flags = flags;
+ return this;
+ }
+
+ public FieldFactory key(String key) {
+ this.key = key;
+ return this;
+ }
+
+ public FieldFactory label(String label) {
+ this.label = label;
+ return this;
+ }
+
+ public FieldFactory type(String type) {
+ this.type = type;
+ return this;
+ }
+
+ public Field create() {
+ return createField(key, label, type, (!flags.isEmpty()) ? flags.toArray(new Flag[0]) : null);
+ }
+
+ }
+
+ public static class Field {
+
+ private EnumSet<Flag> flags;
+
+ private final String key;
+
+ private final String label;
+
+ private final String type;
+
+ protected Field(String key, String label, String type) {
+ this(key, label, type, (Flag[]) null);
+ }
+
+ protected Field(String key, String label, String type, Flag... flags) {
+ Assert.isNotNull(key);
+ Assert.isNotNull(label);
+ Assert.isNotNull(type);
+ this.key = key;
+ this.label = label;
+ this.type = type;
+ if (flags == null) {
+ this.flags = NO_FLAGS;
+ } else {
+ this.flags = EnumSet.copyOf(Arrays.asList(flags));
+ }
+ }
+
+ public TaskAttribute createAttribute(TaskAttribute parent) {
+ TaskAttribute attribute = parent.createMappedAttribute(getKey());
+ // meta data
+ TaskAttributeMetaData metaData = attribute.getMetaData();
+ metaData.setLabel(getLabel());
+ metaData.setType(getType());
+ metaData.setReadOnly(isReadOnly());
+ metaData.setKind(getKind());
+ // options
+ Map<String, String> options = getDefaultOptions();
+ if (options != null) {
+ for (Entry<String, String> option : options.entrySet()) {
+ attribute.putOption(option.getKey(), option.getValue());
+ }
+ }
+ return attribute;
+ }
+
+ public Map<String, String> getDefaultOptions() {
+ return Collections.emptyMap();
+ }
+
+ public String getKey() {
+ return key;
+ }
+
+ public String getKind() {
+ if (flags.contains(Flag.ATTRIBUTE)) {
+ return TaskAttribute.KIND_DEFAULT;
+ } else if (flags.contains(Flag.PEOPLE)) {
+ return TaskAttribute.KIND_PEOPLE;
+ } else if (flags.contains(Flag.OPERATION)) {
+ return TaskAttribute.KIND_OPERATION;
+ }
+ return null;
+ }
+
+ public String getLabel() {
+ return label;
+ }
+
+ public String getType() {
+ return type;
+ }
+
+ public boolean isReadOnly() {
+ return flags.contains(Flag.READ_ONLY);
+ }
+
+ @Override
+ public String toString() {
+ return getLabel();
+ }
+
+ };
+
+ public enum Flag {
+ ATTRIBUTE, OPERATION, PEOPLE, READ_ONLY
+ }
+
+ public static final EnumSet<Flag> NO_FLAGS = EnumSet.noneOf(Flag.class);
+
+ private final Map<String, Field> fieldByKey = new LinkedHashMap<String, Field>();
+
+ public Field getFieldByKey(String taskKey) {
+ return fieldByKey.get(taskKey);
+ }
+
+ protected FieldFactory inheritFrom(Field source) {
+ return new FieldFactory(source);
+ }
+
+ protected Field createField(String key, String label, String type) {
+ return createField(key, label, type, (Flag[]) null);
+ }
+
+ protected Field createField(String key, String label, String type, Flag... flags) {
+ Field field = new Field(key, label, type, flags);
+ fieldByKey.put(key, field);
+ return field;
+ }
+
+ public void initialize(TaskData taskData) {
+ for (Field field : fieldByKey.values()) {
+ field.createAttribute(taskData.getRoot());
+ }
+ }
+
+}

Back to the top