Author: scabanovich
Date: 2011-03-28 15:42:11 -0400 (Mon, 28 Mar 2011)
New Revision: 30069
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreNature.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionFactory.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionManager.java
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/scanner/lib/ClassPathMonitor.java
Log:
JBIDE-3120
https://issues.jboss.org/browse/JBIDE-3120
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreNature.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreNature.java 2011-03-28
15:56:08 UTC (rev 30068)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/CDICoreNature.java 2011-03-28
19:42:11 UTC (rev 30069)
@@ -97,6 +97,10 @@
return dependsOn;
}
+ public CDIExtensionManager getExtensionManager() {
+ return extensions;
+ }
+
public Set<CDICoreNature> getCDIProjects(boolean hierarchy) {
if(hierarchy) {
if(dependsOn.isEmpty()) return dependsOn;
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionFactory.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionFactory.java 2011-03-28
15:56:08 UTC (rev 30068)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionFactory.java 2011-03-28
19:42:11 UTC (rev 30069)
@@ -21,8 +21,12 @@
import org.eclipse.core.runtime.IExtensionPoint;
import org.eclipse.core.runtime.Platform;
import org.jboss.tools.cdi.core.CDICorePlugin;
-import org.osgi.framework.Bundle;
+/**
+ * Loads Eclipse extension point 'org.jboss.tools.cdi.core.cdiextensions'
+ * @author Viacheslav Kabanovich
+ *
+ */
public class CDIExtensionFactory {
static CDIExtensionFactory factory = null;
public static String POINT_ID = "org.jboss.tools.cdi.core.cdiextensions";
@@ -43,7 +47,7 @@
/**
* Maps features to fully qualified names of implementations of ICDIExtention.
*/
- Map<String, Set<String>> featureToDesign = new HashMap<String,
Set<String>>();
+ private Map<String, Set<String>> featureToDesign = new HashMap<String,
Set<String>>();
/**
* Maps fully qualified names of implementations of ICDIExtention to their Class
objects.
@@ -96,6 +100,13 @@
return runtimeToDesign.get(qualifiedName);
}
+ public Set<String> getFeatures() {
+ return featureToDesign.keySet();
+ }
+ public Set<String> getExtensionClassesByfeature(String featureName) {
+ return featureToDesign.get(featureName);
+ }
+
public ICDIExtension createExtensionInstance(String qualifiedName) {
Class<? extends ICDIExtension> cls = designToClass.get(qualifiedName);
if(cls != null) {
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionManager.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionManager.java 2011-03-28
15:56:08 UTC (rev 30068)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/core/extension/CDIExtensionManager.java 2011-03-28
19:42:11 UTC (rev 30069)
@@ -19,69 +19,88 @@
public class CDIExtensionManager {
CDICoreNature n;
- Set<String> runtimes = new HashSet<String>();
+ /**
+ * Mapping of jar path to CDI extensions declared in it.
+ */
+ Map<String, Set<String>> runtimes = new HashMap<String,
Set<String>>();
+ /**
+ * Mapping of extension ids (class names) to instances.
+ */
Map<String, ICDIExtension> instances = new HashMap<String,
ICDIExtension>();
+
+ /**
+ * Mapping of feature ids to extension instances.
+ */
Map<String, Set<ICDIExtension>> featureToExtensions = new HashMap<String,
Set<ICDIExtension>>();
public CDIExtensionManager(CDICoreNature n) {
this.n = n;
}
- public void setRuntimes(Set<String> runtimes) {
- Set<String> addedRuntimes = new HashSet<String>();
- Set<String> deletedRuntimes = new HashSet<String>();
- for (String runtime: this.runtimes) {
- if(!runtimes.contains(runtime)) {
- deletedRuntimes.add(runtime);
+ public void pathRemoved(String path) {
+ Set<String> rs = runtimes.remove(path);
+ if(rs == null) return;
+ for (String runtime: rs) {
+ deleteRuntime(runtime);
+ }
+ }
+
+ public void setRuntimes(String path, Set<String> newRuntimes) {
+ Set<String> oldRuntimes = runtimes.get(path);
+ if(oldRuntimes == null) {
+ if(newRuntimes.isEmpty()) return;
+ oldRuntimes = new HashSet<String>();
+ }
+ for (String runtime: oldRuntimes) {
+ if(!newRuntimes.contains(runtime)) {
+ deleteRuntime(runtime);
}
}
- for (String runtime: runtimes) {
- if(!this.runtimes.contains(runtime)) {
- addedRuntimes.add(runtime);
+ for (String runtime: newRuntimes) {
+ if(!oldRuntimes.contains(runtime)) {
+ addRuntime(runtime);
}
}
-
- for (String runtime: deletedRuntimes) {
- runtimes.remove(runtime);
- Set<String> clss =
CDIExtensionFactory.getInstance().getExtensionClassesByRuntime(runtime);
- for (String cls: clss) {
- ICDIExtension ext = instances.remove(cls);
- if(ext != null) {
- String[] is = featureToExtensions.keySet().toArray(new String[0]);
- for (String feature: is) {
- Set<ICDIExtension> es = featureToExtensions.get(feature);
- if(es != null) {
- es.remove(ext);
- if(es.isEmpty()) featureToExtensions.remove(feature);
- }
+ if(newRuntimes.isEmpty()) runtimes.remove(path); else runtimes.put(path, newRuntimes);
+ }
+
+ private void addRuntime(String runtime) {
+ CDIExtensionFactory factory = CDIExtensionFactory.getInstance();
+ Set<String> clss = factory.getExtensionClassesByRuntime(runtime);
+ if(clss != null) for (String cls: clss) {
+ ICDIExtension ext = factory.createExtensionInstance(cls);
+ if(ext == null) continue;
+ //TODO initialize ext object.
+ instances.put(cls, ext);
+ for (String feature: CDIExtensionFactory.getInstance().getFeatures()) {
+ if(factory.getExtensionClassesByfeature(feature).contains(cls)) {
+ Set<ICDIExtension> es = featureToExtensions.get(feature);
+ if(es == null) {
+ es = new HashSet<ICDIExtension>();
+ featureToExtensions.put(feature, es);
}
+ es.add(ext);
}
}
}
-
- for (String runtime: addedRuntimes) {
- runtimes.add(runtime);
- Set<String> clss =
CDIExtensionFactory.getInstance().getExtensionClassesByRuntime(runtime);
- for (String cls: clss) {
- ICDIExtension ext = CDIExtensionFactory.getInstance().createExtensionInstance(cls);
- if(ext == null) continue;
- //TODO initialize ext object.
- instances.put(cls, ext);
- Map<String, Set<String>> featureToDesign =
CDIExtensionFactory.getInstance().featureToDesign;
- for (String feature: featureToDesign.keySet()) {
- if(featureToDesign.get(feature).contains(cls)) {
- Set<ICDIExtension> es = featureToExtensions.get(feature);
- if(es == null) {
- es = new HashSet<ICDIExtension>();
- featureToExtensions.put(feature, es);
- }
- es.add(ext);
+ }
+
+ private void deleteRuntime(String runtime) {
+ Set<String> clss =
CDIExtensionFactory.getInstance().getExtensionClassesByRuntime(runtime);
+ for (String cls: clss) {
+ ICDIExtension ext = instances.remove(cls);
+ if(ext != null) {
+ String[] is = featureToExtensions.keySet().toArray(new String[0]);
+ for (String feature: is) {
+ Set<ICDIExtension> es = featureToExtensions.get(feature);
+ if(es != null) {
+ es.remove(ext);
+ if(es.isEmpty()) featureToExtensions.remove(feature);
}
}
}
}
-
}
static Set<ICDIExtension> EMPTY = new HashSet<ICDIExtension>();
Modified:
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/scanner/lib/ClassPathMonitor.java
===================================================================
---
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/scanner/lib/ClassPathMonitor.java 2011-03-28
15:56:08 UTC (rev 30068)
+++
trunk/cdi/plugins/org.jboss.tools.cdi.core/src/org/jboss/tools/cdi/internal/core/scanner/lib/ClassPathMonitor.java 2011-03-28
19:42:11 UTC (rev 30069)
@@ -18,6 +18,7 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
+import java.util.StringTokenizer;
import org.eclipse.core.resources.IProject;
import org.eclipse.core.resources.ResourcesPlugin;
@@ -30,6 +31,7 @@
import org.jboss.tools.cdi.core.CDICoreNature;
import org.jboss.tools.cdi.core.CDICorePlugin;
import org.jboss.tools.common.model.XModelObject;
+import org.jboss.tools.common.model.filesystems.impl.FileAnyImpl;
import org.jboss.tools.common.model.project.ext.AbstractClassPathMonitor;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
@@ -49,6 +51,7 @@
Map<String, XModelObject> newJars = new HashMap<String, XModelObject>();
for (String p: syncProcessedPaths()) {
project.pathRemoved(new Path(p));
+ project.getExtensionManager().pathRemoved(p);
}
for (int i = 0; i < paths.size(); i++) {
String p = paths.get(i);
@@ -59,6 +62,10 @@
String jsname = "lib-" + fileName; //$NON-NLS-1$
XModelObject o = model.getByPath("FileSystems").getChildByPath(jsname);
//$NON-NLS-1$
if(o == null) continue;
+
+ //Load cdi extensions. Do we need beans.xml to look for extensions?
+ project.getExtensionManager().setRuntimes(p, readRuntimes(o));
+
XModelObject b = o.getChildByPath("META-INF/beans.xml");
if(b == null && !isWeldJar(fileName)) {
continue;
@@ -156,4 +163,23 @@
}
return list;
}
+
+ private static Set<String> EMPTY_RUNTIMES = new HashSet<String>();
+
+ private Set<String> readRuntimes(XModelObject jar) {
+ XModelObject o =
jar.getChildByPath("META-INF/services/javax.enterprise.inject.spi.Extension");
+ if(o == null) return EMPTY_RUNTIMES;
+ if(!(o instanceof FileAnyImpl)) return EMPTY_RUNTIMES;
+ Set<String> result = new HashSet<String>();
+ String text = ((FileAnyImpl)o).getAsText();
+ if(text == null || text.length() == 0) return EMPTY_RUNTIMES;
+ StringTokenizer st = new StringTokenizer(text, " \r\n\t");
+ while(st.hasMoreTokens()) {
+ String t = st.nextToken().trim();
+ if(t.length() > 0) result.add(t);
+ }
+ return result;
+ }
+
+
}
\ No newline at end of file