You are viewing a plain text version of this content. The canonical link for it is here.
Posted to scm@geronimo.apache.org by dj...@apache.org on 2011/05/08 07:39:22 UTC
svn commit: r1100682 - in
/geronimo/server/branches/3.0-osgi/framework/modules:
geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/
geronimo-kernel/src/main/java/org/apache/geronimo/kernel/
geronimo-kernel/src/main/java/org/apache/geronimo...
Author: djencks
Date: Sun May 8 05:39:22 2011
New Revision: 1100682
URL: http://svn.apache.org/viewvc?rev=1100682&view=rev
Log:
restore kernel DependencyManager accidently removed by Kevan's commit
Added:
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java (with props)
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java (with props)
Modified:
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/Kernel.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/KernelGBean.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicKernel.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/runtime/GBeanAttributeTest.java
geronimo/server/branches/3.0-osgi/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/jmx/KernelDelegate.java
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java Sun May 8 05:39:22 2011
@@ -78,7 +78,7 @@ public final class GBeanDependency
public synchronized boolean start() {
if (targetRunning && !dependencyRegistered) {
AbstractName abstractName = gbeanInstance.getAbstractName();
-// kernel.getDependencyManager().addDependency(abstractName, targetName);
+ kernel.getDependencyManager().addDependency(abstractName, targetName);
dependencyRegistered = true;
}
return targetRunning;
@@ -88,7 +88,7 @@ public final class GBeanDependency
public synchronized void stop() {
if (dependencyRegistered) {
AbstractName abstractName = gbeanInstance.getAbstractName();
-// kernel.getDependencyManager().removeDependency(abstractName, targetName);
+ kernel.getDependencyManager().removeDependency(abstractName, targetName);
dependencyRegistered = false;
}
}
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java Sun May 8 05:39:22 2011
@@ -50,7 +50,7 @@ import org.apache.geronimo.gbean.GOperat
import org.apache.geronimo.gbean.GReferenceInfo;
import org.apache.geronimo.gbean.InvalidConfigurationException;
import org.apache.geronimo.gbean.ReferencePatterns;
-// import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.DependencyManager;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.NoSuchAttributeException;
@@ -232,13 +232,11 @@ public final class GBeanInstance impleme
* if the gbeanInfo is inconsistent with the actual java classes, such as
* mismatched attribute types or the intial data cannot be set
*/
-// public GBeanInstance(GBeanData gbeanData, Kernel kernel, DependencyManager dependencyManager, LifecycleBroadcaster lifecycleBroadcaster, Bundle bundle) throws InvalidConfigurationException {
- public GBeanInstance(GBeanData gbeanData, Kernel kernel, LifecycleBroadcaster lifecycleBroadcaster, Bundle bundle) throws InvalidConfigurationException {
+ public GBeanInstance(GBeanData gbeanData, Kernel kernel, DependencyManager dependencyManager, LifecycleBroadcaster lifecycleBroadcaster, Bundle bundle) throws InvalidConfigurationException {
this.abstractName = gbeanData.getAbstractName();
this.kernel = kernel;
this.lifecycleBroadcaster = lifecycleBroadcaster;
-// this.gbeanInstanceState = new GBeanInstanceState(abstractName, kernel, dependencyManager, this, lifecycleBroadcaster);
- this.gbeanInstanceState = new GBeanInstanceState(abstractName, kernel, this, lifecycleBroadcaster);
+ this.gbeanInstanceState = new GBeanInstanceState(abstractName, kernel, dependencyManager, this, lifecycleBroadcaster);
this.bundle = bundle;
this.classLoader = new BundleClassLoader(bundle);
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/gbean/runtime/GBeanInstanceState.java Sun May 8 05:39:22 2011
@@ -19,7 +19,7 @@ package org.apache.geronimo.gbean.runtim
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.apache.geronimo.gbean.AbstractName;
-// import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.DependencyManager;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.Kernel;
import org.apache.geronimo.kernel.management.State;
@@ -54,7 +54,7 @@ public class GBeanInstanceState
/**
* The dependency manager
*/
-// private final DependencyManager dependencyManager;
+ private final DependencyManager dependencyManager;
/**
* The broadcaster of lifecycle events
@@ -65,11 +65,10 @@ public class GBeanInstanceState
// objects check if each other are in one state or another (i.e., classic A calls B while B calls A)
private volatile State state = State.STOPPED;
-// GBeanInstanceState(AbstractName abstractName, Kernel kernel, DependencyManager dependencyManager, GBeanInstance gbeanInstance, LifecycleBroadcaster lifecycleBroadcaster) {
- GBeanInstanceState(AbstractName abstractName, Kernel kernel, GBeanInstance gbeanInstance, LifecycleBroadcaster lifecycleBroadcaster) {
+ GBeanInstanceState(AbstractName abstractName, Kernel kernel, DependencyManager dependencyManager, GBeanInstance gbeanInstance, LifecycleBroadcaster lifecycleBroadcaster) {
this.abstractName = abstractName;
this.kernel = kernel;
-// this.dependencyManager = dependencyManager;
+ this.dependencyManager = dependencyManager;
this.gbeanInstance = gbeanInstance;
this.lifecycleBroadcaster = lifecycleBroadcaster;
}
@@ -128,18 +127,17 @@ public class GBeanInstanceState
start();
// startRecursive all of objects that depend on me
-// Set dependents = dependencyManager.getChildren(abstractName);
- Set dependents = null;
-// for (Iterator iterator = dependents.iterator(); iterator.hasNext();) {
-// AbstractName dependent = (AbstractName) iterator.next();
-// try {
-// kernel.startRecursiveGBean(dependent);
-// } catch (GBeanNotFoundException e) {
-// // this is ok the gbean died before we could start it
-// } catch (Exception e) {
-// // there is something wrong with this gbean... skip it
-// }
-// }
+ Set dependents = dependencyManager.getChildren(abstractName);
+ for (Iterator iterator = dependents.iterator(); iterator.hasNext();) {
+ AbstractName dependent = (AbstractName) iterator.next();
+ try {
+ kernel.startRecursiveGBean(dependent);
+ } catch (GBeanNotFoundException e) {
+ // this is ok the gbean died before we could start it
+ } catch (Exception e) {
+ // there is something wrong with this gbean... skip it
+ }
+ }
}
/**
@@ -175,21 +173,20 @@ public class GBeanInstanceState
// Don't try to stop dependents from within a synchronized block... this should reduce deadlocks
// stop all of my dependent objects
-// Set dependents = dependencyManager.getChildren(abstractName);
- Set dependents = null;
-// for (Iterator iterator = dependents.iterator(); iterator.hasNext();) {
-// AbstractName child = (AbstractName) iterator.next();
-// try {
-// log.trace("Checking if child is running: child={}", child);
-// if (kernel.getGBeanState(child) == State.RUNNING_INDEX) {
-// log.trace("Stopping child: child={}", child);
-// kernel.stopGBean(child);
-// log.trace("Stopped child: child={}", child);
-// }
-// } catch (Exception ignore) {
-// // not a big deal... did my best
-// }
-// }
+ Set dependents = dependencyManager.getChildren(abstractName);
+ for (Iterator iterator = dependents.iterator(); iterator.hasNext();) {
+ AbstractName child = (AbstractName) iterator.next();
+ try {
+ log.trace("Checking if child is running: child={}", child);
+ if (kernel.getGBeanState(child) == State.RUNNING_INDEX) {
+ log.trace("Stopping child: child={}", child);
+ kernel.stopGBean(child);
+ log.trace("Stopped child: child={}", child);
+ }
+ } catch (Exception ignore) {
+ // not a big deal... did my best
+ }
+ }
attemptFullStop();
}
@@ -243,31 +240,30 @@ public class GBeanInstanceState
}
// check if all of the gbeans we depend on are running
-// Set parents = dependencyManager.getParents(abstractName);
- Set parents = null;
-// for (Iterator i = parents.iterator(); i.hasNext();) {
-// AbstractName parent = (AbstractName) i.next();
-// if (!kernel.isLoaded(parent)) {
-// log.trace("Cannot run because parent is not registered: parent={}", parent);
-// return;
-// }
-// try {
-// log.trace("Checking if parent is running: parent={}", parent);
-// if (kernel.getGBeanState(parent) != State.RUNNING_INDEX) {
-// log.trace("Cannot run because parent is not running: parent={}", parent);
-// return;
-// }
-// log.trace("Parent is running: parent={}", parent);
-// } catch (GBeanNotFoundException e) {
-// // depended on instance was removed bewteen the register check and the invoke
-// log.trace("Cannot run because parent is not registered: parent={}", parent);
-// return;
-// } catch (Exception e) {
-// // problem getting the attribute, parent has most likely failed
-// log.trace("Cannot run because an error occurred while checking if parent is running: parent={}", parent);
-// return;
-// }
-// }
+ Set parents = dependencyManager.getParents(abstractName);
+ for (Iterator i = parents.iterator(); i.hasNext();) {
+ AbstractName parent = (AbstractName) i.next();
+ if (!kernel.isLoaded(parent)) {
+ log.trace("Cannot run because parent is not registered: parent={}", parent);
+ return;
+ }
+ try {
+ log.trace("Checking if parent is running: parent={}", parent);
+ if (kernel.getGBeanState(parent) != State.RUNNING_INDEX) {
+ log.trace("Cannot run because parent is not running: parent={}", parent);
+ return;
+ }
+ log.trace("Parent is running: parent={}", parent);
+ } catch (GBeanNotFoundException e) {
+ // depended on instance was removed bewteen the register check and the invoke
+ log.trace("Cannot run because parent is not registered: parent={}", parent);
+ return;
+ } catch (Exception e) {
+ // problem getting the attribute, parent has most likely failed
+ log.trace("Cannot run because an error occurred while checking if parent is running: parent={}", parent);
+ return;
+ }
+ }
}
try {
@@ -323,27 +319,26 @@ public class GBeanInstanceState
}
// check if all of the mbeans depending on us are stopped
-// Set children = dependencyManager.getChildren(abstractName);
- Set children = null;
-// for (Iterator i = children.iterator(); i.hasNext();) {
-// AbstractName child = (AbstractName) i.next();
-// if (kernel.isLoaded(child)) {
-// try {
-// log.trace("Checking if child is stopped: child={}", child);
-// int state = kernel.getGBeanState(child);
-// if (state == State.RUNNING_INDEX) {
-// log.trace("Cannot stop because child is still running: child={}", child);
-// return;
-// }
-// } catch (GBeanNotFoundException e) {
-// // depended on instance was removed between the register check and the invoke
-// } catch (Exception e) {
-// // problem getting the attribute, depended on bean has most likely failed
-// log.trace("Cannot run because an error occurred while checking if child is stopped: child={}", child);
-// return;
-// }
-// }
-// }
+ Set children = dependencyManager.getChildren(abstractName);
+ for (Iterator i = children.iterator(); i.hasNext();) {
+ AbstractName child = (AbstractName) i.next();
+ if (kernel.isLoaded(child)) {
+ try {
+ log.trace("Checking if child is stopped: child={}", child);
+ int state = kernel.getGBeanState(child);
+ if (state == State.RUNNING_INDEX) {
+ log.trace("Cannot stop because child is still running: child={}", child);
+ return;
+ }
+ } catch (GBeanNotFoundException e) {
+ // depended on instance was removed between the register check and the invoke
+ } catch (Exception e) {
+ // problem getting the attribute, depended on bean has most likely failed
+ log.trace("Cannot run because an error occurred while checking if child is stopped: child={}", child);
+ return;
+ }
+ }
+ }
}
// all is clear to stop... try to stop
Added: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java?rev=1100682&view=auto
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java (added)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java Sun May 8 05:39:22 2011
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.kernel;
+
+import org.apache.geronimo.gbean.AbstractName;
+
+import java.util.Set;
+
+/**
+ * DependencyManager is the record keeper of the dependencies in Geronimo. The DependencyManager
+ * does not enforce any dependencies, it is simply a place where components can register their intent
+ * to be dependent on another component.
+ * <p/>
+ * The DependencyManager uses the nomenclature of parent-child where a child is dependent on a parent.
+ * The names parent and child have no other meaning are just a convience to make the code readable.
+ *
+ * @version $Rev$ $Date$
+ */
+public interface DependencyManager {
+ /**
+ * Closes the dependency manager releasing all resources
+ */
+ public void close();
+
+ /**
+ * Declares a dependency from a child to a parent.
+ *
+ * @param child the dependent component
+ * @param parent the component the child is depending on
+ */
+ public void addDependency(AbstractName child, AbstractName parent);
+
+ /**
+ * Removes a dependency from a child to a parent
+ *
+ * @param child the dependnet component
+ * @param parent the component that the child wil no longer depend on
+ */
+ public void removeDependency(AbstractName child, AbstractName parent);
+
+ /**
+ * Removes all dependencies for a child
+ *
+ * @param child the component that will no longer depend on anything
+ */
+ public void removeAllDependencies(AbstractName child);
+
+ /**
+ * Adds dependencies from the child to every parent in the parents set
+ *
+ * @param child the dependent component
+ * @param parents the set of components the child is depending on
+ */
+ public void addDependencies(AbstractName child, Set parents);
+
+ /**
+ * Gets the set of parents that the child is depending on
+ *
+ * @param child the dependent component
+ * @return a collection containing all of the components the child depends on; will never be null
+ */
+ public Set getParents(AbstractName child);
+
+ /**
+ * Gets all of the MBeans that have a dependency on the specified startParent.
+ *
+ * @param parent the component the returned childen set depend on
+ * @return a collection containing all of the components that depend on the parent; will never be null
+ */
+ public Set getChildren(AbstractName parent);
+
+}
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/DependencyManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/Kernel.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/Kernel.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/Kernel.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/Kernel.java Sun May 8 05:39:22 2011
@@ -58,7 +58,7 @@ public interface Kernel {
* Gets the dependency manager kernel service
* @return the dependency manager or null if the kernel is not running
*/
-// DependencyManager getDependencyManager();
+ DependencyManager getDependencyManager();
/**
* Gets the lifecycle monitor kernel service
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/KernelGBean.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/KernelGBean.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/KernelGBean.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/KernelGBean.java Sun May 8 05:39:22 2011
@@ -48,9 +48,9 @@ public class KernelGBean implements Kern
return kernel.getNaming();
}
-// public DependencyManager getDependencyManager() {
-// return kernel.getDependencyManager();
-// }
+ public DependencyManager getDependencyManager() {
+ return kernel.getDependencyManager();
+ }
public LifecycleMonitor getLifecycleMonitor() {
return kernel.getLifecycleMonitor();
Added: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java?rev=1100682&view=auto
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java (added)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java Sun May 8 05:39:22 2011
@@ -0,0 +1,204 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.geronimo.kernel.basic;
+
+import org.apache.geronimo.gbean.AbstractName;
+import org.apache.geronimo.gbean.AbstractNameQuery;
+import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
+import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
+import org.apache.geronimo.kernel.lifecycle.LifecycleMonitor;
+
+import javax.management.ObjectName;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * DependencyManager is the record keeper of the dependencies in Geronimo. The DependencyManager
+ * does not enforce any dependencies, it is simply a place where components can register their intent
+ * to be dependent on another component. Since a JMX Component can pretty much do whatever it wants
+ * a component must watch the components it depends on to assure that they are following the
+ * J2EE-Management state machine.
+ * <p/>
+ * The DependencyManager uses the nomenclature of parent-child where a child is dependent on a parent.
+ * The names parent and child have no other meaning are just a convience to make the code readable.
+ *
+ * @version $Rev$ $Date$
+ */
+public class BasicDependencyManager implements DependencyManager {
+ /**
+ * The lifecycleMonitor informs us when gbeans go off line,
+ * so we can clean up the lingering dependencies.
+ */
+ private final LifecycleMonitor lifecycleMonitor;
+
+ /**
+ * Listenes for GBeans to unregister and removes all dependencies associated with the dependency
+ */
+ private final LifecycleListener lifecycleListener = new DependencyManagerLifecycleListener();
+
+ /**
+ * A map from child names to a list of parents.
+ */
+ private final Map childToParentMap = new HashMap();
+
+ /**
+ * A map from parent back to a list of its children.
+ */
+ private final Map parentToChildMap = new HashMap();
+
+ public BasicDependencyManager(LifecycleMonitor lifecycleMonitor) {
+ assert lifecycleMonitor != null;
+ this.lifecycleMonitor = lifecycleMonitor;
+ lifecycleMonitor.addLifecycleListener(lifecycleListener, new AbstractNameQuery(null, Collections.EMPTY_MAP, Collections.EMPTY_SET));
+ }
+
+ public synchronized void close() {
+ lifecycleMonitor.removeLifecycleListener(lifecycleListener);
+ childToParentMap.clear();
+ parentToChildMap.clear();
+ }
+
+ /**
+ * Declares a dependency from a child to a parent.
+ *
+ * @param child the dependent component
+ * @param parent the component the child is depending on
+ */
+ public synchronized void addDependency(AbstractName child, AbstractName parent) {
+ Set parents = (Set) childToParentMap.get(child);
+ if (parents == null) {
+ parents = new HashSet();
+ childToParentMap.put(child, parents);
+ }
+ parents.add(parent);
+
+ Set children = (Set) parentToChildMap.get(parent);
+ if (children == null) {
+ children = new HashSet();
+ parentToChildMap.put(parent, children);
+ }
+ children.add(child);
+ }
+
+ /**
+ * Removes a dependency from a child to a parent
+ *
+ * @param child the dependnet component
+ * @param parent the component that the child wil no longer depend on
+ */
+ public synchronized void removeDependency(AbstractName child, AbstractName parent) {
+ Set parents = (Set) childToParentMap.get(child);
+ if (parents != null) {
+ parents.remove(parent);
+ }
+
+ Set children = (Set) parentToChildMap.get(parent);
+ if (children != null) {
+ children.remove(child);
+ }
+ }
+
+ /**
+ * Removes all dependencies for a child
+ *
+ * @param child the component that will no longer depend on anything
+ */
+ public synchronized void removeAllDependencies(AbstractName child) {
+ Set parents = (Set) childToParentMap.remove(child);
+ if (parents == null) {
+ return;
+ }
+ for (Iterator iterator = parents.iterator(); iterator.hasNext();) {
+ ObjectName parent = (ObjectName) iterator.next();
+ Set children = (Set) parentToChildMap.get(parent);
+ if (children != null) {
+ children.remove(child);
+ }
+
+ }
+ }
+
+ /**
+ * Adds dependencies from the child to every parent in the parents set
+ *
+ * @param child the dependent component
+ * @param parents the set of components the child is depending on
+ */
+ public synchronized void addDependencies(AbstractName child, Set parents) {
+ Set existingParents = (Set) childToParentMap.get(child);
+ if (existingParents == null) {
+ existingParents = new HashSet(parents);
+ childToParentMap.put(child, existingParents);
+ } else {
+ existingParents.addAll(parents);
+ }
+
+ for (Iterator i = parents.iterator(); i.hasNext();) {
+ Object startParent = i.next();
+ Set children = (Set) parentToChildMap.get(startParent);
+ if (children == null) {
+ children = new HashSet();
+ parentToChildMap.put(startParent, children);
+ }
+ children.add(child);
+ }
+ }
+
+ /**
+ * Gets the set of parents that the child is depending on
+ *
+ * @param child the dependent component
+ * @return a collection containing all of the components the child depends on; will never be null
+ */
+ public synchronized Set getParents(AbstractName child) {
+ Set parents = (Set) childToParentMap.get(child);
+ if (parents == null) {
+ return Collections.EMPTY_SET;
+ }
+ return new HashSet(parents);
+ }
+
+ /**
+ * Gets all of the MBeans that have a dependency on the specified startParent.
+ *
+ * @param parent the component the returned childen set depend on
+ * @return a collection containing all of the components that depend on the parent; will never be null
+ */
+ public synchronized Set getChildren(AbstractName parent) {
+ Set children = (Set) parentToChildMap.get(parent);
+ if (children == null) {
+ return Collections.EMPTY_SET;
+ }
+ return new HashSet(children);
+ }
+
+
+ private class DependencyManagerLifecycleListener extends LifecycleAdapter {
+ public void unloaded(AbstractName abstractName) {
+ synchronized (BasicDependencyManager.this) {
+ removeAllDependencies(abstractName);
+ }
+
+ }
+ }
+}
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java
------------------------------------------------------------------------------
svn:keywords = Date Revision
Propchange: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicDependencyManager.java
------------------------------------------------------------------------------
svn:mime-type = text/plain
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicKernel.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicKernel.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicKernel.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/main/java/org/apache/geronimo/kernel/basic/BasicKernel.java Sun May 8 05:39:22 2011
@@ -36,7 +36,7 @@ import org.apache.geronimo.gbean.Abstrac
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.runtime.GBeanInstance;
import org.apache.geronimo.gbean.runtime.LifecycleBroadcaster;
-// import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.DependencyManager;
import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.InternalKernelException;
@@ -125,7 +125,7 @@ public class
/**
* This manager is used by the kernel to manage dependencies between gbeans
*/
-// private DependencyManager dependencyManager = new BasicDependencyManager(publicLifecycleMonitor);
+ private DependencyManager dependencyManager = new BasicDependencyManager(publicLifecycleMonitor);
/**
* This factory gbean proxies, and tracks all proxies in the system
@@ -184,8 +184,8 @@ public class
registry.stop();
-// dependencyManager.close();
-// dependencyManager = null;
+ dependencyManager.close();
+ dependencyManager = null;
synchronized (this) {
notify();
@@ -208,9 +208,9 @@ public class
/**
* @deprecated this will be removed as when we add generalized dependencies to gbeans... the only current user is Configuration
*/
-// public DependencyManager getDependencyManager() {
-// return dependencyManager;
-// }
+ public DependencyManager getDependencyManager() {
+ return dependencyManager;
+ }
/**
* Gets the lifecycle monitor.
@@ -419,8 +419,7 @@ public class
AbstractName abstractName = gbeanData.getAbstractName();
Set interfaces = gbeanData.getGBeanInfo().getInterfaces();
LifecycleBroadcaster lifecycleBroadcaster = lifecycleMonitor.createLifecycleBroadcaster(abstractName, interfaces);
-// GBeanInstance gbeanInstance = new GBeanInstance(gbeanData, this, dependencyManager, lifecycleBroadcaster, bundle);
- GBeanInstance gbeanInstance = new GBeanInstance(gbeanData, this, lifecycleBroadcaster, bundle);
+ GBeanInstance gbeanInstance = new GBeanInstance(gbeanData, this, dependencyManager, lifecycleBroadcaster, bundle);
registry.register(gbeanInstance);
lifecycleBroadcaster.fireLoadedEvent();
}
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/runtime/GBeanAttributeTest.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/runtime/GBeanAttributeTest.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/runtime/GBeanAttributeTest.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-kernel/src/test/java/org/apache/geronimo/gbean/runtime/GBeanAttributeTest.java Sun May 8 05:39:22 2011
@@ -341,7 +341,7 @@ public class GBeanAttributeTest extends
AbstractName name = kernel.getNaming().createRootName(new Artifact("test", "foo", "1", "car"), "test", "test");
gbeanInstance = new GBeanInstance(new GBeanData(name, MockGBean.getGBeanInfo()),
kernel,
-// kernel.getDependencyManager(),
+ kernel.getDependencyManager(),
new MyLifecycleBroadcaster(),
bundleContext.getBundle());
Modified: geronimo/server/branches/3.0-osgi/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/jmx/KernelDelegate.java
URL: http://svn.apache.org/viewvc/geronimo/server/branches/3.0-osgi/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/jmx/KernelDelegate.java?rev=1100682&r1=1100681&r2=1100682&view=diff
==============================================================================
--- geronimo/server/branches/3.0-osgi/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/jmx/KernelDelegate.java (original)
+++ geronimo/server/branches/3.0-osgi/framework/modules/geronimo-system/src/main/java/org/apache/geronimo/system/jmx/KernelDelegate.java Sun May 8 05:39:22 2011
@@ -30,7 +30,7 @@ import org.apache.geronimo.gbean.GBeanDa
import org.apache.geronimo.gbean.GBeanInfo;
import org.apache.geronimo.gbean.AbstractName;
import org.apache.geronimo.gbean.AbstractNameQuery;
-// import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.DependencyManager;
import org.apache.geronimo.kernel.GBeanAlreadyExistsException;
import org.apache.geronimo.kernel.GBeanNotFoundException;
import org.apache.geronimo.kernel.InternalKernelException;
@@ -864,9 +864,9 @@ public class KernelDelegate implements K
/**
* Throws UnsupportedOperationException. The dependency manager is not accesable over a remote connection.
*/
-// public DependencyManager getDependencyManager() {
-// throw new UnsupportedOperationException("Dependency manager is not accessable by way of a remote connection");
-// }
+ public DependencyManager getDependencyManager() {
+ throw new UnsupportedOperationException("Dependency manager is not accessable by way of a remote connection");
+ }
/**
* Throws UnsupportedOperationException. The lifecycle monitor is not accesable over a remote connection.