Skip to main content
summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorgkessler2008-09-03 23:29:04 +0000
committergkessler2008-09-03 23:29:04 +0000
commitaa43c77512fb091f88b0b8a86de9e9d24b844ae1 (patch)
treeddba681a8af8e6b85a9fe6477e138ffdd69dd06f
parent44acd1036a1b632ebfb8e9751bc99eed8fb21b85 (diff)
downloadwebtools.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
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategy.java15
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainLoadingStrategyRegistry.java2
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/DomainSourceModelTypeDescriptor.java2
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModel.java4
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelContextImpl.java14
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelManager.java323
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/MetaDataModelMergeAssistantImpl.java11
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ModelKeyDescriptor.java20
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/ResourceBundleHelper.java30
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFileRegistry.java2
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardMetaDataFilesTranslator.java7
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/StandardModelFactory.java53
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TaglibDomainMetaDataModelContextImpl.java13
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/TraitValueHelper.java4
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/impl/TraitImpl.java17
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/internal/util/MetadataResourceImpl.java32
-rw-r--r--jsf/plugins/org.eclipse.jst.jsf.common/src/org/eclipse/jst/jsf/common/metadata/query/TaglibDomainMetaDataQueryHelper.java2
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());

Back to the top