catch up with development

Signed-off-by: Ralf Mollik <ramollik@compex-commerce.com>
diff --git a/org.eclipse.osbp.dsl.metadata.service/.classpath b/org.eclipse.osbp.dsl.metadata.service/.classpath
index 43b9862..cf36b56 100644
--- a/org.eclipse.osbp.dsl.metadata.service/.classpath
+++ b/org.eclipse.osbp.dsl.metadata.service/.classpath
@@ -2,6 +2,6 @@
 <classpath>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="src" path="src/"/>
 	<classpathentry kind="output" path="target/classes"/>
 </classpath>
diff --git a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
index a7dcac9..171b5a6 100644
--- a/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
+++ b/org.eclipse.osbp.dsl.metadata.service/src/org/eclipse/osbp/dsl/metadata/service/DSLBuilderParticipant.java
@@ -44,7 +44,11 @@
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
 import org.eclipse.osbp.dsl.semantic.common.types.LTypedPackage;
+import org.eclipse.osbp.dsl.semantic.common.types.OSBPTypesPackage;
+import org.eclipse.osbp.dsl.semantic.dto.LAutoInheritDto;
 import org.eclipse.osbp.dsl.semantic.dto.LDto;
+import org.eclipse.osbp.dsl.semantic.dto.LDtoAttribute;
+import org.eclipse.osbp.dsl.semantic.dto.OSBPDtoPackage;
 import org.eclipse.osbp.dsl.semantic.entity.LEntity;
 import org.eclipse.osbp.dsl.xtext.types.bundles.BundleSpaceTypeProvider;
 import org.eclipse.osbp.ecview.dsl.extensions.SuperTypeCollector;
@@ -144,9 +148,11 @@
 import org.eclipse.persistence.internal.jpa.deployment.SEPersistenceUnitInfo;
 import org.eclipse.persistence.jpa.Archive;
 import org.eclipse.persistence.jpa.PersistenceProvider;
+import org.eclipse.xtext.EcoreUtil2;
 import org.eclipse.xtext.common.types.JvmDeclaredType;
 import org.eclipse.xtext.common.types.JvmTypeReference;
 import org.eclipse.xtext.resource.IEObjectDescription;
+import org.eclipse.xtext.resource.IReferenceDescription;
 import org.eclipse.xtext.util.Pair;
 import org.eclipse.xtext.util.Tuples;
 import org.osgi.framework.Bundle;
@@ -502,14 +508,13 @@
 					
 					// let the empty value be the one with the closest distance, so it will not be used if there is something better! 
 					int distanceFromKey = 0;
+					int distanceFromPrevious = 0;
 					if ( value != null && value.length() > 0 ) {
 						distanceFromKey = StringUtils.getLevenshteinDistance(value, element);
-					}
-
-					String prevValue = properties.getProperty(element);
-					int distanceFromPrevious = 0;
-					if (prevValue != null && value.length() > 0 ) {
-						distanceFromPrevious = StringUtils.getLevenshteinDistance(prevValue, element);
+						String prevValue = properties.getProperty(element);
+						if (prevValue != null && value.length() > 0 ) {
+							distanceFromPrevious = StringUtils.getLevenshteinDistance(prevValue, element);
+						}
 					}
 					
 					if (distanceFromKey > 1 && distanceFromKey > distanceFromPrevious) {
@@ -1001,17 +1006,34 @@
 			return osbee;
 		}
 
+		/* (non-Javadoc)
+		 * @see org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getEntityClassLoader(java.lang.String)
+		 */
+		@Override
+		public ClassLoader getEntityClassLoader(String className) {
+			return entityClassLoaders.get(className.substring(0, className.lastIndexOf('.')));
+		}
 		
 		/* (non-Javadoc)
 		 * @see org.eclipse.osbp.ui.api.metadata.IDSLMetadataService#getClassLoader(java.lang.String)
 		 */
-		@Override
-		public ClassLoader getClassLoader(String className) {
-			for(Entry<String, ClassLoader> entityBundle:entityClassLoaders.entrySet()) {
-				if(className.startsWith(entityBundle.getKey())) {
-					return entityBundle.getValue();
+		public ClassLoader getClassLoader(String fqn, String extension) {
+			if (dslBundles.containsKey(extension)) {
+				for (Bundle bundle : dslBundles.get(extension)) {
+					BundleWiring bundleWiring = bundle.adapt(BundleWiring.class);
+					ClassLoader classLoader = bundleWiring.getClassLoader();
+					Class<?> clz = null;
+					try {
+						clz = classLoader.loadClass(fqn);
+					} catch (ClassNotFoundException e) {
+						// nothing to do
+					}
+					if (clz != null) {
+						return classLoader;
+					}
 				}
 			}
+			log.error("classLoader for class {} could not be found for extension {}", fqn, extension);
 			return null;
 		}
 
@@ -1277,6 +1299,29 @@
 			});
 			return !result.isEmpty();
 		}
+		
+		@Override
+		public Set<String> getDTOsForStateClass(String stateClassName) {
+			Set<String> result = new HashSet<>();
+			Iterable<IEObjectDescription> allDescs = getAllDescriptions(OSBPDtoPackage.Literals.LDTO_ATTRIBUTE);
+			Iterator<IEObjectDescription> iter = allDescs.iterator();
+			while (iter.hasNext()) {
+				IEObjectDescription desc = iter.next();
+				EObject attr = desc.getEObjectOrProxy();
+				if(attr instanceof LDtoAttribute) {
+					if(attr.eIsProxy()) {
+						attr = metadataBuilderService.resolve(attr);
+					}
+					String pkgName = ((LTypedPackage)attr.eContainer().eContainer()).getName();
+					if(stateClassName.equals(pkgName+"."+((LDtoAttribute) attr).getType().getName())) {
+						if(attr.eContainer() instanceof LAutoInheritDto) {
+							result.add(pkgName+"."+((LAutoInheritDto)attr.eContainer()).getName());
+						}
+					}
+				}
+			}
+			return result;
+		}
 	}
 
 	/**