Merge branch 'dev'
diff --git a/build.gradle b/build.gradle
index 6d99206..8e1d5ae 100644
--- a/build.gradle
+++ b/build.gradle
@@ -21,4 +21,9 @@
dependencies {
compile 'org.eclipse.mdm:org.eclipse.mdm.api.base:1.0.0'
+
+ // testing
+ testCompile 'junit:junit:4.12'
+ testCompile 'org.mockito:mockito-core:2.10.0'
+ testCompile 'org.assertj:assertj-core:3.6.2'
}
\ No newline at end of file
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContext.java b/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContext.java
new file mode 100644
index 0000000..3d2537a
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContext.java
@@ -0,0 +1,21 @@
+/*
+ * Copyright (c) 2017 Peak Solution GmbH 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
+ */
+package org.eclipse.mdm.api.dflt;
+
+import org.eclipse.mdm.api.base.BaseApplicationContext;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+
+/**
+ * Extends the {@link BaseApplicationContext} interface to return {@link EntityFactory}
+ * and {@link EntityManager}.
+ *
+ * @since 1.0.0
+ */
+public interface ApplicationContext extends BaseApplicationContext<EntityFactory, EntityManager> {
+
+}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContextFactory.java b/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContextFactory.java
new file mode 100644
index 0000000..b199726
--- /dev/null
+++ b/src/main/java/org/eclipse/mdm/api/dflt/ApplicationContextFactory.java
@@ -0,0 +1,20 @@
+/*
+ * Copyright (c) 2017 Peak Solution GmbH 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
+ */
+package org.eclipse.mdm.api.dflt;
+
+import org.eclipse.mdm.api.base.BaseApplicationContextFactory;
+
+/**
+ * Extends the {@link BaseApplicationContextFactory} interface to return an
+ * {@link ApplicationContext}.
+ *
+ * @since 1.0.0
+ */
+public interface ApplicationContextFactory extends BaseApplicationContextFactory<ApplicationContext> {
+
+}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/EntityManager.java b/src/main/java/org/eclipse/mdm/api/dflt/EntityManager.java
index ac126a7..b3207f6 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/EntityManager.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/EntityManager.java
@@ -17,7 +17,6 @@
import org.eclipse.mdm.api.base.model.ContextType;
import org.eclipse.mdm.api.base.model.Entity;
import org.eclipse.mdm.api.base.query.DataAccessException;
-import org.eclipse.mdm.api.dflt.model.EntityFactory;
import org.eclipse.mdm.api.dflt.model.Versionable;
/**
@@ -27,20 +26,12 @@
* @since 1.0.0
* @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
*/
-public interface EntityManager extends BaseEntityManager<EntityFactory> {
+public interface EntityManager extends BaseEntityManager {
// ======================================================================
// Public methods
// ======================================================================
- // default Optional<Status> loadStatus(Class<? extends StatusAttachable>
- // entityClass, String name)
- // throws DataAccessException {
- // return loadAllStatus(entityClass, name).stream()
- // .filter(s -> s.nameMatches(name))
- // .findAny();
- // }
-
/**
* Loads the entity identified by given entity class, {@link ContextType}
* and its instance ID.
@@ -70,15 +61,6 @@
<T extends Entity> List<T> load(Class<T> entityClass, ContextType contextType, Collection<String> instanceIDs)
throws DataAccessException;
- // default List<Status> loadAllStatus(Class<? extends StatusAttachable>
- // entityClass) throws DataAccessException {
- // return loadAllStatus(entityClass, "*");
- // }
-
- // List<Status> loadAllStatus(Class<? extends StatusAttachable> entityClass,
- // String pattern)
- // throws DataAccessException;
-
/**
* Loads all available entities of given type.
*
@@ -105,16 +87,6 @@
return loadAll(entityClass, contextType, "*");
}
- // default <T extends StatusAttachable> List<T> loadAll(Class<T>
- // entityClass, Status status)
- // throws DataAccessException {
- // return loadAll(entityClass, status, "*");
- // }
-
- // <T extends StatusAttachable> List<T> loadAll(Class<T> entityClass, Status
- // status, String pattern)
- // throws DataAccessException;
-
/**
* Loads all available entities of given type whose name fulfills the given
* pattern.
@@ -185,15 +157,4 @@
return loadAll(entityClass, contextType, name).stream().filter(v -> v.nameEquals(name))
.filter(Versionable::isValid).max(Versionable.COMPARATOR);
}
-
- // default <T extends StatusAttachable> List<T> loadChildren(Entity parent,
- // Class<T> entityClass,
- // Status status) throws DataAccessException {
- // return loadChildren(parent, entityClass, status, "*");
- // }
-
- // <T extends StatusAttachable> List<T> loadChildren(Entity parent, Class<T>
- // entityClass,
- // Status status, String pattern) throws DataAccessException;
-
}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogAttribute.java b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogAttribute.java
index cf2eb29..01304f2 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogAttribute.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogAttribute.java
@@ -12,8 +12,8 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.EnumRegistry;
@@ -59,9 +59,9 @@
public static final String ATTR_ACTION_REQUEST_CLASSNAME = "ActionRequestClassname";
/**
- * The <u>virtual</u> '{@literal @}EnumerationClass' attribute name.
+ * The <u>virtual</u> '{@literal @}EnumerationName' attribute name.
*/
- public static final String VATTR_ENUMERATION_CLASS = "@EnumerationClass";
+ public static final String VATTR_ENUMERATION_NAME = "@EnumerationName";
/**
* The <u>virtual</u> '{@literal @}ScalarType' attribute name.
@@ -77,7 +77,7 @@
// Instance variables
// ======================================================================
- private final Value enumerationClassValue;
+ private Enumeration<?> enumerationObj;
private final Value scalarTypeValue;
private final Value sequenceValue;
@@ -97,7 +97,11 @@
super(core);
Map<String, Value> values = core.getValues();
- enumerationClassValue = values.remove(VATTR_ENUMERATION_CLASS);
+ EnumRegistry er = EnumRegistry.getInstance();
+ Value enumValue = values.remove(VATTR_ENUMERATION_NAME);
+ if (enumValue != null) {
+ enumerationObj = er.get(enumValue.extract(ValueType.STRING));
+ }
scalarTypeValue = values.remove(VATTR_SCALAR_TYPE);
sequenceValue = values.remove(VATTR_SEQUENCE);
@@ -243,8 +247,7 @@
if (!getValueType().isEnumerationType()) {
throw new IllegalStateException("Catalog attribute is not of type enumeration.");
}
-
- return EnumRegistry.getInstance().get(enumerationClassValue.extract(ValueType.ENUMERATION).name());
+ return enumerationObj;
}
/**
@@ -281,9 +284,9 @@
sb.append(", Sequence = ").append((boolean) sequenceValue.extract());
- Optional<Unit> unit = getUnit();
- if (unit.isPresent()) {
- sb.append(", Unit = ").append(unit.get());
+ Optional<Unit> catalogUnit = getUnit();
+ if (catalogUnit.isPresent()) {
+ sb.append(", Unit = ").append(catalogUnit.get());
}
sb.append(", ").append(getValues().values().stream().map(Value::toString).collect(Collectors.joining(", ")));
@@ -308,14 +311,14 @@
}
/**
- * Sets enumeration class of this catalog attribute.
+ * Sets enumeration Object of this catalog attribute.
*
- * @param enumerationValueClass
- * The enumeration class.
+ * @param enumerationObj
+ * The enumeration.
*/
- void setEnumerationValueClass(Class<? extends EnumerationValue> enumerationValueClass) {
+ void setEnumerationObj(Enumeration<?> enumerationObj) {
setValueType(ValueType.ENUMERATION);
- enumerationClassValue.set(enumerationValueClass.getName());
+ this.enumerationObj=enumerationObj;
}
}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogComponent.java b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogComponent.java
index 7a3e89d..068e4e9 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogComponent.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogComponent.java
@@ -14,9 +14,9 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextType;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Datable;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogSensor.java b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogSensor.java
index 377913a..f46f971 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogSensor.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/CatalogSensor.java
@@ -12,9 +12,9 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextType;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Datable;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/EntityFactory.java b/src/main/java/org/eclipse/mdm/api/dflt/model/EntityFactory.java
index 4f5a0b2..802f954 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/EntityFactory.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/EntityFactory.java
@@ -8,6 +8,8 @@
package org.eclipse.mdm.api.dflt.model;
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.HashSet;
@@ -16,14 +18,15 @@
import java.util.Optional;
import java.util.Set;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.BaseEntityFactory;
import org.eclipse.mdm.api.base.model.ContextComponent;
import org.eclipse.mdm.api.base.model.ContextRoot;
import org.eclipse.mdm.api.base.model.ContextSensor;
import org.eclipse.mdm.api.base.model.ContextType;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Entity;
-import org.eclipse.mdm.api.base.model.EnumerationValue;
+import org.eclipse.mdm.api.base.model.Enumeration;
import org.eclipse.mdm.api.base.model.Measurement;
import org.eclipse.mdm.api.base.model.ScalarType;
import org.eclipse.mdm.api.base.model.Test;
@@ -56,11 +59,6 @@
throw new UnsupportedOperationException("Test requires a parent Pool.");
}
- // @Override
- // public TestStep createTestStep(String name, Test test) {
- // throw new UnsupportedOperationException("Test step requires a status.");
- // }
-
/**
* Creates a new {@link Project}.
*
@@ -90,8 +88,8 @@
Pool pool = new Pool(createCore(Pool.class));
// relations
- getPermanentStore(pool).set(project);
- getChildrenStore(project).add(pool);
+ getCore(pool).getPermanentStore().set(project);
+ getCore(project).getChildrenStore().add(pool);
// properties
pool.setName(name);
@@ -131,7 +129,7 @@
ContextRoot contextRoot = createContextRoot(templateRoot);
// relations
- getMutableStore(testStep).set(contextRoot, templateRoot.getContextType());
+ getCore(testStep).getMutableStore().set(contextRoot, templateRoot.getContextType());
return contextRoot;
}
@@ -151,7 +149,7 @@
ContextRoot contextRoot = createContextRoot(templateRoot);
// relations
- getMutableStore(measurement).set(contextRoot, templateRoot.getContextType());
+ getCore(measurement).getMutableStore().set(contextRoot, templateRoot.getContextType());
return contextRoot;
}
@@ -168,7 +166,7 @@
ContextRoot contextRoot = createContextRoot(templateRoot.getName(), templateRoot.getContextType());
// relations
- getMutableStore(contextRoot).set(templateRoot);
+ getCore(contextRoot).getMutableStore().set(templateRoot);
// create default active and mandatory context components
templateRoot.getTemplateComponents().stream()
@@ -207,7 +205,7 @@
templateComponent.get().getCatalogComponent().getName(), contextRoot);
// relations
- getMutableStore(contextComponent).set(templateComponent.get());
+ getCore(contextComponent).getMutableStore().set(templateComponent.get());
// properties
contextComponent.setName(name);
@@ -255,7 +253,7 @@
contextComponent);
// relations
- getMutableStore(contextSensor).set(templateSensor.get());
+ getCore(contextSensor).getMutableStore().set(templateSensor.get());
// properties
contextSensor.setName(name);
@@ -356,8 +354,8 @@
createCore(CatalogAttribute.class, catalogComponent.getContextType()));
// relations
- getPermanentStore(catalogAttribute).set(catalogComponent);
- getChildrenStore(catalogComponent).add(catalogAttribute);
+ getCore(catalogAttribute).getPermanentStore().set(catalogComponent);
+ getCore(catalogComponent).getChildrenStore().add(catalogAttribute);
// properties
catalogAttribute.setName(name);
@@ -373,8 +371,8 @@
*
* @param name
* Name of the created {@code CatalogAttribute}.
- * @param enumerationValueClass
- * The enumeration class.
+ * @param enumerationObject
+ * The enumeration.
* @param catalogComponent
* The parent {@code CatalogComponent}.
* @return The created {@code CatalogAttribute} is returned.
@@ -382,10 +380,10 @@
* Thrown if given name is already in use or not allowed or
* given enumeration class is not supported.
*/
- public CatalogAttribute createCatalogAttribute(String name, Class<? extends EnumerationValue> enumerationValueClass,
+ public CatalogAttribute createCatalogAttribute(String name, Enumeration<?> enumerationObj,
CatalogComponent catalogComponent) {
validateCatalogName(name, true);
- validateEnum(enumerationValueClass);
+ validateEnum(enumerationObj);
if (catalogComponent.getCatalogAttribute(name).isPresent()) {
throw new IllegalArgumentException("Catalog attribute with name '" + name + "' already exists.");
}
@@ -394,151 +392,17 @@
createCore(CatalogAttribute.class, catalogComponent.getContextType()));
// relations
- getPermanentStore(catalogAttribute).set(catalogComponent);
- getChildrenStore(catalogComponent).add(catalogAttribute);
+ getCore(catalogAttribute).getPermanentStore().set(catalogComponent);
+ getCore(catalogComponent).getChildrenStore().add(catalogAttribute);
// properties
catalogAttribute.setName(name);
- catalogAttribute.setEnumerationValueClass(enumerationValueClass);
+ catalogAttribute.setEnumerationObj(enumerationObj);
catalogAttribute.setSortIndex(nextIndex(catalogComponent.getCatalogAttributes()));
return catalogAttribute;
}
- // public CatalogSensor createCatalogSensor(String name, CatalogComponent
- // catalogComponent) {
- // validateCatalogName(name, false);
- //
- // if(!catalogComponent.getContextType().isTestEquipment()) {
- // throw new IllegalArgumentException("Catalog component is not of type
- // 'TESTEQUIPMENT'");
- // } else if(catalogComponent.getCatalogSensor(name).isPresent()) {
- // throw new IllegalArgumentException("Catalog sensor with name '" + name +
- // "' already exists.");
- // }
- //
- // CatalogSensor catalogSensor = new
- // CatalogSensor(createCore(CatalogSensor.class));
- //
- // // relations
- // getPermanentStore(catalogSensor).set(catalogComponent);
- // getChildrenStore(catalogComponent).add(catalogSensor);
- //
- // // properties
- // catalogSensor.setName(name);
- // catalogSensor.setDateCreated(LocalDateTime.now());
- //
- // return catalogSensor;
- // }
- //
- //
- // /**
- // * Creates a new {@link CatalogAttribute} for given {@link
- // CatalogComponent}.
- // * The {@link ValueType} may be one of the following:
- // *
- // * <ul>
- // * <li>{@link ValueType#STRING}</li>
- // * <li>{@link ValueType#STRING_SEQUENCE}</li>
- // * <li>{@link ValueType#DATE}</li>
- // * <li>{@link ValueType#DATE_SEQUENCE}</li>
- // * <li>{@link ValueType#BOOLEAN}</li>
- // * <li>{@link ValueType#BOOLEAN_SEQUENCE}</li>
- // * <li>{@link ValueType#BYTE}</li>
- // * <li>{@link ValueType#BYTE_SEQUENCE}</li>
- // * <li>{@link ValueType#SHORT}</li>
- // * <li>{@link ValueType#SHORT_SEQUENCE}</li>
- // * <li>{@link ValueType#INTEGER}</li>
- // * <li>{@link ValueType#INTEGER_SEQUENCE}</li>
- // * <li>{@link ValueType#LONG}</li>
- // * <li>{@link ValueType#LONG_SEQUENCE}</li>
- // * <li>{@link ValueType#FLOAT}</li>
- // * <li>{@link ValueType#FLOAT_SEQUENCE}</li>
- // * <li>{@link ValueType#DOUBLE}</li>
- // * <li>{@link ValueType#DOUBLE_SEQUENCE}</li>
- // * <li>{@link ValueType#BYTE_STREAM}</li>
- // * <li>{@link ValueType#BYTE_STREAM_SEQUENCE}</li>
- // * <li>{@link ValueType#FLOAT_COMPLEX}</li>
- // * <li>{@link ValueType#FLOAT_COMPLEX_SEQUENCE}</li>
- // * <li>{@link ValueType#DOUBLE_COMPLEX}</li>
- // * <li>{@link ValueType#DOUBLE_COMPLEX_SEQUENCE}</li>
- // * <li>{@link ValueType#FILE_LINK}</li>
- // * <li>{@link ValueType#FILE_LINK_SEQUENCE_SEQUENCE}</li>
- // * </ul>
- // *
- // *
- // * @param name Name of the created {@code CatalogAttribute}.
- // * @param valueType The {@code ValueType}.
- // * @param catalogSensor The parent {@code CatalogSensor}.
- // * @return The created {@code CatalogAttribute} is returned.
- // * @throws IllegalArgumentException Thrown if given name is already in use
- // * or given {@code ValueType} is not supported.
- // */
- // public CatalogAttribute createCatalogAttribute(String name, ValueType
- // valueType, CatalogSensor catalogSensor) {
- // validateCatalogName(name, true);
- //
- // if(catalogSensor.getCatalogAttribute(name).isPresent()) {
- // throw new IllegalArgumentException("Catalog attribute with name '" + name
- // + "' already exists.");
- // } else if(valueType.isEnumerationType() || valueType.isByteStreamType()
- // ||
- // valueType.isUnknown() || valueType.isBlob()) {
- // throw new IllegalArgumentException("Value type '" + valueType + "' is not
- // allowed.");
- // }
- //
- // CatalogAttribute catalogAttribute = new
- // CatalogAttribute(createCore(CatalogAttribute.class));
- //
- // // relations
- // getPermanentStore(catalogAttribute).set(catalogSensor);
- // getChildrenStore(catalogSensor).add(catalogAttribute);
- //
- // // properties
- // catalogAttribute.setName(name);
- // catalogAttribute.setValueType(valueType);
- // catalogAttribute.setSortIndex(nextIndex(catalogSensor.getCatalogAttributes()));
- //
- // return catalogAttribute;
- // }
- //
- // /**
- // * Creates a new {@link CatalogAttribute} for given {@link
- // CatalogComponent}.
- // *
- // * @param name Name of the created {@code CatalogAttribute}.
- // * @param enumerationClass The enumeration class.
- // * @param catalogSensor The parent {@code CatalogSensor}.
- // * @return The created {@code CatalogAttribute} is returned.
- // * @throws IllegalArgumentException Thrown if given name is already in use
- // * or not allowed or given enumeration class is not supported.
- // */
- // public CatalogAttribute createCatalogAttribute(String name, Class<?
- // extends Enum<?>> enumerationClass,
- // CatalogSensor catalogSensor) {
- // validateCatalogName(name, true);
- // validateEnum(enumerationClass);
- // if(catalogSensor.getCatalogAttribute(name).isPresent()) {
- // throw new IllegalArgumentException("Catalog attribute with name '" + name
- // + "' already exists.");
- // }
- //
- // CatalogAttribute catalogAttribute = new
- // CatalogAttribute(createCore(CatalogAttribute.class));
- //
- // // relations
- // getPermanentStore(catalogAttribute).set(catalogSensor);
- // getChildrenStore(catalogSensor).add(catalogAttribute);
- //
- // // properties
- // catalogAttribute.setName(name);
- // catalogAttribute.setEnumerationClass(enumerationClass);
- // catalogAttribute.setSortIndex(nextIndex(catalogSensor.getCatalogAttributes()));
- //
- // return catalogAttribute;
- // }
-
/**
* Creates a new {@link TemplateRoot} with given {@link ContextType} and
* name.
@@ -589,9 +453,9 @@
createCore(TemplateComponent.class, templateRoot.getContextType()));
// relations
- getPermanentStore(templateComponent).set(templateRoot);
- getMutableStore(templateComponent).set(catalogComponent);
- getChildrenStore(templateRoot).add(templateComponent);
+ getCore(templateComponent).getPermanentStore().set(templateRoot);
+ getCore(templateComponent).getMutableStore().set(catalogComponent);
+ getCore(templateRoot).getChildrenStore().add(templateComponent);
// properties
templateComponent.setName(name);
@@ -635,9 +499,9 @@
createCore(TemplateComponent.class, templateRoot.getContextType()));
// relations
- getPermanentStore(templateComponent).set(partentComponentTemplate);
- getMutableStore(templateComponent).set(catalogComponent);
- getChildrenStore(partentComponentTemplate).add(templateComponent);
+ getCore(templateComponent).getPermanentStore().set(partentComponentTemplate);
+ getCore(templateComponent).getMutableStore().set(catalogComponent);
+ getCore(partentComponentTemplate).getChildrenStore().add(templateComponent);
// properties
templateComponent.setName(name);
@@ -676,9 +540,9 @@
createCore(TemplateAttribute.class, catalogComponent.getContextType()));
// relations
- getPermanentStore(templateAttribute).set(templateComponent);
- getMutableStore(templateAttribute).set(catalogAttribute.get());
- getChildrenStore(templateComponent).add(templateAttribute);
+ getCore(templateAttribute).getPermanentStore().set(templateComponent);
+ getCore(templateAttribute).getMutableStore().set(catalogAttribute.get());
+ getCore(templateComponent).getChildrenStore().add(templateAttribute);
// properties
templateAttribute.setName(name);
@@ -753,9 +617,9 @@
createCore(TemplateTestStepUsage.class));
// relations
- getPermanentStore(templateTestStepUsage).set(templateTest);
- getMutableStore(templateTestStepUsage).set(templateTestStep);
- getChildrenStore(templateTest).add(templateTestStepUsage);
+ getCore(templateTestStepUsage).getPermanentStore().set(templateTest);
+ getCore(templateTestStepUsage).getMutableStore().set(templateTestStep);
+ getCore(templateTest).getChildrenStore().add(templateTestStepUsage);
// properties
templateTestStepUsage.setName(name);
@@ -800,8 +664,8 @@
ValueListValue valueListValue = new ValueListValue(createCore(ValueListValue.class));
// relations
- getPermanentStore(valueListValue).set(valueList);
- getChildrenStore(valueList).add(valueListValue);
+ getCore(valueListValue).getPermanentStore().set(valueList);
+ getCore(valueList).getChildrenStore().add(valueListValue);
// properties
valueListValue.setName(name);
@@ -842,7 +706,7 @@
Test test = createTest(name, pool, statusTest);
// relations
- getMutableStore(test).set(templateTest);
+ getCore(test).getMutableStore().set(templateTest);
// create default active and mandatory test steps according to the
// template
@@ -870,8 +734,8 @@
Test test = super.createTest(name);
// relations
- getPermanentStore(test).set(pool);
- getChildrenStore(pool).add(test);
+ getCore(test).getPermanentStore().set(pool);
+ getCore(pool).getChildrenStore().add(test);
if (status != null) {
status.assign(test);
@@ -919,7 +783,7 @@
TestStep testStep = createTestStep(templateTestStep.getName(), test, status);
// relations
- getMutableStore(testStep).set(templateTestStep);
+ getCore(testStep).getMutableStore().set(templateTestStep);
// create initial context roots
templateTestStep.getTemplateRoots().forEach(templateRoot -> createContextRoot(testStep, templateRoot));
@@ -948,17 +812,34 @@
return testStep;
}
+
+ /**
+ * {@inheritDoc}
+ */
+ @Override
+ protected <T extends BaseEntity> T createBaseEntity(Class<T> clazz, Core core) {
+ try {
+ Constructor<T> constructor = clazz.getDeclaredConstructor(Core.class);
+ try {
+ return constructor.newInstance(core);
+ } catch (IllegalAccessException exc) {
+ return super.createBaseEntity(clazz, core);
+ }
+ } catch (NoSuchMethodException | InvocationTargetException | InstantiationException exc) {
+ throw new IllegalStateException(exc.getMessage(), exc);
+ }
+ }
/**
- * Checks whether given enumeration class is defined in the application
+ * Checks whether given enumeration is defined in the application
* model or not.
*
- * @param enumClass
+ * @param enumerationObj
* The checked enumeration class.
* @throws IllegalArgumentException
* Thrown if given enumeration class is not supported.
*/
- protected abstract void validateEnum(Class<? extends EnumerationValue> enumClass);
+ protected abstract void validateEnum(Enumeration<?> enumerationObj);
// ======================================================================
// Private methods
@@ -975,7 +856,7 @@
* Thrown if given name is not allowed.
*/
private static void validateCatalogName(String name, boolean isAttributeName) {
- if (name == null || name.isEmpty() || name.length() > 30) {
+ if (!isValidCatalogName(name)) {
throw new IllegalArgumentException(
"A catalog name is not allowed to be empty and " + "must not exceed 30 characters.");
} else if (name.toLowerCase(Locale.ROOT).startsWith("ao")) {
@@ -988,6 +869,17 @@
"A catalog attribute name is not allowed to be " + "'id', 'name' or 'mimetype' (case ignored).");
}
}
+
+ /**
+ * Checks whether given catalog name is valid
+ *
+ * @param name
+ * The checked name.
+ * @return Returns {@code true} if name is a valid catalog name
+ */
+ private static boolean isValidCatalogName(String name) {
+ return name != null && !name.isEmpty() && name.length() <= 30;
+ }
/**
* Hides {@link Value} containers missing in the templates.
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/Pool.java b/src/main/java/org/eclipse/mdm/api/dflt/model/Pool.java
index 1b9e4ad..2682598 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/Pool.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/Pool.java
@@ -1,7 +1,7 @@
package org.eclipse.mdm.api.dflt.model;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Test;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/Project.java b/src/main/java/org/eclipse/mdm/api/dflt/model/Project.java
index b338d88..479e64f 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/Project.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/Project.java
@@ -1,7 +1,7 @@
package org.eclipse.mdm.api.dflt.model;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
/**
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/Status.java b/src/main/java/org/eclipse/mdm/api/dflt/model/Status.java
index cd96a42..d29e5ae 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/Status.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/Status.java
@@ -11,8 +11,8 @@
import java.util.List;
import java.util.Optional;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.StatusAttachable;
import org.eclipse.mdm.api.base.model.Test;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateAttribute.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateAttribute.java
index caa4b85..56411fe 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateAttribute.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateAttribute.java
@@ -14,7 +14,9 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Comparator;
+import java.util.HashMap;
import java.util.List;
+import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.regex.Matcher;
@@ -23,8 +25,8 @@
import java.util.stream.IntStream;
import java.util.stream.Stream;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.DoubleComplex;
import org.eclipse.mdm.api.base.model.Enumeration;
@@ -74,6 +76,22 @@
*/
public static final String ATTR_OPTIONAL = "Obligatory";
+ private static final Map<ValueType<?>, Function<String, Object>> VALUETYPE_FUNCTION_MAP = new HashMap<>();
+
+ static {
+ VALUETYPE_FUNCTION_MAP.put(ValueType.STRING, v -> v);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.DATE, v -> LocalDateTime.parse(v, Value.LOCAL_DATE_TIME_FORMATTER));
+ VALUETYPE_FUNCTION_MAP.put(ValueType.BOOLEAN, Boolean::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.BYTE, Byte::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.SHORT, Short::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.INTEGER, Integer::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.LONG, Long::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.FLOAT, Float::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.DOUBLE, Double::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.FLOAT_COMPLEX, FloatComplex::valueOf);
+ VALUETYPE_FUNCTION_MAP.put(ValueType.DOUBLE_COMPLEX, DoubleComplex::valueOf);
+ }
+
// ======================================================================
// Constructors
// ======================================================================
@@ -105,7 +123,8 @@
String value = defaultValue.extract();
if (valueType.isEnumerationType()) {
Enumeration enumObject = getCatalogAttribute().getEnumerationObject();
- return valueType.create(getName(), "", isValid, isValid ? enumObject.valueOf(value) : null, enumObject.getName());
+ return valueType.create(getName(), "", isValid, isValid ? enumObject.valueOf(value) : null,
+ enumObject.getName());
} else {
return valueType.create(getName(), isValid ? parse(value, valueType) : null);
}
@@ -132,25 +151,7 @@
String stringValue;
if (valueType.isFileLinkType()) {
- FileLink[] values = sequence ? value.extract() : new FileLink[] { value.extract() };
- stringValue = Stream.of(values).map(fl -> {
- StringBuilder sb = new StringBuilder();
- if (fl.getDescription().isEmpty()) {
- sb.append(FileLinkParser.NO_DESC_MARKER);
- } else {
- sb.append(fl.getDescription());
- }
- sb.append('[').append(fl.getMimeType()).append(',');
- if (fl.isRemote()) {
- sb.append(fl.getRemotePath());
- } else if (fl.isLocal()) {
- sb.append(FileLinkParser.LOCAL_MARKER).append(fl.getLocalPath());
- } else {
- throw new IllegalStateException("File link is neither in local nor remote state: " + fl);
- }
-
- return sb.append(']');
- }).collect(Collectors.joining(","));
+ stringValue = getStringValueForFileLinkType(value, sequence);
} else if (valueType.isDateType()) {
LocalDateTime[] values = sequence ? value.extract() : new LocalDateTime[] { value.extract() };
stringValue = Stream.of(values).map(ldt -> ldt.format(Value.LOCAL_DATE_TIME_FORMATTER))
@@ -311,34 +312,10 @@
* Thrown if a corresponding {@code String} is not supported.
*/
private static Function<String, Object> getParser(ValueType<?> valueType) {
- Function<String, Object> converter;
-
- if (valueType.isString()) {
- converter = v -> v;
- } else if (valueType.isDate()) {
- converter = v -> LocalDateTime.parse(v, Value.LOCAL_DATE_TIME_FORMATTER);
- } else if (valueType.isBoolean()) {
- converter = Boolean::valueOf;
- } else if (valueType.isByte()) {
- converter = Byte::valueOf;
- } else if (valueType.isShort()) {
- converter = Short::valueOf;
- } else if (valueType.isInteger()) {
- converter = Integer::valueOf;
- } else if (valueType.isLong()) {
- converter = Long::valueOf;
- } else if (valueType.isFloat()) {
- converter = Float::valueOf;
- } else if (valueType.isDouble()) {
- converter = Double::valueOf;
- } else if (valueType.isFloatComplex()) {
- converter = FloatComplex::valueOf;
- } else if (valueType.isDoubleComplex()) {
- converter = DoubleComplex::valueOf;
- } else {
+ Function<String, Object> converter = VALUETYPE_FUNCTION_MAP.get(valueType);
+ if (converter == null) {
throw new IllegalArgumentException("String conversion for value type '" + valueType + "' not supported.");
}
-
return converter;
}
@@ -403,4 +380,34 @@
}
+ /**
+ * Get string value for FileLinkType
+ *
+ * @param value
+ * The {@code Value} value.
+ * @param sequence
+ * The {@code boolean} sequence.
+ * @return Return {@code String} string value for FileLinkType
+ */
+ private String getStringValueForFileLinkType(Value value, boolean sequence) {
+ FileLink[] values = sequence ? value.extract() : new FileLink[] { value.extract() };
+ return Stream.of(values).map(fl -> {
+ StringBuilder sb = new StringBuilder();
+ if (fl.getDescription().isEmpty()) {
+ sb.append(FileLinkParser.NO_DESC_MARKER);
+ } else {
+ sb.append(fl.getDescription());
+ }
+ sb.append('[').append(fl.getMimeType()).append(',');
+ if (fl.isRemote()) {
+ sb.append(fl.getRemotePath());
+ } else if (fl.isLocal()) {
+ sb.append(FileLinkParser.LOCAL_MARKER).append(fl.getLocalPath());
+ } else {
+ throw new IllegalStateException("File link is neither in local nor remote state: " + fl);
+ }
+
+ return sb.append(']');
+ }).collect(Collectors.joining(","));
+ }
}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateComponent.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateComponent.java
index 189917b..823b0e2 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateComponent.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateComponent.java
@@ -14,10 +14,10 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextComponent;
import org.eclipse.mdm.api.base.model.ContextRoot;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Sortable;
import org.eclipse.mdm.api.base.model.TestStep;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateRoot.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateRoot.java
index cc980f7..3a9f0c7 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateRoot.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateRoot.java
@@ -13,10 +13,10 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextRoot;
import org.eclipse.mdm.api.base.model.ContextType;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Value;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateSensor.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateSensor.java
index 330725c..c9d5c41 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateSensor.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateSensor.java
@@ -13,11 +13,11 @@
import java.util.function.Predicate;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.AxisType;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextComponent;
import org.eclipse.mdm.api.base.model.ContextSensor;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.Quantity;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTest.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTest.java
index 0a98273..35c1f4a 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTest.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTest.java
@@ -12,9 +12,9 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextComponent;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.Test;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStep.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStep.java
index d70879f..a140e6d 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStep.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStep.java
@@ -12,9 +12,9 @@
import java.util.List;
import java.util.Optional;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
import org.eclipse.mdm.api.base.model.ContextType;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.TestStep;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStepUsage.java b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStepUsage.java
index e01a99d..b18c2de 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStepUsage.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/TemplateTestStepUsage.java
@@ -10,8 +10,8 @@
import java.util.function.Predicate;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Sortable;
import org.eclipse.mdm.api.base.model.Test;
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/ValueList.java b/src/main/java/org/eclipse/mdm/api/dflt/model/ValueList.java
index 64f538a..babe0e9 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/ValueList.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/ValueList.java
@@ -12,8 +12,8 @@
import java.util.Optional;
import java.util.stream.Collectors;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Datable;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
@@ -103,5 +103,6 @@
return sb.append(')').toString();
}
+
}
diff --git a/src/main/java/org/eclipse/mdm/api/dflt/model/ValueListValue.java b/src/main/java/org/eclipse/mdm/api/dflt/model/ValueListValue.java
index 9102bf2..d6712e2 100644
--- a/src/main/java/org/eclipse/mdm/api/dflt/model/ValueListValue.java
+++ b/src/main/java/org/eclipse/mdm/api/dflt/model/ValueListValue.java
@@ -8,8 +8,8 @@
package org.eclipse.mdm.api.dflt.model;
+import org.eclipse.mdm.api.base.adapter.Core;
import org.eclipse.mdm.api.base.model.BaseEntity;
-import org.eclipse.mdm.api.base.model.Core;
import org.eclipse.mdm.api.base.model.Deletable;
import org.eclipse.mdm.api.base.model.Describable;
import org.eclipse.mdm.api.base.model.Sortable;
diff --git a/src/test/java/org/eclipse/mdm/api/dflt/model/EntityFactoryTest.java b/src/test/java/org/eclipse/mdm/api/dflt/model/EntityFactoryTest.java
new file mode 100644
index 0000000..24bfac2
--- /dev/null
+++ b/src/test/java/org/eclipse/mdm/api/dflt/model/EntityFactoryTest.java
@@ -0,0 +1,29 @@
+package org.eclipse.mdm.api.dflt.model;
+
+import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+import org.eclipse.mdm.api.base.model.Channel;
+import org.junit.Test;
+
+public class EntityFactoryTest {
+
+ @Test
+ public void createBaseEntities() {
+ EntityFactory entityFactory = mock(EntityFactory.class);
+ when(entityFactory.createBaseEntity(any(), any())).thenCallRealMethod();
+
+ // The Entities below were chosen as representatives of their respective
+ // packages since their constructors don't do anything with the Core instances
+ // passed to them, so a null pointer is sufficient for this test.
+
+ // Channel class is in package org.eclipse.mdm.api.base.model
+ // (BaseEntityFactory's package):
+ assertThat(entityFactory.createBaseEntity(Channel.class, null)).isInstanceOf(Channel.class);
+ // CatalogSensor class is in package org.eclipse.mdm.api.dflt.model
+ // (EntityFactory's package):
+ assertThat(entityFactory.createBaseEntity(CatalogSensor.class, null)).isInstanceOf(CatalogSensor.class);
+ }
+}