Author: scabanovich
Date: 2008-11-28 10:12:36 -0500 (Fri, 28 Nov 2008)
New Revision: 12126
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/PackageInfoRequestor.java
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/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/SeamXmlComponentDeclaration.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/xml/XMLScanner.java
Log:
JBIDE-2957
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-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -99,7 +99,7 @@
*
* @return
*/
- public Map<String, ISeamNamespace> getNamespaces();
+ public Map<String, Set<ISeamNamespace>> getNamespaces();
/**
* Returns seam component. Project can have only one ISeamComponent with
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-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -312,7 +312,7 @@
usedBy.add(p);
}
- public Map<String, ISeamNamespace> getNamespaces() {
+ public Map<String, Set<ISeamNamespace>> getNamespaces() {
return namespaces.namespacesByURI;
}
@@ -486,8 +486,11 @@
private void storeNamespaces(Element root) {
Element namespacesElement = XMLUtilities.createElement(root, "namespaces");
//$NON-NLS-1$
- for (ISeamNamespace n : namespaces.namespacesByURI.values()) {
- ((SeamNamespace)n).toXML(namespacesElement);
+ for (String uri : namespaces.namespacesByURI.keySet()) {
+ Set<ISeamNamespace> s = namespaces.namespacesByURI.get(uri);
+ for (ISeamNamespace n: s) {
+ ((SeamNamespace)n).toXML(namespacesElement);
+ }
}
}
@@ -1562,15 +1565,18 @@
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);
+ for (String uri : namespaces.namespacesByURI.keySet()) {
+ Set<ISeamNamespace> s = namespaces.namespacesByURI.get(uri);
+ for (ISeamNamespace n : s) {
+ 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);
}
- ds.getNamespaces().add(n);
}
for (ISeamFactory f : factories.allFactories) {
IPath p = f.getSourcePath();
@@ -1670,10 +1676,9 @@
p.getComponents().add(c);
}
-
class NamespaceStorage {
Map<IPath, Set<ISeamNamespace>> namespacesBySource = new HashMap<IPath,
Set<ISeamNamespace>>();
- Map<String, ISeamNamespace> namespacesByURI = new HashMap<String,
ISeamNamespace>();
+ Map<String, Set<ISeamNamespace>> namespacesByURI = new HashMap<String,
Set<ISeamNamespace>>();
public void clear() {
namespacesBySource.clear();
@@ -1690,22 +1695,24 @@
if(ns.length == 0) {
removePath(source);
} else {
- if(sd != null) {
- sd.clear();
- } else {
- sd = new HashSet<ISeamNamespace>();
- namespacesBySource.put(source, sd);
- }
+ //TODO replace this with merge!
+ removePath(source);
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]);
+ addNamespace(ns[i]);
}
}
}
public void addNamespace(ISeamNamespace n) {
- namespacesByURI.put(n.getURI(), n);
+ String uri = n.getURI();
+ if(uri != null) {
+ Set<ISeamNamespace> s = namespacesByURI.get(uri);
+ if(s == null) {
+ s = new HashSet<ISeamNamespace>();
+ namespacesByURI.put(n.getURI(), s);
+ }
+ s.add(n);
+ }
IPath path = n.getSourcePath();
if(path != null) {
Set<ISeamNamespace> fs = namespacesBySource.get(path);
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-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamResourceVisitor.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -131,7 +131,7 @@
static long timeUsed = 0;
void componentsLoaded(LoadedDeclarations c, IFile resource) {
- if(c == null || c.getComponents().size() + c.getFactories().size() == 0) return;
+ if(c == null || c.getComponents().size() + c.getFactories().size() +
c.getNamespaces().size() == 0) return;
p.registerComponents(c, resource.getFullPath());
}
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java 2008-11-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamXmlComponentDeclaration.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -220,7 +220,7 @@
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());
+ className = XMLScanner.getDefaultClassName(c, nm, sp);
isClassNameGuessed = true;
}
}
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-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/JavaScanner.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -19,6 +19,7 @@
import org.eclipse.jdt.core.ICompilationUnit;
import org.eclipse.jdt.core.IJavaElement;
import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IType;
import org.eclipse.jdt.core.JavaCore;
import org.eclipse.jdt.core.JavaModelException;
@@ -91,11 +92,16 @@
NLS.bind(SeamCoreMessages.JAVA_SCANNER_CANNOT_GET_COMPILATION_UNIT_FOR,f), e);
}
if(u == null) return null;
- ASTRequestorImpl requestor = new ASTRequestorImpl(f);
ICompilationUnit[] us = new ICompilationUnit[]{u};
ASTParser p = ASTParser.newParser(AST.JLS3);
p.setSource(u);
p.setResolveBindings(true);
+ if("package-info.java".equals(f.getFullPath().lastSegment())) {
+ PackageInfoRequestor requestor = new PackageInfoRequestor(f);
+ p.createASTs(us, new String[0], requestor, null);
+ return requestor.getDeclarations();
+ }
+ ASTRequestorImpl requestor = new ASTRequestorImpl(f);
p.createASTs(us, new String[0], requestor, null);
return requestor.getDeclarations();
}
@@ -108,6 +114,13 @@
if(rs[i].getFullPath().isPrefixOf(f.getFullPath())) {
IPath path =
f.getFullPath().removeFirstSegments(rs[i].getFullPath().segmentCount());
IJavaElement e = javaProject.findElement(path);
+ if(e == null && path.lastSegment().equals("package-info.java")) {
+ //strange but sometimes only this works
+ IJavaElement ep = javaProject.findElement(path.removeLastSegments(1));
+ if(ep instanceof IPackageFragment) {
+ e = ((IPackageFragment)ep).getCompilationUnit("package-info.java");
+ }
+ }
if(e instanceof ICompilationUnit) {
return (ICompilationUnit)e;
}
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/PackageInfoRequestor.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/PackageInfoRequestor.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/java/PackageInfoRequestor.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -0,0 +1,93 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Red Hat, Inc.
+ * Distributed under license by Red Hat, Inc. All rights reserved.
+ * This program is made available under the terms of the
+ * Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at
http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ * Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.seam.internal.core.scanner.java;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.dom.ASTRequestor;
+import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.IAnnotationBinding;
+import org.eclipse.jdt.core.dom.NormalAnnotation;
+import org.eclipse.jdt.core.dom.PackageDeclaration;
+import org.jboss.tools.seam.internal.core.SeamNamespace;
+import org.jboss.tools.seam.internal.core.scanner.LoadedDeclarations;
+
+/**
+ * This object collects annotations from package-info.java.
+ *
+ * @author Viacheslav Kabanovich
+ */
+public class PackageInfoRequestor extends ASTRequestor {
+ PackageInfoVisitor visitor = new PackageInfoVisitor();
+ LoadedDeclarations ds = new LoadedDeclarations();
+ IResource resource;
+ IPath sourcePath;
+
+ public PackageInfoRequestor(IResource resource) {
+ this.resource = resource;
+ this.sourcePath = resource.getFullPath();
+ }
+
+ public LoadedDeclarations getDeclarations() {
+ return ds;
+ }
+
+ public void acceptAST(ICompilationUnit source, CompilationUnit ast) {
+ ast.accept(visitor);
+ for (SeamNamespace n: visitor.namespaces) {
+ n.setSourcePath(resource.getFullPath());
+ n.setPackage(visitor.javaPackage);
+ }
+ ds.getNamespaces().addAll(visitor.namespaces);
+ }
+
+}
+
+class PackageInfoVisitor extends ASTVisitor implements SeamAnnotations {
+ List<SeamNamespace> namespaces = new ArrayList<SeamNamespace>();
+ String javaPackage = null;
+
+ public PackageInfoVisitor() {}
+
+ public boolean visit(PackageDeclaration node) {
+ if(node.getName() != null) {
+ javaPackage = node.getName().getFullyQualifiedName();
+ }
+ return true;
+ }
+
+ public boolean visit(NormalAnnotation node) {
+ IAnnotationBinding b = node.resolveAnnotationBinding();
+ if(b != null) {
+ String type = b.getAnnotationType().getQualifiedName();
+ if(NAMESPACE_ANNOTATION_TYPE.equals(type)) {
+ System.out.println("!!!\n" + node);
+ ValueInfo value = ValueInfo.getValueInfo(node, "value");
+ ValueInfo prefix = ValueInfo.getValueInfo(node, "prefix");
+ SeamNamespace ns = new SeamNamespace();
+ if(value != null) {
+ ns.setURI(value.getValue());
+ }
+ if(prefix != null) {
+ //
+ }
+ namespaces.add(ns);
+ }
+ }
+ return true;
+ }
+
+}
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-28
15:01:26 UTC (rev 12125)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/scanner/xml/XMLScanner.java 2008-11-28
15:12:36 UTC (rev 12126)
@@ -19,6 +19,10 @@
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.internal.core.ModelUpdater;
import org.jboss.tools.common.meta.XAttribute;
import org.jboss.tools.common.meta.XModelEntity;
import org.jboss.tools.common.model.XModel;
@@ -26,6 +30,7 @@
import org.jboss.tools.common.model.XModelObject;
import org.jboss.tools.common.model.filesystems.impl.FolderImpl;
import org.jboss.tools.common.model.plugin.ModelPlugin;
+import org.jboss.tools.common.model.util.EclipseJavaUtil;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.model.util.NamespaceMapping;
import org.jboss.tools.seam.core.ISeamNamespace;
@@ -176,7 +181,7 @@
} else if(c.getModelEntity().getName().equals("FileSeamComponent12")) {
//$NON-NLS-1$
component.setClassName(getImpliedClassName(c, source));
} else {
- String className = getDefaultClassName(c, nm, sp.getNamespaces());
+ String className = getDefaultClassName(c, nm, sp);
if(className != null) {
component.setClassName(className);
component.setClassNameGuessed(true);
@@ -341,25 +346,43 @@
* @param c
* @return
*/
- public static String getDefaultClassName(XModelObject c, NamespaceMapping nm,
Map<String, ISeamNamespace> ns) {
+ public static String getDefaultClassName(XModelObject c, NamespaceMapping nm,
ISeamProject sp) {
String s = c.getModelEntity().getXMLSubPath();
int d = s.indexOf(':');
if(d < 0) return null;
+
+ Map<String, Set<ISeamNamespace>> ns = sp == null ? null :
sp.getNamespaces();
+
String namespace = s.substring(0, d);
String tag = s.substring(d + 1);
String packageName = "org.jboss.seam." + namespace;
+ String name = toCamelCase(tag, true);
if(nm != null) {
String uri = nm.getURIForDefaultNamespace(namespace);
- if(uri != null && ns != null) {
- ISeamNamespace n = ns.get(uri);
- if(n != null) {
+ if(uri != null && ns != null && !ns.isEmpty()) {
+ Set<ISeamNamespace> set = ns.get(uri);
+
+ if(set != null && !set.isEmpty()) for (ISeamNamespace n: set) {
String pn = n.getPackage();
- if(pn != null && pn.length() > 0) packageName = pn;
+ if(pn == null || pn.length() == 0) continue;
+ String cn = pn + "." + name;
+ packageName = pn;
+ if(set.size() == 1) break;
+ IJavaProject jp = EclipseResourceUtil.getJavaProject(sp.getProject());
+ IType type = null;
+ try {
+ type = EclipseJavaUtil.findType(jp, cn);
+ } catch (JavaModelException e) {
+ ModelPlugin.getPluginLog().logError(e);
+ }
+ if(type != null) {
+ break;
+ }
}
}
}
- String className = packageName + "." + toCamelCase(tag, true); //$NON-NLS-1$
//$NON-NLS-2$
+ String className = packageName + "." + name; //$NON-NLS-1$
return className;
}