diff options
author | gkessler | 2008-09-03 23:29:04 +0000 |
---|---|---|
committer | gkessler | 2008-09-03 23:29:04 +0000 |
commit | aa43c77512fb091f88b0b8a86de9e9d24b844ae1 (patch) | |
tree | ddba681a8af8e6b85a9fe6477e138ffdd69dd06f | |
parent | 44acd1036a1b632ebfb8e9751bc99eed8fb21b85 (diff) | |
download | webtools.jsf-aa43c77512fb091f88b0b8a86de9e9d24b844ae1.tar.gz webtools.jsf-aa43c77512fb091f88b0b8a86de9e9d24b844ae1.tar.xz webtools.jsf-aa43c77512fb091f88b0b8a86de9e9d24b844ae1.zip |
[243614] Intermittent Metadata Model Loading issues in Automated Tests
- improved fix plus some cleanup and debug tracing added
17 files changed, 347 insertions, 204 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 c15e2bcd0..93317b1c6 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 @@ -15,6 +15,9 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jst.jsf.common.JSFCommonPlugin; + /** * Default class used for loading metadata. * Loads the source types from extensions defined against the domain. @@ -73,6 +76,9 @@ public class DomainLoadingStrategy implements IDomainLoadingStrategy, IMetaDataO * @param sources */ protected void mergeModel(MetaDataModel model, List/*<IMetaDataSourceModelProvider>*/ sources) { + + StandardModelFactory.debug(">> Begin Merge: "+model.getModelKey()+"("+sources.size()+ " sources)", StandardModelFactory.DEBUG_MD_LOAD); + IMetaDataModelMergeAssistant assistant = createModelMergeAssistant(model); for (Iterator/*<IMetaDataSourceModelProvider>*/ it = sources.iterator();it.hasNext();){ IMetaDataSourceModelProvider mds = (IMetaDataSourceModelProvider)it.next(); @@ -80,12 +86,19 @@ public class DomainLoadingStrategy implements IDomainLoadingStrategy, IMetaDataO while (translators.hasNext()){ IMetaDataTranslator translator = (IMetaDataTranslator)translators.next(); if (translator.canTranslate(mds)){ + StandardModelFactory.debug(">>> Merging: "+model.getModelKey()+"::"+mds, StandardModelFactory.DEBUG_MD_LOAD); assistant.setSourceModelProvider(mds); - translator.translate(assistant); + try { + translator.translate(assistant); + } catch (Exception e) { + StandardModelFactory.debug(">>>> Error during translate/merge of: "+model.getModelKey()+": "+mds, StandardModelFactory.DEBUG_MD_LOAD); + JSFCommonPlugin.log(IStatus.ERROR, "Error during load of: "+mds, e); + } } } } assistant.setMergeComplete(); + StandardModelFactory.debug(">> End Merge: "+model.getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); } /** diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java index f0acd69ae..12a5fd2e3 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java @@ -112,7 +112,7 @@ public class DomainLoadingStrategyRegistry{ /** * Implementation of a DomainLoadingStrategy descriptor that is responsible for creating instances of the IDomainLoadingStrategy */ - private class DomainLoadingStrategyDescriptorImpl { + private static class DomainLoadingStrategyDescriptorImpl { String domain; String loadingStrategyClassName; String bundleId; 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 bcd933815..18259ceb4 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 @@ -217,7 +217,7 @@ public class DomainSourceModelTypeDescriptor { /** * Internal class implementing a descriptor for DomainSourceModelTranslators */ - class DomainSourceModelTranslatorDescriptor { + static class DomainSourceModelTranslatorDescriptor { private String _translator; private String _bundleId; diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java index 9e5c4a679..413048c85 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java @@ -75,8 +75,10 @@ public class MetaDataModel { /** * Load the model. Delegates to the strategy. */ - public void load(){ + public synchronized void load(){ + StandardModelFactory.debug("> Begin Loading: "+getModelKey(), StandardModelFactory.DEBUG_MD_LOAD); strategy.load(this); + StandardModelFactory.debug("> End Loading: "+getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); } /** diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java index 37b9e16fa..03a99fadd 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java @@ -17,14 +17,14 @@ import org.eclipse.jst.jsf.common.metadata.query.IMetaDataModelContext; * Simple implementation of {@link IMetaDataModelContext} * */ -public class MetaDataModelContextImpl implements IMetaDataModelContext { - private String _domain; +public class MetaDataModelContextImpl implements IMetaDataModelContext, Cloneable { + private final String _domain; /** * Constructor * @param domain id */ - public MetaDataModelContextImpl(String domain){ + public MetaDataModelContextImpl(final String domain){ _domain = domain; } @@ -32,10 +32,14 @@ public class MetaDataModelContextImpl implements IMetaDataModelContext { return _domain; } - public Object getAdapter(Class adapter) { - if (adapter.equals(IMetaDataModelContext.class)) + public Object getAdapter(final Class adapter) { + if (IMetaDataModelContext.class.equals(adapter)) return this; return null; } + @Override + protected Object clone() throws CloneNotSupportedException { + return super.clone(); + } } 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 342e1c237..1dbd27cec 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 @@ -12,10 +12,8 @@ package org.eclipse.jst.jsf.common.metadata.internal; import java.util.HashMap; -import java.util.HashSet; -import java.util.Iterator; import java.util.Map; -import java.util.Set; +import java.util.concurrent.atomic.AtomicBoolean; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IResourceChangeEvent; @@ -46,8 +44,12 @@ public class MetaDataModelManager implements IResourceChangeListener{ new QualifiedName(null, "MetaDataModelManager"); //$NON-NLS-1$ FIX ME private static MetaDataModelManager SHARED_INSTANCE; - private ModelMap models; - private IProject project; + + // used to lock all instance calls for getModel + private static final Object GLOBAL_INSTANCE_LOCK = new Object(); + private final ModelMap models; + private final IProject project; + /** * @return instance that is project agnostic. * may get removed * @@ -63,7 +65,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * @param project * @return instance of the model manager for this project. Shouldn't, but may, return null. */ - public synchronized static MetaDataModelManager getInstance(IProject project){ + public synchronized static MetaDataModelManager getInstance(final IProject project){ MetaDataModelManager repo = null; repo = getFromSessionProperty(project); if (repo == null) { @@ -72,16 +74,17 @@ public class MetaDataModelManager implements IResourceChangeListener{ } return repo; } - private MetaDataModelManager(IProject project) { + private MetaDataModelManager(final IProject project) { this.project = project; - init(); + models = new ModelMap(); + setAsSessionProperty(); } /** * @param project * @return MetaDataModelManager instance for the project */ - protected static MetaDataModelManager getFromSessionProperty(IProject project) { + private static MetaDataModelManager getFromSessionProperty(final IProject project) { MetaDataModelManager repo = null; try { Object obj = project.getSessionProperty(KEY_SESSIONPROPERTY); @@ -98,7 +101,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * Sets this MetaDataModelManager instance as a session property of its * IProject instance. */ - protected void setAsSessionProperty() { + private void setAsSessionProperty() { if (project != null) {//&& project.isAccessible()) { try { project.setSessionProperty(KEY_SESSIONPROPERTY, this); @@ -112,7 +115,7 @@ public class MetaDataModelManager implements IResourceChangeListener{ * Releases a project's MetaDataModelManager instance by removing from project session property * @param aProject */ - protected void removeAsSessionProperty(IProject aProject){ + private void removeAsSessionProperty(IProject aProject){ try { ResourcesPlugin.getWorkspace().removeResourceChangeListener(this); aProject.setSessionProperty(KEY_SESSIONPROPERTY, null); @@ -120,137 +123,185 @@ public class MetaDataModelManager implements IResourceChangeListener{ JSFCommonPlugin.log(e, "Error removing session property"); //$NON-NLS-1$ } } - - private synchronized void init() { - models = new ModelMap(); - setAsSessionProperty(); - } - - + /** - * Will locate the cached MetaDataModel. Sets the model context in the model. - * @param modelContext - * @return the MetaDataModel for the given ITaglibDomainMetaDataModelContext - */ - public synchronized MetaDataModel getModel(final ITaglibDomainMetaDataModelContext modelContext){ - ModelKeyDescriptor modelKeyDescriptor = StandardModelFactory.getInstance().createModelKeyDescriptor(modelContext); - MetaDataModel model = models.get(modelKeyDescriptor); - if (model == null || project == null){ -// long in = System.currentTimeMillis(); - model = loadMetadata(modelKeyDescriptor); -// System.out.println("Time to load "+modelContext.getURI()+": "+String.valueOf(System.currentTimeMillis() - in)); - } - else if (model.needsRefresh()){ - try { - model.reload(); - } catch (ModelNotSetException e) { - //simply load it - should not get here - model = loadMetadata(modelKeyDescriptor); - } - } - if (model != null && model.getRoot() != null) - ((Model)model.getRoot()).setCurrentModelContext(modelKeyDescriptor); - - return model; - } - - private void addModel(MetaDataModel model) { - - if (model != null) - models.put(model.getModelKey(), model); - } - + * Will locate the cached MetaDataModel. Sets the model context in the + * model. + * + * @param modelContext + * @return the MetaDataModel for the given ITaglibDomainMetaDataModelContext + */ + public MetaDataModel getModel( + final ITaglibDomainMetaDataModelContext modelContext) { + synchronized (GLOBAL_INSTANCE_LOCK) { + ModelKeyDescriptor modelKeyDescriptor = StandardModelFactory.getInstance().createModelKeyDescriptor(modelContext); - /* (non-Javadoc) - * @see org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org.eclipse.core.resources.IResourceChangeEvent) - */ - public void resourceChanged(IResourceChangeEvent event) { - if (event.getType() == IResourceChangeEvent.PRE_CLOSE){ - //a project is closing - release and cleanup - final IProject aProject = (IProject)event.getResource(); - if (aProject == this.project){ - SafeRunnable.run(new ISafeRunnable(){ + StandardModelFactory.debug(">START getModel: "+modelKeyDescriptor, StandardModelFactory.DEBUG_MD_GET); - public void handleException(Throwable exception) { - // FIXME: what to do here? - - } + MetaDataModel model = models.get(modelKeyDescriptor); + if (model == null || project == null) { + // long in = System.currentTimeMillis(); + model = loadMetadata(modelKeyDescriptor); + //System.out.println("Time to load "+modelContext.getURI()+": "+ + // String.valueOf(System.currentTimeMillis() - in)); + } else if (model.needsRefresh()) { + try { + model.reload(); + } catch (ModelNotSetException e) { + // simply load it - should not get here + model = loadMetadata(modelKeyDescriptor); + } + } + if (model != null && model.getRoot() != null) + ((Model) model.getRoot()) + .setCurrentModelContext(modelKeyDescriptor); - public void run() throws Exception { - for (Iterator it=models.getModels().iterator();it.hasNext();){ - MetaDataModel model = (MetaDataModel)it.next(); -// System.out.println("kill mmModel: "+model.toString()); - models.remove(model); - model.cleanup(); - } - removeAsSessionProperty(project); - } - }); - } - } - - } - - private synchronized MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor){ - IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry.getInstance().getLoadingStrategy(modelKeyDescriptor.getDomain());; - if (strategy == null){ - JSFCommonPlugin.log(IStatus.ERROR, "Internal Error: Unable to locate metadata loading strategy for: "+modelKeyDescriptor.toString()); //$NON-NLS-1$ - return null; - } - MetaDataModel model = StandardModelFactory.getInstance().createModel(modelKeyDescriptor, strategy);//new MetaDataModel(modelKey, strategy); - model.load(); - addModel(model); + return model; + } + } - return model; - } + /* + * (non-Javadoc) + * + * @see + * org.eclipse.core.resources.IResourceChangeListener#resourceChanged(org + * .eclipse.core.resources.IResourceChangeEvent) + */ + public void resourceChanged(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 && aProject.equals(this.project)) { + SafeRunnable.run(new ISafeRunnable() { - /** - * Map of models keyed by ModelKeyDescriptor (.toString()) - * - */ - private class ModelMap{ - private HashMap /*<String, MetaDataModel>*/ map; - - ModelMap(){ - map = new HashMap/*<String, MetaDataModel>*/(); - } - - /** - * @param modelKeyDescriptor - * @param model adds model to the map using the given key descriptor - */ - public void put(ModelKeyDescriptor modelKeyDescriptor, MetaDataModel model){ - String key = modelKeyDescriptor.toString(); - map.put(key, model); - } - - /** - * @param modelKeyDescriptor - * @return MetaDataModel for this ModelKeyDescriptor. May return null. - */ - public synchronized MetaDataModel get(ModelKeyDescriptor modelKeyDescriptor){ - String key = modelKeyDescriptor.toString(); - return (MetaDataModel)map.get(key); - } - - /** - * @param model from the map - */ - public void remove(MetaDataModel model){ - map.remove(model.getModelKey().toString()); - } - /** - * @return models in this map as a Set - */ - public Set getModels(){ - Set ret = new HashSet(); - for (Iterator it=map.entrySet().iterator();it.hasNext();){ - Map.Entry entry = (Map.Entry)it.next(); - ret.add(entry.getValue()); - } - return ret; - } - } + public void handleException(Throwable exception) { + JSFCommonPlugin.log(exception); + } + + public void run() throws Exception { + models.dispose(); + removeAsSessionProperty(project); + } + }); + } + } + } + + private MetaDataModel loadMetadata(ModelKeyDescriptor modelKeyDescriptor) { + if (!Thread.holdsLock(GLOBAL_INSTANCE_LOCK)) { + JSFCommonPlugin + .log(IStatus.ERROR, + "Internal Error: loadMetadata must not be called if class lock not held"); + return null; + } + + IDomainLoadingStrategy strategy = DomainLoadingStrategyRegistry + .getInstance().getLoadingStrategy( + modelKeyDescriptor.getDomain()); + ; + if (strategy == null) { + JSFCommonPlugin + .log( + IStatus.ERROR, + "Internal Error: Unable to locate metadata loading strategy for: " + modelKeyDescriptor.toString()); //$NON-NLS-1$ + return null; + } + MetaDataModel model = StandardModelFactory.getInstance().createModel( + modelKeyDescriptor, strategy);// new MetaDataModel(modelKey, + // strategy); + model.load(); + addModel(model); + + return model; + } + + private void addModel(MetaDataModel model) { + if (model != null) + models.put(model); + } + + /** + * Map of models keyed by ModelKeyDescriptor (.toString()) + * + */ + private static class ModelMap + { + private final Map<String, MetaDataModel> map; + private final AtomicBoolean _isDisposed = new AtomicBoolean(false); + + ModelMap() { + map = new HashMap<String, MetaDataModel>(); + } + + /** + * @param model + * adds model to the map using the given key descriptor + */ + public void put(final MetaDataModel model) { + assert !_isDisposed.get(); + final String key = calculateKey(model); + synchronized (this) { + map.put(key, model); + } + } + + /** + * @param modelKeyDescriptor + * @return MetaDataModel for this ModelKeyDescriptor. May return null. + */ + public MetaDataModel get(final ModelKeyDescriptor modelKeyDescriptor) { + assert !_isDisposed.get(); + + final String key = calculateKey(modelKeyDescriptor); + + synchronized (this) + { + return map.get(key); + } + } + + /** + * @param model + * from the map + */ + public void remove(final MetaDataModel model) { + assert !_isDisposed.get(); + final String key = calculateKey(model); + synchronized(this) + { + unprotectedRemove(key); + } + } + + private void unprotectedRemove(final String key) + { + map.remove(key); + } + + public void dispose() { + if (_isDisposed.compareAndSet(false, true)) { + synchronized(this) + { + for (final MetaDataModel model : map.values()) + { + // System.out.println("kill mmModel: "+model.toString()); + final String key = calculateKey(model); + unprotectedRemove(key); + model.cleanup(); + } + } + } + } + private String calculateKey(final MetaDataModel model) + { + return calculateKey(model.getModelKey()); + } + private String calculateKey(final ModelKeyDescriptor modelKeyDescriptor) + { + return modelKeyDescriptor.toString(); + } + } } 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 f24b0cb67..f53cdd2b5 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 @@ -196,7 +196,7 @@ public class MetaDataModelMergeAssistantImpl implements private boolean addTraitAsNecessary(Entity mergedEntity, Trait trait) { Trait mmTrait = getMergedTrait(mergedEntity, trait); if (mmTrait == null){ - mmTrait = addTraitInternal(mergedEntity, trait); + addTraitInternal(mergedEntity, trait); return true; } @@ -208,8 +208,13 @@ public class MetaDataModelMergeAssistantImpl implements */ public void setMergeComplete() { Model model = (Model)getMergedModel().getRoot(); - if (model != null) - processIncludeGroups(model); + if (model != null){ + StandardModelFactory.debug(">> Begin processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); + + processIncludeGroups(model); + + StandardModelFactory.debug(">> End processIncludeGroups for: "+getMergedModel().getModelKey(),StandardModelFactory.DEBUG_MD_LOAD); + } } /** diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java index b08227701..381da3398 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java @@ -18,10 +18,10 @@ import org.eclipse.core.resources.IProject; * */ public class ModelKeyDescriptor { - private IProject project; - private String domain; - private String uri; - private String key; + private final IProject project; + private final String domain; + private final String uri; + private final String key; /** * Constructor @@ -33,7 +33,9 @@ public class ModelKeyDescriptor { this.project = project; this.domain = domain; this.uri = uri; - StringBuffer buf = new StringBuffer(domain); + StringBuffer buf = new StringBuffer(project.getName()); + buf.append(":"); + buf.append(domain); buf.append(":"); buf.append(uri); key = buf.toString(); @@ -42,28 +44,28 @@ public class ModelKeyDescriptor { /** * @return domain id */ - public String getDomain(){ + public final String getDomain(){ return domain; } /** * @return model uri */ - public String getUri(){ + public final String getUri(){ return uri; } /** * @return project */ - public IProject getProject(){ + public final IProject getProject(){ return project; } /* (non-Javadoc) * @see java.lang.Object#toString() */ - public String toString(){ + public final String toString(){ return key; } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java index 58788dcc2..d96b267f8 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java @@ -27,7 +27,7 @@ import org.eclipse.core.runtime.Path; * ResourceBundleHelper * */ -public class ResourceBundleHelper { +public final class ResourceBundleHelper { /** * @param resourceURL @@ -35,7 +35,7 @@ public class ResourceBundleHelper { * @throws MalformedURLException - may return null * @throws IOException */ - public static ResourceBundle getResourceBundle(URL resourceURL) throws MalformedURLException, IOException { + public static ResourceBundle getResourceBundle(final URL resourceURL) throws MalformedURLException, IOException { return getResourceBundle(resourceURL, Locale.getDefault()); } @@ -46,27 +46,35 @@ public class ResourceBundleHelper { * @throws MalformedURLException * @throws IOException */ - public static ResourceBundle getResourceBundle(URL resourceURL, Locale targetLocale) throws MalformedURLException, IOException { + public static ResourceBundle getResourceBundle(final URL resourceURL, final Locale targetLocale) throws MalformedURLException, IOException { // try to load bundle from the location specified in the resourceURL // - String protocol = resourceURL.getProtocol(); - String host = resourceURL.getHost(); - String file = resourceURL.getFile(); - IPath path = new Path(file); + final String protocol = resourceURL.getProtocol(); + final String host = resourceURL.getHost(); + final String file = resourceURL.getFile(); + final IPath path = new Path(file); String dir = "./"; - String bundleName = path.removeFileExtension().segment(path.segmentCount() - 1); + final String bundleName = path.removeFileExtension().segment(path.segmentCount() - 1); if (path.segmentCount() > 1) + { dir = path.removeLastSegments(1).toString(); - + } + // create a class loader with a class path that points to the resource // bundle's location // - URL[] classpath = new URL[1]; + final URL[] classpath = new URL[1]; classpath[0] = FileLocator.resolve(new URL(protocol, host, dir)); - ClassLoader resourceLoader = new URLClassLoader(classpath, null); + // TODO: does this need to be in a doPrivileged block? + final ClassLoader resourceLoader = new URLClassLoader(classpath, null); return ResourceBundle.getBundle(bundleName, targetLocale, resourceLoader); } + + private ResourceBundleHelper() + { + // no instantiation + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java index 4cb134e33..4252c8c0c 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java @@ -89,7 +89,7 @@ public final class StandardMetaDataFileRegistry { * Internal implementation of IMetaDataSourceModelProvider for "standard" metadata sources * */ -class StandardMetaDataFilesProvider implements IMetaDataSourceModelProvider { +static class StandardMetaDataFilesProvider implements IMetaDataSourceModelProvider { private org.eclipse.jst.jsf.common.metadata.internal.IStandardMetaDataSourceInfo info; private Object model; 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 92ae6916c..4a4efdde0 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 @@ -13,6 +13,8 @@ package org.eclipse.jst.jsf.common.metadata.internal; import java.util.Iterator; +import org.eclipse.core.runtime.IStatus; +import org.eclipse.jst.jsf.common.JSFCommonPlugin; import org.eclipse.jst.jsf.common.metadata.Entity; import org.eclipse.jst.jsf.common.metadata.EntityGroup; import org.eclipse.jst.jsf.common.metadata.Model; @@ -46,8 +48,11 @@ public class StandardMetaDataFilesTranslator implements IMetaDataTranslator { else { //for each entity and trait call "add". assistant will handle merge. Model mk = (Model)assistant.getSourceModelProvider().getSourceModel(); - if (mk != null)//possible that model was not loaded + if (mk != null) {//possible that model was not loaded traverseAndAdd(assistant, mk); + } else if (StandardModelFactory.DEBUG_MD_LOAD) { + JSFCommonPlugin.log(IStatus.ERROR,"Unable to load source model: "+assistant.getSourceModelProvider()); + } } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java index a2cddc7d9..ffcb07462 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java @@ -44,7 +44,8 @@ import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelConte */ public class StandardModelFactory { private static StandardModelFactory INSTANCE; - private static boolean DEBUG_MD_LOAD = false; + static boolean DEBUG_MD_LOAD = false; + static boolean DEBUG_MD_GET = false; private ExtendedMetaData extendedMetaData; private ResourceSet resourceSet; @@ -59,6 +60,7 @@ public class StandardModelFactory { if (JSFCommonPlugin.getPlugin().isDebugging()){ DEBUG_MD_LOAD = Boolean.valueOf(Platform.getDebugOption(JSFCommonPlugin.PLUGIN_ID+"/debug/metadataload")).booleanValue(); + DEBUG_MD_GET = Boolean.valueOf(Platform.getDebugOption(JSFCommonPlugin.PLUGIN_ID+"/debug/metadataget")).booleanValue(); } } return INSTANCE; @@ -108,24 +110,33 @@ public class StandardModelFactory { * @return the root of the standard model from the resource as an EList * @throws IOException */ - public EList loadStandardFileResource(final InputStream inputStream, final IMetaDataSourceModelProvider provider, final org.eclipse.emf.common.util.URI uri) throws IOException { - final XMLResource res = new MetadataResourceImpl(provider); - res.setURI(uri); - resourceSet.getResources().add(res); - setLoadOptions(res); - res.load(inputStream, null); - if (DEBUG_MD_LOAD) - reportErrors(res); - final EList root = res.getContents(); - return root; - } + public EList loadStandardFileResource(final InputStream inputStream, + final IMetaDataSourceModelProvider provider, + final org.eclipse.emf.common.util.URI uri) throws IOException + { + final XMLResource res = new MetadataResourceImpl(provider); + + debug(String.format( + ">>> Loading standard meta-data file for uri %s", uri), DEBUG_MD_LOAD); + + res.setURI(uri); + resourceSet.getResources().add(res); + setLoadOptions(res); + res.load(inputStream, null); + if (DEBUG_MD_LOAD) + { + reportErrors(res); + } + final EList root = res.getContents(); + return root; + } private void reportErrors(Resource res) { EList<Resource.Diagnostic> errs = res.getErrors(); if (! errs.isEmpty()){ - for (Iterator<Resource.Diagnostic> it= errs.iterator();it.hasNext();){ + for (Iterator<Resource.Diagnostic> it= errs.iterator();it.hasNext();){ StandardModelErrorMessageFactory.logErrorMessage(it.next()); - } + } } } /** @@ -141,6 +152,10 @@ public class StandardModelFactory { options.put(XMLResource.OPTION_LAX_FEATURE_PROCESSING, Boolean.TRUE); options.put(XMLResource.OPTION_RECORD_UNKNOWN_FEATURE, Boolean.FALSE);//turning this off so that res.getErrors() has values to check! bizarre that I should need to do this. // options.put(XMLResource.OPTION_DOM_USE_NAMESPACES_IN_SCOPE, Boolean.TRUE); +// if (DEBUG_MD_LOAD) +// { +// System.out.println("Using load options: "+options); +// } } @@ -187,4 +202,14 @@ public class StandardModelFactory { return buf.toString(); } } + + /** + * Debug output. Paren shows thread id. + * @param msg + * @param debugFlag + */ + public static void debug(String msg, boolean debugFlag) { + if (debugFlag) + System.out.println(msg + "["+Thread.currentThread().getId()+"]"); + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java index 8f3813a53..040c5069d 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java @@ -17,9 +17,10 @@ import org.eclipse.jst.jsf.common.metadata.query.ITaglibDomainMetaDataModelConte /** * Simple implementation of {@link ITaglibDomainMetaDataModelContext} */ -public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextImpl implements ITaglibDomainMetaDataModelContext, Cloneable{ - private IProject _project; - private String _uri; +public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextImpl implements ITaglibDomainMetaDataModelContext, Cloneable +{ + private final IProject _project; + private final String _uri; /** * Constructor @@ -27,7 +28,7 @@ public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextIm * @param domain * @param uri */ - public TaglibDomainMetaDataModelContextImpl(String domain, IProject project, String uri){ + public TaglibDomainMetaDataModelContextImpl(final String domain, final IProject project, final String uri){ super(domain); this._project = project; this._uri = uri; @@ -54,4 +55,8 @@ public class TaglibDomainMetaDataModelContextImpl extends MetaDataModelContextIm return super.getAdapter(adapter); } + @Override + public Object clone() throws CloneNotSupportedException { + return super.clone(); + } } diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java index 804e36849..272e10e23 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java @@ -135,7 +135,7 @@ public class TraitValueHelper { if (rawValue.startsWith("%") && !rawValue.startsWith("%%")){ String key = rawValue.substring(1); result = getNLSPropertyValue(trait, key); - if (rawValue == null){ + if (result == null){ result = rawValue; } } @@ -143,7 +143,7 @@ public class TraitValueHelper { } //will return null if there is an IOException with ResourceBundle - private static String getNLSPropertyValue(Trait trait, String key){ + private static String getNLSPropertyValue(final Trait trait, final String key){ try{ IMetaDataSourceModelProvider provider = trait.getSourceModelProvider(); IResourceBundleProvider resourceBundleProvider = (IResourceBundleProvider)provider.getAdapter(IResourceBundleProvider.class); diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java index 616aaf0f4..f030f9175 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java @@ -2,7 +2,7 @@ * <copyright> * </copyright> * - * $Id: TraitImpl.java,v 1.7 2008/02/01 22:16:42 gkessler Exp $ + * $Id: TraitImpl.java,v 1.8 2008/09/03 23:29:04 gkessler Exp $ */ package org.eclipse.jst.jsf.common.metadata.internal.impl; @@ -310,14 +310,21 @@ public class TraitImpl extends EObjectImpl implements Trait { return result.toString(); } - public boolean equals(@SuppressWarnings("hiding") Object value){ - if (!(value instanceof String)) - return super.equals(value); + public boolean equals(Object value_){ + if (!(value_ instanceof String)) + return super.equals(value_); - String key = (String)value; + String key = (String)value_; if (key.equals(getId())) return true; return false; } + + @Override + public int hashCode() + { + // try to match convention x.equals(y) => x.hashCode() == y.hashCode() + return getId() != null ? getId().hashCode() : 0xDEADBEEF; + } } //TraitImpl
\ No newline at end of file diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java index 7af2b51d5..19e54a78d 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java @@ -2,16 +2,19 @@ * <copyright> * </copyright> * - * $Id: MetadataResourceImpl.java,v 1.9 2008/02/01 20:20:47 gkessler Exp $ + * $Id: MetadataResourceImpl.java,v 1.10 2008/09/03 23:29:03 gkessler Exp $ */ package org.eclipse.jst.jsf.common.metadata.internal.util; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.util.List; import java.util.Map; +import org.eclipse.core.runtime.IStatus; import org.eclipse.emf.common.util.URI; +import org.eclipse.emf.ecore.EObject; import org.eclipse.emf.ecore.EPackage; import org.eclipse.emf.ecore.xmi.XMLHelper; import org.eclipse.emf.ecore.xmi.XMLLoad; @@ -19,6 +22,7 @@ import org.eclipse.emf.ecore.xmi.XMLResource; import org.eclipse.emf.ecore.xmi.impl.XMLHelperImpl; import org.eclipse.emf.ecore.xmi.impl.XMLLoadImpl; import org.eclipse.emf.ecore.xmi.impl.XMLResourceImpl; +import org.eclipse.jst.jsf.common.JSFCommonPlugin; import org.eclipse.jst.jsf.common.metadata.Entity; import org.eclipse.jst.jsf.common.metadata.MetadataPackage; import org.eclipse.jst.jsf.common.metadata.Model; @@ -93,12 +97,24 @@ public class MetadataResourceImpl extends XMLResourceImpl implements XMLResource } public void postLoad(XMLResource resource, InputStream inputStream, - Map options) { - Object aRoot = resource.getContents().get(0); - if (aRoot instanceof Model){ - setModelKeyInTraits((Model)aRoot, (Model)aRoot); - } - } + Map options) + { + final List<EObject> resContents = resource.getContents(); + + if (resContents.size() > 0) + { + final Object aRoot = resContents.get(0); + if (aRoot instanceof Model) + { + setModelKeyInTraits((Model) aRoot, (Model) aRoot); + } + } + else + { + JSFCommonPlugin.log(IStatus.WARNING, + "No model loaded for "+getURI()); + } + } private void setModelKeyInTraits(Model root, Entity currentEntity) { // TODO: does this have side effect that we care about? nothing is done with the return value @@ -138,7 +154,7 @@ public class MetadataResourceImpl extends XMLResourceImpl implements XMLResource * when appropriate * */ - private class MetadataXMLLoad extends XMLLoadImpl { + private static class MetadataXMLLoad extends XMLLoadImpl { public MetadataXMLLoad(XMLHelper helper) { super(helper); diff --git a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java index 0050231b8..b8afde9cb 100644 --- a/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java +++ b/jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java @@ -186,7 +186,7 @@ public final class TaglibDomainMetaDataQueryHelper{ * @param modelContext * @return MetaDataModel */ - private synchronized static MetaDataModel getMDModel(final ITaglibDomainMetaDataModelContext modelContext){ + private static MetaDataModel getMDModel(final ITaglibDomainMetaDataModelContext modelContext){ MetaDataModelManager mgr = null; if (modelContext.getProject() != null) mgr = MetaDataModelManager.getInstance(modelContext.getProject()); |