Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgkessler2009-08-05 23:53:12 +0000
committergkessler2009-08-05 23:53:12 +0000
commit90fd504aa6a89fe4bd4e21149bb2f0026955a242 (patch)
tree329699eaa71c9ff2132c5a9ecc970cbc11edb52f
parenteb07d18c47a140fca3ecf7aca326f8e2d04a96dc (diff)
downloadwebtools.jsf-90fd504aa6a89fe4bd4e21149bb2f0026955a242.tar.gz
webtools.jsf-90fd504aa6a89fe4bd4e21149bb2f0026955a242.tar.xz
webtools.jsf-90fd504aa6a89fe4bd4e21149bb2f0026955a242.zip
[282936] Serious metadata loading performance issues when many files and include groups
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java32
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java20
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java19
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java7
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java121
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java2
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java6
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java15
8 files changed, 147 insertions, 75 deletions
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
index 7cfa87a17..01a38e61b 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java
@@ -135,25 +135,23 @@ public class DomainLoadingStrategy implements IDomainLoadingStrategy, IMetaDataO
List/*<IMetaDataSourceModelProvider>*/ sources = new ArrayList/*<IMetaDataSourceModelProvider>*/();
for (Iterator/*<IDomainSourceModelType>*/ it = sourceTypes.iterator();it.hasNext();){
IDomainSourceModelType sourceType = (IDomainSourceModelType)it.next();
- IMetaDataLocator locator = sourceType.getLocator();
- //We MUST set the sourceType here to associate the handler with locator to use for the source models
- locator.setDomainSourceModelType(sourceType);
-
- //set project context in locator for those that care
- if (locator instanceof IPathSensitiveMetaDataLocator)
- ((IPathSensitiveMetaDataLocator)locator).setProjectContext(model.getModelKey().getProject());
-
- List/*<IMetaDataSourceModelProvider>*/ providers = sourceType.getLocator().locateMetaDataModelProviders(model.getModelKey().getUri());
- if (providers != null && !providers.isEmpty()){
- for (Iterator mdProviders =providers.iterator();mdProviders.hasNext();){
- IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)mdProviders.next();
- //We MUST set the sourceType here to associate the translators to use for the source models
- provider.setLocator(sourceType.getLocator());
- sources.add(provider);
+ IMetaDataLocator locator = sourceType.getLocator(model.getModelKey().getProject());
+ if (locator != null) {
+ //We MUST set the sourceType here to associate the handler with locator to use for the source models
+ locator.setDomainSourceModelType(sourceType);
+
+ List/*<IMetaDataSourceModelProvider>*/ providers = locator.locateMetaDataModelProviders(model.getModelKey().getUri());
+ if (providers != null && !providers.isEmpty()){
+ for (Iterator mdProviders =providers.iterator();mdProviders.hasNext();){
+ IMetaDataSourceModelProvider provider = (IMetaDataSourceModelProvider)mdProviders.next();
+ //We MUST set the sourceType here to associate the translators to use for the source models
+ provider.setLocator(locator);
+ sources.add(provider);
+ }
}
+ //listen for changes
+ locator.addObserver(this);
}
- //listen for changes
- sourceType.getLocator().addObserver(this);
}
return sources;
}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
index e72babf6e..dd623ca5d 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java
@@ -15,6 +15,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
+import org.eclipse.core.resources.IProject;
import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.IExtensionRegistry;
@@ -36,7 +37,6 @@ public class DomainSourceModelTypeDescriptor {
private Set translatorDescriptors;
private String bundleId = JSFCommonPlugin.PLUGIN_ID;
private int ordinal;
- private IDomainSourceModelType _instance;
/**
* Constructor
@@ -98,19 +98,9 @@ public class DomainSourceModelTypeDescriptor {
}
/**
- * @return singleton instance of the {@link IDomainSourceModelType}
+ * @return new instance of the {@link IDomainSourceModelType}
*/
public IDomainSourceModelType getInstance(){
- if (_instance == null){
- _instance = newInstance();
- }
- return _instance;
- }
- /**
- * @return new instance of {@link IDomainSourceModelType}
- */
- private IDomainSourceModelType newInstance(){
-
return new DomainSourceModelTypeImpl();
}
@@ -143,9 +133,9 @@ public class DomainSourceModelTypeDescriptor {
/* (non-Javadoc)
* @see org.eclipse.jst.jsf.common.metadata.internal.IDomainSourceModelType#getLocator()
*/
- public IMetaDataLocator getLocator() {
+ public IMetaDataLocator getLocator(IProject project) {
if (locator == null){
- locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId);
+ locator = MetaDataLocatorFactory.getInstance().getLocator(locatorClassName, bundleId, project);
}
return locator;
@@ -169,7 +159,7 @@ public class DomainSourceModelTypeDescriptor {
buf.append("(domain = "); //$NON-NLS-1$
buf.append(getDomain());
buf.append(", locator = "); //$NON-NLS-1$
- buf.append(getLocator());
+ buf.append(locator != null ? locator.toString() : "null"); //$NON-NLS-1$
buf.append(")"); //$NON-NLS-1$
return buf.toString();
}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
index 47300eeaa..000fdef91 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceTypesRegistry.java
@@ -33,7 +33,6 @@ public class DomainSourceTypesRegistry{
private static final String EXTENSION_POINT_ID = "domainSourceModelTypes"; //$NON-NLS-1$
private static DomainSourceTypesRegistry INSTANCE;
private Map/*<String, List/*<DomainSourceModelTypeDescriptor>>*/ domainSourceTypeDescriptors;
- private Map/*<String, List/*<IDomainSourceModelType>*/ domainSourceTypes;
private DomainSourceTypesRegistry(){
init();
@@ -53,10 +52,7 @@ public class DomainSourceTypesRegistry{
* @param domain identifier
* @return list of <code>IDomainSourceModelType</code> sorted in descending order by ordinal
*/
- public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
- if (getDomainSourceTypes().containsKey(domain))
- return (List)getDomainSourceTypes().get(domain);
-
+ public List/*<IDomainSourceModelType>*/ getDomainSourceTypes(String domain){
List/*<DomainSourceModelTypeDescriptor>*/ list = getDomainSourceModelDescriptors(domain);
List/*<IDomainSourceModelType>*/ types = new ArrayList/*<IDomainSourceModelType>*/();
for(Iterator/*<DomainSourceModelTypeDescriptor>*/ it=list.iterator();it.hasNext();){
@@ -78,7 +74,6 @@ public class DomainSourceTypesRegistry{
});
- getDomainSourceTypes().put(domain, types);
return types;
}
@@ -134,11 +129,11 @@ public class DomainSourceTypesRegistry{
return domainSourceTypeDescriptors;
}
- private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
- if (domainSourceTypes == null){
- domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
- }
- return domainSourceTypes;
- }
+// private Map/*<String, List/*<IDomainSourceModelType>>*/ getDomainSourceTypes() {
+// if (domainSourceTypes == null){
+// domainSourceTypes = new HashMap/*<String, List/*<IDomainSourceModelType>>*/();
+// }
+// return domainSourceTypes;
+// }
} \ No newline at end of file
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
index 296c4a7a2..67ed29214 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/IDomainSourceModelType.java
@@ -13,6 +13,8 @@ package org.eclipse.jst.jsf.common.metadata.internal;
import java.util.Set;
+import org.eclipse.core.resources.IProject;
+
/**
* Binds a domain of metadata to a source model type which is defined by a {@link IMetaDataLocator}
* and set of {@link IMetaDataTranslator}s
@@ -24,9 +26,10 @@ public interface IDomainSourceModelType {
*/
public String getDomain();
/**
- * @return IMetaDataLocator
+ * @param project - may be null
+ * @return instance of IMetaDataLocator - may return null if the locator cannot operate in the current context
*/
- public IMetaDataLocator getLocator();
+ public IMetaDataLocator getLocator(IProject project);
// public int getOrdinal();
/**
* @return set of {@link IMetaDataTranslator}s for the domain source model type
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
index dcbf05df0..a590590ec 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataLocatorFactory.java
@@ -10,10 +10,17 @@
*******************************************************************************/
package org.eclipse.jst.jsf.common.metadata.internal;
+import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
+import java.util.List;
import java.util.Map;
+import java.util.StringTokenizer;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResourceChangeEvent;
+import org.eclipse.core.resources.IResourceChangeListener;
+import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
@@ -21,55 +28,83 @@ import org.eclipse.jst.jsf.common.JSFCommonPlugin;
* Creates instances of IMetaDataLocators and caches them so that there is only one instance of a particular locator
* when client requests one.
*/
-public class MetaDataLocatorFactory {
+public class MetaDataLocatorFactory
+ implements IResourceChangeListener {
+
private static MetaDataLocatorFactory INSTANCE = null;
+ private Map<String, IMetaDataLocator> _locators;
+ private static final boolean DEBUG = false;
/**
* @return singleton instance of the MetaDataLocatorFactory
*/
public synchronized static MetaDataLocatorFactory getInstance(){
if (INSTANCE == null){
INSTANCE = new MetaDataLocatorFactory();
+ ResourcesPlugin.getWorkspace().addResourceChangeListener(INSTANCE, IResourceChangeEvent.PRE_CLOSE);
}
return INSTANCE;
}
- private HashMap _locators;
- private Map getLocators() {
+
+ private Map<String, IMetaDataLocator> getLocators() {
if (_locators == null){
- _locators = new HashMap();
+ _locators = new HashMap<String, IMetaDataLocator>();
}
return _locators;
}
/**
- * @param locatorClassName
- * @param bundleId
- * @return IMetaDataLocator
+ * @param locatorClassName - may NOT be null
+ * @param bundleId - may NOT be null
+ * @param project - may be null
+ * @return shared instance of IMetaDataLocator
+ * may return null if is IPathSensitiveMetaDataLocator and there is no project context
*/
- public IMetaDataLocator getLocator(String locatorClassName, String bundleId){
+ public IMetaDataLocator getLocator(final String locatorClassName, final String bundleId, final IProject project){
+ final Class klass = JSFCommonPlugin.loadClass(locatorClassName, bundleId);
String key = getKey(locatorClassName, bundleId);
- IMetaDataLocator locator = (IMetaDataLocator)getLocators().get(key);
- if (locator == null){
- Class klass = JSFCommonPlugin.loadClass(locatorClassName, bundleId);
- try {
- locator = (IMetaDataLocator)klass.newInstance();
- if (locator != null) {
+ IMetaDataLocator locator = null;
+ try {
+ IMetaDataLocator tempLocator = (IMetaDataLocator)klass.newInstance();
+ if (tempLocator != null) {
+ if (tempLocator instanceof IPathSensitiveMetaDataLocator) {
+ if (project == null)
+ return null;
+
+ key = getKey(locatorClassName, project.getName());
+ }
+
+ locator = getLocators().get(key);
+ if (locator == null) {
+ locator = tempLocator;
+ if (locator instanceof IPathSensitiveMetaDataLocator)
+ ((IPathSensitiveMetaDataLocator)locator).setProjectContext(project);
+
+ if (DEBUG)
+ System.out.println("Created locator: "+locator.toString()); //$NON-NLS-1$
+
getLocators().put(key, locator);
locator.startLocating();
}
- } catch (InstantiationException e) {
- JSFCommonPlugin.log(IStatus.ERROR, "Could not instantiate IMetaDataLocator: "+key, e); //$NON-NLS-1$
- } catch (IllegalAccessException e) {
- JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException while creating IMetaDataLocator: "+key, e); //$NON-NLS-1$
}
+ } catch (InstantiationException e) {
+ JSFCommonPlugin.log(IStatus.ERROR, "Could not instantiate IMetaDataLocator: "+key, e); //$NON-NLS-1$
+ } catch (IllegalAccessException e) {
+ JSFCommonPlugin.log(IStatus.ERROR, "IllegalAccessException while creating IMetaDataLocator: "+key, e); //$NON-NLS-1$
}
+
return locator;
}
- private String getKey(String locatorClassName, String bundleId) {
- StringBuffer buf = new StringBuffer(bundleId);
+ /**
+ * @param locatorClassName
+ * @param contextId - this may be the bundleID or the projectName if it is a path sensitive locator
+ * @return key
+ */
+ private String getKey(final String locatorClassName, final String contextId) {
+ StringBuffer buf = new StringBuffer(contextId);
buf.append(":"); //$NON-NLS-1$
buf.append(locatorClassName);
return buf.toString();
@@ -79,10 +114,56 @@ public class MetaDataLocatorFactory {
* Stops and disposes all locators
*/
public void dispose(){
+ ResourcesPlugin.getWorkspace().removeResourceChangeListener(this);
for (Iterator it=getLocators().values().iterator();it.hasNext();){
IMetaDataLocator locator = (IMetaDataLocator)it.next();
locator.stopLocating();
}
getLocators().clear();
}
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org
+ * .eclipse.core.resources.IResourceChangeEvent)
+ */
+ public void resourceChanged(final IResourceChangeEvent event) {
+ if (event.getType() == IResourceChangeEvent.PRE_CLOSE
+ || event.getType() == IResourceChangeEvent.PRE_DELETE) {
+ // a project is closing - release and cleanup
+ final IProject aProject = (IProject) event.getResource();
+
+ if (aProject != null) {
+ List<String> locatorsToRemove = new ArrayList<String>();
+ for (Iterator it=getLocators().keySet().iterator();it.hasNext();){
+ String key = (String)it.next();
+ if (locatorIsForProject(key, aProject.getName())) {
+ locatorsToRemove.add(key);
+ }
+ }
+
+ if (! locatorsToRemove.isEmpty()) {
+ for (String key : locatorsToRemove) {
+ IMetaDataLocator locator = getLocators().get(key);
+
+ if (DEBUG)
+ System.out.println("Removed locator: "+locator.toString()); //$NON-NLS-1$
+
+ locator.stopLocating();
+ getLocators().remove(key);
+ }
+ }
+ }
+ }
+ }
+
+ private boolean locatorIsForProject(final String key, final String projectName) {
+ StringTokenizer t = new StringTokenizer(key, ":"); //$NON-NLS-1$
+ String contextId = t.nextToken();
+ if (contextId.equals(projectName))
+ return true;
+ return false;
+ }
}
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
index fc75d28bd..a2b9476f3 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java
@@ -140,7 +140,7 @@ public class MetaDataModelManager implements IResourceChangeListener{
StandardModelFactory.debug(">START getModel: "+modelKeyDescriptor, StandardModelFactory.DEBUG_MD_GET); //$NON-NLS-1$
MetaDataModel model = models.get(modelKeyDescriptor);
- if (model == null || project == null) {
+ if (model == null || project == null) { //<--- why is the project == null test here?!?!
// long in = System.currentTimeMillis();
model = loadMetadata(modelKeyDescriptor);
//System.out.println("Time to load "+modelContext.getURI()+": "+
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
index 91134492c..49f9aa4f7 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java
@@ -43,7 +43,6 @@ public class MetaDataModelMergeAssistantImpl implements
IMetaDataModelMergeAssistant {
private MetaDataModel mergedModel;
- private Copier copier;
private SimpleEntityQueryVisitorImpl entityVisitor;
private SimpleTraitQueryVisitorImpl traitVisitor;
private IMetaDataSourceModelProvider provider;
@@ -54,7 +53,6 @@ public class MetaDataModelMergeAssistantImpl implements
*/
public MetaDataModelMergeAssistantImpl(MetaDataModel model) {
this.mergedModel = model;
- copier = new Copier();
entityVisitor = new SimpleEntityQueryVisitorImpl(new HierarchicalSearchControl(1,
HierarchicalSearchControl.SCOPE_ALL_LEVELS));
traitVisitor = new SimpleTraitQueryVisitorImpl(new SearchControl(1));
@@ -175,6 +173,7 @@ public class MetaDataModelMergeAssistantImpl implements
}
private /*synchronized*/ Entity addEntityInternal(final Entity parent, final Entity entity) {
+ Copier copier = new Copier();
Entity mmEntity =(Entity)copier.copy(entity);
copier.copyReferences();
parent.getChildEntities().add(mmEntity);
@@ -226,7 +225,8 @@ public class MetaDataModelMergeAssistantImpl implements
* @param trait
* @return merged Trait
*/
- private Trait addTraitInternal(final Entity parent, final Trait trait) {
+ private Trait addTraitInternal(final Entity parent, final Trait trait) {
+ Copier copier = new Copier();
Trait mmTrait =(Trait)copier.copy(trait);
copier.copyReferences();
parent.getTraits().add(mmTrait);
diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
index 65021930a..f9869ffb8 100644
--- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
+++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java
@@ -14,6 +14,7 @@ package org.eclipse.jst.jsf.common.metadata.internal;
import java.util.Iterator;
import org.eclipse.core.runtime.IStatus;
+import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
import org.eclipse.jst.jsf.common.JSFCommonPlugin;
import org.eclipse.jst.jsf.common.metadata.Entity;
import org.eclipse.jst.jsf.common.metadata.EntityGroup;
@@ -42,12 +43,16 @@ public class StandardMetaDataFilesTranslator implements IMetaDataTranslator {
//assert assistant.getSourceModel() instanceof ModelKeyDescriptor;
MetaDataModel mm = assistant.getMergedModel();
- if (mm.getRoot() == null)
- mm.setRoot(assistant.getSourceModelProvider().getSourceModel());
-
+ Model mk = (Model)assistant.getSourceModelProvider().getSourceModel();
+ if (mm.getRoot() == null) {
+ //create copy, otherwise source model becomes merged model because of reference
+ Copier copier = new Copier();
+ Model newModel = (Model)copier.copy(mk.getModel());
+ copier.copyReferences();
+ mm.setRoot(newModel);
+ }
else {
- //for each entity and trait call "add". assistant will handle merge.
- Model mk = (Model)assistant.getSourceModelProvider().getSourceModel();
+ //for each entity and trait call "add". assistant will handle merge.
if (mk != null) {//possible that model was not loaded
traverseAndAdd(assistant, mk);
} else if (StandardModelFactory.DEBUG_MD_LOAD) {

Back to the top