Fixed line endings

Signed-off-by: Matthias Koller <m.koller@peak-solution.de>
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java
index c03206a..e1cb7fc 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 package org.eclipse.mdm.api.odsadapter;
 
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContextFactory.java b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContextFactory.java
index 7ac0b1d..4084697 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContextFactory.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContextFactory.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSEntityManager.java b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSEntityManager.java
index a113ec6..bbbad94 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSEntityManager.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSEntityManager.java
@@ -25,13 +25,13 @@
 import java.util.Map.Entry;
 import java.util.Optional;
 import java.util.stream.Collectors;
-import java.util.stream.Stream;

+import java.util.stream.Stream;
 
 import org.asam.ods.AoException;
 import org.asam.ods.ApplicationStructure;
 import org.asam.ods.ElemId;
-import org.asam.ods.InstanceElement;

-import org.asam.ods.T_LONGLONG;

+import org.asam.ods.InstanceElement;
+import org.asam.ods.T_LONGLONG;
 import org.eclipse.mdm.api.base.ServiceNotProvidedException;
 import org.eclipse.mdm.api.base.Transaction;
 import org.eclipse.mdm.api.base.adapter.EntityType;
@@ -353,22 +353,22 @@
 
 		return Collections.emptyMap();
 	}
-

-	/**

-	 * {@inheritDoc}

-	 */

-	public <T extends Entity> List<T> loadRelatedEntities(Entity entity, String relationName, Class<T> relatedClass) {

-		ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));

-		ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));

-

-		try {

-			T_LONGLONG[] instanceIds = context.getAoSession().getApplElemAccess().getRelInst(elemId, relationName);

-			List<String> instanceIDs = Stream.of(instanceIds).map(ODSConverter::fromODSLong).map(l -> l.toString()).collect(Collectors.toList());

-			return entityLoader.loadAll(new Key<>(relatedClass), instanceIDs);

-		} catch (AoException e) {

-			throw new DataAccessException("" + e.reason, e); // TODO

-		}

-	}

+
+	/**
+	 * {@inheritDoc}
+	 */
+	public <T extends Entity> List<T> loadRelatedEntities(Entity entity, String relationName, Class<T> relatedClass) {
+		ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));
+		ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));
+
+		try {
+			T_LONGLONG[] instanceIds = context.getAoSession().getApplElemAccess().getRelInst(elemId, relationName);
+			List<String> instanceIDs = Stream.of(instanceIds).map(ODSConverter::fromODSLong).map(l -> l.toString()).collect(Collectors.toList());
+			return entityLoader.loadAll(new Key<>(relatedClass), instanceIDs);
+		} catch (AoException e) {
+			throw new DataAccessException("" + e.reason, e); // TODO
+		}
+	}
 	
 	/**
 	 * {@inheritDoc}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/ReadRequestHandler.java b/src/main/java/org/eclipse/mdm/api/odsadapter/ReadRequestHandler.java
index 9d6d2aa..44d32fd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/ReadRequestHandler.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/ReadRequestHandler.java
@@ -1,57 +1,57 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter;
 
-import java.util.ArrayList;

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-import java.util.Map.Entry;

-import java.util.Set;

-

-import org.apache.commons.lang3.tuple.ImmutablePair;

-import org.apache.commons.lang3.tuple.Pair;

-import org.asam.ods.AoException;

-import org.asam.ods.Column;

-import org.asam.ods.ElemId;

-import org.asam.ods.NameValueSeqUnit;

-import org.asam.ods.T_LONGLONG;

-import org.asam.ods.ValueMatrix;

-import org.asam.ods.ValueMatrixMode;

-import org.eclipse.mdm.api.base.adapter.Attribute;

-import org.eclipse.mdm.api.base.adapter.EntityType;

-import org.eclipse.mdm.api.base.massdata.ReadRequest;

-import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;

-import org.eclipse.mdm.api.base.model.AxisType;

-import org.eclipse.mdm.api.base.model.Channel;

-import org.eclipse.mdm.api.base.model.Entity;

-import org.eclipse.mdm.api.base.model.MeasuredValues;

-import org.eclipse.mdm.api.base.model.SequenceRepresentation;

-import org.eclipse.mdm.api.base.model.Unit;

-import org.eclipse.mdm.api.base.model.Value;

-import org.eclipse.mdm.api.base.query.ComparisonOperator;

-import org.eclipse.mdm.api.base.query.DataAccessException;

-import org.eclipse.mdm.api.base.query.Filter;

-import org.eclipse.mdm.api.base.query.Query;

-import org.eclipse.mdm.api.base.query.QueryService;

-import org.eclipse.mdm.api.base.query.Result;

-import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;

-import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;

-import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;

-

+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+
+import org.apache.commons.lang3.tuple.ImmutablePair;
+import org.apache.commons.lang3.tuple.Pair;
+import org.asam.ods.AoException;
+import org.asam.ods.Column;
+import org.asam.ods.ElemId;
+import org.asam.ods.NameValueSeqUnit;
+import org.asam.ods.T_LONGLONG;
+import org.asam.ods.ValueMatrix;
+import org.asam.ods.ValueMatrixMode;
+import org.eclipse.mdm.api.base.adapter.Attribute;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.massdata.ReadRequest;
+import org.eclipse.mdm.api.base.massdata.ReadRequest.ValuesMode;
+import org.eclipse.mdm.api.base.model.AxisType;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.MeasuredValues;
+import org.eclipse.mdm.api.base.model.SequenceRepresentation;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.query.ComparisonOperator;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.base.query.Filter;
+import org.eclipse.mdm.api.base.query.Query;
+import org.eclipse.mdm.api.base.query.QueryService;
+import org.eclipse.mdm.api.base.query.Result;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+
 import com.google.common.collect.Lists;
 
 /**
@@ -60,81 +60,81 @@
  * @since 1.0.0
  * @author Viktor Stoehr, Gigatronik Ingolstadt GmbH
  */
-public final class ReadRequestHandler {

-	public static final class ColumnAttributes

-	{

-		private String name;

-		private SequenceRepresentation sequenceRepresentation;

-		private double[] generationParameters;

-		private boolean independent;

-		private AxisType axisType;

-		

-		public ColumnAttributes(String name, SequenceRepresentation sequenceRepresentation, double[] generationParameters, boolean independent, AxisType axisType)

-		{

-			this.name = name;

-			this.sequenceRepresentation = sequenceRepresentation;

-			this.generationParameters = generationParameters;

-			this.independent = independent;

-			this.axisType = axisType;

-		}

-		

-		public String getName()

-		{

-			return name;

-		}

-		

-		public void setName(String name)

-		{

-			this.name = name;

-		}

-

-		public SequenceRepresentation getSequenceRepresentation()

-		{

-			return sequenceRepresentation;

-		}

-		

-		public void setSequenceRepresentation(SequenceRepresentation sequenceRepresentation)

-		{

-			this.sequenceRepresentation = sequenceRepresentation;

-		}

-		

-		public double[] getGenerationParameters()

-		{

-			return generationParameters;

-		}

-		

-		public void setGenerationParameters(double[] generationParameters)

-		{

-			this.generationParameters = generationParameters;

-		}

-		

-		public boolean isIndependentColumn()

-		{

-			return independent;

-		}

-		

-		public void setIndependentColumn(boolean independent)

-		{

-			this.independent = independent;

-		}

-		

-		public AxisType getAxisType()

-		{

-			return axisType;

-		}

-		

-		public void setAxisType(AxisType axisType)

-		{

-			this.axisType = axisType;

-		}

-		

+public final class ReadRequestHandler {
+	public static final class ColumnAttributes
+	{
+		private String name;
+		private SequenceRepresentation sequenceRepresentation;
+		private double[] generationParameters;
+		private boolean independent;
+		private AxisType axisType;
+		
+		public ColumnAttributes(String name, SequenceRepresentation sequenceRepresentation, double[] generationParameters, boolean independent, AxisType axisType)
+		{
+			this.name = name;
+			this.sequenceRepresentation = sequenceRepresentation;
+			this.generationParameters = generationParameters;
+			this.independent = independent;
+			this.axisType = axisType;
+		}
+		
+		public String getName()
+		{
+			return name;
+		}
+		
+		public void setName(String name)
+		{
+			this.name = name;
+		}
+
+		public SequenceRepresentation getSequenceRepresentation()
+		{
+			return sequenceRepresentation;
+		}
+		
+		public void setSequenceRepresentation(SequenceRepresentation sequenceRepresentation)
+		{
+			this.sequenceRepresentation = sequenceRepresentation;
+		}
+		
+		public double[] getGenerationParameters()
+		{
+			return generationParameters;
+		}
+		
+		public void setGenerationParameters(double[] generationParameters)
+		{
+			this.generationParameters = generationParameters;
+		}
+		
+		public boolean isIndependentColumn()
+		{
+			return independent;
+		}
+		
+		public void setIndependentColumn(boolean independent)
+		{
+			this.independent = independent;
+		}
+		
+		public AxisType getAxisType()
+		{
+			return axisType;
+		}
+		
+		public void setAxisType(AxisType axisType)
+		{
+			this.axisType = axisType;
+		}
+		
 	}
 
 	// ======================================================================
 	// Instance variables
 	// ======================================================================
-

-	private final ODSModelManager modelManager;

+
+	private final ODSModelManager modelManager;
 	private final QueryService queryService;
 
 	// ======================================================================
@@ -147,8 +147,8 @@
 	 * @param modelManager
 	 *            Used to gain access to value matrices.
 	 */
-	public ReadRequestHandler(ODSModelManager modelManager, QueryService queryService) {

-		this.modelManager = modelManager;

+	public ReadRequestHandler(ODSModelManager modelManager, QueryService queryService) {
+		this.modelManager = modelManager;
 		this.queryService = queryService;
 	}
 
@@ -171,11 +171,11 @@
 		Column[] arrColumns = null;
 
 		try {
-			valueMatrix = getValueMatrix(readRequest);

-			List<Pair<Column, ColumnAttributes>> listColumnPairs = getODSColumns(readRequest, valueMatrix);

-			

-			arrColumns = listColumnPairs.stream().map(Pair::getLeft).toArray(Column[]::new);

-			ColumnAttributes[] arrColumnAttributes = listColumnPairs.stream().map(Pair::getRight).toArray(ColumnAttributes[]::new);

+			valueMatrix = getValueMatrix(readRequest);
+			List<Pair<Column, ColumnAttributes>> listColumnPairs = getODSColumns(readRequest, valueMatrix);
+			
+			arrColumns = listColumnPairs.stream().map(Pair::getLeft).toArray(Column[]::new);
+			ColumnAttributes[] arrColumnAttributes = listColumnPairs.stream().map(Pair::getRight).toArray(ColumnAttributes[]::new);
 			
 			NameValueSeqUnit[] nvsus = valueMatrix.getValue(arrColumns, readRequest.getStartIndex(),
 					readRequest.getRequestSize());
@@ -208,122 +208,122 @@
 	 * @throws DataAccessException
 	 *             Thrown on wrong {@code ReadRequest} setup.
 	 */
-	private List<Pair<Column, ColumnAttributes>> getODSColumns(ReadRequest readRequest, ValueMatrix valueMatrix)

-			throws AoException, DataAccessException {

-		List<Pair<Column, ColumnAttributes>> listColumnPairs = new ArrayList<>();

-		Map<String, Column> mapColumns = new HashMap<>();

-

-		try {

-			if (readRequest.isLoadAllChannels()) {

-				// TODO should it be possible to overwrite the unit of some

-				// channels?!

-				// -> this results in a performance issue since we need to call

-				// getName()

-				// on each column for mapping! (no longer, see below!)

-				Column[] columns = valueMatrix.getColumns("*");

-

-				if (null != columns) {

-					for (Column column : columns) {

-						String columnName = column.getName();

-						if (mapColumns.containsKey(columnName))

-						{

-							releaseColumns(columns);

-							throw new DataAccessException(String.format("Duplicate column name '%s' found within submatrix ID %d!",

-									columnName, Long.valueOf(readRequest.getChannelGroup().getID())));

-						}

-						

-						mapColumns.put(columnName, column);

-					}

-				}

-			} else {

-				for (Entry<Channel, Unit> entry : readRequest.getChannels().entrySet()) {

-					Channel channel = entry.getKey();

-					Unit unit = entry.getValue();

-					String channelName = channel.getName();

-					Column[] columns = valueMatrix.getColumns(channelName);

-					if (columns == null || columns.length != 1) {

-						releaseColumns(columns);

-						throw new DataAccessException(String.format("Zero or more than one column with name '%s' found within submatrix ID %d!",

-								channelName, Long.valueOf(readRequest.getChannelGroup().getID())));

-					}

-					

-					Column column = columns[0];

-					if (!unit.nameEquals(channel.getUnit().getName())) {

-						column.setUnit(unit.getName());

-					}

-

-					mapColumns.put(channelName, column);

-				}

-			}

-

-			if (mapColumns.size() > 0) {

-				EntityType localColumnEntityType = modelManager.getEntityType("LocalColumn");

-				Attribute idAttr = localColumnEntityType.getAttribute("Id");

-				Attribute nameAttr = localColumnEntityType.getAttribute("Name");

-				Attribute submatrixAttr = localColumnEntityType.getAttribute("SubMatrix");

-

-				// Don't query GenerationParameters together with other non-ID attributes as Avalon dislikes this:

-				Query query1 = queryService.createQuery()

-						.select(Lists.newArrayList(idAttr,

-								nameAttr,

-								localColumnEntityType.getAttribute("SequenceRepresentation"),

-								localColumnEntityType.getAttribute("IndependentFlag"),

-								localColumnEntityType.getAttribute("axistype")));

-				

-				

-

-				Filter filter = Filter.and()

-						.add(ComparisonOperator.EQUAL.create(submatrixAttr, Long.valueOf(readRequest.getChannelGroup().getID())));

-				

-				Set<String> setColumnNames = mapColumns.keySet();

-				

-				Map<Long, ColumnAttributes> mapColumnAttributes = new HashMap<>();

-

-				for (Result result : query1.fetch(filter)) {

-					Map<String, Value> mapValues = result.getRecord(localColumnEntityType).getValues();

-

-					String columnName = mapValues.get("Name").extract();

-

-					if (setColumnNames.contains(columnName))

-					{	

-						ColumnAttributes ca = new ColumnAttributes(columnName,

-								(ValuesMode.CALCULATED == readRequest.getValuesMode() ? SequenceRepresentation.EXPLICIT : mapValues.get("SequenceRepresentation").extract()),

-								new double[0],

-								((short) mapValues.get("IndependentFlag").extract() != 0),

-								mapValues.get("axistype").extract());

-						

-						mapColumnAttributes.put(mapValues.get("Id").extract(), ca);

-					}

-				}

-				

-				if (ValuesMode.CALCULATED != readRequest.getValuesMode())

-				{

-					Query query2 = queryService.createQuery()

-							.select(idAttr,

-									localColumnEntityType.getAttribute("GenerationParameters"));

-					

-					for (Result result : query2.fetch(filter)) {

-						Map<String, Value> mapValues = result.getRecord(localColumnEntityType).getValues();

-						

-						ColumnAttributes ca = mapColumnAttributes.get(mapValues.get("Id").extract());

-						

-						if (ca != null) {

-							ca.setGenerationParameters(mapValues.get("GenerationParameters").extract());

-						}

-					}

-				}

-				

-				for (Map.Entry<Long, ColumnAttributes> me : mapColumnAttributes.entrySet()) {

-					ColumnAttributes ca = me.getValue();

-					listColumnPairs.add(new ImmutablePair<Column, ColumnAttributes>(mapColumns.get(ca.getName()), ca));

-				}

-			}

-

-			return listColumnPairs;

-		} catch (AoException e) {

-			releaseColumns(listColumnPairs.stream().map(Pair::getLeft).toArray(Column[]::new));

-			throw new DataAccessException("Unable to load column due to: " + e.reason, e);

-		}

+	private List<Pair<Column, ColumnAttributes>> getODSColumns(ReadRequest readRequest, ValueMatrix valueMatrix)
+			throws AoException, DataAccessException {
+		List<Pair<Column, ColumnAttributes>> listColumnPairs = new ArrayList<>();
+		Map<String, Column> mapColumns = new HashMap<>();
+
+		try {
+			if (readRequest.isLoadAllChannels()) {
+				// TODO should it be possible to overwrite the unit of some
+				// channels?!
+				// -> this results in a performance issue since we need to call
+				// getName()
+				// on each column for mapping! (no longer, see below!)
+				Column[] columns = valueMatrix.getColumns("*");
+
+				if (null != columns) {
+					for (Column column : columns) {
+						String columnName = column.getName();
+						if (mapColumns.containsKey(columnName))
+						{
+							releaseColumns(columns);
+							throw new DataAccessException(String.format("Duplicate column name '%s' found within submatrix ID %d!",
+									columnName, Long.valueOf(readRequest.getChannelGroup().getID())));
+						}
+						
+						mapColumns.put(columnName, column);
+					}
+				}
+			} else {
+				for (Entry<Channel, Unit> entry : readRequest.getChannels().entrySet()) {
+					Channel channel = entry.getKey();
+					Unit unit = entry.getValue();
+					String channelName = channel.getName();
+					Column[] columns = valueMatrix.getColumns(channelName);
+					if (columns == null || columns.length != 1) {
+						releaseColumns(columns);
+						throw new DataAccessException(String.format("Zero or more than one column with name '%s' found within submatrix ID %d!",
+								channelName, Long.valueOf(readRequest.getChannelGroup().getID())));
+					}
+					
+					Column column = columns[0];
+					if (!unit.nameEquals(channel.getUnit().getName())) {
+						column.setUnit(unit.getName());
+					}
+
+					mapColumns.put(channelName, column);
+				}
+			}
+
+			if (mapColumns.size() > 0) {
+				EntityType localColumnEntityType = modelManager.getEntityType("LocalColumn");
+				Attribute idAttr = localColumnEntityType.getAttribute("Id");
+				Attribute nameAttr = localColumnEntityType.getAttribute("Name");
+				Attribute submatrixAttr = localColumnEntityType.getAttribute("SubMatrix");
+
+				// Don't query GenerationParameters together with other non-ID attributes as Avalon dislikes this:
+				Query query1 = queryService.createQuery()
+						.select(Lists.newArrayList(idAttr,
+								nameAttr,
+								localColumnEntityType.getAttribute("SequenceRepresentation"),
+								localColumnEntityType.getAttribute("IndependentFlag"),
+								localColumnEntityType.getAttribute("axistype")));
+				
+				
+
+				Filter filter = Filter.and()
+						.add(ComparisonOperator.EQUAL.create(submatrixAttr, Long.valueOf(readRequest.getChannelGroup().getID())));
+				
+				Set<String> setColumnNames = mapColumns.keySet();
+				
+				Map<Long, ColumnAttributes> mapColumnAttributes = new HashMap<>();
+
+				for (Result result : query1.fetch(filter)) {
+					Map<String, Value> mapValues = result.getRecord(localColumnEntityType).getValues();
+
+					String columnName = mapValues.get("Name").extract();
+
+					if (setColumnNames.contains(columnName))
+					{	
+						ColumnAttributes ca = new ColumnAttributes(columnName,
+								(ValuesMode.CALCULATED == readRequest.getValuesMode() ? SequenceRepresentation.EXPLICIT : mapValues.get("SequenceRepresentation").extract()),
+								new double[0],
+								((short) mapValues.get("IndependentFlag").extract() != 0),
+								mapValues.get("axistype").extract());
+						
+						mapColumnAttributes.put(mapValues.get("Id").extract(), ca);
+					}
+				}
+				
+				if (ValuesMode.CALCULATED != readRequest.getValuesMode())
+				{
+					Query query2 = queryService.createQuery()
+							.select(idAttr,
+									localColumnEntityType.getAttribute("GenerationParameters"));
+					
+					for (Result result : query2.fetch(filter)) {
+						Map<String, Value> mapValues = result.getRecord(localColumnEntityType).getValues();
+						
+						ColumnAttributes ca = mapColumnAttributes.get(mapValues.get("Id").extract());
+						
+						if (ca != null) {
+							ca.setGenerationParameters(mapValues.get("GenerationParameters").extract());
+						}
+					}
+				}
+				
+				for (Map.Entry<Long, ColumnAttributes> me : mapColumnAttributes.entrySet()) {
+					ColumnAttributes ca = me.getValue();
+					listColumnPairs.add(new ImmutablePair<Column, ColumnAttributes>(mapColumns.get(ca.getName()), ca));
+				}
+			}
+
+			return listColumnPairs;
+		} catch (AoException e) {
+			releaseColumns(listColumnPairs.stream().map(Pair::getLeft).toArray(Column[]::new));
+			throw new DataAccessException("Unable to load column due to: " + e.reason, e);
+		}
 	}
 
 	/**
@@ -339,16 +339,16 @@
 	private ValueMatrix getValueMatrix(ReadRequest readRequest) throws AoException {
 		Entity entity = readRequest.getChannelGroup();
 		T_LONGLONG iid = ODSConverter.toODSID(entity.getID());
-		T_LONGLONG aid = ((ODSEntityType) modelManager.getEntityType(entity)).getODSID();

-		ValueMatrixMode valueMatrixMode = ValueMatrixMode.CALCULATED;

-		switch (readRequest.getValuesMode())

-		{

-		case CALCULATED: valueMatrixMode = ValueMatrixMode.CALCULATED; break;

-		case STORAGE: valueMatrixMode = ValueMatrixMode.STORAGE; break;

-		default:

-			throw new DataAccessException(

-					String.format("Unsupported ValueMode %s!", readRequest.getValuesMode().name()));

-		}

+		T_LONGLONG aid = ((ODSEntityType) modelManager.getEntityType(entity)).getODSID();
+		ValueMatrixMode valueMatrixMode = ValueMatrixMode.CALCULATED;
+		switch (readRequest.getValuesMode())
+		{
+		case CALCULATED: valueMatrixMode = ValueMatrixMode.CALCULATED; break;
+		case STORAGE: valueMatrixMode = ValueMatrixMode.STORAGE; break;
+		default:
+			throw new DataAccessException(
+					String.format("Unsupported ValueMode %s!", readRequest.getValuesMode().name()));
+		}
 		
 		return modelManager.getApplElemAccess().getValueMatrixInMode(new ElemId(aid, iid), valueMatrixMode);
 	}
@@ -385,7 +385,7 @@
 		}
 
 		for (Column column : columns) {
-			try {

+			try {
 				column.destroy();
 			} catch (AoException e) {
 				// ignore
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/DefaultEntityConfigRepositoryLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/DefaultEntityConfigRepositoryLoader.java
index e630c00..5f17e54 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/DefaultEntityConfigRepositoryLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/DefaultEntityConfigRepositoryLoader.java
@@ -1,336 +1,336 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

-

-package org.eclipse.mdm.api.odsadapter.lookup.config;

-

-import java.util.Locale;

-

-import org.eclipse.mdm.api.base.adapter.EntityType;

-import org.eclipse.mdm.api.base.adapter.Relation;

-import org.eclipse.mdm.api.base.model.Channel;

-import org.eclipse.mdm.api.base.model.ChannelGroup;

-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.Entity;

-import org.eclipse.mdm.api.base.model.Environment;

-import org.eclipse.mdm.api.base.model.Measurement;

-import org.eclipse.mdm.api.base.model.Parameter;

-import org.eclipse.mdm.api.base.model.ParameterSet;

-import org.eclipse.mdm.api.base.model.PhysicalDimension;

-import org.eclipse.mdm.api.base.model.Quantity;

-import org.eclipse.mdm.api.base.model.Sortable;

-import org.eclipse.mdm.api.base.model.Test;

-import org.eclipse.mdm.api.base.model.TestStep;

-import org.eclipse.mdm.api.base.model.Unit;

-import org.eclipse.mdm.api.base.model.User;

-import org.eclipse.mdm.api.dflt.model.CatalogAttribute;

-import org.eclipse.mdm.api.dflt.model.CatalogComponent;

-import org.eclipse.mdm.api.dflt.model.CatalogSensor;

-import org.eclipse.mdm.api.dflt.model.Pool;

-import org.eclipse.mdm.api.dflt.model.Project;

-import org.eclipse.mdm.api.dflt.model.Role;

-import org.eclipse.mdm.api.dflt.model.TemplateAttribute;

-import org.eclipse.mdm.api.dflt.model.TemplateComponent;

-import org.eclipse.mdm.api.dflt.model.TemplateRoot;

-import org.eclipse.mdm.api.dflt.model.TemplateSensor;

-import org.eclipse.mdm.api.dflt.model.TemplateTest;

-import org.eclipse.mdm.api.dflt.model.TemplateTestStep;

-import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;

-import org.eclipse.mdm.api.dflt.model.ValueList;

-import org.eclipse.mdm.api.dflt.model.ValueListValue;

-import org.eclipse.mdm.api.dflt.model.Versionable;

-import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;

-import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;

-import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;

-import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;

-import org.slf4j.Logger;

-import org.slf4j.LoggerFactory;

-

-public class DefaultEntityConfigRepositoryLoader  implements EntityConfigRepositoryLoader {

-

-	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEntityConfigRepositoryLoader.class);

-	

-	EntityConfigRepository entityConfigRepository;

-	

-	

-	public DefaultEntityConfigRepositoryLoader() {

-	}

-

-	/**

-	 * Loads the {@link EntityConfig}s.

-	 * @return 

-	 */

-	@Override

-	public EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager) {

-		LOGGER.debug("Loading entity configurations...");

-		long start = System.currentTimeMillis();

-

-		entityConfigRepository = new EntityConfigRepository();

-

-		entityConfigRepository.register(create(modelManager, new Key<>(Role.class), "Role", false));

-		

-		// Environment | Project | Pool | PhysicalDimension | User | Measurement

-		// | ChannelGroup

-		entityConfigRepository.register(create(modelManager, new Key<>(Environment.class), "Environment", false));

-		entityConfigRepository.register(create(modelManager, new Key<>(Project.class), "Project", false));

-		entityConfigRepository.register(create(modelManager, new Key<>(Pool.class), "StructureLevel", true));

-		entityConfigRepository.register(create(modelManager, new Key<>(PhysicalDimension.class), "PhysDimension", false));

-		entityConfigRepository.register(create(modelManager, new Key<>(User.class), "User", false));

-		entityConfigRepository.register(create(modelManager, new Key<>(Measurement.class), "MeaResult", false));

-		entityConfigRepository.register(create(modelManager, new Key<>(ChannelGroup.class), "SubMatrix", false));

-

-		// Unit

-		EntityConfig<Unit> unitConfig = create(modelManager, new Key<>(Unit.class), "Unit", false);

-		unitConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(PhysicalDimension.class)));

-		entityConfigRepository.register(unitConfig);

-

-		// Quantity

-		EntityConfig<Quantity> quantityConfig = create(modelManager, new Key<>(Quantity.class), "Quantity", false);

-		quantityConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));

-		entityConfigRepository.register(quantityConfig);

-

-		// Channel

-		EntityConfig<Channel> channelConfig = create(modelManager, new Key<>(Channel.class), "MeaQuantity", false);

-		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));

-		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));

-		entityConfigRepository.register(channelConfig);

-

-		// ValueList

-		EntityConfig<ValueListValue> valueListValueConfig = create(modelManager, new Key<>(ValueListValue.class), "ValueListValue",

-				true);

-		valueListValueConfig.setComparator(Sortable.COMPARATOR);

-		EntityConfig<ValueList> valueListConfig = create(modelManager, new Key<>(ValueList.class), "ValueList", true);

-		valueListConfig.addChild(valueListValueConfig);

-		entityConfigRepository.register(valueListConfig);

-

-		// ParameterSet

-		EntityConfig<Parameter> parameterConfig = create(modelManager, new Key<>(Parameter.class), "ResultParameter", true);

-		parameterConfig.addOptional(entityConfigRepository.findRoot(new Key<>(Unit.class)));

-		EntityConfig<ParameterSet> parameterSetConfig = create(modelManager, new Key<>(ParameterSet.class), "ResultParameterSet",

-				true);

-		parameterSetConfig.addChild(parameterConfig);

-		entityConfigRepository.register(parameterSetConfig);

-

-		// CatalogComponents

-		registerCatalogComponent(modelManager, ContextType.UNITUNDERTEST);

-		registerCatalogComponent(modelManager, ContextType.TESTSEQUENCE);

-		registerCatalogComponent(modelManager, ContextType.TESTEQUIPMENT);

-

-		// TemplateRoots

-		registerTemplateRoot(modelManager, ContextType.UNITUNDERTEST);

-		registerTemplateRoot(modelManager, ContextType.TESTSEQUENCE);

-		registerTemplateRoot(modelManager, ContextType.TESTEQUIPMENT);

-

-		// TemplateTestStep

-		EntityConfig<TemplateTestStep> templateTestStepConfig = create(modelManager, new Key<>(TemplateTestStep.class), "TplTestStep",

-				true);

-		templateTestStepConfig

-				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.UNITUNDERTEST)));

-		templateTestStepConfig

-				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.TESTSEQUENCE)));

-		templateTestStepConfig

-				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.TESTEQUIPMENT)));

-		templateTestStepConfig.setComparator(Versionable.COMPARATOR);

-		entityConfigRepository.register(templateTestStepConfig);

-

-		// Status TestStep

-		// TODO check MIME type genration

-		// entityConfigRepository.register(create(new Key<>(Status.class,

-		// TestStep.class), "StatusTestStep", true));

-

-		// TestStep

-		EntityConfig<TestStep> testStepConfig = create(modelManager, new Key<>(TestStep.class), "TestStep", true);

-		// testStepConfig.addMandatory(entityConfigRepository.findRoot(new

-		// Key<>(Status.class, TestStep.class)));

-		testStepConfig.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateTestStep.class)));

-		testStepConfig.setComparator(Sortable.COMPARATOR);

-		entityConfigRepository.register(testStepConfig);

-

-		// TemplateTest

-		EntityConfig<TemplateTestStepUsage> templateTestStepUsageConfig = create(modelManager, new Key<>(TemplateTestStepUsage.class),

-				"TplTestStepUsage", true);

-		templateTestStepUsageConfig.addMandatory(templateTestStepConfig);

-		templateTestStepUsageConfig.setComparator(Sortable.COMPARATOR);

-		EntityConfig<TemplateTest> templateTestConfig = create(modelManager, new Key<>(TemplateTest.class), "TplTest", true);

-		templateTestConfig.addChild(templateTestStepUsageConfig);

-		templateTestConfig.setComparator(Versionable.COMPARATOR);

-		entityConfigRepository.register(templateTestConfig);

-

-		// Status Test

-		// TODO check MIME type genration

-		// entityConfigRepository.register(create(new Key<>(Status.class,

-		// Test.class), "StatusTest", true));

-

-		// Test

-		EntityConfig<Test> testConfig = create(modelManager, new Key<>(Test.class), "Test", true);

-		testConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(User.class)));

-		// testConfig.addMandatory(entityConfigRepository.findRoot(new

-		// Key<>(Status.class, Test.class)));

-		testConfig.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateTest.class)));

-		entityConfigRepository.register(testConfig);

-

-		// ContextRoots

-		registerContextRoot(modelManager, ContextType.UNITUNDERTEST);

-		registerContextRoot(modelManager, ContextType.TESTSEQUENCE);

-		registerContextRoot(modelManager, ContextType.TESTEQUIPMENT);

-

-		LOGGER.debug("Entity configurations loaded in {} ms.", System.currentTimeMillis() - start);

-		return entityConfigRepository;

-	}

-

-	/**

-	 * Loads the {@link EntityConfig}s required for {@link ContextRoot} with

-	 * given {@link ContextType}.

-	 *

-	 * @param contextType

-	 *            The {@code ContextType}.

-	 */

-	private void registerContextRoot(ODSModelManager modelManager, ContextType contextType) {

-		EntityConfig<ContextRoot> contextRootConfig = create(modelManager, new Key<>(ContextRoot.class, contextType),

-				ODSUtils.CONTEXTTYPES.get(contextType), true);

-		contextRootConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, contextType)));

-		for (Relation contextComponentRelation : contextRootConfig.getEntityType().getChildRelations()) {

-			EntityType contextComponentEntityType = contextComponentRelation.getTarget();

-			EntityConfig<ContextComponent> contextComponentConfig = create(modelManager, 

-					new Key<>(ContextComponent.class, contextType), contextComponentEntityType.getName(), true);

-			contextComponentConfig

-					.addInherited(entityConfigRepository.findImplicit(new Key<>(TemplateComponent.class, contextType)));

-			contextRootConfig.addChild(contextComponentConfig);

-			if (contextType.isTestEquipment()) {

-				for (Relation contextSensorRelation : contextComponentEntityType.getChildRelations()) {

-					EntityType contextSensorEntityType = contextSensorRelation.getTarget();

-					EntityConfig<ContextSensor> contextSensorConfig = create(modelManager, new Key<>(ContextSensor.class),

-							contextSensorEntityType.getName(), true);

-					contextSensorConfig

-							.addInherited(entityConfigRepository.findImplicit(new Key<>(TemplateSensor.class)));

-					contextComponentConfig.addChild(contextSensorConfig);

-				}

-			}

-		}

-		entityConfigRepository.register(contextRootConfig);

-	}

-

-	/**

-	 * Loads the {@link EntityConfig}s required for {@link TemplateRoot} with

-	 * given {@link ContextType}.

-	 *

-	 * @param contextType

-	 *            The {@code ContextType}.

-	 */

-	private void registerTemplateRoot(ODSModelManager modelManager, ContextType contextType) {

-		String odsName = ODSUtils.CONTEXTTYPES.get(contextType);

-		EntityConfig<TemplateAttribute> templateAttributeConfig = create(modelManager, 

-				new Key<>(TemplateAttribute.class, contextType), "Tpl" + odsName + "Attr", true);

-		templateAttributeConfig

-				.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogAttribute.class, contextType)));

-		templateAttributeConfig.setComparator(TemplateAttribute.COMPARATOR);

-		EntityConfig<TemplateComponent> templateComponentConfig = create(modelManager, 

-				new Key<>(TemplateComponent.class, contextType), "Tpl" + odsName + "Comp", true);

-		templateComponentConfig.addChild(templateAttributeConfig);

-		templateComponentConfig

-				.addMandatory(entityConfigRepository.findRoot(new Key<>(CatalogComponent.class, contextType)));

-		templateComponentConfig.addChild(templateComponentConfig);

-		templateComponentConfig.setComparator(Sortable.COMPARATOR);

-		if (contextType.isTestEquipment()) {

-			EntityConfig<TemplateAttribute> templateSensorAttributeConfig = create(modelManager, new Key<>(TemplateAttribute.class),

-					"TplSensorAttr", true);

-			templateSensorAttributeConfig.setComparator(TemplateAttribute.COMPARATOR);

-			templateSensorAttributeConfig

-					.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogAttribute.class)));

-			EntityConfig<TemplateSensor> templateSensorConfig = create(modelManager, new Key<>(TemplateSensor.class), "TplSensor",

-					true);

-			templateSensorConfig.addChild(templateSensorAttributeConfig);

-			templateSensorConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));

-			templateSensorConfig.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogSensor.class)));

-			templateSensorConfig.setComparator(Sortable.COMPARATOR);

-			templateComponentConfig.addChild(templateSensorConfig);

-		}

-		EntityConfig<TemplateRoot> templateRootConfig = create(modelManager, new Key<>(TemplateRoot.class, contextType),

-				"Tpl" + odsName + "Root", true);

-		templateRootConfig.addChild(templateComponentConfig);

-		templateRootConfig.setComparator(Versionable.COMPARATOR);

-		entityConfigRepository.register(templateRootConfig);

-	}

-

-	/**

-	 * Loads the {@link EntityConfig}s required for {@link CatalogComponent}

-	 * with given {@link ContextType}.

-	 *

-	 * @param contextType

-	 *            The {@code ContextType}.

-	 */

-	private void registerCatalogComponent(ODSModelManager modelManager, ContextType contextType) {

-		String odsName = ODSUtils.CONTEXTTYPES.get(contextType);

-		EntityConfig<CatalogAttribute> catalogAttributeConfig = create(modelManager, new Key<>(CatalogAttribute.class, contextType),

-				"Cat" + odsName + "Attr", true);

-		catalogAttributeConfig.addOptional(entityConfigRepository.findRoot(new Key<>(ValueList.class)));

-		catalogAttributeConfig.setComparator(Sortable.COMPARATOR);

-		EntityConfig<CatalogComponent> catalogComponentConfig = create(modelManager, new Key<>(CatalogComponent.class, contextType),

-				"Cat" + odsName + "Comp", true);

-		catalogComponentConfig.addChild(catalogAttributeConfig);

-		if (contextType.isTestEquipment()) {

-			EntityConfig<CatalogAttribute> catalogSensorAttributeConfig = create(modelManager, new Key<>(CatalogAttribute.class),

-					"CatSensorAttr", true);

-			catalogSensorAttributeConfig.addOptional(entityConfigRepository.findRoot(new Key<>(ValueList.class)));

-			EntityConfig<CatalogSensor> catalogSensorConfig = create(modelManager, new Key<>(CatalogSensor.class), "CatSensor", true);

-			catalogSensorConfig.addChild(catalogSensorAttributeConfig);

-			catalogComponentConfig.addChild(catalogSensorConfig);

-		}

-		entityConfigRepository.register(catalogComponentConfig);

-	}

-

-	/**

-	 * Creates a new {@link EntityConfig}.

-	 *

-	 * @param <T>

-	 *            The entity type.

-	 * @param key

-	 *            Used as identifier.

-	 * @param typeName

-	 *            Name of the associated {@link EntityType}.

-	 * @param appendName

-	 *            Flag indicates whether to append the entity types base name to

-	 *            the MIME type.

-	 * @return The created {@code EntityConfig} is returned.

-	 */

-	private <T extends Entity> EntityConfig<T> create(ODSModelManager modelManager, Key<T> key, String typeName, boolean appendName) {

-		EntityConfig<T> entityConfig = new EntityConfig<>(key);

-		ODSEntityType entityType = (ODSEntityType) modelManager.getEntityType(typeName);

-		entityConfig.setEntityType(entityType);

-		entityConfig.setMimeType(buildDefaultMimeType(entityType, appendName));

-		return entityConfig;

-	}

-

-	/**

-	 * Creates a default MIME type for given {@link EntityType}.

-	 *

-	 * @param entityType

-	 *            The {@code EntityType}.

-	 * @param appendName

-	 *            Flag indicates whether to append the entity types base name to

-	 *            the MIME type.

-	 * @return The created MIME type {@code String} is returned.

-	 */

-	private String buildDefaultMimeType(ODSEntityType entityType, boolean appendName) {

-		StringBuilder sb = new StringBuilder();

-		sb.append("application/x-asam.");

-		sb.append(entityType.getBaseName().toLowerCase(Locale.ROOT));

-		if (appendName) {

-			sb.append('.').append(entityType.getName().toLowerCase(Locale.ROOT));

-		}

-		return sb.toString();

-	}

-}

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.odsadapter.lookup.config;
+
+import java.util.Locale;
+
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ChannelGroup;
+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.Entity;
+import org.eclipse.mdm.api.base.model.Environment;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.Parameter;
+import org.eclipse.mdm.api.base.model.ParameterSet;
+import org.eclipse.mdm.api.base.model.PhysicalDimension;
+import org.eclipse.mdm.api.base.model.Quantity;
+import org.eclipse.mdm.api.base.model.Sortable;
+import org.eclipse.mdm.api.base.model.Test;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Unit;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.Pool;
+import org.eclipse.mdm.api.dflt.model.Project;
+import org.eclipse.mdm.api.dflt.model.Role;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.dflt.model.TemplateComponent;
+import org.eclipse.mdm.api.dflt.model.TemplateRoot;
+import org.eclipse.mdm.api.dflt.model.TemplateSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateTest;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStep;
+import org.eclipse.mdm.api.dflt.model.TemplateTestStepUsage;
+import org.eclipse.mdm.api.dflt.model.ValueList;
+import org.eclipse.mdm.api.dflt.model.ValueListValue;
+import org.eclipse.mdm.api.dflt.model.Versionable;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig.Key;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class DefaultEntityConfigRepositoryLoader  implements EntityConfigRepositoryLoader {
+
+	private static final Logger LOGGER = LoggerFactory.getLogger(DefaultEntityConfigRepositoryLoader.class);
+	
+	EntityConfigRepository entityConfigRepository;
+	
+	
+	public DefaultEntityConfigRepositoryLoader() {
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s.
+	 * @return 
+	 */
+	@Override
+	public EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager) {
+		LOGGER.debug("Loading entity configurations...");
+		long start = System.currentTimeMillis();
+
+		entityConfigRepository = new EntityConfigRepository();
+
+		entityConfigRepository.register(create(modelManager, new Key<>(Role.class), "Role", false));
+		
+		// Environment | Project | Pool | PhysicalDimension | User | Measurement
+		// | ChannelGroup
+		entityConfigRepository.register(create(modelManager, new Key<>(Environment.class), "Environment", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Project.class), "Project", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Pool.class), "StructureLevel", true));
+		entityConfigRepository.register(create(modelManager, new Key<>(PhysicalDimension.class), "PhysDimension", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(User.class), "User", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(Measurement.class), "MeaResult", false));
+		entityConfigRepository.register(create(modelManager, new Key<>(ChannelGroup.class), "SubMatrix", false));
+
+		// Unit
+		EntityConfig<Unit> unitConfig = create(modelManager, new Key<>(Unit.class), "Unit", false);
+		unitConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(PhysicalDimension.class)));
+		entityConfigRepository.register(unitConfig);
+
+		// Quantity
+		EntityConfig<Quantity> quantityConfig = create(modelManager, new Key<>(Quantity.class), "Quantity", false);
+		quantityConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		entityConfigRepository.register(quantityConfig);
+
+		// Channel
+		EntityConfig<Channel> channelConfig = create(modelManager, new Key<>(Channel.class), "MeaQuantity", false);
+		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		channelConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));
+		entityConfigRepository.register(channelConfig);
+
+		// ValueList
+		EntityConfig<ValueListValue> valueListValueConfig = create(modelManager, new Key<>(ValueListValue.class), "ValueListValue",
+				true);
+		valueListValueConfig.setComparator(Sortable.COMPARATOR);
+		EntityConfig<ValueList> valueListConfig = create(modelManager, new Key<>(ValueList.class), "ValueList", true);
+		valueListConfig.addChild(valueListValueConfig);
+		entityConfigRepository.register(valueListConfig);
+
+		// ParameterSet
+		EntityConfig<Parameter> parameterConfig = create(modelManager, new Key<>(Parameter.class), "ResultParameter", true);
+		parameterConfig.addOptional(entityConfigRepository.findRoot(new Key<>(Unit.class)));
+		EntityConfig<ParameterSet> parameterSetConfig = create(modelManager, new Key<>(ParameterSet.class), "ResultParameterSet",
+				true);
+		parameterSetConfig.addChild(parameterConfig);
+		entityConfigRepository.register(parameterSetConfig);
+
+		// CatalogComponents
+		registerCatalogComponent(modelManager, ContextType.UNITUNDERTEST);
+		registerCatalogComponent(modelManager, ContextType.TESTSEQUENCE);
+		registerCatalogComponent(modelManager, ContextType.TESTEQUIPMENT);
+
+		// TemplateRoots
+		registerTemplateRoot(modelManager, ContextType.UNITUNDERTEST);
+		registerTemplateRoot(modelManager, ContextType.TESTSEQUENCE);
+		registerTemplateRoot(modelManager, ContextType.TESTEQUIPMENT);
+
+		// TemplateTestStep
+		EntityConfig<TemplateTestStep> templateTestStepConfig = create(modelManager, new Key<>(TemplateTestStep.class), "TplTestStep",
+				true);
+		templateTestStepConfig
+				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.UNITUNDERTEST)));
+		templateTestStepConfig
+				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.TESTSEQUENCE)));
+		templateTestStepConfig
+				.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, ContextType.TESTEQUIPMENT)));
+		templateTestStepConfig.setComparator(Versionable.COMPARATOR);
+		entityConfigRepository.register(templateTestStepConfig);
+
+		// Status TestStep
+		// TODO check MIME type genration
+		// entityConfigRepository.register(create(new Key<>(Status.class,
+		// TestStep.class), "StatusTestStep", true));
+
+		// TestStep
+		EntityConfig<TestStep> testStepConfig = create(modelManager, new Key<>(TestStep.class), "TestStep", true);
+		// testStepConfig.addMandatory(entityConfigRepository.findRoot(new
+		// Key<>(Status.class, TestStep.class)));
+		testStepConfig.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateTestStep.class)));
+		testStepConfig.setComparator(Sortable.COMPARATOR);
+		entityConfigRepository.register(testStepConfig);
+
+		// TemplateTest
+		EntityConfig<TemplateTestStepUsage> templateTestStepUsageConfig = create(modelManager, new Key<>(TemplateTestStepUsage.class),
+				"TplTestStepUsage", true);
+		templateTestStepUsageConfig.addMandatory(templateTestStepConfig);
+		templateTestStepUsageConfig.setComparator(Sortable.COMPARATOR);
+		EntityConfig<TemplateTest> templateTestConfig = create(modelManager, new Key<>(TemplateTest.class), "TplTest", true);
+		templateTestConfig.addChild(templateTestStepUsageConfig);
+		templateTestConfig.setComparator(Versionable.COMPARATOR);
+		entityConfigRepository.register(templateTestConfig);
+
+		// Status Test
+		// TODO check MIME type genration
+		// entityConfigRepository.register(create(new Key<>(Status.class,
+		// Test.class), "StatusTest", true));
+
+		// Test
+		EntityConfig<Test> testConfig = create(modelManager, new Key<>(Test.class), "Test", true);
+		testConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(User.class)));
+		// testConfig.addMandatory(entityConfigRepository.findRoot(new
+		// Key<>(Status.class, Test.class)));
+		testConfig.addOptional(entityConfigRepository.findRoot(new Key<>(TemplateTest.class)));
+		entityConfigRepository.register(testConfig);
+
+		// ContextRoots
+		registerContextRoot(modelManager, ContextType.UNITUNDERTEST);
+		registerContextRoot(modelManager, ContextType.TESTSEQUENCE);
+		registerContextRoot(modelManager, ContextType.TESTEQUIPMENT);
+
+		LOGGER.debug("Entity configurations loaded in {} ms.", System.currentTimeMillis() - start);
+		return entityConfigRepository;
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s required for {@link ContextRoot} with
+	 * given {@link ContextType}.
+	 *
+	 * @param contextType
+	 *            The {@code ContextType}.
+	 */
+	private void registerContextRoot(ODSModelManager modelManager, ContextType contextType) {
+		EntityConfig<ContextRoot> contextRootConfig = create(modelManager, new Key<>(ContextRoot.class, contextType),
+				ODSUtils.CONTEXTTYPES.get(contextType), true);
+		contextRootConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(TemplateRoot.class, contextType)));
+		for (Relation contextComponentRelation : contextRootConfig.getEntityType().getChildRelations()) {
+			EntityType contextComponentEntityType = contextComponentRelation.getTarget();
+			EntityConfig<ContextComponent> contextComponentConfig = create(modelManager, 
+					new Key<>(ContextComponent.class, contextType), contextComponentEntityType.getName(), true);
+			contextComponentConfig
+					.addInherited(entityConfigRepository.findImplicit(new Key<>(TemplateComponent.class, contextType)));
+			contextRootConfig.addChild(contextComponentConfig);
+			if (contextType.isTestEquipment()) {
+				for (Relation contextSensorRelation : contextComponentEntityType.getChildRelations()) {
+					EntityType contextSensorEntityType = contextSensorRelation.getTarget();
+					EntityConfig<ContextSensor> contextSensorConfig = create(modelManager, new Key<>(ContextSensor.class),
+							contextSensorEntityType.getName(), true);
+					contextSensorConfig
+							.addInherited(entityConfigRepository.findImplicit(new Key<>(TemplateSensor.class)));
+					contextComponentConfig.addChild(contextSensorConfig);
+				}
+			}
+		}
+		entityConfigRepository.register(contextRootConfig);
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s required for {@link TemplateRoot} with
+	 * given {@link ContextType}.
+	 *
+	 * @param contextType
+	 *            The {@code ContextType}.
+	 */
+	private void registerTemplateRoot(ODSModelManager modelManager, ContextType contextType) {
+		String odsName = ODSUtils.CONTEXTTYPES.get(contextType);
+		EntityConfig<TemplateAttribute> templateAttributeConfig = create(modelManager, 
+				new Key<>(TemplateAttribute.class, contextType), "Tpl" + odsName + "Attr", true);
+		templateAttributeConfig
+				.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogAttribute.class, contextType)));
+		templateAttributeConfig.setComparator(TemplateAttribute.COMPARATOR);
+		EntityConfig<TemplateComponent> templateComponentConfig = create(modelManager, 
+				new Key<>(TemplateComponent.class, contextType), "Tpl" + odsName + "Comp", true);
+		templateComponentConfig.addChild(templateAttributeConfig);
+		templateComponentConfig
+				.addMandatory(entityConfigRepository.findRoot(new Key<>(CatalogComponent.class, contextType)));
+		templateComponentConfig.addChild(templateComponentConfig);
+		templateComponentConfig.setComparator(Sortable.COMPARATOR);
+		if (contextType.isTestEquipment()) {
+			EntityConfig<TemplateAttribute> templateSensorAttributeConfig = create(modelManager, new Key<>(TemplateAttribute.class),
+					"TplSensorAttr", true);
+			templateSensorAttributeConfig.setComparator(TemplateAttribute.COMPARATOR);
+			templateSensorAttributeConfig
+					.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogAttribute.class)));
+			EntityConfig<TemplateSensor> templateSensorConfig = create(modelManager, new Key<>(TemplateSensor.class), "TplSensor",
+					true);
+			templateSensorConfig.addChild(templateSensorAttributeConfig);
+			templateSensorConfig.addMandatory(entityConfigRepository.findRoot(new Key<>(Quantity.class)));
+			templateSensorConfig.addInherited(entityConfigRepository.findImplicit(new Key<>(CatalogSensor.class)));
+			templateSensorConfig.setComparator(Sortable.COMPARATOR);
+			templateComponentConfig.addChild(templateSensorConfig);
+		}
+		EntityConfig<TemplateRoot> templateRootConfig = create(modelManager, new Key<>(TemplateRoot.class, contextType),
+				"Tpl" + odsName + "Root", true);
+		templateRootConfig.addChild(templateComponentConfig);
+		templateRootConfig.setComparator(Versionable.COMPARATOR);
+		entityConfigRepository.register(templateRootConfig);
+	}
+
+	/**
+	 * Loads the {@link EntityConfig}s required for {@link CatalogComponent}
+	 * with given {@link ContextType}.
+	 *
+	 * @param contextType
+	 *            The {@code ContextType}.
+	 */
+	private void registerCatalogComponent(ODSModelManager modelManager, ContextType contextType) {
+		String odsName = ODSUtils.CONTEXTTYPES.get(contextType);
+		EntityConfig<CatalogAttribute> catalogAttributeConfig = create(modelManager, new Key<>(CatalogAttribute.class, contextType),
+				"Cat" + odsName + "Attr", true);
+		catalogAttributeConfig.addOptional(entityConfigRepository.findRoot(new Key<>(ValueList.class)));
+		catalogAttributeConfig.setComparator(Sortable.COMPARATOR);
+		EntityConfig<CatalogComponent> catalogComponentConfig = create(modelManager, new Key<>(CatalogComponent.class, contextType),
+				"Cat" + odsName + "Comp", true);
+		catalogComponentConfig.addChild(catalogAttributeConfig);
+		if (contextType.isTestEquipment()) {
+			EntityConfig<CatalogAttribute> catalogSensorAttributeConfig = create(modelManager, new Key<>(CatalogAttribute.class),
+					"CatSensorAttr", true);
+			catalogSensorAttributeConfig.addOptional(entityConfigRepository.findRoot(new Key<>(ValueList.class)));
+			EntityConfig<CatalogSensor> catalogSensorConfig = create(modelManager, new Key<>(CatalogSensor.class), "CatSensor", true);
+			catalogSensorConfig.addChild(catalogSensorAttributeConfig);
+			catalogComponentConfig.addChild(catalogSensorConfig);
+		}
+		entityConfigRepository.register(catalogComponentConfig);
+	}
+
+	/**
+	 * Creates a new {@link EntityConfig}.
+	 *
+	 * @param <T>
+	 *            The entity type.
+	 * @param key
+	 *            Used as identifier.
+	 * @param typeName
+	 *            Name of the associated {@link EntityType}.
+	 * @param appendName
+	 *            Flag indicates whether to append the entity types base name to
+	 *            the MIME type.
+	 * @return The created {@code EntityConfig} is returned.
+	 */
+	private <T extends Entity> EntityConfig<T> create(ODSModelManager modelManager, Key<T> key, String typeName, boolean appendName) {
+		EntityConfig<T> entityConfig = new EntityConfig<>(key);
+		ODSEntityType entityType = (ODSEntityType) modelManager.getEntityType(typeName);
+		entityConfig.setEntityType(entityType);
+		entityConfig.setMimeType(buildDefaultMimeType(entityType, appendName));
+		return entityConfig;
+	}
+
+	/**
+	 * Creates a default MIME type for given {@link EntityType}.
+	 *
+	 * @param entityType
+	 *            The {@code EntityType}.
+	 * @param appendName
+	 *            Flag indicates whether to append the entity types base name to
+	 *            the MIME type.
+	 * @return The created MIME type {@code String} is returned.
+	 */
+	private String buildDefaultMimeType(ODSEntityType entityType, boolean appendName) {
+		StringBuilder sb = new StringBuilder();
+		sb.append("application/x-asam.");
+		sb.append(entityType.getBaseName().toLowerCase(Locale.ROOT));
+		if (appendName) {
+			sb.append('.').append(entityType.getName().toLowerCase(Locale.ROOT));
+		}
+		return sb.toString();
+	}
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepositoryLoader.java b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepositoryLoader.java
index 88b8f0f..80b205d 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepositoryLoader.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/lookup/config/EntityConfigRepositoryLoader.java
@@ -1,26 +1,26 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

-

-package org.eclipse.mdm.api.odsadapter.lookup.config;

-

-import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;

-

-public interface EntityConfigRepositoryLoader {

-

-	/**

-	 * Loads the {@link EntityConfigRepository}.

-	 * @return 

-	 */

-	EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager);

-}

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
+
+package org.eclipse.mdm.api.odsadapter.lookup.config;
+
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+
+public interface EntityConfigRepositoryLoader {
+
+	/**
+	 * Loads the {@link EntityConfigRepository}.
+	 * @return 
+	 */
+	EntityConfigRepository loadEntityConfigurations(ODSModelManager modelManager);
+}
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSEntityFactory.java b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSEntityFactory.java
index ec2a38e..14d5d19 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSEntityFactory.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSEntityFactory.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.query;
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSRelation.java b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSRelation.java
index f70933a..a623d0e 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSRelation.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/query/ODSRelation.java
@@ -66,7 +66,7 @@
 		this.target = target;
 		name = applRel.arName;
 		relationType = ODSUtils.RELATIONSHIPS.inverse().get(applRel.arRelationType);
-		rangeMax = applRel.arRelationRange.max;

+		rangeMax = applRel.arRelationRange.max;
 		invRangeMax = applRel.invRelationRange.max;
 	}
 
@@ -164,11 +164,11 @@
 	@Override
 	public boolean isIncoming(RelationType relationType) {
 		return relationType.equals(getRelationType()) && rangeMax == -1;
-	}

-	

-	@Override

-	public boolean isNtoM() {

-		return relationType == RelationType.INFO && rangeMax == -1 && invRangeMax == -1;

+	}
+	
+	@Override
+	public boolean isNtoM() {
+		return relationType == RelationType.INFO && rangeMax == -1 && invRangeMax == -1;
 	}
 
 }
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/InsertStatement.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/InsertStatement.java
index 1408064..b7fff30 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/InsertStatement.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/InsertStatement.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.transaction;
@@ -271,7 +271,7 @@
 		EntityType testStep = getEntityType();
 		EntityType test = getModelManager().getEntityType(Test.class);
 		Relation parentRelation = testStep.getRelation(test);
-

+
 		Attribute attrSortIndex = testStep.getAttribute(Sortable.ATTR_SORT_INDEX);
 		Query query = getQueryService().createQuery().select(parentRelation.getAttribute())
 				.select(attrSortIndex, Aggregation.MAXIMUM)
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/ODSTransaction.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/ODSTransaction.java
index 952c6b6..3fe7ce2 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/ODSTransaction.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/ODSTransaction.java
@@ -1,65 +1,65 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.transaction;
 
-import java.io.IOException;

-import java.util.ArrayList;

-import java.util.Collection;

-import java.util.Collections;

-import java.util.HashSet;

-import java.util.List;

-import java.util.Map;

-import java.util.Map.Entry;

-import java.util.Set;

-import java.util.UUID;

-import java.util.function.Function;

-import java.util.stream.Collectors;

-

-import org.asam.ods.AoException;

-import org.asam.ods.ElemId;

-import org.asam.ods.SetType;

-import org.asam.ods.T_LONGLONG;

-import org.eclipse.mdm.api.base.Transaction;

-import org.eclipse.mdm.api.base.adapter.Core;

-import org.eclipse.mdm.api.base.adapter.EntityType;

-import org.eclipse.mdm.api.base.adapter.Relation;

-import org.eclipse.mdm.api.base.massdata.WriteRequest;

-import org.eclipse.mdm.api.base.model.Channel;

-import org.eclipse.mdm.api.base.model.ContextRoot;

-import org.eclipse.mdm.api.base.model.Deletable;

-import org.eclipse.mdm.api.base.model.Entity;

-import org.eclipse.mdm.api.base.model.FileLink;

-import org.eclipse.mdm.api.base.model.Measurement;

-import org.eclipse.mdm.api.base.model.ScalarType;

-import org.eclipse.mdm.api.base.model.TestStep;

-import org.eclipse.mdm.api.base.model.Value;

-import org.eclipse.mdm.api.base.model.ValueType;

-import org.eclipse.mdm.api.base.query.DataAccessException;

-import org.eclipse.mdm.api.dflt.model.CatalogAttribute;

-import org.eclipse.mdm.api.dflt.model.CatalogComponent;

-import org.eclipse.mdm.api.dflt.model.CatalogSensor;

-import org.eclipse.mdm.api.dflt.model.TemplateAttribute;

-import org.eclipse.mdm.api.odsadapter.ODSContext;

-import org.eclipse.mdm.api.odsadapter.filetransfer.Transfer;

-import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;

-import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;

-import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;

-import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;

-import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;

-import org.slf4j.Logger;

+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.UUID;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import org.asam.ods.AoException;
+import org.asam.ods.ElemId;
+import org.asam.ods.SetType;
+import org.asam.ods.T_LONGLONG;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.adapter.Core;
+import org.eclipse.mdm.api.base.adapter.EntityType;
+import org.eclipse.mdm.api.base.adapter.Relation;
+import org.eclipse.mdm.api.base.massdata.WriteRequest;
+import org.eclipse.mdm.api.base.model.Channel;
+import org.eclipse.mdm.api.base.model.ContextRoot;
+import org.eclipse.mdm.api.base.model.Deletable;
+import org.eclipse.mdm.api.base.model.Entity;
+import org.eclipse.mdm.api.base.model.FileLink;
+import org.eclipse.mdm.api.base.model.Measurement;
+import org.eclipse.mdm.api.base.model.ScalarType;
+import org.eclipse.mdm.api.base.model.TestStep;
+import org.eclipse.mdm.api.base.model.Value;
+import org.eclipse.mdm.api.base.model.ValueType;
+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.model.CatalogAttribute;
+import org.eclipse.mdm.api.dflt.model.CatalogComponent;
+import org.eclipse.mdm.api.dflt.model.CatalogSensor;
+import org.eclipse.mdm.api.dflt.model.TemplateAttribute;
+import org.eclipse.mdm.api.odsadapter.ODSContext;
+import org.eclipse.mdm.api.odsadapter.filetransfer.Transfer;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
+import org.eclipse.mdm.api.odsadapter.query.ODSEntityType;
+import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
+import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
+import org.eclipse.mdm.api.odsadapter.utils.ODSUtils;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 /**
@@ -177,16 +177,16 @@
 			}
 
 			List<Measurement> measurements = (List<Measurement>) entitiesByClassType.get(Measurement.class);
-			if (measurements != null) {

-				// Use set here, since measurement siblings point to the same

-				// context roots. Only create those ContextRoots that haven't been created yet:

-				create(measurements.stream().map(ContextRoot::of)

-						.collect(HashSet<ContextRoot>::new, Set<ContextRoot>::addAll, Set<ContextRoot>::addAll)

+			if (measurements != null) {
+				// Use set here, since measurement siblings point to the same
+				// context roots. Only create those ContextRoots that haven't been created yet:
+				create(measurements.stream().map(ContextRoot::of)
+						.collect(HashSet<ContextRoot>::new, Set<ContextRoot>::addAll, Set<ContextRoot>::addAll)
 						.stream().filter(cr -> !ODSUtils.isValidID(cr.getID())).collect(Collectors.toSet()));
 			}
 
 			executeStatements(et -> new InsertStatement(this, et), entities);
-			processNtoMRelations(entities);

+			processNtoMRelations(entities);
 			
 			List<ContextRoot> roots = (List<ContextRoot>) entitiesByClassType.get(ContextRoot.class);
 			if (roots != null) {
@@ -234,7 +234,7 @@
 					getUploadService().upload(filtered, null);
 				}
 			}
-			executeStatements(et -> new UpdateStatement(this, et, false), entities);

+			executeStatements(et -> new UpdateStatement(this, et, false), entities);
 			processNtoMRelations(entities);
 		} catch (AoException e) {
 			throw new DataAccessException("Unable to update entities due to: " + e.reason, e);
@@ -502,55 +502,55 @@
 		}
 	}
 
-	/**

-	 * Processes N-to-M relations for the given entities

-	 * @param entities

-	 *            The processed {@code Entity}s.

-	 * @throws DataAccessException

-	 *             Thrown if the execution fails.

-	 */

-	private <T extends Entity> void processNtoMRelations(Collection<T> entities) {

-		for (Entity e : entities) {

-			context.getODSModelManager().getEntityType(e)

-				.getRelations()

-				.stream()

-				.filter(Relation::isNtoM)

-				.forEach(r -> processMtoMRelation(e, r));

-		}

-	}

-

-	private void processMtoMRelation(Entity entity, Relation relation) {

-		

-		List<? extends Deletable> removedRelatedEntities = ODSEntityFactory.extract(entity).getNtoMStore().getRemoved().getOrDefault(relation.getName(), Collections.emptyList());

-		List<? extends Deletable> addedRelatedEntities = ODSEntityFactory.extract(entity).getNtoMStore().getAdded().getOrDefault(relation.getName(), Collections.emptyList());

-		

-		T_LONGLONG[] removedInstIds = removedRelatedEntities.stream()

-				.map(Entity::getID)

-				.map(ODSConverter::toODSID)

-				.toArray(T_LONGLONG[]::new);

-		

-		T_LONGLONG[] addedInstIds = addedRelatedEntities.stream()

-				.map(Entity::getID)

-				.map(ODSConverter::toODSID)

-				.toArray(T_LONGLONG[]::new);

-

-		try {

-			if (removedInstIds.length > 0) {

-				ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));

-				ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));

-				context.getAoSession().getApplElemAccess().setRelInst(elemId, relation.getName(), removedInstIds, SetType.REMOVE);

-			}

-			

-			if (addedInstIds.length > 0) {

-				ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));

-				ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));

-				context.getAoSession().getApplElemAccess().setRelInst(elemId, relation.getName(), addedInstIds, SetType.APPEND);

-			}

-		} catch (AoException e) {

-			throw new DataAccessException("" + e.reason, e); // TODO

-		}

-	}

-

+	/**
+	 * Processes N-to-M relations for the given entities
+	 * @param entities
+	 *            The processed {@code Entity}s.
+	 * @throws DataAccessException
+	 *             Thrown if the execution fails.
+	 */
+	private <T extends Entity> void processNtoMRelations(Collection<T> entities) {
+		for (Entity e : entities) {
+			context.getODSModelManager().getEntityType(e)
+				.getRelations()
+				.stream()
+				.filter(Relation::isNtoM)
+				.forEach(r -> processMtoMRelation(e, r));
+		}
+	}
+
+	private void processMtoMRelation(Entity entity, Relation relation) {
+		
+		List<? extends Deletable> removedRelatedEntities = ODSEntityFactory.extract(entity).getNtoMStore().getRemoved().getOrDefault(relation.getName(), Collections.emptyList());
+		List<? extends Deletable> addedRelatedEntities = ODSEntityFactory.extract(entity).getNtoMStore().getAdded().getOrDefault(relation.getName(), Collections.emptyList());
+		
+		T_LONGLONG[] removedInstIds = removedRelatedEntities.stream()
+				.map(Entity::getID)
+				.map(ODSConverter::toODSID)
+				.toArray(T_LONGLONG[]::new);
+		
+		T_LONGLONG[] addedInstIds = addedRelatedEntities.stream()
+				.map(Entity::getID)
+				.map(ODSConverter::toODSID)
+				.toArray(T_LONGLONG[]::new);
+
+		try {
+			if (removedInstIds.length > 0) {
+				ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));
+				ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));
+				context.getAoSession().getApplElemAccess().setRelInst(elemId, relation.getName(), removedInstIds, SetType.REMOVE);
+			}
+			
+			if (addedInstIds.length > 0) {
+				ODSEntityType entityType = ((ODSEntityType) context.getODSModelManager().getEntityType(entity));
+				ElemId elemId = new ElemId(entityType.getODSID(), ODSConverter.toODSID(entity.getID()));
+				context.getAoSession().getApplElemAccess().setRelInst(elemId, relation.getName(), addedInstIds, SetType.APPEND);
+			}
+		} catch (AoException e) {
+			throw new DataAccessException("" + e.reason, e); // TODO
+		}
+	}
+
 	/**
 	 * Closes the co-session of this transaction.
 	 */
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UpdateStatement.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UpdateStatement.java
index 49040b4..300fcfd 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UpdateStatement.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/UpdateStatement.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.transaction;
@@ -38,8 +38,8 @@
 import org.eclipse.mdm.api.base.model.FileLink;
 import org.eclipse.mdm.api.base.model.FilesAttachable;
 import org.eclipse.mdm.api.base.model.Value;
-import org.eclipse.mdm.api.base.query.DataAccessException;

-import org.eclipse.mdm.api.dflt.model.Role;

+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.dflt.model.Role;
 import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfig;
 import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
 import org.eclipse.mdm.api.odsadapter.utils.ODSConverter;
@@ -126,10 +126,10 @@
 			if (nonUpdatableRelationNames.contains(entry.getKey())) {
 				// skip "empty" informative relation sequence
 				continue;
-			}

-			if (entry.getKey().equalsIgnoreCase(Role.ATTR_SUPERUSER_FLAG)) {

-				// skip superuser flag as it cannot be written through the ODS API

-				continue;

+			}
+			if (entry.getKey().equalsIgnoreCase(Role.ATTR_SUPERUSER_FLAG)) {
+				// skip superuser flag as it cannot be written through the ODS API
+				continue;
 			}
 
 			Attribute attribute = getEntityType().getAttribute(entry.getKey());
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/WriteRequestHandler.java b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/WriteRequestHandler.java
index 8a27cfd..86610a9 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/WriteRequestHandler.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/transaction/WriteRequestHandler.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.transaction;
@@ -137,20 +137,20 @@
 			ValueType<?> valueType = writeRequest.getRawScalarType().toValueType();
 			String unitName = writeRequest.getChannel().getUnit().getName();
 			values.put(AE_LC_ATTR_VALUES,
-					valueType.create(AE_LC_ATTR_VALUES, unitName, true, writeRequest.getValues()));

-			

-			// OpenATFX issue: For "implicit" columns, if no value for the GenerationParameters attribute is present,

-			// it is attempted to transfer the local column values (through which the generation parameters are

-			// available in these cases) to the GenerationParameters attribute without converting them to the 

-			// correct DS_DOUBLE data type first (unless it is a DOUBLE or LONG column), resulting in an exception.

-			// Hence, supply correctly converted generation parameters as a workaround:

-			if (writeRequest.getSequenceRepresentation().isImplicit()) {

-				Object genParamValues = writeRequest.getValues();

-				double[] genParamD = new double[Array.getLength(genParamValues)];

-				IntStream.range(0, genParamD.length)

-						.forEach(i -> genParamD[i] = ((Number) Array.get(genParamValues, i)).doubleValue());

-				values.get(AE_LC_ATTR_PARAMETERS).set(genParamD);

-			}

+					valueType.create(AE_LC_ATTR_VALUES, unitName, true, writeRequest.getValues()));
+			
+			// OpenATFX issue: For "implicit" columns, if no value for the GenerationParameters attribute is present,
+			// it is attempted to transfer the local column values (through which the generation parameters are
+			// available in these cases) to the GenerationParameters attribute without converting them to the 
+			// correct DS_DOUBLE data type first (unless it is a DOUBLE or LONG column), resulting in an exception.
+			// Hence, supply correctly converted generation parameters as a workaround:
+			if (writeRequest.getSequenceRepresentation().isImplicit()) {
+				Object genParamValues = writeRequest.getValues();
+				double[] genParamD = new double[Array.getLength(genParamValues)];
+				IntStream.range(0, genParamD.length)
+						.forEach(i -> genParamD[i] = ((Number) Array.get(genParamValues, i)).doubleValue());
+				values.get(AE_LC_ATTR_PARAMETERS).set(genParamD);
+			}
 
 			// flags
 			if (writeRequest.areAllValid()) {
diff --git a/src/main/java/org/eclipse/mdm/api/odsadapter/utils/ODSConverter.java b/src/main/java/org/eclipse/mdm/api/odsadapter/utils/ODSConverter.java
index 2df4f23..f0d146b 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/utils/ODSConverter.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/utils/ODSConverter.java
@@ -1,16 +1,16 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter.utils;
@@ -21,8 +21,8 @@
 import java.time.format.DateTimeFormatterBuilder;
 import java.time.format.DateTimeParseException;
 import java.time.temporal.ChronoField;
-import java.util.ArrayList;

-import java.util.Arrays;

+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -50,8 +50,8 @@
 import org.eclipse.mdm.api.base.model.Value;
 import org.eclipse.mdm.api.base.model.ValueType;
 import org.eclipse.mdm.api.base.query.Aggregation;
-import org.eclipse.mdm.api.base.query.DataAccessException;

-import org.eclipse.mdm.api.odsadapter.ReadRequestHandler;

+import org.eclipse.mdm.api.base.query.DataAccessException;
+import org.eclipse.mdm.api.odsadapter.ReadRequestHandler;
 import org.eclipse.mdm.api.odsadapter.query.ODSAttribute;
 
 import com.google.common.collect.Sets;
@@ -344,17 +344,17 @@
 			}
 		}
 	}
-

-	/**

-	 * Returns the name of the attribute with its applied aggregation as returned by the ODS Server,

-	 * for example: MAXIMUM(sortIndex)

-	 * @param attribute 

-	 * @param aggregation

-	 * @return the name of the attribute with the applied aggragation

-	 */

-	public static String getColumnName(Attribute attribute, Aggregation aggregation) {

-		return String.format("%s(%s)", aggregation.name(), attribute.getName());

-	}

+
+	/**
+	 * Returns the name of the attribute with its applied aggregation as returned by the ODS Server,
+	 * for example: MAXIMUM(sortIndex)
+	 * @param attribute 
+	 * @param aggregation
+	 * @return the name of the attribute with the applied aggragation
+	 */
+	public static String getColumnName(Attribute attribute, Aggregation aggregation) {
+		return String.format("%s(%s)", aggregation.name(), attribute.getName());
+	}
 	
 	private static String[] toString(int[] odsValues) {
 		return IntStream.of(odsValues).mapToObj(Integer::toString).toArray(String[]::new);
@@ -667,12 +667,12 @@
 	 */
 	public static List<MeasuredValues> fromODSMeasuredValuesSeq(NameValueSeqUnit[] odsMeasuredValuesSeq, ReadRequestHandler.ColumnAttributes[] columnAttributesArray)
 			throws DataAccessException {
-		List<MeasuredValues> measuredValues = new ArrayList<>(odsMeasuredValuesSeq.length);

-		

-		Map<String, ReadRequestHandler.ColumnAttributes> mapColumnAttributes = new HashMap<>();

-		if (null != columnAttributesArray)

-		{

-			Arrays.stream(columnAttributesArray).forEach(ca -> mapColumnAttributes.put(ca.getName(), ca));

+		List<MeasuredValues> measuredValues = new ArrayList<>(odsMeasuredValuesSeq.length);
+		
+		Map<String, ReadRequestHandler.ColumnAttributes> mapColumnAttributes = new HashMap<>();
+		if (null != columnAttributesArray)
+		{
+			Arrays.stream(columnAttributesArray).forEach(ca -> mapColumnAttributes.put(ca.getName(), ca));
 		}
 
 		for (NameValueSeqUnit odsMeasuredValues : odsMeasuredValuesSeq) {
@@ -739,19 +739,19 @@
 		} else {
 			throw new DataAccessException(
 					"Conversion for ODS measured points of type '" + dataType.toString() + "' does not exist.");
-		}

-		

-		if (null == columnAttributes)

-		{

-			columnAttributes = new ReadRequestHandler.ColumnAttributes("", null, new double[0], false, null);

+		}
+		
+		if (null == columnAttributes)
+		{
+			columnAttributes = new ReadRequestHandler.ColumnAttributes("", null, new double[0], false, null);
 		}
 
-		return scalarType.createMeasuredValues(odsMeasuredValues.valName,

-				odsMeasuredValues.unit, 

-				columnAttributes.getSequenceRepresentation(),

-				columnAttributes.getGenerationParameters(),

-				columnAttributes.isIndependentColumn(),

-				columnAttributes.getAxisType(),

+		return scalarType.createMeasuredValues(odsMeasuredValues.valName,
+				odsMeasuredValues.unit, 
+				columnAttributes.getSequenceRepresentation(),
+				columnAttributes.getGenerationParameters(),
+				columnAttributes.isIndependentColumn(),
+				columnAttributes.getAxisType(),
 				values,
 				fromODSValidFlagSeq(odsValueSeq.flag));
 	}
diff --git a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSRoleTest.java b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSRoleTest.java
index f136664..88a2f31 100644
--- a/src/test/java/org/eclipse/mdm/api/odsadapter/ODSRoleTest.java
+++ b/src/test/java/org/eclipse/mdm/api/odsadapter/ODSRoleTest.java
@@ -1,43 +1,43 @@
-/********************************************************************************

- * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation

- *

- * See the NOTICE file(s) distributed with this work for additional

- * information regarding copyright ownership.

- *

- * This program and the accompanying materials are made available under the

- * terms of the Eclipse Public License v. 2.0 which is available at

- * http://www.eclipse.org/legal/epl-2.0.

- *

- * SPDX-License-Identifier: EPL-2.0

- *

- ********************************************************************************/

+/********************************************************************************
+ * Copyright (c) 2015-2018 Contributors to the Eclipse Foundation
+ *
+ * See the NOTICE file(s) distributed with this work for additional
+ * information regarding copyright ownership.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v. 2.0 which is available at
+ * http://www.eclipse.org/legal/epl-2.0.
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ ********************************************************************************/
 
 
 package org.eclipse.mdm.api.odsadapter;
 
-import static org.assertj.core.api.Assertions.assertThat;

-import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;

-import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;

-import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;

-import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;

-

-import java.lang.reflect.InvocationTargetException;

-import java.util.Arrays;

-import java.util.HashMap;

-import java.util.List;

-import java.util.Map;

-

-import org.eclipse.mdm.api.base.ConnectionException;

-import org.eclipse.mdm.api.base.ServiceNotProvidedException;

-import org.eclipse.mdm.api.base.Transaction;

-import org.eclipse.mdm.api.base.model.User;

-import org.eclipse.mdm.api.dflt.ApplicationContext;

-import org.eclipse.mdm.api.dflt.EntityManager;

-import org.eclipse.mdm.api.dflt.model.EntityFactory;

-import org.eclipse.mdm.api.dflt.model.Role;

-import org.junit.AfterClass;

-import org.junit.BeforeClass;

-import org.slf4j.Logger;

+import static org.assertj.core.api.Assertions.assertThat;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_NAMESERVICE;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_PASSWORD;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_SERVICENAME;
+import static org.eclipse.mdm.api.odsadapter.ODSContextFactory.PARAM_USER;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import org.eclipse.mdm.api.base.ConnectionException;
+import org.eclipse.mdm.api.base.ServiceNotProvidedException;
+import org.eclipse.mdm.api.base.Transaction;
+import org.eclipse.mdm.api.base.model.User;
+import org.eclipse.mdm.api.dflt.ApplicationContext;
+import org.eclipse.mdm.api.dflt.EntityManager;
+import org.eclipse.mdm.api.dflt.model.EntityFactory;
+import org.eclipse.mdm.api.dflt.model.Role;
+import org.junit.AfterClass;
+import org.junit.BeforeClass;
+import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 //@Ignore
@@ -102,108 +102,108 @@
 			context.close();
 		}
 	}
-	

-	@org.junit.Test

-	public void testLoadRelatedUsers() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

-		User user = em.loadAll(User.class, "sa").get(0);

-		List<Role> role = em.loadRelatedEntities(user, "users2groups", Role.class);

-		

-		assertThat(role).hasSize(1).extracting(Role::getName).containsExactly("MDMSystemAdministrator");

-	}

-	

-	@org.junit.Test

-	public void testLoadRelatedRoles() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

-		Role role = em.loadAll(Role.class, "MDMSystemAdministrator").get(0);

-		List<User> user = em.loadRelatedEntities(role, "groups2users", User.class);

-		

-		assertThat(user).hasSize(1).extracting(User::getName).containsExactly("sa");

-	}

-	

-	@org.junit.Test

-	public void testCreateUserAndRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

-		String userName = "CreateUserAndRole";

-		String roleName = "CreateUserAndRole";

-			

-		try {

-			Transaction transaction = em.startTransaction();

-			User user = entityFactory.createUser(userName, "Test", "User");

-			Role role = entityFactory.createRole(roleName);

-			role.addUser(user);

-			

-			transaction.create(Arrays.asList(user, role));

-			transaction.commit();

-			

-			assertThat(em.loadRelatedEntities(role, "users2groups", User.class))

-				.hasSize(1)

-				.extracting(User::getName)

-				.contains(userName);

-			

-			assertThat(em.loadRelatedEntities(user, "groups2users", Role.class))

-				.hasSize(1)

-				.extracting(Role::getName)

-				.contains(roleName);

-		} finally {

-			Transaction transaction = em.startTransaction();

-			List<User> users = em.loadAll(User.class, userName);

-			transaction.delete(users);

-			List<Role> roles = em.loadAll(Role.class, roleName);

-			transaction.delete(roles);

-			transaction.commit();

-		}

-	}

-	

-	@org.junit.Test

-	public void testAddMultipleUsersToNewRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

-		String roleName = "AddMultipleUsersToNewRole";

-		try {

-			Transaction transaction = em.startTransaction();

-			List<User> users = em.loadAll(User.class);

-			Role role = entityFactory.createRole(roleName);

-			

-			users.forEach(u -> role.addUser(u));

-			transaction.create(Arrays.asList(role));

-			transaction.commit();

-			

-			assertThat(em.loadRelatedEntities(role, "users2groups", User.class))

-				.hasSize(users.size());

-		} finally {

-			Transaction transaction = em.startTransaction();

-			List<Role> roles = em.loadAll(Role.class, roleName);

-			transaction.delete(roles);

-			transaction.commit();

-		}

-	}

-	

-	@org.junit.Test

-	public void testRemoveUserFromRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {

-		String userName = "RemoveUserFromRole";

-		try {

-			Transaction transaction = em.startTransaction();

-			Role role = em.load(Role.class, "1");

-			User user = entityFactory.createUser(userName, "User", "User");

-			

-			role.addUser(user);

-			

-			transaction.create(Arrays.asList(user));

-			transaction.update(Arrays.asList(role));

-			transaction.commit();

-			

-			assertThat(em.loadRelatedEntities(role, "groups2users", User.class))

-				.hasSize(2);

-			

-			Role role2 = em.load(Role.class, "1");

-			transaction = em.startTransaction();

-			role2.removeUser(user);

-			transaction.update(Arrays.asList(role2));

-			transaction.commit();

-			

-			assertThat(em.loadRelatedEntities(role2, "groups2users", User.class))

-				.hasSize(1);

-		} finally {

-			Transaction transaction = em.startTransaction();

-			List<User> users = em.loadAll(User.class, userName);

-			transaction.delete(users);

-			transaction.commit();

-		}

+	
+	@org.junit.Test
+	public void testLoadRelatedUsers() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		User user = em.loadAll(User.class, "sa").get(0);
+		List<Role> role = em.loadRelatedEntities(user, "users2groups", Role.class);
+		
+		assertThat(role).hasSize(1).extracting(Role::getName).containsExactly("MDMSystemAdministrator");
+	}
+	
+	@org.junit.Test
+	public void testLoadRelatedRoles() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		Role role = em.loadAll(Role.class, "MDMSystemAdministrator").get(0);
+		List<User> user = em.loadRelatedEntities(role, "groups2users", User.class);
+		
+		assertThat(user).hasSize(1).extracting(User::getName).containsExactly("sa");
+	}
+	
+	@org.junit.Test
+	public void testCreateUserAndRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		String userName = "CreateUserAndRole";
+		String roleName = "CreateUserAndRole";
+			
+		try {
+			Transaction transaction = em.startTransaction();
+			User user = entityFactory.createUser(userName, "Test", "User");
+			Role role = entityFactory.createRole(roleName);
+			role.addUser(user);
+			
+			transaction.create(Arrays.asList(user, role));
+			transaction.commit();
+			
+			assertThat(em.loadRelatedEntities(role, "users2groups", User.class))
+				.hasSize(1)
+				.extracting(User::getName)
+				.contains(userName);
+			
+			assertThat(em.loadRelatedEntities(user, "groups2users", Role.class))
+				.hasSize(1)
+				.extracting(Role::getName)
+				.contains(roleName);
+		} finally {
+			Transaction transaction = em.startTransaction();
+			List<User> users = em.loadAll(User.class, userName);
+			transaction.delete(users);
+			List<Role> roles = em.loadAll(Role.class, roleName);
+			transaction.delete(roles);
+			transaction.commit();
+		}
+	}
+	
+	@org.junit.Test
+	public void testAddMultipleUsersToNewRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		String roleName = "AddMultipleUsersToNewRole";
+		try {
+			Transaction transaction = em.startTransaction();
+			List<User> users = em.loadAll(User.class);
+			Role role = entityFactory.createRole(roleName);
+			
+			users.forEach(u -> role.addUser(u));
+			transaction.create(Arrays.asList(role));
+			transaction.commit();
+			
+			assertThat(em.loadRelatedEntities(role, "users2groups", User.class))
+				.hasSize(users.size());
+		} finally {
+			Transaction transaction = em.startTransaction();
+			List<Role> roles = em.loadAll(Role.class, roleName);
+			transaction.delete(roles);
+			transaction.commit();
+		}
+	}
+	
+	@org.junit.Test
+	public void testRemoveUserFromRole() throws IllegalAccessException, IllegalArgumentException, InvocationTargetException {
+		String userName = "RemoveUserFromRole";
+		try {
+			Transaction transaction = em.startTransaction();
+			Role role = em.load(Role.class, "1");
+			User user = entityFactory.createUser(userName, "User", "User");
+			
+			role.addUser(user);
+			
+			transaction.create(Arrays.asList(user));
+			transaction.update(Arrays.asList(role));
+			transaction.commit();
+			
+			assertThat(em.loadRelatedEntities(role, "groups2users", User.class))
+				.hasSize(2);
+			
+			Role role2 = em.load(Role.class, "1");
+			transaction = em.startTransaction();
+			role2.removeUser(user);
+			transaction.update(Arrays.asList(role2));
+			transaction.commit();
+			
+			assertThat(em.loadRelatedEntities(role2, "groups2users", User.class))
+				.hasSize(1);
+		} finally {
+			Transaction transaction = em.startTransaction();
+			List<User> users = em.loadAll(User.class, userName);
+			transaction.delete(users);
+			transaction.commit();
+		}
 	}
 }