You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by mc...@apache.org on 2008/05/23 03:36:01 UTC
svn commit: r659354 -
/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java
Author: mcconne
Date: Thu May 22 18:36:00 2008
New Revision: 659354
URL: http://svn.apache.org/viewvc?rev=659354&view=rev
Log:
GERONIMODEVTOOLS-347 Support reordering of IModule array prior to port to GEP 1.1
Modified:
geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java
Modified: geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java
URL: http://svn.apache.org/viewvc/geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java?rev=659354&r1=659353&r2=659354&view=diff
==============================================================================
--- geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java (original)
+++ geronimo/devtools/eclipse-plugin/trunk/plugins/org.apache.geronimo.st.core/src/main/java/org/apache/geronimo/st/core/internal/DependencyHelper.java Thu May 22 18:36:00 2008
@@ -57,6 +57,10 @@
private DependencyManager dm = new DependencyManager();
private ObjectFactory deploymentFactory = new ObjectFactory();
+ private List inputModules = new ArrayList();
+ private List inputDeltaKind = new ArrayList();
+ private List reorderedModules = new ArrayList();
+ private List reorderedKinds = new ArrayList();
private List<JAXBElement> inputJAXBElements = new ArrayList();
private List<JAXBElement> reorderedJAXBElements = new ArrayList();
@@ -72,19 +76,21 @@
public List reorderModules( List modules, List deltaKind ) {
Trace.tracePoint("Entry", "DependencyHelper.reorderModules", modules, deltaKind);
- int size = modules.size();
- if (size == 0) {
+ if (modules.size() == 0) {
List reorderedLists = new ArrayList(2);
- reorderedLists.add( modules );
- reorderedLists.add( deltaKind );
+ reorderedLists.add(modules);
+ reorderedLists.add(deltaKind);
Trace.tracePoint("Exit ", "DependencyHelper.reorderModules", reorderedLists);
return reorderedLists;
}
+ inputModules = modules;
+ inputDeltaKind = deltaKind;
+
//
// Iterate through all the modules and register the dependencies
//
- for (int ii=0; ii<size; ii++) {
+ for (int ii=0; ii<modules.size(); ii++) {
IModule[] module = (IModule[]) modules.get(ii);
int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
@@ -108,84 +114,53 @@
}
//
- // Reorder modules and deltaKind as necessary
+ // Iterate through all the modules again and reorder as necessary
//
- List reorderedModules = new ArrayList(size);
- List reorderedKinds = new ArrayList(size);
-
- // Move REMOVED modules first
- for (int ii=0; ii<size; ii++) {
- IModule[] module = (IModule[]) modules.get(ii);
- int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
- if (moduleDeltaKind == ServerBehaviourDelegate.REMOVED) {
- reorderedModules.add( module );
- reorderedKinds.add( moduleDeltaKind );
- }
- }
-
- // Next move modules with no dependencies
- for (int ii=0; ii<size; ii++) {
- IModule[] module = (IModule[]) modules.get(ii);
- int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
- if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
- Environment environment = getEnvironment(module[0]);
- if (environment != null) {
- Artifact artifact = environment.getModuleId();
- if (dm.getChildren(artifact).size() == 0 &&
- dm.getParents(artifact).size() == 0) {
- reorderedModules.add( module );
- reorderedKinds.add( moduleDeltaKind );
- }
- }
- }
- }
-
- // Next move modules with children but no parents
- for (int ii=0; ii<size; ii++) {
- IModule[] module = (IModule[]) modules.get(ii);
- int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
- if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
- Environment environment = getEnvironment(module[0]);
- if (environment != null) {
- Artifact artifact = environment.getModuleId();
- if (dm.getChildren(artifact).size() > 0 &&
- dm.getParents(artifact).size() == 0) {
- reorderedModules.add( module );
- reorderedKinds.add( moduleDeltaKind );
- }
- }
- }
- }
-
- // Next move modules with parents but no children
- for (int ii=0; ii<size; ii++) {
+ for (int ii=0; ii<modules.size(); ii++) {
IModule[] module = (IModule[]) modules.get(ii);
int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
- if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
- Environment environment = getEnvironment(module[0]);
- if (environment != null) {
- Artifact artifact = environment.getModuleId();
- if (dm.getChildren(artifact).size() == 0 &&
- dm.getParents(artifact).size() > 0) {
- reorderedModules.add( module );
- reorderedKinds.add( moduleDeltaKind );
- }
+ if (!reorderedModules.contains(module)) {
+ // Not already moved
+ if (moduleDeltaKind == ServerBehaviourDelegate.REMOVED) {
+ // Move module if going to be removed
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
}
- }
- }
-
- // Finally move modules with both parent(s) and children (TODO)
- for (int ii=0; ii<size; ii++) {
- IModule[] module = (IModule[]) modules.get(ii);
- int moduleDeltaKind = ((Integer)deltaKind.get(ii)).intValue();
- if (moduleDeltaKind != ServerBehaviourDelegate.REMOVED) {
- Environment environment = getEnvironment(module[0]);
- if (environment != null) {
- Artifact artifact = environment.getModuleId();
- if (dm.getChildren(artifact).size() > 0 &&
- dm.getParents(artifact).size() > 0) {
- reorderedModules.add( module );
- reorderedKinds.add( moduleDeltaKind );
+ else {
+ Environment environment = getEnvironment(module[0]);
+ if (environment != null) {
+ Artifact artifact = environment.getModuleId();
+ if (artifact == null) {
+ // Move if null (nothing can be done)
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
+ else if (dm.getParents(artifact).contains(artifact) ||
+ dm.getChildren(artifact).contains(artifact)) {
+ // Move if a tight circular dependency (nothing can be done)
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
+ else if (dm.getParents(artifact).size() == 0) {
+ // Move if no parents (nothing to do)
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
+ else if (dm.getParents(artifact).size() > 0) {
+ // Move parents first
+ processParents(dm.getParents(artifact), artifact);
+ // Move self
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
}
}
}
@@ -201,8 +176,8 @@
// Return List of lists
//
List reorderedLists = new ArrayList(2);
- reorderedLists.add( reorderedModules );
- reorderedLists.add( reorderedKinds );
+ reorderedLists.add(reorderedModules);
+ reorderedLists.add(reorderedKinds);
Trace.tracePoint("Exit ", "DependencyHelper.reorderModules", reorderedLists);
return reorderedLists;
@@ -219,14 +194,13 @@
public List<JAXBElement> reorderJAXBElements( List<JAXBElement> jaxbElements ) {
Trace.tracePoint("Entry", "DependencyHelper.reorderModules", jaxbElements);
- inputJAXBElements = jaxbElements;
-
- int size = jaxbElements.size();
- if (size == 0) {
+ if (jaxbElements.size() == 0) {
Trace.tracePoint("Exit ", "DependencyHelper.reorderModules", jaxbElements);
return jaxbElements;
}
+ inputJAXBElements = jaxbElements;
+
//
// Iterate through all the JAXBElements and register the dependencies
//
@@ -257,8 +231,8 @@
// Iterate through all the JAXBElements again and reorder as necessary
//
for (JAXBElement jaxbElement : jaxbElements) {
- // Already moved ??
if (!reorderedJAXBElements.contains(jaxbElement)) {
+ // Not already moved
Environment environment = getEnvironment(jaxbElement);
if (environment != null) {
Artifact artifact = environment.getModuleId();
@@ -283,7 +257,7 @@
}
else if (dm.getParents(artifact).size() > 0) {
// Move parents first
- processParents(dm.getParents(artifact), artifact);
+ processJaxbParents(dm.getParents(artifact), artifact);
// Move self
if (!reorderedJAXBElements.contains(jaxbElement)) {
reorderedJAXBElements.add(jaxbElement);
@@ -321,6 +295,49 @@
\*--------------------------------------------------------------------------------------------*/
/**
+ * Process the parents for a given artifact. The terminatingArtifact parameter will be used as
+ * the terminating condition to ensure there will not be an infinite loop (i.e., if
+ * terminatingArtifact is encountered again there is a circular dependency).
+ *
+ * @param parents
+ * @param terminatingArtifact
+ */
+ private void processParents(Set parents, Artifact terminatingArtifact) {
+ Trace.tracePoint("Enter", "DependencyHelper.processParents", parents, terminatingArtifact );
+
+ if (parents == null) {
+ Trace.tracePoint("Exit ", "DependencyHelper.processParents", null);
+ return;
+ }
+ for (Iterator ii = parents.iterator(); ii.hasNext();) {
+ Artifact artifact = (Artifact)ii.next();
+ if (dm.getParents(artifact).size() > 0 && !artifact.equals(terminatingArtifact)) {
+ // Keep processing parents (as long as no circular dependencies)
+ processParents(dm.getParents(artifact), terminatingArtifact);
+ // Move self
+ IModule[] module = getModule(artifact);
+ int moduleDeltaKind = getDeltaKind(artifact);
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
+ else {
+ // Move parent
+ IModule[] module = getModule(artifact);
+ int moduleDeltaKind = getDeltaKind(artifact);
+ if (!reorderedModules.contains(module)) {
+ reorderedModules.add(module);
+ reorderedKinds.add(moduleDeltaKind);
+ }
+ }
+ }
+
+ Trace.tracePoint("Exit ", "DependencyHelper.processParents");
+ }
+
+
+ /**
* Returns the Environment for the given IModule
*
* @param module IModule to be published
@@ -358,36 +375,57 @@
/**
- * Returns the Environment for the given JAXBElement plan
+ * Return the IModule[] for a given artifact
*
- * @param jaxbElement JAXBElement plan
+ * @param artifact
*
- * @return Environment
+ * @return IModule[]
*/
- private Environment getEnvironment(JAXBElement jaxbElement) {
- Trace.tracePoint("Enter", "DependencyHelper.getEnvironment", jaxbElement);
+ private IModule[] getModule(Artifact artifact) {
+ Trace.tracePoint("Enter", "DependencyHelper.getModule", artifact);
- Environment environment = null;
- Object plan = jaxbElement.getValue();
- if (WebApp.class.isInstance(plan)) {
- if (plan != null)
- environment = ((WebApp)plan).getEnvironment();
- }
- else if (OpenejbJar.class.isInstance(plan)) {
- if (plan != null)
- environment = ((OpenejbJar)plan).getEnvironment();
- }
- else if (Application.class.isInstance(plan)) {
- if (plan != null)
- environment = ((Application)plan).getEnvironment();
- }
- else if (Connector.class.isInstance(plan)) {
- if (plan != null)
- environment = ((Connector)plan).getEnvironment();
+ for (int ii=0; ii<inputModules.size(); ii++) {
+ IModule[] module = (IModule[]) inputModules.get(ii);
+ int moduleDeltaKind = ((Integer)inputDeltaKind.get(ii)).intValue();
+ Environment environment = getEnvironment(module[0]);
+ if (environment != null) {
+ Artifact moduleArtifact = environment.getModuleId();
+ if (artifact.equals(moduleArtifact)) {
+ Trace.tracePoint("Exit ", "DependencyHelper.getModule", module);
+ return module;
+ }
+ }
}
- Trace.tracePoint("Exit ", "DependencyHelper.getEnvironment", environment);
- return environment;
+ Trace.tracePoint("Exit ", "DependencyHelper.getModule", null);
+ return null;
+ }
+
+
+ /**
+ * Return the deltaKind array index for a given artifact
+ *
+ * @param artifact
+ *
+ * @return int
+ */
+ private int getDeltaKind(Artifact artifact) {
+ Trace.tracePoint("Enter", "DependencyHelper.getDeltaKind", artifact);
+
+ for (int ii=0; ii<inputModules.size(); ii++) {
+ IModule[] module = (IModule[]) inputModules.get(ii);
+ int moduleDeltaKind = ((Integer)inputDeltaKind.get(ii)).intValue();
+ Environment environment = getEnvironment(module[0]);
+ if (environment != null) {
+ Artifact moduleArtifact = environment.getModuleId();
+ if (artifact.equals(moduleArtifact)) {
+ Trace.tracePoint("Exit ", "DependencyHelper.getDeltaKind", moduleDeltaKind);
+ return moduleDeltaKind;
+ }
+ }
+ }
+ Trace.tracePoint("Exit ", "DependencyHelper.getDeltaKind", 0);
+ return 0;
}
@@ -487,17 +525,18 @@
* @param parents
* @param terminatingArtifact
*/
- private void processParents(Set parents, Artifact terminatingArtifact) {
- Trace.tracePoint("Enter", "DependencyHelper.processParents", parents, terminatingArtifact );
+ private void processJaxbParents(Set parents, Artifact terminatingArtifact) {
+ Trace.tracePoint("Enter", "DependencyHelper.processJaxbParents", parents, terminatingArtifact );
if (parents == null) {
+ Trace.tracePoint("Exit ", "DependencyHelper.processJaxbParents", null);
return;
}
for (Iterator ii = parents.iterator(); ii.hasNext();) {
Artifact artifact = (Artifact)ii.next();
if (dm.getParents(artifact).size() > 0 && !artifact.equals(terminatingArtifact)) {
// Keep processing parents (as long as no circular dependencies)
- processParents(dm.getParents(artifact), terminatingArtifact);
+ processJaxbParents(dm.getParents(artifact), terminatingArtifact);
// Move self
JAXBElement jaxbElement = getJaxbElement(artifact);
if (jaxbElement != null) {
@@ -517,7 +556,41 @@
}
}
- Trace.tracePoint("Exit ", "DependencyHelper.processParents");
+ Trace.tracePoint("Exit ", "DependencyHelper.processJaxbParents");
+ }
+
+
+ /**
+ * Returns the Environment for the given JAXBElement plan
+ *
+ * @param jaxbElement JAXBElement plan
+ *
+ * @return Environment
+ */
+ private Environment getEnvironment(JAXBElement jaxbElement) {
+ Trace.tracePoint("Enter", "DependencyHelper.getEnvironment", jaxbElement);
+
+ Environment environment = null;
+ Object plan = jaxbElement.getValue();
+ if (WebApp.class.isInstance(plan)) {
+ if (plan != null)
+ environment = ((WebApp)plan).getEnvironment();
+ }
+ else if (OpenejbJar.class.isInstance(plan)) {
+ if (plan != null)
+ environment = ((OpenejbJar)plan).getEnvironment();
+ }
+ else if (Application.class.isInstance(plan)) {
+ if (plan != null)
+ environment = ((Application)plan).getEnvironment();
+ }
+ else if (Connector.class.isInstance(plan)) {
+ if (plan != null)
+ environment = ((Connector)plan).getEnvironment();
+ }
+
+ Trace.tracePoint("Exit ", "DependencyHelper.getEnvironment", environment);
+ return environment;
}
@@ -536,6 +609,7 @@
if (environment != null) {
Artifact jaxbArtifact = environment.getModuleId();
if (artifact.equals(jaxbArtifact)) {
+ Trace.tracePoint("Exit ", "DependencyHelper.getJaxbElement", jaxbElement);
return jaxbElement;
}
}