Author: scabanovich
Date: 2008-11-21 10:54:42 -0500 (Fri, 21 Nov 2008)
New Revision: 11950
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamNamespace.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamNamespace.java
Modified:
branches/jbosstools-3.0.0.Beta1/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java
trunk/seam/plugins/org.jboss.tools.seam.core/META-INF/MANIFEST.MF
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamResourceVisitor.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/IFileScanner.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/LoadedDeclarations.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/SeamAnnotations.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassPath.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/LibraryScanner.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/PropertiesScanner.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/XMLScanner.java
Log:
JBIDE-2957
Modified:
branches/jbosstools-3.0.0.Beta1/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java
===================================================================
---
branches/jbosstools-3.0.0.Beta1/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
branches/jbosstools-3.0.0.Beta1/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -15,6 +15,7 @@
import java.util.Properties;
import org.jboss.tools.common.model.XModelObject;
+import org.jboss.tools.common.model.util.NamespaceMapping;
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
import org.jboss.tools.seam.core.IValueInfo;
@@ -215,7 +216,11 @@
className = XMLScanner.getImpliedClassName(c, source);
isClassNameGuessed = true;
} else {
- className = XMLScanner.getDefaultClassName(c);
+ XModelObject f = c;
+ while(f != null && f.getFileType() != XModelObject.FILE) f = f.getParent();
+ NamespaceMapping nm = NamespaceMapping.load(f);
+ SeamProject sp = (SeamProject)context.get("seamProject");
+ className = XMLScanner.getDefaultClassName(c, nm, sp == null ? null :
sp.getNamespaces());
isClassNameGuessed = true;
}
}
Modified: trunk/seam/plugins/org.jboss.tools.seam.core/META-INF/MANIFEST.MF
===================================================================
--- trunk/seam/plugins/org.jboss.tools.seam.core/META-INF/MANIFEST.MF 2008-11-21 15:50:48
UTC (rev 11949)
+++ trunk/seam/plugins/org.jboss.tools.seam.core/META-INF/MANIFEST.MF 2008-11-21 15:54:42
UTC (rev 11950)
@@ -15,6 +15,7 @@
org.eclipse.jdt.ui,
org.jboss.tools.common.model,
org.jboss.tools.common.el.core,
+ org.jboss.tools.seam.xml,
org.eclipse.wst.common.frameworks.ui,
org.eclipse.wst.common.project.facet.core,
org.eclipse.jst.jsf.core,
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamNamespace.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamNamespace.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamNamespace.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -0,0 +1,9 @@
+package org.jboss.tools.seam.core;
+
+import org.eclipse.core.runtime.IPath;
+
+public interface ISeamNamespace {
+ public IPath getSourcePath();
+ public String getURI();
+ public String getPackage();
+}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -11,6 +11,7 @@
package org.jboss.tools.seam.core;
import java.util.Collection;
+import java.util.Map;
import java.util.Set;
import org.eclipse.core.resources.IProject;
@@ -95,6 +96,12 @@
public ISeamPackage getPackage(ISeamComponent c);
/**
+ *
+ * @return
+ */
+ public Map<String, ISeamNamespace> getNamespaces();
+
+ /**
* Returns seam component. Project can have only one ISeamComponent with
* unique name. If project has a few seam components with the same name,
* then corresponding ISeamComponent will have all declarations
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamNamespace.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamNamespace.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamNamespace.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -0,0 +1,67 @@
+package org.jboss.tools.seam.internal.core;
+
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+import org.jboss.tools.common.xml.XMLUtilities;
+import org.jboss.tools.seam.core.ISeamNamespace;
+import org.w3c.dom.Element;
+
+public class SeamNamespace implements ISeamNamespace {
+ static String ATTR_URI = "uri";
+ static String ATTR_PACKAGE = "package";
+
+ protected IPath source;
+ protected String uri;
+ protected String javaPackage;
+
+ public SeamNamespace() {}
+
+ public IPath getSourcePath() {
+ return source;
+ }
+
+ public String getURI() {
+ return uri;
+ }
+
+ public String getPackage() {
+ return javaPackage;
+ }
+
+ public void setSourcePath(IPath source) {
+ this.source = source;
+
+ }
+
+ public void setURI(String uri) {
+ this.uri = uri;
+ }
+
+ public void setPackage(String javaPackage) {
+ this.javaPackage = javaPackage;
+ }
+
+ public Element toXML(Element parent) {
+ Element element = XMLUtilities.createElement(parent, "namespace");
+ if(source != null) {
+ element.setAttribute(SeamXMLConstants.ATTR_PATH, source.toString());
+ }
+ if(uri != null) {
+ element.setAttribute(ATTR_URI, uri);
+ }
+ if(javaPackage != null) {
+ element.setAttribute(ATTR_PACKAGE, javaPackage);
+ }
+ return element;
+ }
+
+ public void loadXML(Element element) {
+ String s = element.getAttribute(SeamXMLConstants.ATTR_PATH);
+ if(s != null && s.length() > 0) {
+ source = new Path(s);
+ }
+ uri = element.getAttribute(ATTR_URI);
+ javaPackage = element.getAttribute(ATTR_PACKAGE);
+ }
+
+}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -42,6 +42,7 @@
import org.jboss.tools.seam.core.ISeamContextVariable;
import org.jboss.tools.seam.core.ISeamFactory;
import org.jboss.tools.seam.core.ISeamJavaComponentDeclaration;
+import org.jboss.tools.seam.core.ISeamNamespace;
import org.jboss.tools.seam.core.ISeamPackage;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.ISeamScope;
@@ -93,6 +94,7 @@
createScopes();
}
+ NamespaceStorage namespaces = new NamespaceStorage();
ComponentStorage components = new ComponentStorage();
FactoryStorage factories = new FactoryStorage();
VariablesStorage variables = new VariablesStorage();
@@ -309,7 +311,11 @@
public void addDependentSeamProject(SeamProject p) {
usedBy.add(p);
}
-
+
+ public Map<String, ISeamNamespace> getNamespaces() {
+ return namespaces.namespacesByURI;
+ }
+
/**
*
* @param p
@@ -377,6 +383,7 @@
root = XMLUtilities.getElement(file, null);
if(root != null) {
loadProjectDependencies(root);
+ loadNamespaces(root);
if(XMLUtilities.getUniqueChild(root, "paths") != null) {
loadSourcePaths2(root);
} else {
@@ -421,6 +428,7 @@
isStorageResolved = false;
dependsOn.clear();
usedBy.clear();
+ namespaces.clear();
components.clear();
factories.clear();
variables.clear();
@@ -455,6 +463,8 @@
Element root = XMLUtilities.createDocumentElement("seam-project");
//$NON-NLS-1$
storeProjectDependencies(root);
+
+ storeNamespaces(root);
// storeSourcePaths(root);
storeSourcePaths2(root);
@@ -473,7 +483,14 @@
// pathElement.setAttribute("value", path.toString()); //$NON-NLS-1$
// }
// }
-
+
+ private void storeNamespaces(Element root) {
+ Element namespacesElement = XMLUtilities.createElement(root, "namespaces");
//$NON-NLS-1$
+ for (ISeamNamespace n : namespaces.namespacesByURI.values()) {
+ ((SeamNamespace)n).toXML(namespacesElement);
+ }
+ }
+
private void storeSourcePaths2(Element root) {
Properties context = new Properties();
Element sourcePathsElement = XMLUtilities.createElement(root, "paths");
//$NON-NLS-1$
@@ -550,9 +567,21 @@
b.visit(f);
}
}
-
+
+ private void loadNamespaces(Element root) {
+ Element namespacesElement = XMLUtilities.getUniqueChild(root, "namespaces");
//$NON-NLS-1$
+ if(namespacesElement == null) return;
+ Element[] ns = XMLUtilities.getChildren(namespacesElement, "namespace");
//$NON-NLS-1$
+ for (int i = 0; i < ns.length; i++) {
+ SeamNamespace sn = new SeamNamespace();
+ sn.loadXML(ns[i]);
+ namespaces.addNamespace(sn);
+ }
+ }
+
private void loadSourcePaths2(Element root) {
Properties context = new Properties();
+ context.put("seamProject", this);
Element sourcePathsElement = XMLUtilities.getUniqueChild(root, "paths");
//$NON-NLS-1$
if(sourcePathsElement == null) return;
Element[] paths = XMLUtilities.getChildren(sourcePathsElement, "path");
//$NON-NLS-1$
@@ -619,6 +648,13 @@
}
getClassPath().pathLoaded(path);
+
+ Set<ISeamNamespace> ns = namespaces.getNamespacesBySource(path);
+ if(ns != null) {
+ //we need that, or registering will remove them
+ ds.getNamespaces().addAll(ns);
+ }
+
registerComponents(ds, path);
long t2 = System.currentTimeMillis();
if(statistics != null) {
@@ -715,10 +751,11 @@
*/
public void registerComponents(LoadedDeclarations ds, IPath source) {
+ ISeamNamespace[] ns = ds.getNamespaces().toArray(new ISeamNamespace[0]);
ISeamComponentDeclaration[] components = ds.getComponents().toArray(new
ISeamComponentDeclaration[0]);
ISeamFactory[] factories = ds.getFactories().toArray(new ISeamFactory[0]);
- if(components.length == 0 && factories.length == 0 &&
ds.getImports().size() == 0) {
+ if(ns.length == 0 && components.length == 0 && factories.length == 0
&& ds.getImports().size() == 0) {
pathRemoved(source);
if(source.toString().endsWith(".jar")) {
if(!sourcePaths.contains(source)) sourcePaths.add(source);
@@ -728,6 +765,10 @@
}
if(!sourcePaths.contains(source)) sourcePaths.add(source);
sourcePaths2.put(source, ds);
+
+ if(ns.length > 0) {
+ namespaces.addPath(source, ns);
+ }
if(ds.getImports().size() > 0) {
setImports(source.toString(), ds.getImports());
@@ -890,6 +931,9 @@
for (SeamProject p : usedBy) {
p.resolve();
LoadedDeclarations ds1 = new LoadedDeclarations();
+ for (ISeamNamespace n: ds.getNamespaces()) {
+ ds1.getNamespaces().add(n); //no need to clone, it is read-only.
+ }
for (ISeamComponentDeclaration d: ds.getComponents()) {
ds1.getComponents().add(d.clone());
}
@@ -956,6 +1000,8 @@
if(!sourcePaths.contains(source) && !sourcePaths2.containsKey(source)) return;
sourcePaths.remove(source);
sourcePaths2.remove(source);
+
+ namespaces.removePath(source);
removeImports(source.toString());
List<Change> changes = null;
@@ -1516,6 +1562,16 @@
ds.getComponents().add(d.clone());
}
}
+ for (ISeamNamespace n : namespaces.namespacesByURI.values()) {
+ IPath p = n.getSourcePath();
+ if(p == null || p.toString().endsWith(".jar")) continue; //$NON-NLS-1$
+ LoadedDeclarations ds = map.get(p);
+ if(ds == null) {
+ ds = new LoadedDeclarations();
+ map.put(p, ds);
+ }
+ ds.getNamespaces().add(n);
+ }
for (ISeamFactory f : factories.allFactories) {
IPath p = f.getSourcePath();
if(p == null || p.toString().endsWith(".jar")) continue; //$NON-NLS-1$
@@ -1615,6 +1671,78 @@
}
+ class NamespaceStorage {
+ Map<IPath, Set<ISeamNamespace>> namespacesBySource = new HashMap<IPath,
Set<ISeamNamespace>>();
+ Map<String, ISeamNamespace> namespacesByURI = new HashMap<String,
ISeamNamespace>();
+
+ public void clear() {
+ namespacesBySource.clear();
+ namespacesByURI.clear();
+ }
+
+ public Set<ISeamNamespace> getNamespacesBySource(IPath path) {
+ return namespacesBySource.get(path);
+ }
+
+ public void addPath(IPath source, ISeamNamespace[] ns) {
+ Set<ISeamNamespace> sd = namespacesBySource.get(source);
+ if(sd == null && ns.length == 0) return;
+ if(ns.length == 0) {
+ removePath(source);
+ } else {
+ if(sd != null) {
+ sd.clear();
+ } else {
+ sd = new HashSet<ISeamNamespace>();
+ namespacesBySource.put(source, sd);
+ }
+ for (int i = 0; i < ns.length; i++) {
+ sd.add(ns[i]);
+ //TODO that will not remove old objects
+ namespacesByURI.put(ns[i].getURI(), ns[i]);
+ }
+ }
+ }
+
+ public void addNamespace(ISeamNamespace n) {
+ namespacesByURI.put(n.getURI(), n);
+ IPath path = n.getSourcePath();
+ if(path != null) {
+ Set<ISeamNamespace> fs = namespacesBySource.get(path);
+ if(fs == null) {
+ fs = new HashSet<ISeamNamespace>();
+ namespacesBySource.put(path, fs);
+ }
+ fs.add(n);
+ }
+ }
+
+ public void removePath(IPath path) {
+ Set<ISeamNamespace> sd = namespacesBySource.get(path);
+ if(sd == null) return;
+ for (ISeamNamespace d: sd) {
+ if(d.getURI() != null)
+ namespacesByURI.remove(d.getURI());
+ }
+ namespacesBySource.remove(path);
+ }
+
+ public void removeNamespace(ISeamNamespace n) {
+ namespacesByURI.remove(n.getURI());
+ IPath path = n.getSourcePath();
+ if(path != null) {
+ Set<ISeamNamespace> fs = namespacesBySource.get(path);
+ if(fs != null) {
+ fs.remove(n);
+ }
+ if(fs.isEmpty()) {
+ namespacesBySource.remove(fs);
+ }
+ }
+ }
+
+ }
+
class ComponentStorage {
Set<ISeamComponent> allComponentsSet = new HashSet<ISeamComponent>();
Map<String, SeamComponent> allComponents = new HashMap<String,
SeamComponent>();
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamResourceVisitor.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamResourceVisitor.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamResourceVisitor.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -91,7 +91,7 @@
}
LoadedDeclarations c = null;
try {
- c = scanner.parse(f);
+ c = scanner.parse(f, p);
} catch (ScannerException e) {
SeamCorePlugin.getDefault().logError(e);
}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/IFileScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/IFileScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/IFileScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -11,6 +11,7 @@
package org.jboss.tools.seam.internal.core.scanner;
import org.eclipse.core.resources.IFile;
+import org.jboss.tools.seam.core.ISeamProject;
public interface IFileScanner {
@@ -36,6 +37,6 @@
* @return
* @throws ScannerException
*/
- public LoadedDeclarations parse(IFile f) throws ScannerException;
+ public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException;
}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/LoadedDeclarations.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/LoadedDeclarations.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/LoadedDeclarations.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -15,6 +15,7 @@
import org.jboss.tools.seam.core.ISeamComponentDeclaration;
import org.jboss.tools.seam.core.ISeamFactory;
+import org.jboss.tools.seam.core.ISeamNamespace;
/**
* This object keeps all declarations loaded from one source.
@@ -25,6 +26,7 @@
List<ISeamComponentDeclaration> components = new
ArrayList<ISeamComponentDeclaration>();
List<ISeamFactory> factories = new ArrayList<ISeamFactory>();
List<String> imports = new ArrayList<String>();
+ List<ISeamNamespace> namespaces = new ArrayList<ISeamNamespace>();
public List<ISeamComponentDeclaration> getComponents() {
return components;
@@ -37,12 +39,17 @@
public List<String> getImports() {
return imports;
}
+
+ public List<ISeamNamespace> getNamespaces() {
+ return namespaces;
+ }
public void add(LoadedDeclarations ds) {
if(ds == null) return;
components.addAll(ds.components);
factories.addAll(ds.factories);
imports.addAll(ds.imports);
+ namespaces.addAll(ds.namespaces);
}
}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -30,6 +30,7 @@
import org.jboss.tools.common.model.util.EclipseJavaUtil;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.util.FileUtil;
+import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.internal.core.scanner.IFileScanner;
import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
@@ -81,7 +82,7 @@
* @return
* @throws ScannerException
*/
- public LoadedDeclarations parse(IFile f) throws ScannerException {
+ public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException {
ICompilationUnit u = null;
try {
u = getCompilationUnit(f);
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/SeamAnnotations.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/SeamAnnotations.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/SeamAnnotations.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -23,6 +23,8 @@
public static final String SCOPE_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"Scope"; //$NON-NLS-1$
public static final String INSTALL_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"Install"; //$NON-NLS-1$
+ public static final String NAMESPACE_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"Namespace"; //$NON-NLS-1$
+
public static final String IN_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"In"; //$NON-NLS-1$
public static final String OUT_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"Out"; //$NON-NLS-1$
public static final String DATA_MODEL_ANNOTATION_TYPE = SEAM_ANNOTATION_TYPE_PREFIX +
"datamodel.DataModel"; //$NON-NLS-1$
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassPath.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassPath.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/ClassPath.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -12,9 +12,6 @@
import java.io.File;
import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
@@ -193,7 +190,7 @@
LoadedDeclarations c = null;
try {
if(scanner.isLikelyComponentSource(o)) {
- c = scanner.parse(o, new Path(p));
+ c = scanner.parse(o, new Path(p), project);
}
} catch (ScannerException e) {
SeamCorePlugin.getDefault().logError(e);
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/LibraryScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/LibraryScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/LibraryScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -25,17 +25,21 @@
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
import org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader;
+import org.eclipse.jdt.internal.compiler.env.IBinaryAnnotation;
import org.jboss.tools.common.model.XModel;
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FileSystemsImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.model.util.XModelObjectUtil;
+import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.SeamCoreMessages;
import org.jboss.tools.seam.internal.core.InnerModelHelper;
+import org.jboss.tools.seam.internal.core.SeamNamespace;
import org.jboss.tools.seam.internal.core.scanner.IFileScanner;
import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
import org.jboss.tools.seam.internal.core.scanner.ScannerException;
+import org.jboss.tools.seam.internal.core.scanner.java.SeamAnnotations;
import org.jboss.tools.seam.internal.core.scanner.xml.PropertiesScanner;
import org.jboss.tools.seam.internal.core.scanner.xml.XMLScanner;
@@ -72,7 +76,7 @@
return isLikelyComponentSource(o);
}
- public LoadedDeclarations parse(IFile f) throws ScannerException {
+ public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException {
XModel model = InnerModelHelper.createXModel(f.getProject());
if(model == null) return null;
XModelObject o = EclipseResourceUtil.getObjectByResource(model, f);
@@ -82,7 +86,7 @@
o = EclipseResourceUtil.getObjectByResource(f);
if(o == null || !o.getModelEntity().getName().equals("FileSystemJar"))
return null; //$NON-NLS-1$
}
- return parse(o, f.getFullPath());
+ return parse(o, f.getFullPath(), sp);
}
public boolean isLikelyComponentSource(XModelObject o) {
@@ -93,7 +97,7 @@
return false;
}
- public LoadedDeclarations parse(XModelObject o, IPath path) throws ScannerException {
+ public LoadedDeclarations parse(XModelObject o, IPath path, ISeamProject sp) throws
ScannerException {
if(o == null) return null;
sourcePath = path;
XModelObject seamProperties = o.getChildByPath("META-INF/seam.properties");
//$NON-NLS-1$
@@ -110,7 +114,7 @@
}
if(componentsXML != null) {
- LoadedDeclarations ds1 = new XMLScanner().parse(componentsXML, path);
+ LoadedDeclarations ds1 = new XMLScanner().parse(componentsXML, path, sp);
if(ds1 != null) ds.add(ds1);
}
if(seamProperties != null) {
@@ -143,46 +147,104 @@
protected void process(IParent element, LoadedDeclarations ds) throws JavaModelException
{
if(element == null) return;
IJavaElement[] es = element.getChildren();
+ String prefix = null;
for (int i = 0; i < es.length; i++) {
+ if(es[i] instanceof IClassFile) {
+ IClassFile typeRoot = (IClassFile)es[i];
+ if(es[i].getElementName().equals("package-info.class")) {
+ prefix = processPackageInfo(typeRoot, ds);
+ break;
+ }
+ }
+ }
+ for (int i = 0; i < es.length; i++) {
if(es[i] instanceof IPackageFragment) {
process((IPackageFragment)es[i], ds);
} else if(es[i] instanceof IClassFile) {
IClassFile typeRoot = (IClassFile)es[i];
- processWithClassReader(typeRoot, ds);
+ if(es[i].getElementName().equals("package-info.class")) {
+ continue;
+ } else {
+ processWithClassReader(typeRoot, ds, prefix);
+ }
}
}
}
- void processWithClassReader(IClassFile typeRoot, LoadedDeclarations ds) {
+ void processWithClassReader(IClassFile typeRoot, LoadedDeclarations ds, String prefix)
{
IType type = typeRoot.getType();
+ ClassFileReader reader = getReader(type, typeRoot);
+
+ if(reader == null) return;
+ LoadedDeclarations ds1 = null;
+
+ //TODO use prefix
+ TypeScanner scanner = new TypeScanner();
+ if(!scanner.isLikelyComponentSource(reader)) return;
+ ds1 = scanner.parse(type, reader, sourcePath);
+
+ if(ds1 != null) {
+ ds.add(ds1);
+ }
+ }
+
+ String processPackageInfo(IClassFile typeRoot, LoadedDeclarations ds) {
+ IType type = typeRoot.getType();
+
+ ClassFileReader reader = getReader(type, typeRoot);
+
+ if(reader == null) return null;
+ IBinaryAnnotation[] as = reader.getAnnotations();
+ IBinaryAnnotation namespaceAnnotation = getNamespaceAnnotation(as);
+ if(namespaceAnnotation == null) return null;
+ String uri = TypeScanner.getValue(namespaceAnnotation, "value");
+ String prefix = TypeScanner.getValue(namespaceAnnotation, "prefix");
+ if(uri == null) return null;
+
String className = type.getFullyQualifiedName();
+ int i = className.indexOf(".package-info");
+ if(i < 0) return null;
+ String packageName = className.substring(0, i);
+
+ SeamNamespace n = new SeamNamespace();
+ n.setSourcePath(sourcePath);
+ n.setURI(uri);
+ n.setPackage(packageName);
+
+ ds.getNamespaces().add(n);
+
+ return prefix;
+ }
+
+ static IBinaryAnnotation getNamespaceAnnotation(IBinaryAnnotation[] as) {
+ if(as != null) for (int i = 0; i < as.length; i++) {
+ String type = TypeScanner.getTypeName(as[i]);
+ if(type != null && type.equals(SeamAnnotations.NAMESPACE_ANNOTATION_TYPE)) {
+ return as[i];
+ }
+ }
+ return null;
+ }
+
+ private ClassFileReader getReader(IType type, IClassFile typeRoot) {
+ String className = type.getFullyQualifiedName();
byte[] bs = null;
try {
bs = typeRoot.getBytes();
} catch (JavaModelException e) {
- return;
+ return null;
}
- ClassFileReader reader = null;
-
try {
- reader = ClassFileReader.read(new ByteArrayInputStream(bs), className, false);
+ return ClassFileReader.read(new ByteArrayInputStream(bs), className, false);
} catch (Throwable t) {
//ignore
}
-
- if(reader == null) return;
- LoadedDeclarations ds1 = null;
- TypeScanner scanner = new TypeScanner();
- if(!scanner.isLikelyComponentSource(reader)) return;
- ds1 = scanner.parse(type, reader, sourcePath);
+ return null;
+ }
- if(ds1 != null) {
- ds.add(ds1);
- }
- }
}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/lib/TypeScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -104,7 +104,7 @@
return false;
}
- protected String getTypeName(IBinaryAnnotation a) {
+ public static String getTypeName(IBinaryAnnotation a) {
if(a.getTypeName() == null) return ""; //$NON-NLS-1$
String t = new String(a.getTypeName());
if(t.startsWith("L") && t.endsWith(";")) { //$NON-NLS-1$
//$NON-NLS-2$
@@ -280,7 +280,7 @@
}
}
- private String getValue(IBinaryAnnotation a, String method) {
+ public static String getValue(IBinaryAnnotation a, String method) {
try {
IBinaryElementValuePair[] ps = a.getElementValuePairs();
if(ps != null) for (int i = 0; i < ps.length; i++) {
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/PropertiesScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/PropertiesScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/PropertiesScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -22,6 +22,7 @@
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
+import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.internal.core.InnerModelHelper;
import org.jboss.tools.seam.internal.core.SeamPropertiesDeclaration;
import org.jboss.tools.seam.internal.core.SeamProperty;
@@ -63,7 +64,7 @@
* @return
* @throws ScannerException
*/
- public LoadedDeclarations parse(IFile f) throws ScannerException {
+ public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException {
XModel model = InnerModelHelper.createXModel(f.getProject());
if(model == null) return null;
XModelObject o = EclipseResourceUtil.getObjectByResource(model, f);
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/XMLScanner.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/XMLScanner.java 2008-11-21
15:50:48 UTC (rev 11949)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/XMLScanner.java 2008-11-21
15:54:42 UTC (rev 11950)
@@ -11,6 +11,7 @@
package org.jboss.tools.seam.internal.core.scanner.xml;
import java.util.HashSet;
+import java.util.Map;
import java.util.Set;
import java.util.StringTokenizer;
@@ -26,6 +27,9 @@
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
+import org.jboss.tools.common.model.util.NamespaceMapping;
+import org.jboss.tools.seam.core.ISeamNamespace;
+import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
import org.jboss.tools.seam.core.SeamCorePlugin;
import org.jboss.tools.seam.core.event.ISeamValue;
@@ -84,11 +88,11 @@
* @return
* @throws ScannerException
*/
- public LoadedDeclarations parse(IFile f) throws ScannerException {
+ public LoadedDeclarations parse(IFile f, ISeamProject sp) throws ScannerException {
XModel model = InnerModelHelper.createXModel(f.getProject());
if(model == null) return null;
XModelObject o = EclipseResourceUtil.getObjectByResource(model, f);
- return parse(o, f.getFullPath());
+ return parse(o, f.getFullPath(), sp);
}
static Set<String> COMMON_ATTRIBUTES = new HashSet<String>();
@@ -109,8 +113,10 @@
INTERNAL_ATTRIBUTES.add("#comment"); //$NON-NLS-1$
}
- public LoadedDeclarations parse(XModelObject o, IPath source) {
+ public LoadedDeclarations parse(XModelObject o, IPath source, ISeamProject sp) {
if(o == null) return null;
+
+ NamespaceMapping nm = NamespaceMapping.load(o);
if(o.getParent() instanceof FolderImpl) {
IFile f = ResourcesPlugin.getWorkspace().getRoot().getFile(source);
@@ -131,14 +137,14 @@
LoadedDeclarations ds = new LoadedDeclarations();
if(o.getModelEntity().getName().equals("FileSeamComponent12")) {
//$NON-NLS-1$
- parseComponent(o, source, ds);
+ parseComponent(o, source, nm, sp, ds);
return ds;
}
XModelObject[] os = o.getChildren();
for (int i = 0; i < os.length; i++) {
XModelEntity componentEntity = os[i].getModelEntity();
if(componentEntity.getAttribute("class") != null) { //$NON-NLS-1$
- parseComponent(os[i], source, ds);
+ parseComponent(os[i], source, nm, sp, ds);
} else if(os[i].getModelEntity().getName().startsWith("SeamFactory")) {
//$NON-NLS-1$
SeamXmlFactory factory = new SeamXmlFactory();
factory.setId(os[i]);
@@ -158,7 +164,7 @@
return ds;
}
- private void parseComponent(XModelObject c, IPath source, LoadedDeclarations ds) {
+ private void parseComponent(XModelObject c, IPath source, NamespaceMapping nm,
ISeamProject sp, LoadedDeclarations ds) {
SeamXmlComponentDeclaration component = new SeamXmlComponentDeclaration();
component.setSourcePath(source);
@@ -170,7 +176,7 @@
} else if(c.getModelEntity().getName().equals("FileSeamComponent12")) {
//$NON-NLS-1$
component.setClassName(getImpliedClassName(c, source));
} else {
- String className = getDefaultClassName(c);
+ String className = getDefaultClassName(c, nm, sp.getNamespaces());
if(className != null) {
component.setClassName(className);
component.setClassNameGuessed(true);
@@ -335,13 +341,25 @@
* @param c
* @return
*/
- public static String getDefaultClassName(XModelObject c) {
+ public static String getDefaultClassName(XModelObject c, NamespaceMapping nm,
Map<String, ISeamNamespace> ns) {
String s = c.getModelEntity().getXMLSubPath();
int d = s.indexOf(':');
if(d < 0) return null;
String namespace = s.substring(0, d);
String tag = s.substring(d + 1);
- String className = "org.jboss.seam." + namespace + "." +
toCamelCase(tag, true); //$NON-NLS-1$ //$NON-NLS-2$
+
+ String packageName = "org.jboss.seam." + namespace;
+ if(nm != null) {
+ String uri = nm.getURIForDefaultNamespace(namespace);
+ if(uri != null && ns != null) {
+ ISeamNamespace n = ns.get(uri);
+ if(n != null) {
+ String pn = n.getPackage();
+ if(pn != null && pn.length() > 0) packageName = pn;
+ }
+ }
+ }
+ String className = packageName + "." + toCamelCase(tag, true); //$NON-NLS-1$
//$NON-NLS-2$
return className;
}