diff options
author | gkessler | 2009-08-05 23:53:12 +0000 |
---|---|---|
committer | gkessler | 2009-08-05 23:53:12 +0000 |
commit | 90fd504aa6a89fe4bd4e21149bb2f0026955a242 (patch) | |
tree | 329699eaa71c9ff2132c5a9ecc970cbc11edb52f | |
parent | eb07d18c47a140fca3ecf7aca326f8e2d04a96dc (diff) | |
download | webtools.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
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) { |