Merge remote-tracking branch 'origin/master' into anehmer/integration
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 d2de0a5..71e4391 100644
--- a/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java
+++ b/src/main/java/org/eclipse/mdm/api/odsadapter/ODSContext.java
@@ -32,6 +32,7 @@
 import org.eclipse.mdm.api.odsadapter.filetransfer.CORBAFileService;
 import org.eclipse.mdm.api.odsadapter.filetransfer.Transfer;
 import org.eclipse.mdm.api.odsadapter.lookup.EntityLoader;
+import org.eclipse.mdm.api.odsadapter.lookup.config.EntityConfigRepositoryLoader;
 import org.eclipse.mdm.api.odsadapter.notification.ODSNotificationServiceFactory;
 import org.eclipse.mdm.api.odsadapter.query.ODSEntityFactory;
 import org.eclipse.mdm.api.odsadapter.query.ODSModelManager;
@@ -77,7 +78,7 @@
 		this.fileServer = fileServer;
 		this.parameters = parameters;
 
-		this.modelManager = new ODSModelManager(orb, aoSession);
+		this.modelManager = initModelManager(orb, aoSession);
 		this.queryService = new ODSQueryService(this.modelManager);
 		this.entityManager = new ODSEntityManager(this);
 		this.entityLoader = new EntityLoader(modelManager, queryService);
@@ -85,6 +86,39 @@
 		LOGGER.debug("ODSContext initialized.");
 	}
 
+	private static final String ENTITYCONFIGREPOSITORYLOADERCLASS_ATTRIBUTE_NAME = "entityConfigRepositoryLoaderClass";
+
+	/**
+	 * Initializes the ODSModelManager with an optionally configured
+	 * {@link EntityConfigRepositoryLoader} in service.xml
+	 * 
+	 * @return The initialized {@link ODSModelManager}
+	 */
+	private ODSModelManager initModelManager(ORB orb, AoSession aoSession) throws AoException {
+		// check parameters for configured custom EntityConfigRepositoryLoader
+		String entityConfigRepositoryLoaderClassName = parameters.get(ENTITYCONFIGREPOSITORYLOADERCLASS_ATTRIBUTE_NAME);
+
+		// if custom loader is configured
+		if (entityConfigRepositoryLoaderClassName != null) {
+			EntityConfigRepositoryLoader entityConfigRepositoryLoader;
+			try {
+				entityConfigRepositoryLoader = Thread.currentThread().getContextClassLoader()
+						.loadClass(entityConfigRepositoryLoaderClassName).asSubclass(EntityConfigRepositoryLoader.class)
+						.newInstance();
+			} catch (Exception e) {
+				// just log an error, but recover using the default loader
+				LOGGER.error("Failed to initialize EntityConfigRepositoryLoaderClass. Using default.", e);
+				return new ODSModelManager(orb, aoSession);
+			}
+
+			return new ODSModelManager(orb, aoSession, entityConfigRepositoryLoader);
+		}
+		// if not, use default
+		else {
+			return new ODSModelManager(orb, aoSession);
+		}
+	}
+
 	/**
 	 * {@inheritDoc}
 	 */
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 82529f5..adbf57e 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
@@ -321,7 +321,7 @@
 	 *                   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,
+	public <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);
@@ -347,4 +347,4 @@
 		}
 		return sb.toString();
 	}
-}
+}
\ No newline at end of file