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 2005/10/26 03:25:54 UTC

svn commit: r328519 - in /geronimo/trunk/modules: kernel/src/java/org/apache/geronimo/gbean/ kernel/src/java/org/apache/geronimo/gbean/runtime/ kernel/src/test/org/apache/geronimo/gbean/runtime/ service-builder/src/java/org/apache/geronimo/deployment/s...

Author: djencks
Date: Tue Oct 25 18:25:48 2005
New Revision: 328519

URL: http://svn.apache.org/viewcvs?rev=328519&view=rev
Log:
GERONIMO-512 non-reference dependencies

Added:
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java
    geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/runtime/GBeanDependencyTest.java
Modified:
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanData.java
    geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
    geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/GBeanBuilder.java
    geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java
    geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanData.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanData.java?rev=328519&r1=328518&r2=328519&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanData.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/GBeanData.java Tue Oct 25 18:25:48 2005
@@ -36,23 +36,23 @@
     private GBeanInfo gbeanInfo;
     private final Map attributes;
     private final Map references;
+    private final Set dependencies;
 
     public GBeanData() {
         attributes = new HashMap();
         references = new HashMap();
+        dependencies = new HashSet();
     }
 
     public GBeanData(GBeanInfo gbeanInfo) {
+        this();
         this.gbeanInfo = gbeanInfo;
-        attributes = new HashMap();
-        references = new HashMap();
     }
 
     public GBeanData(ObjectName name, GBeanInfo gbeanInfo) {
+        this();
         this.name = name;
         this.gbeanInfo = gbeanInfo;
-        attributes = new HashMap();
-        references = new HashMap();
     }
 
     public GBeanData(GBeanData gbeanData) {
@@ -60,6 +60,7 @@
         gbeanInfo = gbeanData.gbeanInfo;
         attributes = new HashMap(gbeanData.attributes);
         references = new HashMap(gbeanData.references);
+        dependencies = new HashSet(gbeanData.dependencies);
     }
 
     public ObjectName getName() {
@@ -114,6 +115,10 @@
         references.put(name, patterns);
     }
 
+    public Set getDependencies() {
+        return dependencies;
+    }
+
     public void writeExternal(ObjectOutput out) throws IOException {
         // write the gbean info
         out.writeObject(gbeanInfo);
@@ -148,6 +153,13 @@
                 throw (IOException) new IOException("Unable to write reference pattern: " + name).initCause(e);
             }
         }
+        //write the dependencies
+        out.writeInt(dependencies.size());
+        for (Iterator iterator = dependencies.iterator(); iterator.hasNext();) {
+            ObjectName objectName = (ObjectName) iterator.next();
+            out.writeObject(objectName);
+        }
+
     }
 
 
@@ -173,6 +185,13 @@
             int endpointCount = in.readInt();
             for (int i = 0; i < endpointCount; i++) {
                 setReferencePatterns((String) in.readObject(), (Set) in.readObject());
+            }
+
+            //read the dependencies
+            int dependencyCount = in.readInt();
+            for (int i = 0; i < dependencyCount; i++) {
+                ObjectName objectName = (ObjectName) in.readObject();
+                dependencies.add(objectName);
             }
         } catch (IOException e) {
             throw (IOException) new IOException("Unable to deserialize GBeanData " + name).initCause(e);

Added: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java?rev=328519&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java (added)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanDependency.java Tue Oct 25 18:25:48 2005
@@ -0,0 +1,322 @@
+/**
+ *
+ * Copyright 2004 The Apache Software Foundation
+ *
+ *  Licensed 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.gbean.runtime;
+
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Set;
+import javax.management.ObjectName;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.geronimo.gbean.InvalidConfigurationException;
+import org.apache.geronimo.kernel.DependencyManager;
+import org.apache.geronimo.kernel.GBeanNotFoundException;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.lifecycle.LifecycleAdapter;
+import org.apache.geronimo.kernel.lifecycle.LifecycleListener;
+import org.apache.geronimo.kernel.management.State;
+
+/**
+ * @version $Rev$ $Date$
+ */
+public class GBeanDependency {
+    /**
+     * The GBeanInstance to which this reference belongs.
+     */
+    private final GBeanInstance gbeanInstance;
+
+    /**
+     * The target objectName patterns to watch for a connection.
+     */
+    private Set patterns = Collections.EMPTY_SET;
+
+    /**
+     * Our listener for lifecycle events
+     */
+    private final LifecycleListener listener;
+
+    /**
+     * Current set of targets
+     */
+    private final Set targets = new HashSet();
+
+    /**
+     * The kernel to which the reference is bound.
+     */
+    private final Kernel kernel;
+
+    /**
+     * The dependency manager of the kernel.
+     */
+    private final DependencyManager dependencyManager;
+
+    /**
+     * is this reference online
+     */
+    private boolean isOnline = false;
+
+    public GBeanDependency(GBeanInstance gbeanInstance, ObjectName pattern, Kernel kernel, DependencyManager dependencyManager) throws InvalidConfigurationException {
+        this.gbeanInstance = gbeanInstance;
+        this.kernel = kernel;
+        this.dependencyManager = dependencyManager;
+        patterns = Collections.singleton(pattern);
+        listener = createLifecycleListener();
+    }
+
+    private static final Log log = LogFactory.getLog(GBeanSingleReference.class);
+
+    /**
+     * Is the GBeanMBean waitng for me to start?
+     */
+    private boolean waitingForMe = false;
+
+    /**
+     * The object to which the proxy is bound
+     */
+    private ObjectName proxyTarget;
+
+
+    public synchronized boolean start() {
+        // We only need to start if there are patterns and we don't already have a proxy
+        if (proxyTarget == null) {
+            //
+            // We must have exactally one running target
+            //
+            ObjectName objectName = getGBeanInstance().getObjectNameObject();
+            Set targets = getTargets();
+            if (targets.size() == 0) {
+                waitingForMe = true;
+                log.debug("Waiting to start " + objectName + " because no targets are running for the dependency matching the patternspatterns " + getPatternsText());
+                return false;
+            } else if (targets.size() > 1) {
+                waitingForMe = true;
+                log.debug("Waiting to start " + objectName + " because more then one targets are running for the dependency matching the patternspatterns " + getPatternsText());
+                return false;
+            }
+            waitingForMe = false;
+
+            // stop all gbeans that would match our patterns from starting
+            DependencyManager dependencyManager = getDependencyManager();
+            dependencyManager.addStartHolds(objectName, getPatterns());
+
+            // add a dependency on our target and create the proxy
+            ObjectName target = (ObjectName) targets.iterator().next();
+            proxyTarget = target;
+            dependencyManager.addDependency(objectName, target);
+        }
+
+        return true;
+    }
+
+    private String getPatternsText() {
+        StringBuffer buf = new StringBuffer();
+        Set patterns = getPatterns();
+        for (Iterator iterator = patterns.iterator(); iterator.hasNext();) {
+            ObjectName objectName = (ObjectName) iterator.next();
+            buf.append(objectName.getCanonicalName()).append(" ");
+        }
+        return buf.toString();
+    }
+
+    public synchronized void stop() {
+        waitingForMe = false;
+        ObjectName objectName = getGBeanInstance().getObjectNameObject();
+        Set patterns = getPatterns();
+        DependencyManager dependencyManager = getDependencyManager();
+        if (!patterns.isEmpty()) {
+            dependencyManager.removeStartHolds(objectName, patterns);
+        }
+
+        if (proxyTarget != null) {
+            dependencyManager.removeDependency(objectName, proxyTarget);
+            proxyTarget = null;
+        }
+    }
+
+    protected synchronized void targetAdded(ObjectName target) {
+        // if we are running, and we now have two valid targets, which is an illegal state so we need to fail
+        GBeanInstance gbeanInstance = getGBeanInstance();
+        if (gbeanInstance.getStateInstance() == State.RUNNING) {
+            log.error("Illegal state: two or more targets are not running for a signle valued reference: " + getDescription() +
+                    ", currentTarget=" + proxyTarget +
+                    ", newTarget=" + target);
+            gbeanInstance.referenceFailed();
+        } else if (waitingForMe) {
+            Set targets = getTargets();
+            if (targets.size() == 1) {
+                // the gbean was waiting for me and not there is now just one target
+                attemptFullStart();
+            }
+        }
+    }
+
+    protected synchronized void targetRemoved(ObjectName target) {
+        GBeanInstance gbeanInstance = getGBeanInstance();
+        if (gbeanInstance.getStateInstance() == State.RUNNING) {
+            // we no longer have a valid target, which is an illegal state so we need to fail
+            log.error("Illegal state: current target for a signle valued reference stopped: " + getDescription() +
+                    ", currentTarget=" + target);
+            gbeanInstance.referenceFailed();
+        } else if (waitingForMe) {
+            Set targets = getTargets();
+            if (targets.size() == 1) {
+                // the gbean was waiting for me and not there is now just one target
+                attemptFullStart();
+            }
+        }
+    }
+
+    private synchronized void attemptFullStart() {
+        try {
+            // there could be an issue with really badly written components holding up a stop when the
+            // component never reached the starting phase... then a target registers and we automatically
+            // attempt to restart
+            waitingForMe = false;
+            getGBeanInstance().start();
+        } catch (Exception e) {
+            log.warn("Exception occured while attempting to fully start: objectName=" + getGBeanInstance().getObjectName(), e);
+        }
+    }
+
+    protected LifecycleListener createLifecycleListener() {
+        return new LifecycleAdapter() {
+                    public void running(ObjectName objectName) {
+                        addTarget(objectName);
+                    }
+
+                    public void stopped(ObjectName objectName) {
+                        removeTarget(objectName);
+                    }
+
+                    public void failed(ObjectName objectName) {
+                        removeTarget(objectName);
+                    }
+
+                    public void unloaded(ObjectName objectName) {
+                        removeTarget(objectName);
+                    }
+                };
+    }
+
+    protected final Kernel getKernel() {
+        return kernel;
+    }
+
+    protected final DependencyManager getDependencyManager() {
+        return dependencyManager;
+    }
+
+    public final GBeanInstance getGBeanInstance() {
+        return gbeanInstance;
+    }
+
+    public final Set getPatterns() {
+        return patterns;
+    }
+
+    public final void setPatterns(Set patterns) {
+        if (isOnline) {
+            throw new IllegalStateException("Pattern set can not be modified while online");
+        }
+
+        if (patterns == null || patterns.isEmpty() || (patterns.size() == 1 && patterns.iterator().next() == null)) {
+            this.patterns = Collections.EMPTY_SET;
+        } else {
+            patterns = new HashSet(patterns);
+            for (Iterator iterator = this.patterns.iterator(); iterator.hasNext();) {
+                if (iterator.next() == null) {
+                    iterator.remove();
+                    //there can be at most one null value in a set.
+                    break;
+                }
+            }
+            this.patterns = Collections.unmodifiableSet(patterns);
+        }
+    }
+
+    public final synchronized void online() {
+        Set gbeans = kernel.listGBeans(patterns);
+        for (Iterator objectNameIterator = gbeans.iterator(); objectNameIterator.hasNext();) {
+            ObjectName target = (ObjectName) objectNameIterator.next();
+            if (!targets.contains(target)) {
+
+                // if the bean is running add it to the runningTargets list
+                if (isRunning(kernel, target)) {
+                    targets.add(target);
+                }
+            }
+        }
+
+        kernel.getLifecycleMonitor().addLifecycleListener(listener, patterns);
+        isOnline = true;
+    }
+
+    public final synchronized void offline() {
+        // make sure we are stoped
+        stop();
+
+        kernel.getLifecycleMonitor().removeLifecycleListener(listener);
+
+        targets.clear();
+        isOnline = false;
+    }
+
+    protected final Set getTargets() {
+        return targets;
+    }
+
+    protected final void addTarget(ObjectName objectName) {
+        if (!targets.contains(objectName)) {
+            targets.add(objectName);
+            targetAdded(objectName);
+        }
+    }
+
+    protected final void removeTarget(ObjectName objectName) {
+        boolean wasTarget = targets.remove(objectName);
+        if (wasTarget) {
+            targetRemoved(objectName);
+        }
+    }
+
+
+    /**
+     * Is the component in the Running state
+     *
+     * @param objectName name of the component to check
+     * @return true if the component is running; false otherwise
+     */
+    private boolean isRunning(Kernel kernel, ObjectName objectName) {
+        try {
+            final int state = kernel.getGBeanState(objectName);
+            return state == State.RUNNING_INDEX;
+        } catch (GBeanNotFoundException e) {
+            // mbean is no longer registerd
+            return false;
+        } catch (Exception e) {
+            // problem getting the attribute, mbean has most likely failed
+            return false;
+        }
+    }
+
+    protected final String getDescription() {
+        return "\n    GBeanInstance: " + gbeanInstance.getName() +
+                "\n    Pattern Name: " + getPatterns();
+    }
+}

Modified: geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java?rev=328519&r1=328518&r2=328519&view=diff
==============================================================================
--- geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java (original)
+++ geronimo/trunk/modules/kernel/src/java/org/apache/geronimo/gbean/runtime/GBeanInstance.java Tue Oct 25 18:25:48 2005
@@ -120,6 +120,11 @@
     private final Map referenceIndex = new HashMap();
 
     /**
+     * Dependencies supported by this GBean.
+     */
+    private final GBeanDependency[] dependencies;
+
+    /**
      * Operations lookup table
      */
     private final GBeanOperation[] operations;
@@ -179,7 +184,7 @@
      * fail when it returns from usercode.  This is set when a
      * reference has gone offline during construction.
      */
-    private boolean shouldFail = false; 
+    private boolean shouldFail = false;
 
     /**
      * Construct a GBeanMBean using the supplied GBeanData and class loader
@@ -239,6 +244,14 @@
             referenceIndex.put(references[i].getName(), new Integer(i));
         }
 
+        dependencies = new GBeanDependency[gbeanData.getDependencies().size()];
+        int j = 0;
+        for (Iterator iterator = gbeanData.getDependencies().iterator(); iterator.hasNext();) {
+            ObjectName dependencyName = (ObjectName) iterator.next();
+            GBeanDependency dependency = new GBeanDependency(this, dependencyName, kernel, dependencyManager);
+            dependencies[j++] = dependency;
+        }
+
         // framework operations -- all framework operations have currently been removed
 
         // operations
@@ -321,6 +334,9 @@
         for (int i = 0; i < references.length; i++) {
             references[i].online();
         }
+        for (int i = 0; i < dependencies.length; i++) {
+            dependencies[i].online();
+        }
         lifecycleBroadcaster.fireLoadedEvent();
     }
 
@@ -344,6 +360,9 @@
         for (int i = 0; i < references.length; i++) {
             references[i].offline();
         }
+        for (int i = 0; i < dependencies.length; i++) {
+            dependencies[i].offline();
+        }
 
         // tell everyone we are done
         lifecycleBroadcaster.fireUnloadedEvent();
@@ -822,6 +841,9 @@
             for (int i = 0; i < references.length; i++) {
                 allStarted = references[i].start() && allStarted;
             }
+            for (int i = 0; i < dependencies.length; i++) {
+                allStarted = dependencies[i].start() && allStarted;
+            }
             if (!allStarted) {
                 return false;
             }
@@ -919,6 +941,9 @@
                 for (int i = 0; i < references.length; i++) {
                     references[i].stop();
                 }
+                for (int i = 0; i < dependencies.length; i++) {
+                    dependencies[i].stop();
+                }
 
                 target = null;
                 instanceState = DESTROYED;
@@ -1041,6 +1066,9 @@
             // stop all of the references
             for (int i = 0; i < references.length; i++) {
                 references[i].stop();
+            }
+            for (int i = 0; i < dependencies.length; i++) {
+                dependencies[i].stop();
             }
 
             target = null;

Added: geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/runtime/GBeanDependencyTest.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/runtime/GBeanDependencyTest.java?rev=328519&view=auto
==============================================================================
--- geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/runtime/GBeanDependencyTest.java (added)
+++ geronimo/trunk/modules/kernel/src/test/org/apache/geronimo/gbean/runtime/GBeanDependencyTest.java Tue Oct 25 18:25:48 2005
@@ -0,0 +1,60 @@
+/**
+ *
+ * Copyright 2005 The Apache Software Foundation
+ *
+ *  Licensed 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.gbean.runtime;
+
+import javax.management.ObjectName;
+
+import junit.framework.TestCase;
+import org.apache.geronimo.kernel.KernelFactory;
+import org.apache.geronimo.kernel.MockGBean;
+import org.apache.geronimo.kernel.MockDynamicGBean;
+import org.apache.geronimo.kernel.Kernel;
+import org.apache.geronimo.kernel.management.State;
+import org.apache.geronimo.gbean.GBeanData;
+import org.apache.geronimo.gbean.GAttributeInfo;
+
+/**
+ * @version $Rev:  $ $Date:  $
+ */
+public class GBeanDependencyTest extends TestCase {
+
+    private Kernel kernel;
+    
+    public void testGBeanDependency() throws Exception {
+        ObjectName parentName = new ObjectName("test:MockGBean=parent");
+        GBeanData gbeanDataParent = new GBeanData(parentName, MockGBean.getGBeanInfo());
+        GBeanData gbeanDataChild = new GBeanData(new ObjectName("test:MockGBean=child"), MockGBean.getGBeanInfo());
+        gbeanDataChild.getDependencies().add(parentName);
+        kernel.loadGBean(gbeanDataChild, MockGBean.class.getClassLoader());
+        kernel.startGBean(gbeanDataChild.getName());
+        assertEquals(State.STARTING_INDEX, kernel.getGBeanState(gbeanDataChild.getName()));
+        kernel.loadGBean(gbeanDataParent, MockGBean.class.getClassLoader());
+        assertEquals(State.STARTING_INDEX, kernel.getGBeanState(gbeanDataChild.getName()));
+        kernel.startGBean(parentName);
+        assertEquals(State.RUNNING_INDEX, kernel.getGBeanState(gbeanDataChild.getName()));
+    }
+
+    protected void setUp() throws Exception {
+        kernel = KernelFactory.newInstance().createKernel("test");
+        kernel.boot();
+    }
+
+    protected void tearDown() throws Exception {
+        kernel.shutdown();
+    }
+
+}

Modified: geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/GBeanBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/GBeanBuilder.java?rev=328519&r1=328518&r2=328519&view=diff
==============================================================================
--- geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/GBeanBuilder.java (original)
+++ geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/GBeanBuilder.java Tue Oct 25 18:25:48 2005
@@ -135,6 +135,15 @@
         gbean.setReferencePatterns(name, patternNames);
     }
 
+    public void addDependency(PatternType patternType, J2eeContext j2eeContext) throws DeploymentException {
+        try {
+            ObjectName objectName = buildObjectName(null, patternType, j2eeContext);
+            gbean.getDependencies().add(objectName);
+        } catch (MalformedObjectNameException e) {
+            throw new DeploymentException("Invalid pattern for dependency: " + patternType, e);
+        }
+    }
+
     private ObjectName buildObjectName(String refName, PatternType pattern, J2eeContext j2eeContext) throws MalformedObjectNameException, DeploymentException {
         if (pattern.isSetGbeanName()) {
             String gbeanName = pattern.getGbeanName();
@@ -150,6 +159,9 @@
 
         //get the type from the gbean info if not supplied explicitly
         if (type == null) {
+            if (refName == null) {
+                throw new DeploymentException("No type specified in dependency pattern " + pattern + " for gbean " + gbean.getName());
+            }
             boolean found = false;
             Set referenceInfos = gbean.getGBeanInfo().getReferences();
             for (Iterator iterator = referenceInfos.iterator(); iterator.hasNext();) {
@@ -170,4 +182,5 @@
     public GBeanData getGBeanData() {
         return gbean;
     }
+
 }

Modified: geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java?rev=328519&r1=328518&r2=328519&view=diff
==============================================================================
--- geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java (original)
+++ geronimo/trunk/modules/service-builder/src/java/org/apache/geronimo/deployment/service/ServiceConfigBuilder.java Tue Oct 25 18:25:48 2005
@@ -53,6 +53,7 @@
 import org.apache.geronimo.deployment.xbeans.ReferencesType;
 import org.apache.geronimo.deployment.xbeans.ServiceDocument;
 import org.apache.geronimo.deployment.xbeans.XmlAttributeType;
+import org.apache.geronimo.deployment.xbeans.PatternType;
 import org.apache.geronimo.deployment.xmlbeans.XmlBeansUtil;
 import org.apache.geronimo.gbean.GBeanData;
 import org.apache.geronimo.gbean.GBeanInfo;
@@ -383,6 +384,14 @@
                     throw new DeploymentException("Unexpected count of xs:any elements in xml-attribute " + anys.length + " qnameset: " + XmlAttributeType.type.qnameSetForWildcardElements());
                 }
                 builder.setXmlReference(name, anys[0]);
+            }
+        }
+
+        PatternType[] dependencyArray = gbean.getDependencyArray();
+        if (dependencyArray != null) {
+            for (int i = 0; i < dependencyArray.length; i++) {
+                PatternType patternType = dependencyArray[i];
+                builder.addDependency(patternType, j2eeContext);
             }
         }
 

Modified: geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd
URL: http://svn.apache.org/viewcvs/geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd?rev=328519&r1=328518&r2=328519&view=diff
==============================================================================
--- geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd (original)
+++ geronimo/trunk/modules/service-builder/src/schema/geronimo-config-1.0.xsd Tue Oct 25 18:25:48 2005
@@ -88,6 +88,7 @@
             <xs:element name="reference" type="sys:referenceType"/>
             <xs:element name="references" type="sys:referencesType"/>
             <xs:element name="xml-reference" type="sys:xml-attributeType"/>
+            <xs:element name="dependency" type="sys:patternType"/>
         </xs:choice>
         <xs:attribute name="gbeanName" type="xs:string"/>
         <xs:attribute name="name" type="xs:string"/>