hlship      2003/06/09 15:23:09

  Modified:    hivemind/src/java/org/apache/commons/hivemind
                        HiveMindMessages.properties
                        IServiceExtensionPoint.java
               hivemind/xdocs descriptor.xml services.xml
               hivemind project.xml project.properties
               hivemind/src/test/hivemind/test HiveMindSuite.java
               hivemind/src/java/org/apache/commons/hivemind/parse
                        DescriptorParser.java HiveMind_1.0.xsd
                        ExpressionDescriptor.java
               hivemind/common links.xml
               hivemind/src/test/hivemind/test/config
                        TestConfiguration.java
               hivemind/src/test/hivemind/test/services TestServices.java
               hivemind/src/java/org/apache/commons/hivemind/impl
                        RegistryBuilder.java ServiceExtensionPoint.java
               hivemind/src/test/hivemind/test/parse
                        TestDescriptorParser.java
  Added:       hivemind/src/java/org/apache/commons/hivemind
                        IInitializeService.java
               hivemind maven.xml
               hivemind/src/test/hivemind/test TestRegistryBuilder.java
               hivemind/src/test/hivemind/test/config
                        ExpressionVariables.xml
               hivemind/src/test/hivemind/test/services Initialize.xml
                        ICheckInitializeService.java
               hivemind/src/test-data/TestRegistryBuilder/META-INF
                        hivemodule.xml
               hivemind/src/test/hivemind/test/parse
                        SetExpressionExtended.xml SetValueExtended.xml
               hivemind/src/test/hivemind/test/services/impl
                        CheckInitializeService.java
  Log:
  Allow HiveMind variable references inside OGNL expressions.
  Allow <set> and <set-expression> to provide the value or expression in the body of 
the element.
  Add IInitializeService interface, to allow core implementations to initialize once 
configured.
  
  
  Revision  Changes    Path
  1.4       +2 -2      
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/HiveMindMessages.properties
  
  Index: HiveMindMessages.properties
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/HiveMindMessages.properties,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HiveMindMessages.properties       4 Jun 2003 21:46:05 -0000       1.3
  +++ HiveMindMessages.properties       9 Jun 2003 22:23:07 -0000       1.4
  @@ -45,7 +45,7 @@
   RegistryBuilder.one-or-more=at least one
   RegistryBuilder.optional=an optional
   RegistryBuilder.required=exactly one
  -
  +RegistryBuilder.unable-to-find-modules=Unable to locate HiveMind module deployment 
descriptors in {0}: {1}
   
   InterceptorStack.interceptor-does-not-implement-interface=The service interceptor 
({0}) generated by service {1} for service extension point {2} does not implement the 
{3} interface defined by the extension point.
   InterceptorStack.null-interceptor=Service {0} generated a null interceptor (for 
service extension point {1}).
  
  
  
  1.4       +19 -2     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/IServiceExtensionPoint.java
  
  Index: IServiceExtensionPoint.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/IServiceExtensionPoint.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- IServiceExtensionPoint.java       4 Jun 2003 23:52:49 -0000       1.3
  +++ IServiceExtensionPoint.java       9 Jun 2003 22:23:07 -0000       1.4
  @@ -100,7 +100,24 @@
   
       /**
        * Constructs a new instance of the service (including
  -     * any interceptors).
  +     * any interceptors).  This should only be invoked by
  +     * the registry.
  +     * 
  +     * <p>Once the core implementation is created and the interceptor
  +     * stack is assembled, the core implementation is checked
  +     * to see if it implements [EMAIL PROTECTED] IInitializeService}.
  +     * If so [EMAIL PROTECTED] 
IInitializeService#initializeService(IServiceExtensionPoint, IFactoryContribution, 
Object)}
  +     * is invoked, to let the core service implementation
  +     * initialize.
  +     * 
  +     * <p>May return null if the service is optional and no
  +     * factory contribution has been made.
  +     * 
  +     * @returns the outermost interceptor for the service, or the
  +     * core implementation if there are no interceptors.
  +     * 
  +     * @throws org.apache.tapestry.ApplicationRuntimeException if there
  +     * is any problem creating the service.
        */
       public Object constructService();
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/IInitializeService.java
  
  Index: IInitializeService.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package org.apache.commons.hivemind;
  
  /**
   * Interface that may be implemented by a core service implementation
   * (in addition to the service interface), which is used by HiveMind
   * to inform a newly created implementation service extension point
   * it was created for.
   * 
   * <p>
   * The final version of the service is provided (this will
   * be the receiver if the service extension point has no interceptors; otherwise,
   * it will be the outermost interceptor).  This allows the
   * service to, for example, establish a callback to the core implementation that
   * uses the interceptor stack (rather than bypassing it).
   *
   * @author Howard Lewis Ship
   * @version $Id: IInitializeService.java,v 1.1 2003/06/09 22:23:06 hlship Exp $
   */
  public interface IInitializeService
  {
      /**
       * Invoked after the core implementation is instantiated, and the interceptor
       * stack has been created.
       * @param point the service extension point the core service was created for.
       * @param factoryContribution the contribution which created the core 
implementation.
       * @param service the outside representation of the service, this may be the
       * same as the receiver, or can be the outermost interceptor.
       */
      public void initializeService(
          IServiceExtensionPoint point,
          Object service);
  }
  
  
  
  1.3       +39 -11    jakarta-commons-sandbox/hivemind/xdocs/descriptor.xml
  
  Index: descriptor.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/descriptor.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- descriptor.xml    6 Jun 2003 21:56:29 -0000       1.2
  +++ descriptor.xml    9 Jun 2003 22:23:07 -0000       1.3
  @@ -413,8 +413,8 @@
                                        </td>
                                        <td>0..n.</td>
                                        <td>Reads an XML file and assigns the root 
element, as an instance of
  -                                             IElement. The configuation extension 
point must also be type
  -                                             IElement.</td>
  +                                             <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>. The 
configuation extension point must also be type
  +                                             <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>.</td>
                                </tr>
                                <tr>
                                        <td colspan="2">
  @@ -483,8 +483,8 @@
                                        </td>
                                        <td>0..n.</td>
                                        <td>Reads an XML file and assigns the root 
element, as an instance of
  -                                             IElement. The configuation extension 
point must also by type
  -                                             IElement.</td>
  +                                             <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>. The 
configuation extension point must also by type
  +                                             <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>.</td>
                                </tr>
                                <tr>
                                        <td colspan="2">
  @@ -553,7 +553,7 @@
                                        </td>
                                        <td>0..n.</td>
                                        <td>Sets a property of the object to the root 
element of a parsed XML
  -                                             file. The property must be type 
IElement.</td>
  +                                             file. The property must be type <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>.</td>
                                </tr>
                                <tr>
                                        <td colspan="2">
  @@ -665,6 +665,11 @@
                        <p>The contributing module is the root object for the 
expression (meaning
                                properties of the module may be used, including 
<code>repository</code> 
                                to access the HiveMind repository).</p>
  +                             
  +                                                     <p>
  +                     Variable references in the value are expanded.  
  +                     </p>
  +                     
                </section>
                <section name="set-expression">
                        <p>&_set-expression; is similar to &expression;, but is used 
to update a
  @@ -685,17 +690,30 @@
                                <tr>
                                        <td>expression</td>
                                        <td>string</td>
  -                                     <td>yes</td>
  +                                     <td>no</td>
                                        <td>The OGNL expression to evaluate. The 
result is assigned to the
                                                property.</td>
                                </tr>
                        </table>
  +                     
  +                     <p>
  +                     If a value is not given for the <code>expression</code>  
attribute,
  +                     then the body of the &_set-expression; element is used as the 
expression.
  +                     This is useful for long or complex expressions.
  +                     </p>
  +                     
  +                                             <p>
  +                     Variable references in the expression are expanded before the 
expression is evaluated.
  +                     </p>
                </section>
                <section name="value">
                        <p>&_value; is used to contribute a literal value to a 
configuration
                                extension point. Simple conversions from string to 
boolean or a numeric
  -                             type occur automatically. Variable references in the 
value are expanded.</p>
  +                             type occur automatically. </p>
                        <p>The body of the &_value; element is the literal value to 
contribute.</p>
  +                                             <p>
  +                     Variable references in the value are expanded.  
  +                     </p>
                </section>
                <section name="set">
                        <p>&_set; sets a property of an object to a literal value. 
Internally, it
  @@ -716,10 +734,20 @@
                                <tr>
                                        <td>value</td>
                                        <td>string</td>
  -                                     <td>yes</td>
  +                                     <td>no</td>
                                        <td>The literal value to assign to the 
property.</td>
                                </tr>
                        </table>
  +                     
  +                     <p>
  +                     If the <code>value</code>       attribute is not specified, 
then the body of the
  +                     &_set; element is used as the value.  This is useful for long 
values, or values
  +                     that have a mix of quotes.
  +                     </p>
  +                     
  +                     <p>
  +                     Variable references in the value are expanded.  
  +                     </p>
                </section>
                <section name="service-ref">
                        <p>&_service-ref; is used to contribute a service instance to a
  @@ -765,7 +793,7 @@
                </section>
                <section name="xml">
                        <p> &_xml; reads an XML file and parses it into a light-wieght 
DOM. An
  -                             instance of IElement, representing the root element of 
the XML file, is
  +                             instance of <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>, representing 
the root element of the XML file, is
                                contributed to the configuration.</p>
                        <table>
                                <tr>
  @@ -805,7 +833,7 @@
                                        <td>yes</td>
                                        <td>The path, relative to the contributing 
module's descriptor, of the
                                                XML file to read. The root element of 
the XML file, represented as
  -                                             an instance of IElement, is assigned 
to the property.</td>
  +                                             an instance of <a 
href="apidocs/org/apache/commons/hivemind/IElement.html">IElement</a>, is assigned to 
the property.</td>
                                </tr>
                        </table>
                </section>
  
  
  
  1.4       +27 -3     jakarta-commons-sandbox/hivemind/xdocs/services.xml
  
  Index: services.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/services.xml,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- services.xml      6 Jun 2003 21:56:29 -0000       1.3
  +++ services.xml      9 Jun 2003 22:23:07 -0000       1.4
  @@ -51,7 +51,10 @@
                                <p>An instance factory is represented by a &factory; 
element. It
                                        includes a service-id attribute. This is the 
fully qualfied id of a
                                        factory service, a service which implements the
  -                                     org.apache.commons.hivemind.IFactory 
interface.</p>
  +                                     
  +                                     <a 
href="apidocs/org/apache/commons/hivemind/IFactory.html">IFactory</a> 
  +                                     
  +                                     interface.</p>
                                <p>In both cases, the properties of the core instance 
may be configured
                                        using enclosed &set;, &set-expression;, 
&set-create;, &set-factory;
                                        &set-service-ref; and &set-xml;
  @@ -61,7 +64,10 @@
                                <p>An interceptor contribution is represented by a 
&interceptor; 
                                        element. The service-id attribute identifies 
an interceptor factory
                                        service: a service that implements the
  -                                     
org.apache.commons.hivemind.IInterceptorFactory interface.</p>
  +                                     
  +                                     <a 
href="apidocs/org/apache/commons/hivemind/IInterceptorFactory.html">IInterceptorFactory</a>
  +                                     
  +                                     interface.</p>
                                <p>An interceptor factory knows how to create an 
object that implements
                                        an arbitrary interface, adding the 
functionality of that interface.
                                        For example, a logging interceptor factory 
would create an object
  @@ -191,7 +197,25 @@
                                                ApplicationRuntimeException. So, if a 
service is required, you don't
                                                have to check for null.</p>
                                </li>
  +                             
  +                             <li>
  +                             <strong>What if I need to do some initializations in 
my service?</strong>       
  +                             <p>
  +                             If you have additional initializations that can't 
occur inside your
  +                             core service implementations constructor (for 
instance, if
  +                             the initializations are based on properties set after 
object
  +                             is constructed), then
  +                             your class should implement the
  +                             
  +                             <a 
href="apidocs/org/apache/commons/hivemind/IInitializeService.html">IInitializeService</a>
  +                             interface (in addition to the service interface).
  +                               This interface defines a callback that occurs only 
after
  +                             the core service has been constructed and configured, 
and the interceptor stack
  +                             has been assembled.
  +                             </p>
  +                             </li>
                        </ul>
  +                     
                </section>
        </body>
   </document>
  
  
  
  1.5       +5 -10     jakarta-commons-sandbox/hivemind/project.xml
  
  Index: project.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/project.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- project.xml       6 Jun 2003 21:56:29 -0000       1.4
  +++ project.xml       9 Jun 2003 22:23:07 -0000       1.5
  @@ -89,7 +89,8 @@
       </dependency>   
       
       <dependency>
  -     <id>jakarta-tapestry</id>
  +     <!-- Note: just until the Maven folks put this in the right spot! -->
  +     <id>tapestry</id>
        <artifactId>tapestry</artifactId>
        <version>3.0-beta-1a</version>
        <url>http://jakarta.apache.org/tapestry/</url>
  @@ -182,15 +183,9 @@
             <include>**/*.xsd</include>
             <include>**/*.properties</include>
           </includes>
  -      </resource>
  +      </resource>     
         
  -      <resource>
  -        <directory>src/META-INF</directory>
  -        <targetPath>META-INF</targetPath>
  -        <includes>
  -          <include>*</include>
  -        </includes>
  -      </resource>
  +      <!-- We don't package src/META-INF here, because it screws up some of the 
unit tests. -->
         
       </resources>
   
  
  
  
  1.2       +3 -2      jakarta-commons-sandbox/hivemind/project.properties
  
  Index: project.properties
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/project.properties,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- project.properties        6 Jun 2003 21:56:29 -0000       1.1
  +++ project.properties        9 Jun 2003 22:23:07 -0000       1.2
  @@ -1,3 +1,4 @@
   # $Id$
   
  -maven.username=hlship
  \ No newline at end of file
  +maven.username=hlship
  +maven.xdoc.date=left
  
  
  
  1.1                  jakarta-commons-sandbox/hivemind/maven.xml
  
  Index: maven.xml
  ===================================================================
  <?xml version="1.0"?>
  <!-- $Id: maven.xml,v 1.1 2003/06/09 22:23:07 hlship Exp $ -->
  
  <project
    xmlns:m="maven"
    xmlns:ant="jelly:ant"  
    xmlns:j="jelly:core"
    xmlns:u="jelly:util">
  
    <postGoal name="jar:jar">
  
        <ant:echo>Adding META-INF/hivemodule.xml to ${maven.final.name}.jar</ant:echo>
    <ant:jar
        jarfile="${maven.build.dir}/${maven.final.name}.jar"
        basedir="${maven.build.dest}"
        update="true"
        excludes="${maven.jar.excludes}"> 
    
      <ant:fileset dir="src">
        <ant:include name="META-INF/**"/>
      </ant:fileset>
    </ant:jar>
    </postGoal>
  
  </project>
  
  
  
  1.5       +1 -0      
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindSuite.java
  
  Index: HiveMindSuite.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindSuite.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- HiveMindSuite.java        4 Jun 2003 23:52:48 -0000       1.4
  +++ HiveMindSuite.java        9 Jun 2003 22:23:07 -0000       1.5
  @@ -75,6 +75,7 @@
           suite.addTestSuite(TestExternalParser.class);
           suite.addTestSuite(TestServices.class);
           suite.addTestSuite(TestConfiguration.class);
  +        suite.addTestSuite(TestRegistryBuilder.class);
           suite.addTestSuite(TestToString.class);
   
           return suite;
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/TestRegistryBuilder.java
  
  Index: TestRegistryBuilder.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package hivemind.test;
  
  import java.io.File;
  import java.net.URL;
  import java.net.URLClassLoader;
  import java.util.List;
  
  import org.apache.commons.hivemind.IRegistry;
  import org.apache.commons.hivemind.impl.RegistryBuilder;
  import org.apache.tapestry.ApplicationRuntimeException;
  import org.apache.tapestry.IResourceResolver;
  import org.apache.tapestry.util.DefaultResourceResolver;
  
  /**
   * Tests the [EMAIL PROTECTED] org.apache.commons.hivemind.impl.RegistryBuilder} 
class.
   *
   * @author Howard Lewis Ship
   * @version $Id: TestRegistryBuilder.java,v 1.1 2003/06/09 22:23:07 hlship Exp $
   */
  public class TestRegistryBuilder extends HiveMindTestCase
  {
  
      public TestRegistryBuilder(String name)
      {
          super(name);
      }
  
      public void testEmpty() throws Exception
      {
          RegistryBuilder b = new RegistryBuilder();
  
          b.processModules(_resolver);
  
          IRegistry r = b.constructRegistry();
  
          try
          {
              r.getConfiguration("org.apache.commons.hivemind.VariableSource");
              unreachable();
          }
          catch (ApplicationRuntimeException ex)
          {
              checkException(ex, "Registry does not contain module 
'org.apache.commons.hivemind'.");
          }
      }
  
      /**
       * Reproduce test [EMAIL PROTECTED] 
hivemind.test.config.TestConfiguration#testValueVariables()} using
       * dynamic lookup of hivemodule resources.
       */
  
      public void testLookup() throws Exception
      {
          File f1 = new File("src");
          File f2 = new File("src/test-data/TestRegistryBuilder");
  
          URL[] urls = new URL[] { f1.toURL(), f2.toURL()};
  
          ClassLoader loader =
              new URLClassLoader(urls, Thread.currentThread().getContextClassLoader());
  
          IResourceResolver resolver = new DefaultResourceResolver(loader);
  
          RegistryBuilder b = new RegistryBuilder();
          b.processModules(resolver);
  
          IRegistry r = b.constructRegistry();
  
          List l = r.getConfiguration("hivemind.test.config.Dogs");
          assertEquals(1, l.size());
  
          String dog = (String) l.get(0);
  
          assertEquals("Dino", dog);
      }
  }
  
  
  
  1.5       +13 -17    
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/DescriptorParser.java
  
  Index: DescriptorParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/DescriptorParser.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- DescriptorParser.java     4 Jun 2003 23:52:47 -0000       1.4
  +++ DescriptorParser.java     9 Jun 2003 22:23:08 -0000       1.5
  @@ -83,7 +83,7 @@
    */
   public class DescriptorParser
   {
  -     private static final Log LOG = LogFactory.getLog(DescriptorParser.class);
  +    private static final Log LOG = LogFactory.getLog(DescriptorParser.class);
   
       public static final String HIVE_MIND_SCHEMA_URL =
           "http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";;
  @@ -277,10 +277,8 @@
   
           result.addObjectCreate(pattern, ValueDescriptor.class);
           result.addRule(pattern, setLocationRule);
  -        result.addSetLimitedProperties(
  -            pattern,
  -            new String[] { "property", "value" },
  -            new String[] { "propertyName", "value" });
  +        result.addSetLimitedProperties(pattern, "property", "propertyName");
  +        result.addSetExtendedProperty(pattern, "value", "value", true);
           result.addSetNext(pattern, "addConfigurator");
   
           pattern = "*/service-ref";
  @@ -321,10 +319,8 @@
   
           result.addObjectCreate(pattern, ExpressionDescriptor.class);
           result.addRule(pattern, setLocationRule);
  -        result.addSetLimitedProperties(
  -            pattern,
  -            new String[] { "property", "expression" },
  -            new String[] { "propertyName", "expression" });
  +        result.addSetLimitedProperties(pattern, "property", "propertyName");
  +        result.addSetExtendedProperty(pattern, "expression", "expression", true);
           result.addSetNext(pattern, "addConfigurator");
   
           pattern = "*/set-create";
  @@ -347,13 +343,13 @@
               new String[] { "propertyName", "factoryServiceId" });
           result.addSetNext(pattern, "addConfigurator");
   
  -             pattern = "*/set-location";
  -             
  -             result.addObjectCreate(pattern, SetLocationDescriptor.class);
  -             result.addRule(pattern, setLocationRule);
  -             result.addSetLimitedProperties(pattern, "property", "propertyName");
  -             result.addSetTop(pattern, "setContainer");
  -             result.addSetNext(pattern, "addConfigurator");
  +        pattern = "*/set-location";
  +
  +        result.addObjectCreate(pattern, SetLocationDescriptor.class);
  +        result.addRule(pattern, setLocationRule);
  +        result.addSetLimitedProperties(pattern, "property", "propertyName");
  +        result.addSetTop(pattern, "setContainer");
  +        result.addSetNext(pattern, "addConfigurator");
   
           pattern = "*/interceptor";
   
  
  
  
  1.4       +12 -12    
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/HiveMind_1.0.xsd
  
  Index: HiveMind_1.0.xsd
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/HiveMind_1.0.xsd,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- HiveMind_1.0.xsd  4 Jun 2003 21:46:03 -0000       1.3
  +++ HiveMind_1.0.xsd  9 Jun 2003 22:23:08 -0000       1.4
  @@ -157,12 +157,12 @@
                                        <xs:documentation>Sets the value of an object 
property to a literal value.</xs:documentation>
                                </xs:annotation>
                                <xs:complexType>
  -                                     <xs:attribute name="value" type="xs:string" 
use="required">
  -                                             <xs:annotation>
  -                                                     <xs:documentation>The value to 
be assigned to the property.  Simple data type conversions (from strings to other 
basic types) will automatically occur.  The value may contain variable 
references.</xs:documentation>
  -                                             </xs:annotation>
  -                                     </xs:attribute>
  -                                     <xs:attributeGroup ref="property-setter"/>
  +                                     <xs:simpleContent>
  +                                             <xs:extension base="xs:string">
  +                                                     <xs:attributeGroup 
ref="property-setter"/>
  +                                                     <xs:attribute name="value" 
type="xs:string" use="optional"/>
  +                                             </xs:extension>
  +                                     </xs:simpleContent>
                                </xs:complexType>
                        </xs:element>
                        <xs:element name="set-expression">
  @@ -170,12 +170,12 @@
                                        <xs:documentation>Sets the value of a property 
to a computed OGNL expression.  The module is the root object of the 
expression.</xs:documentation>
                                </xs:annotation>
                                <xs:complexType>
  -                                     <xs:attributeGroup ref="property-setter"/>
  -                                     <xs:attribute name="expression" 
type="xs:string" use="required">
  -                                             <xs:annotation>
  -                                                     <xs:documentation>The OGNL 
expression to evaluate and assign to the property.</xs:documentation>
  -                                             </xs:annotation>
  -                                     </xs:attribute>
  +                                     <xs:simpleContent>
  +                                             <xs:extension base="xs:string">
  +                                                     <xs:attribute 
name="expression" type="xs:string" use="optional"/>
  +                                                     <xs:attributeGroup 
ref="property-setter"/>
  +                                             </xs:extension>
  +                                     </xs:simpleContent>
                                </xs:complexType>
                        </xs:element>
                        <xs:element name="set-create">
  
  
  
  1.5       +9 -3      
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/ExpressionDescriptor.java
  
  Index: ExpressionDescriptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/ExpressionDescriptor.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ExpressionDescriptor.java 4 Jun 2003 23:52:47 -0000       1.4
  +++ ExpressionDescriptor.java 9 Jun 2003 22:23:08 -0000       1.5
  @@ -93,16 +93,22 @@
       {
           IResourceResolver resolver = module.getResourceResolver();
   
  +        // Convert variable references in the expression.
  +        // Should we cache this?
  +
  +        String convertedExpression =
  +            module.getRegistry().convertVariableReferences(_expression, 
getLocation());
  +
           try
           {
  -            return OgnlUtils.get(_expression, resolver, module);
  +            return OgnlUtils.get(convertedExpression, resolver, module);
           }
           catch (Exception ex)
           {
               throw new ApplicationRuntimeException(
                   HiveMind.format(
                       "ExpressionDescriptor.unable-to-evaluate",
  -                    _expression,
  +                    convertedExpression,
                       module,
                       ex.getMessage()),
                   getLocation(),
  
  
  
  1.3       +24 -24    jakarta-commons-sandbox/hivemind/common/links.xml
  
  Index: links.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/common/links.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- links.xml 6 Jun 2003 21:56:30 -0000       1.2
  +++ links.xml 9 Jun 2003 22:23:08 -0000       1.3
  @@ -1,69 +1,69 @@
   <!-- $Id$ -->
   
   
  -<!ENTITY _module '&lt;module&gt;'>
  +<!ENTITY _module '<code><code>&lt;module&gt;</code></code>'>
   <!ENTITY module '<a href="descriptor.html#module">&_module;</a>'>
   
  -<!ENTITY _service '&lt;service&gt;'>
  +<!ENTITY _service '<code>&lt;service&gt;</code>'>
   <!ENTITY service '<a href="descriptor.html#service">&_service;</a>'>
   
  -<!ENTITY _create-instance '&lt;create-instance&gt;'>
  +<!ENTITY _create-instance '<code>&lt;create-instance&gt;</code>'>
   <!ENTITY create-instance '<a 
href="descriptor.html#create-instance">&_create-instance;</a>'>
   
  -<!ENTITY _factory '&lt;factory&gt;'>
  +<!ENTITY _factory '<code>&lt;factory&gt;</code>'>
   <!ENTITY factory '<a href="descriptor.html#factory">&_factory;</a>'>
   
  -<!ENTITY _set '&lt;set&gt;'>
  +<!ENTITY _set '<code>&lt;set&gt;</code>'>
   <!ENTITY set '<a href="descriptor.html#set">&_set;</a>'>
   
  -<!ENTITY _set-expression '&lt;set-expression&gt;'>
  +<!ENTITY _set-expression '<code>&lt;set-expression&gt;</code>'>
   <!ENTITY set-expression '<a 
href="descriptor.html#set-expression">&_set-expression;</a>'>
   
  -<!ENTITY _set-create '&lt;set-create&gt;'>
  +<!ENTITY _set-create '<code>&lt;set-create&gt;</code>'>
   <!ENTITY set-create '<a href="descriptor.html#set-create">&_set-create;</a>'>
   
  -<!ENTITY _set-factory '&lt;set-factory&gt;'>
  +<!ENTITY _set-factory '<code>&lt;set-factory&gt;</code>'>
   <!ENTITY set-factory '<a href="descriptor.html#set-factory">&_set-factory;</a>'>
   
  -<!ENTITY _interceptor '&lt;interceptor&gt;'>
  +<!ENTITY _interceptor '<code>&lt;interceptor&gt;</code>'>
   <!ENTITY interceptor '<a href="descriptor.html#interceptor">&_interceptor;</a>'>
   
  -<!ENTITY _meta '&lt;meta&gt;'>
  +<!ENTITY _meta '<code>&lt;meta&gt;</code>'>
   <!ENTITY meta '<a href="descriptor.html#meta">&_meta;</a>'>
   
  -<!ENTITY _description '&lt;description&gt;'>
  +<!ENTITY _description '<code>&lt;description&gt;</code>'>
   <!ENTITY description '<a href="descriptor.html#description">&_description;</a>'>
   
  -<!ENTITY _dependency '&lt;dependency&gt;'>
  +<!ENTITY _dependency '<code>&lt;dependency&gt;</code>'>
   <!ENTITY dependency '<a href="descriptor.html#dependency">&_dependency;</a>'>
   
  -<!ENTITY _library '&lt;library&gt;'>
  +<!ENTITY _library '<code>&lt;library&gt;</code>'>
   <!ENTITY library '<a href="descriptor.html#library">&_library;</a>'>
   
  -<!ENTITY _configuration '&lt;configuration&gt;'>
  +<!ENTITY _configuration '<code>&lt;configuration&gt;</code>'>
   <!ENTITY configuration '<a 
href="descriptor.html#configuration">&_configuration;</a>'>
   
  -<!ENTITY _expression '&lt;expression&gt;'>
  +<!ENTITY _expression '<code>&lt;expression&gt;</code>'>
   <!ENTITY expression '<a href="descriptor.html#expression">&_expression;</a>'>
   
  -<!ENTITY _value '&lt;value&gt;'>
  +<!ENTITY _value '<code>&lt;value&gt;</code>'>
   <!ENTITY value '<a href="descriptor.html#value">&_value;</a>'>
   
  -<!ENTITY _service-ref '&lt;service-ref&gt;'>
  +<!ENTITY _service-ref '<code>&lt;service-ref&gt;</code>'>
   <!ENTITY service-ref '<a href="descriptor.html#service-ref">&_service-ref;</a>'>
   
  -<!ENTITY _set-service-ref '&lt;set-service-ref&gt;'>
  +<!ENTITY _set-service-ref '<code>&lt;set-service-ref&gt;</code>'>
   <!ENTITY set-service-ref '<a 
href="descriptor.html#set-service-ref">&_set-service-ref;</a>'>
   
  -<!ENTITY _xml '&lt;xml&gt;'>
  +<!ENTITY _xml '<code>&lt;xml&gt;</code>'>
   <!ENTITY xml '<a href="descriptor.html#xml">&_xml;</a>'>
   
  -<!ENTITY _set-xml '&lt;set-xml&gt;'>
  +<!ENTITY _set-xml '<code>&lt;set-xml&gt;</code>'>
   <!ENTITY set-xml '<a href="descriptor.html#set-xml">&_set-xml;</a>'>
   
  -<!ENTITY _contribute-service '&lt;contribute-service&gt;'>
  +<!ENTITY _contribute-service '<code>&lt;contribute-service&gt;</code>'>
   <!ENTITY contribute-service '<a 
href="descriptor.html#contribute-service">&_contribute-service;</a>'>
   
  -
  -<!ENTITY _contribute-configuration '&lt;contribute-configuration&gt;'>
  +<!ENTITY _contribute-configuration '<code>&lt;contribute-configuration&gt;</code>'>
   <!ENTITY contribute-configuration '<a 
href="descriptor.html#contribute-configuration">&_contribute-configuration;</a>'>
  +
  
  
  
  1.6       +18 -0     
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/config/TestConfiguration.java
  
  Index: TestConfiguration.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/config/TestConfiguration.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- TestConfiguration.java    6 Jun 2003 21:56:29 -0000       1.5
  +++ TestConfiguration.java    9 Jun 2003 22:23:08 -0000       1.6
  @@ -342,4 +342,22 @@
   
           assertEquals("Dino", dog);
       }
  +
  +    public void testExpressionVariables() throws Exception
  +    {
  +        RegistryBuilder b = new RegistryBuilder();
  +        DescriptorParser p = new DescriptorParser();
  +
  +        b.processModule(_resolver, p.parse(getMasterModuleLocation()));
  +        b.processModule(_resolver, p.parse(getLocation("ExpressionVariables.xml")));
  +
  +        IRegistry r = b.constructRegistry();
  +
  +        List l = r.getConfiguration("hivemind.test.config.Dogs");
  +        assertEquals(1, l.size());
  +
  +        String dog = (String) l.get(0);
  +
  +        assertEquals("Dino", dog);
  +    }
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/config/ExpressionVariables.xml
  
  Index: ExpressionVariables.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: ExpressionVariables.xml,v 1.1 2003/06/09 22:23:08 hlship Exp $ -->
  <module
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    
xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";
        id="hivemind.test.config" 
        version="1.0.0">
        <contribute-configuration 
configuration-id="org.apache.commons.hivemind.VariableSource">
          <create-instance 
class="org.apache.commons.hivemind.VariableSourceContribution">
            <set-create property="source" 
class="hivemind.test.external.PropertiesVariableSource"/>
          </create-instance>    
        </contribute-configuration>
    <configuration id="Dogs" element-type="java.lang.String">
                <expression>"${dog}"</expression>
    </configuration>
  </module>
  
  
  1.4       +12 -0     
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/TestServices.java
  
  Index: TestServices.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/TestServices.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- TestServices.java 4 Jun 2003 23:52:49 -0000       1.3
  +++ TestServices.java 9 Jun 2003 22:23:08 -0000       1.4
  @@ -140,4 +140,16 @@
               TrackerFactory.getInvocations().toArray());
   
       }
  +
  +    public void testInitialize() throws Exception
  +    {
  +        IRegistry r = buildRegistry("Initialize.xml");
  +
  +        ICheckInitializeService c =
  +            (ICheckInitializeService) r.getService(
  +                "hivemind.test.services.CheckInitialize",
  +                ICheckInitializeService.class);
  +
  +        assertEquals(true, c.didInitialize());
  +    }
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/Initialize.xml
  
  Index: Initialize.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: Initialize.xml,v 1.1 2003/06/09 22:23:08 hlship Exp $ -->
  <module
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    
xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";
        id="hivemind.test.services" 
        version="1.0.0">
        <service id="CheckInitialize" 
interface="hivemind.test.services.ICheckInitializeService">
          <create-instance class="hivemind.test.services.impl.CheckInitializeService"/>
        </service>
  </module>
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/ICheckInitializeService.java
  
  Index: ICheckInitializeService.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package hivemind.test.services;
  
  /**
   * Used for testing support of [EMAIL PROTECTED] 
org.apache.commons.hivemind.IInitializeService}.
   *
   * @author Howard Lewis Ship
   * @version $Id: ICheckInitializeService.java,v 1.1 2003/06/09 22:23:08 hlship Exp $
   */
  public interface ICheckInitializeService
  {
      public boolean didInitialize();
  }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test-data/TestRegistryBuilder/META-INF/hivemodule.xml
  
  Index: hivemodule.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: hivemodule.xml,v 1.1 2003/06/09 22:23:09 hlship Exp $ -->
  <module
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    
xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";
        id="hivemind.test.config" 
        version="1.0.0">
        <contribute-configuration 
configuration-id="org.apache.commons.hivemind.VariableSource">
          <create-instance 
class="org.apache.commons.hivemind.VariableSourceContribution">
            <set-create property="source" 
class="hivemind.test.external.PropertiesVariableSource"/>
          </create-instance>    
        </contribute-configuration>
    <configuration id="Dogs" element-type="java.lang.String">
                <value>${dog}</value>
    </configuration>
  </module>
  
  
  1.4       +69 -14    
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/RegistryBuilder.java
  
  Index: RegistryBuilder.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/RegistryBuilder.java,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -r1.3 -r1.4
  --- RegistryBuilder.java      4 Jun 2003 23:52:48 -0000       1.3
  +++ RegistryBuilder.java      9 Jun 2003 22:23:09 -0000       1.4
  @@ -57,7 +57,10 @@
   
   package org.apache.commons.hivemind.impl;
   
  +import java.io.IOException;
  +import java.net.URL;
   import java.util.ArrayList;
  +import java.util.Enumeration;
   import java.util.HashMap;
   import java.util.Iterator;
   import java.util.List;
  @@ -67,17 +70,20 @@
   import org.apache.commons.hivemind.IModule;
   import org.apache.commons.hivemind.IRegistry;
   import org.apache.commons.hivemind.Occurances;
  +import org.apache.commons.hivemind.parse.AbstractInstanceBuilderDescriptor;
   import org.apache.commons.hivemind.parse.ConfigurationDescriptor;
   import org.apache.commons.hivemind.parse.ContributeConfigurationDescriptor;
   import org.apache.commons.hivemind.parse.ContributeServiceDescriptor;
  +import org.apache.commons.hivemind.parse.DescriptorParser;
   import org.apache.commons.hivemind.parse.IValueProvider;
  -import org.apache.commons.hivemind.parse.AbstractInstanceBuilderDescriptor;
   import org.apache.commons.hivemind.parse.InterceptorDescriptor;
   import org.apache.commons.hivemind.parse.ModuleDescriptor;
   import org.apache.commons.hivemind.parse.ServiceDescriptor;
  +import org.apache.commons.hivemind.util.URLResourceLocation;
   import org.apache.commons.logging.Log;
   import org.apache.commons.logging.LogFactory;
   import org.apache.tapestry.ApplicationRuntimeException;
  +import org.apache.tapestry.IResourceLocation;
   import org.apache.tapestry.IResourceResolver;
   import org.apache.tapestry.Tapestry;
   
  @@ -108,7 +114,6 @@
   {
       private static final Log LOG = LogFactory.getLog(RegistryBuilder.class);
   
  -
       /**
        * List of [EMAIL PROTECTED] ModuleDescriptor}.
        */
  @@ -138,7 +143,56 @@
   
       private Map _configurationPoints = new HashMap();
   
  +    /**
  +     * Processes all modules that can be found using the resolver.
  +     */
  +    public void processModules(IResourceResolver resolver)
  +    {
  +        if (LOG.isDebugEnabled())
  +            LOG.debug("Processing modules visible to " + resolver);
  +
  +        ClassLoader loader = resolver.getClassLoader();
  +        Enumeration e = null;
  +        int count = 0;
  +
  +        try
  +        {
  +
  +            e = loader.getResources("META-INF/hivemodule.xml");
  +        }
  +        catch (IOException ex)
  +        {
  +            throw new ApplicationRuntimeException(
  +                HiveMind.format("RegistryBuilder.unable-to-find-modules", resolver, 
ex),
  +                ex);
  +        }
  +
  +        DescriptorParser parser = new DescriptorParser();
   
  +        while (e.hasMoreElements())
  +        {
  +            URL descriptorURL = (URL) e.nextElement();
  +            IResourceLocation descriptorLocation = new 
URLResourceLocation(descriptorURL);
  +
  +            ModuleDescriptor md = parser.parse(descriptorLocation);
  +
  +            processModule(resolver, md);
  +
  +            count++;
  +        }
  +
  +        if (LOG.isDebugEnabled())
  +            LOG.debug("Processed " + count + " module descriptors.");
  +
  +    }
  +
  +    /**
  +     * Processes a parsed HiveMind module descriptor.  This may be called
  +     * repeatedly before invoking [EMAIL PROTECTED] #constructRegistry()}.
  +     * 
  +     * @param resolver A resolver used to access resources and classes within the 
module.
  +     * @param md the parsed module descriptor
  +     */
       public void processModule(IResourceResolver resolver, ModuleDescriptor md)
       {
           String id = md.getModuleId();
  @@ -165,8 +219,8 @@
   
           module.setLocation(md.getLocation());
           module.setModuleId(id);
  -             module.setResourceResolver(resolver);
  -             
  +        module.setResourceResolver(resolver);
  +
           addServiceExtensionPoints(module, md);
   
           addConfigurationExtensionPoints(module, md);
  @@ -237,11 +291,11 @@
               point.setElementTypeName(cd.getElementTypeName());
               point.setCacheElements(cd.getCacheElements());
   
  -                     module.addConfigurationExtensionPoint(point);
  -                     
  -                     // Needed later when we reconcile the rest
  -                     // of the configuration contributions.
  -                     
  +            module.addConfigurationExtensionPoint(point);
  +
  +            // Needed later when we reconcile the rest
  +            // of the configuration contributions.
  +
               _configurationPoints.put(pointId, point);
   
               addConfigurationContributions(module, point, cd.getValueProviders());
  @@ -259,7 +313,8 @@
   
           if (LOG.isDebugEnabled())
               LOG.debug(
  -                "Adding contributions to configuration extension point " + 
point.getExtensionPointId());
  +                "Adding contributions to configuration extension point "
  +                    + point.getExtensionPointId());
   
           for (int i = 0; i < count; i++)
           {
  @@ -346,7 +401,7 @@
           }
   
           checkForMissingServices();
  -        
  +
           checkConfigurationCounts();
   
           BaseRegistry result = new BaseRegistry();
  @@ -580,8 +635,8 @@
   
               int count = point.getContributionCount();
   
  -                     // Ok, so sometimes a case statement for Enums
  -                     // would be nice.  Guess that's coming in JDK 1.5.
  +            // Ok, so sometimes a case statement for Enums
  +            // would be nice.  Guess that's coming in JDK 1.5.
   
               if (expected == Occurances.ONE_PLUS)
               {
  
  
  
  1.5       +11 -2     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ServiceExtensionPoint.java
  
  Index: ServiceExtensionPoint.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ServiceExtensionPoint.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ServiceExtensionPoint.java        4 Jun 2003 23:52:48 -0000       1.4
  +++ ServiceExtensionPoint.java        9 Jun 2003 22:23:09 -0000       1.5
  @@ -64,6 +64,7 @@
   
   import org.apache.commons.hivemind.HiveMind;
   import org.apache.commons.hivemind.IFactoryContribution;
  +import org.apache.commons.hivemind.IInitializeService;
   import org.apache.commons.hivemind.IInterceptorContribution;
   import org.apache.commons.hivemind.IServiceExtensionPoint;
   import org.apache.commons.lang.builder.ToStringBuilder;
  @@ -255,7 +256,15 @@
                       fc.getLocation(),
                       null);
   
  -            return addInterceptors(core);
  +            Object intercepted = addInterceptors(core);
  +
  +            if (core instanceof IInitializeService)
  +            {
  +                IInitializeService initializeCore = (IInitializeService) core;
  +                initializeCore.initializeService(this, intercepted);
  +            }
  +
  +            return intercepted;
           }
           catch (Exception ex)
           {
  
  
  
  1.5       +32 -1     
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/parse/TestDescriptorParser.java
  
  Index: TestDescriptorParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/parse/TestDescriptorParser.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- TestDescriptorParser.java 4 Jun 2003 23:52:50 -0000       1.4
  +++ TestDescriptorParser.java 9 Jun 2003 22:23:09 -0000       1.5
  @@ -470,4 +470,35 @@
           assertSame(ibd, d.getContainer());
       }
   
  +    public void testSetValueExtended() throws Exception
  +    {
  +        ModuleDescriptor d = parse("SetValueExtended.xml");
  +        ServiceDescriptor s = d.getService("Foo");
  +        AbstractInstanceBuilderDescriptor ibd = s.getInstanceBuilder();
  +        CreateInstanceDescriptor cid = (CreateInstanceDescriptor) ibd;
  +
  +        List l = cid.getConfigurators();
  +        assertEquals(2, Tapestry.size(l));
  +
  +        ValueDescriptor vd = (ValueDescriptor) l.get(0);
  +
  +        assertEquals("gromit", vd.getPropertyName());
  +        assertEquals("greyhound", vd.getValue());
  +    }
  +
  +    public void testSetExpressionExtended() throws Exception
  +    {
  +        ModuleDescriptor d = parse("SetExpressionExtended.xml");
  +        ServiceDescriptor s = d.getService("Foo");
  +        AbstractInstanceBuilderDescriptor ibd = s.getInstanceBuilder();
  +        CreateInstanceDescriptor cid = (CreateInstanceDescriptor) ibd;
  +
  +        List l = cid.getConfigurators();
  +        assertEquals(2, Tapestry.size(l));
  +
  +        ExpressionDescriptor ed = (ExpressionDescriptor) l.get(1);
  +
  +        assertEquals("aProperty", ed.getPropertyName());
  +        assertEquals("an extended expression", ed.getExpression());
  +    }
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/parse/SetExpressionExtended.xml
  
  Index: SetExpressionExtended.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: SetExpressionExtended.xml,v 1.1 2003/06/09 22:23:09 hlship Exp $ -->
  <module xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
        
xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";
        id="package.TwoServices" version="0.0.2">
        <service id="Foo" interface="package.IFoo">
                <create-instance class="package.impl.Foo">
                  <set-create property="fred" class="package.impl.Fred"/>
                        <set-expression property="aProperty">
                                an extended expression  
                        </set-expression>
                </create-instance>
        </service>
  </module>
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/parse/SetValueExtended.xml
  
  Index: SetValueExtended.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: SetValueExtended.xml,v 1.1 2003/06/09 22:23:09 hlship Exp $ -->
  <module
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
    
xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd";
        id="package.TwoServices" 
        version="0.0.2">
        <service id="Foo" interface="package.IFoo">
                 <create-instance class="package.impl.Foo">
                                <set property="gromit">
                                        greyhound
                                </set>
                          <set-create property="fred" class="package.impl.Fred"/>
                 </create-instance>
        </service>
  </module>
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/impl/CheckInitializeService.java
  
  Index: CheckInitializeService.java
  ===================================================================
  /*
   * ====================================================================
   *
   * The Apache Software License, Version 1.1
   *
   * Copyright (c) 1999-2003 The Apache Software Foundation.  All rights
   * reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   * 1. Redistributions of source code must retain the above copyright
   *    notice, this list of conditions and the following disclaimer.
   *
   * 2. Redistributions in binary form must reproduce the above copyright
   *    notice, this list of conditions and the following disclaimer in
   *    the documentation and/or other materials provided with the
   *    distribution.
   *
   * 3. The end-user documentation included with the redistribution, if
   *    any, must include the following acknowlegement:
   *       "This product includes software developed by the
   *        Apache Software Foundation (http://www.apache.org/)."
   *    Alternately, this acknowlegement may appear in the software itself,
   *    if and wherever such third-party acknowlegements normally appear.
   *
   * 4. The names "The Jakarta Project", "Commons", and "Apache Software
   *    Foundation" must not be used to endorse or promote products derived
   *    from this software without prior written permission. For written
   *    permission, please contact [EMAIL PROTECTED]
   *
   * 5. Products derived from this software may not be called "Apache"
   *    nor may "Apache" appear in their names without prior written
   *    permission of the Apache Group.
   *
   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED.  IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
   * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
   * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
   * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
   * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
   * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
   * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   * SUCH DAMAGE.
   * ====================================================================
   *
   * This software consists of voluntary contributions made by many
   * individuals on behalf of the Apache Software Foundation.  For more
   * information on the Apache Software Foundation, please see
   * <http://www.apache.org/>.
   *
   */
  
  package hivemind.test.services.impl;
  
  import hivemind.test.services.ICheckInitializeService;
  
  import org.apache.commons.hivemind.IInitializeService;
  import org.apache.commons.hivemind.IServiceExtensionPoint;
  
  /**
   * Used for testing support of [EMAIL PROTECTED] 
org.apache.commons.hivemind.IInitializeService}.
   *
   * @author Howard Lewis Ship
   * @version $Id: CheckInitializeService.java,v 1.1 2003/06/09 22:23:09 hlship Exp $
   */
  public class CheckInitializeService implements IInitializeService, 
ICheckInitializeService
  {
      private boolean _didInitialize;
  
      public void initializeService(IServiceExtensionPoint point, Object service)
      {
          _didInitialize = true;
      }
  
      public boolean didInitialize()
      {
          return _didInitialize;
      }
  
  }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to