Author: scabanovich
Date: 2007-08-03 13:14:52 -0400 (Fri, 03 Aug 2007)
New Revision: 2890
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamPackage.java
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamPackage.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/core/ISeamScope.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/SeamScope.java
Log:
JBIDE-610,JBIDE-652
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamPackage.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamPackage.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamPackage.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -0,0 +1,24 @@
+/*******************************************************************************
+ * Copyright (c) 2007 Exadel, Inc. and 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:
+ * Exadel, Inc. and Red Hat, Inc. - initial API and implementation
+ ******************************************************************************/
+package org.jboss.tools.seam.core;
+
+import java.util.Set;
+
+/**
+ * @author Viacheslav Kabanovich
+ */
+public interface ISeamPackage extends ISeamElement {
+
+ public String getName();
+
+ public Set<ISeamComponent> getComponents();
+
+}
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 2007-08-03
16:29:25 UTC (rev 2889)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamProject.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -10,6 +10,7 @@
******************************************************************************/
package org.jboss.tools.seam.core;
+import java.util.Collection;
import java.util.Set;
import org.eclipse.core.resources.IProject;
@@ -37,6 +38,19 @@
* @return
*/
public ISeamScope getScope(ScopeType scopeType);
+
+ /**
+ * Returns packages
+ * @return
+ */
+ public Collection<ISeamPackage> getPackages();
+
+ /**
+ * Finds package object in this project for component.
+ * @param c
+ * @return
+ */
+ public ISeamPackage getPackage(ISeamComponent c);
/**
* Returns seam component. Project can have only one ISeamComponent with
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamScope.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamScope.java 2007-08-03
16:29:25 UTC (rev 2889)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/core/ISeamScope.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -10,6 +10,7 @@
******************************************************************************/
package org.jboss.tools.seam.core;
+import java.util.Collection;
import java.util.List;
/**
@@ -28,5 +29,18 @@
* @return list of all seam components resolved to this scope
*/
public List<ISeamComponent> getComponents();
+
+ /**
+ *
+ * @return collection of all packages
+ */
+ public Collection<ISeamPackage> getPackages();
+
+ /**
+ *
+ * @param c
+ * @return
+ */
+ public ISeamPackage getPackage(ISeamComponent c);
}
Added:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamPackage.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamPackage.java
(rev 0)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamPackage.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -0,0 +1,32 @@
+package org.jboss.tools.seam.internal.core;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.jboss.tools.seam.core.ISeamComponent;
+import org.jboss.tools.seam.core.ISeamPackage;
+
+public class SeamPackage extends SeamObject implements ISeamPackage {
+ Set<ISeamComponent> components = new HashSet<ISeamComponent>();
+ public String name;
+
+ public SeamPackage() {}
+
+ public SeamPackage(String name) {
+ setName(name);
+ }
+
+ public Set<ISeamComponent> getComponents() {
+ return components;
+ }
+
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ setId(name);
+ }
+
+}
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 2007-08-03
16:29:25 UTC (rev 2889)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamProject.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -38,6 +38,7 @@
import org.jboss.tools.seam.core.ISeamElement;
import org.jboss.tools.seam.core.ISeamFactory;
import org.jboss.tools.seam.core.ISeamJavaComponentDeclaration;
+import org.jboss.tools.seam.core.ISeamPackage;
import org.jboss.tools.seam.core.ISeamProject;
import org.jboss.tools.seam.core.ISeamScope;
import org.jboss.tools.seam.core.ISeamXmlComponentDeclaration;
@@ -78,6 +79,8 @@
Set<ISeamContextVariable> allVariables = new
HashSet<ISeamContextVariable>();
Map<String, SeamJavaComponentDeclaration> javaDeclarations = new
HashMap<String, SeamJavaComponentDeclaration>();
+ Map<String, ISeamPackage> packages = new HashMap<String, ISeamPackage>();
+
List<ISeamProjectChangeListener> listeners = new
ArrayList<ISeamProjectChangeListener>();
SeamValidationContext validationContext;
@@ -112,7 +115,16 @@
public ISeamScope getScope(ScopeType scopeType) {
return scopesMap.get(scopeType);
}
+
+ public Collection<ISeamPackage> getPackages() {
+ return packages.values();
+ }
+ public ISeamPackage getPackage(ISeamComponent c) {
+ String pkg = getPackageName(c);
+ return packages.get(pkg);
+ }
+
public ISeamProject getSeamProject() {
return this;
}
@@ -247,7 +259,7 @@
}
if(!sourcePaths.contains(source)) sourcePaths.add(source);
- revalidateScopesLock++;
+ revalidateLock++;
Map<Object,ISeamComponentDeclaration> currentComponents =
findComponentDeclarations(source);
@@ -326,8 +338,8 @@
componentDeclarationsRemoved(currentComponents);
- revalidateScopesLock--;
- revalidateScopes();
+ revalidateLock--;
+ revalidate();
Map<Object, ISeamFactory> currentFactories = findFactoryDeclarations(source);
List<Change> addedFactories = null;
@@ -389,7 +401,7 @@
public void pathRemoved(IPath source) {
if(!sourcePaths.contains(source)) return;
sourcePaths.remove(source);
- revalidateScopesLock++;
+ revalidateLock++;
Iterator<SeamComponent> iterator = allComponents.values().iterator();
while(iterator.hasNext()) {
List<Change> changes = null;
@@ -413,8 +425,8 @@
}
fireChanges(changes);
}
- revalidateScopesLock--;
- revalidateScopes();
+ revalidateLock--;
+ revalidate();
Iterator<ISeamFactory> factories = allFactories.iterator();
while(factories.hasNext()) {
@@ -740,10 +752,16 @@
return result;
}
- int revalidateScopesLock = 0;
+ int revalidateLock = 0;
+
+ void revalidate() {
+ if(revalidateLock > 0) return;
+ revalidateScopes();
+ revalidatePackages();
+ }
+
void revalidateScopes() {
List<Change> changes = null;
- if(revalidateScopesLock > 0) return;
for(SeamComponent c : allComponents.values()) {
SeamScope pc = (SeamScope)c.getParent();
SeamScope pn = (SeamScope)getScope(c.getScope());
@@ -756,9 +774,65 @@
pn.addComponent(c);
changes = Change.addChange(changes, new Change(pn, null, null, c));
}
+ for (int i = 0; i < scopes.length; i++) {
+ scopes[i].revalidatePackages();
+ }
fireChanges(changes);
}
+ void revalidatePackages() {
+ List<Change> changes = null;
+ for (ISeamPackage p : packages.values()) {
+ Iterator<ISeamComponent> cs = p.getComponents().iterator();
+ while(cs.hasNext()) {
+ ISeamComponent c = cs.next();
+ String pkg = getPackageName(c);
+ if(allComponents.get(c.getName()) == null || !p.getName().equals(pkg)) {
+ cs.remove();
+ changes = Change.addChange(changes, new Change(p, null, c, null));
+ }
+ }
+ }
+ for (ISeamComponent c : getComponents()) {
+ String pkg = getPackageName(c);
+ ISeamPackage p = findOrCreatePackage(this, packages, pkg);
+ if(p.getComponents().contains(c)) continue;
+ p.getComponents().add(c);
+ changes = Change.addChange(changes, new Change(p, null, null, c));
+ }
+ Iterator<String> ps = packages.keySet().iterator();
+ while(ps.hasNext()) {
+ ISeamPackage p = packages.get(ps.next());
+ if(p.getComponents().size() == 0) {
+ ps.remove();
+ changes = Change.addChange(changes, new Change(this, null, p, null));
+ }
+ }
+ fireChanges(changes);
+ }
+
+ static String getPackageName(ISeamComponent c) {
+ String cls = c.getClassName();
+ if(cls == null || cls.length() == 0) {
+ return "<Unspecified>";
+ } else {
+ int d = cls.lastIndexOf('.');
+ return (d < 0) ? "<default>" : cls.substring(0, d);
+ }
+ }
+
+ static ISeamPackage findOrCreatePackage(ISeamElement parent, Map<String,
ISeamPackage> packages, String name) {
+ ISeamPackage p = packages.get(name);
+ if(p == null) {
+ SeamPackage pi = new SeamPackage(name);
+ pi.setParent(parent);
+ pi.setSourcePath(parent.getSourcePath());
+ p = pi;
+ packages.put(name, pi);
+ }
+ return p;
+ }
+
protected void addToBuildSpec(String builderID) throws CoreException {
IProjectDescription description = getProject().getDescription();
@@ -801,4 +875,5 @@
return;
}
}
+
}
\ No newline at end of file
Modified:
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamScope.java
===================================================================
---
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamScope.java 2007-08-03
16:29:25 UTC (rev 2889)
+++
trunk/seam/plugins/org.jboss.tools.seam.core/src/org/jboss/tools/seam/internal/core/SeamScope.java 2007-08-03
17:14:52 UTC (rev 2890)
@@ -1,15 +1,23 @@
package org.jboss.tools.seam.internal.core;
import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Iterator;
import java.util.List;
+import java.util.Map;
import org.jboss.tools.seam.core.ISeamComponent;
+import org.jboss.tools.seam.core.ISeamPackage;
import org.jboss.tools.seam.core.ISeamScope;
import org.jboss.tools.seam.core.ScopeType;
+import org.jboss.tools.seam.core.event.Change;
public class SeamScope extends SeamObject implements ISeamScope {
private List<ISeamComponent> components = new ArrayList<ISeamComponent>();
private ScopeType scopeType = null;
+
+ Map<String, ISeamPackage> packages = new HashMap<String, ISeamPackage>();
SeamScope(SeamProject project, ScopeType scopeType) {
setParent(project);
@@ -20,6 +28,15 @@
return components;
}
+ public Collection<ISeamPackage> getPackages() {
+ return packages.values();
+ }
+
+ public ISeamPackage getPackage(ISeamComponent c) {
+ String pkg = SeamProject.getPackageName(c);
+ return packages.get(pkg);
+ }
+
public void addComponent(ISeamComponent component) {
components.add(component);
}
@@ -32,4 +49,35 @@
return scopeType;
}
+ void revalidatePackages() {
+ List<Change> changes = null;
+ for (ISeamPackage p : packages.values()) {
+ Iterator<ISeamComponent> cs = p.getComponents().iterator();
+ while(cs.hasNext()) {
+ ISeamComponent c = cs.next();
+ String pkg = SeamProject.getPackageName(c);
+ if(!components.contains(c) || !p.getName().equals(pkg)) {
+ cs.remove();
+ changes = Change.addChange(changes, new Change(p, null, c, null));
+ }
+ }
+ }
+ for (ISeamComponent c : getComponents()) {
+ String pkg = SeamProject.getPackageName(c);
+ ISeamPackage p = SeamProject.findOrCreatePackage(this, packages, pkg);
+ if(p.getComponents().contains(c)) continue;
+ p.getComponents().add(c);
+ changes = Change.addChange(changes, new Change(p, null, null, c));
+ }
+ Iterator<String> ps = packages.keySet().iterator();
+ while(ps.hasNext()) {
+ ISeamPackage p = packages.get(ps.next());
+ if(p.getComponents().size() == 0) {
+ ps.remove();
+ changes = Change.addChange(changes, new Change(this, null, p, null));
+ }
+ }
+ ((SeamProject)getSeamProject()).fireChanges(changes);
+ }
+
}