hlship      2003/07/02 08:40:43

  Modified:    hivemind/src/java/org/apache/commons/hivemind/parse
                        ServiceDescriptor.java DescriptorParser.java
                        HiveMind_1.0.xsd
               hivemind/xdocs descriptor.xml
               hivemind/src/java/org/apache/commons/hivemind/impl
                        ConfigurationExtensionPointImpl.java
                        ServiceExtensionPointImpl.java RegistryBuilder.java
               hivemind/src/test/hivemind/test HiveMindTestCase.java
               hivemind/src/xsl hivemind.xsl
               hivemind/src/test/hivemind/test/services TestServices.java
               hivemind/src/test/hivemind/test/config
                        TestConfiguration.java WrongElementType.xml
               hivemind/src/test/hivemind/test/parse
                        TestDescriptorParser.java
               hivemind/src/java/org/apache/commons/hivemind HiveMind.java
               hivemind/src/META-INF hivemodule.xml
               hivemind/src/test-data/TestConstructRegistry testBasic.xml
                        testUptoDate.xml
               hivemind/src/test/hivemind/test/external
                        TestExternalParser.java
  Added:       hivemind/src/test/hivemind/test StoreAppender.java
               hivemind/src/test/hivemind/test/services ServiceOverride.xml
               hivemind/src/test/hivemind/test/parse OverridableService.xml
               hivemind/src/test/hivemind/test/services/impl
                        BaseSimpleServiceImpl.java
  Removed:     hivemind/src/test/hivemind/test/services StoreAppender.java
  Log:
  Add overridable attribute to <service>
  
  Revision  Changes    Path
  1.5       +12 -1     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/ServiceDescriptor.java
  
  Index: ServiceDescriptor.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/parse/ServiceDescriptor.java,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- ServiceDescriptor.java    4 Jun 2003 23:52:47 -0000       1.4
  +++ ServiceDescriptor.java    2 Jul 2003 15:40:36 -0000       1.5
  @@ -71,6 +71,7 @@
       private String _id;
       private String _interfaceClassName;
       private boolean _required = true;
  +    private boolean _overridable;
       private String _description;
   
       public String getId()
  @@ -118,6 +119,16 @@
           builder.append("id", _id);
           builder.append("interfaceClassName", _interfaceClassName);
           builder.append("required", _required);
  +    }
  +
  +    public boolean isOverridable()
  +    {
  +        return _overridable;
  +    }
  +
  +    public void setOverridable(boolean b)
  +    {
  +        _overridable = b;
       }
   
   }
  
  
  
  1.11      +23 -23    
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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- DescriptorParser.java     1 Jul 2003 20:13:01 -0000       1.10
  +++ DescriptorParser.java     2 Jul 2003 15:40:37 -0000       1.11
  @@ -189,8 +189,8 @@
           result.addRule(pattern, setLocationRule);
           result.addSetLimitedProperties(
               pattern,
  -            new String[] { "id", "interface", "required" },
  -            new String[] { "id", "interfaceClassName", "required" });
  +            new String[] { "id", "interface", "required", "overridable" },
  +            new String[] { "id", "interfaceClassName", "required", "overridable" });
           result.addSetNext(pattern, "addService");
   
           pattern = "module/contribute-service";
  @@ -263,10 +263,10 @@
           addFactoryRules(result, "module/configuration/factory", "addProvider");
           addFactoryRules(result, "module/contribute-configuration/factory", 
"addProvider");
   
  -             pattern = "*/parameters";
  -             result.addObjectCreate(pattern, ParametersDescriptor.class);
  -             result.addRule(pattern, setLocationRule);
  -             result.addSetNext(pattern, "setParameters");
  +        pattern = "*/parameters";
  +        result.addObjectCreate(pattern, ParametersDescriptor.class);
  +        result.addRule(pattern, setLocationRule);
  +        result.addSetNext(pattern, "setParameters");
   
           pattern = "*/value";
   
  @@ -314,13 +314,13 @@
           result.addSetLimitedProperties(pattern, "path", "path");
           result.addSetNext(pattern, "addProvider");
   
  -             pattern = "*/resource";
  +        pattern = "*/resource";
  +
  +        result.addObjectCreate(pattern, ResourceDescriptor.class);
  +        result.addRule(pattern, setLocationRule);
  +        result.addSetLimitedProperties(pattern, "path", "path");
  +        result.addSetNext(pattern, "addProvider");
   
  -             result.addObjectCreate(pattern, ResourceDescriptor.class);
  -             result.addRule(pattern, setLocationRule);
  -             result.addSetLimitedProperties(pattern, "path", "path");
  -             result.addSetNext(pattern, "addProvider");
  -             
           pattern = "*/new";
   
           result.addObjectCreate(pattern, NewDescriptor.class);
  @@ -336,17 +336,17 @@
               new String[] { "property", "path" },
               new String[] { "propertyName", "path" });
           result.addSetNext(pattern, "addConfigurator");
  -        
  -             pattern = "*/set-resource";
   
  -             result.addObjectCreate(pattern, ResourceDescriptor.class);
  -             result.addRule(pattern, setLocationRule);
  -             result.addSetLimitedProperties(
  -                     pattern,
  -                     new String[] { "property", "path" },
  -                     new String[] { "propertyName", "path" });
  -             result.addSetNext(pattern, "addConfigurator");
  -             
  +        pattern = "*/set-resource";
  +
  +        result.addObjectCreate(pattern, ResourceDescriptor.class);
  +        result.addRule(pattern, setLocationRule);
  +        result.addSetLimitedProperties(
  +            pattern,
  +            new String[] { "property", "path" },
  +            new String[] { "propertyName", "path" });
  +        result.addSetNext(pattern, "addConfigurator");
  +
           pattern = "*/set-expression";
   
           result.addObjectCreate(pattern, ExpressionDescriptor.class);
  
  
  
  1.11      +22 -3     
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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- HiveMind_1.0.xsd  1 Jul 2003 20:13:01 -0000       1.10
  +++ HiveMind_1.0.xsd  2 Jul 2003 15:40:38 -0000       1.11
  @@ -51,14 +51,33 @@
                                                                <xs:element 
ref="description" minOccurs="0" maxOccurs="1"/>
                                                                <xs:group 
ref="service-contribution-group"/>
                                                        </xs:sequence>
  -                                                     <xs:attribute name="id" 
type="simple-id" use="required"/>
  -                                                     <xs:attribute name="interface" 
type="xs:string" use="required"/>
  +                                                     <xs:attribute name="id" 
type="simple-id" use="required">
  +                                                             <xs:annotation>
  +                                                             <xs:documentation>The 
simple id for the service; the module's id will be prefixed 
  +                                                                     to form the 
complete service id.</xs:documentation>     
  +                                                             </xs:annotation>       
 
  +                                                     </xs:attribute>
  +                                                     <xs:attribute name="interface" 
type="xs:string" use="required">
  +                                                             <xs:annotation>
  +                                                                     
<xs:documentation>
  +                                                                     The fully 
qualified name of a Java interface for the service.
  +                                                                     
</xs:documentation>     
  +                                                             </xs:annotation>       
 
  +                                                     </xs:attribute>
                                                        <xs:attribute name="required" 
type="xs:boolean" use="optional"
                                                                default="true">
                                                                <xs:annotation>
                                                                        
<xs:documentation>If true (the default), then an
                                                                                
implementation of the service must be provided. If false,
                                                                                then 
the service is optional.</xs:documentation>
  +                                                             </xs:annotation>
  +                                                     </xs:attribute>
  +                                                     <xs:attribute 
name="overridable" type="xs:boolean" use="optional" default="false">
  +                                                             <xs:annotation>
  +                                                             <xs:documentation>
  +                                                             If true, then the core 
implementation provided as an internal contribution
  +                                                             may be overriden by 
another module.     
  +                                                             </xs:documentation>
                                                                </xs:annotation>
                                                        </xs:attribute>
                                                </xs:complexType>
  
  
  
  1.11      +11 -1     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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- descriptor.xml    1 Jul 2003 20:12:57 -0000       1.10
  +++ descriptor.xml    2 Jul 2003 15:40:38 -0000       1.11
  @@ -209,6 +209,16 @@
                                                extension point is optional.</td>
                                </tr>
                                <tr>
  +                                     <td>overridable</td>    
  +                                     <td>boolean</td>
  +                                     <td>no</td>
  +                                     <td>
  +                                     If true, then the factory contribution 
provided as an internal contribution
  +                                     may be overriden by another module.  The core 
implementation is therefore
  +                                     just a placeholder.  The default is false.     
 
  +                                     </td>
  +                             </tr>
  +                             <tr>
                                        <th colspan="2">Element</th>
                                        <th>Count</th>
                                        <th>Description</th>
  
  
  
  1.2       +3 -11     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ConfigurationExtensionPointImpl.java
  
  Index: ConfigurationExtensionPointImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ConfigurationExtensionPointImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ConfigurationExtensionPointImpl.java      30 Jun 2003 23:04:29 -0000      1.1
  +++ ConfigurationExtensionPointImpl.java      2 Jul 2003 15:40:38 -0000       1.2
  @@ -237,7 +237,7 @@
   
                   if (element == null)
                   {
  -                    error(
  +                                     LOG.error(
                           HiveMind.format(
                               "ConfigurationExtensionPoint.element-is-null",
                               c.getContributingModule().getModuleId(),
  @@ -250,7 +250,7 @@
   
                   if (!elementType.isAssignableFrom(coerced.getClass()))
                   {
  -                    error(
  +                    LOG.error(
                           HiveMind.format(
                               "ConfigurationExtensionPoint.element-not-allowed",
                               new Object[] {
  @@ -324,14 +324,6 @@
                   location,
                   ex);
           }
  -    }
  -
  -    protected void error(String message)
  -    {
  -        if (HiveMind.isBrittle())
  -            throw new ApplicationRuntimeException(message);
  -
  -        LOG.error(message);
       }
   
       public boolean getCacheElements()
  
  
  
  1.2       +14 -1     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ServiceExtensionPointImpl.java
  
  Index: ServiceExtensionPointImpl.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/impl/ServiceExtensionPointImpl.java,v
  retrieving revision 1.1
  retrieving revision 1.2
  diff -u -r1.1 -r1.2
  --- ServiceExtensionPointImpl.java    30 Jun 2003 23:04:29 -0000      1.1
  +++ ServiceExtensionPointImpl.java    2 Jul 2003 15:40:38 -0000       1.2
  @@ -89,12 +89,14 @@
       private List _interceptorContributions;
       private List _sortedInterceptorContributions;
       private boolean _required;
  +    private boolean _overridable;
       private boolean _building;
   
       protected void extendDescription(ToStringBuilder builder)
       {
           builder.append("serviceIntrerfaceName", _serviceInterfaceName);
           builder.append("required", _required);
  +        builder.append("overridable", _overridable);
           builder.append("factoryContribution", _factoryContribution);
           builder.append("interceptorContributions", _interceptorContributions);
       }
  @@ -321,4 +323,15 @@
   
           return stack.peek();
       }
  +    
  +    public boolean isOverridable()
  +    {
  +        return _overridable;
  +    }
  +
  +    public void setOverridable(boolean b)
  +    {
  +        _overridable = b;
  +    }
  +
   }
  
  
  
  1.10      +23 -27    
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- RegistryBuilder.java      1 Jul 2003 20:13:03 -0000       1.9
  +++ RegistryBuilder.java      2 Jul 2003 15:40:38 -0000       1.10
  @@ -68,14 +68,13 @@
   
   import org.apache.commons.hivemind.HiveMind;
   import org.apache.commons.hivemind.Module;
  -import org.apache.commons.hivemind.Registry;
   import org.apache.commons.hivemind.Occurances;
  -import org.apache.commons.hivemind.parse.AbstractInstanceBuilderDescriptor;
  +import org.apache.commons.hivemind.Registry;
   import org.apache.commons.hivemind.parse.ConfigurationDescriptor;
  +import org.apache.commons.hivemind.parse.ConfigurationElementProvider;
   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.ConfigurationElementProvider;
   import org.apache.commons.hivemind.parse.InstanceBuilder;
   import org.apache.commons.hivemind.parse.InterceptorDescriptor;
   import org.apache.commons.hivemind.parse.ModuleDescriptor;
  @@ -206,7 +205,7 @@
           {
               Module existing = (Module) _modules.get(id);
   
  -            error(
  +            LOG.error(
                   HiveMind.format(
                       "RegistryBuilder.duplicate-module-id",
                       id,
  @@ -255,6 +254,7 @@
               point.setLocation(sd.getLocation());
               point.setModule(module);
               point.setRequired(sd.isRequired());
  +            point.setOverridable(sd.isOverridable());
               point.setServiceInterfaceName(sd.getInterfaceClassName());
   
               module.addServiceExtensionPoint(point);
  @@ -362,7 +362,7 @@
   
           if (!BaseModule.class.isAssignableFrom(moduleClass))
           {
  -            error(
  +            LOG.error(
                   HiveMind.format(
                       "RegistryBuilder.must-extend-class",
                       new Object[] { md.getModuleId(), className, 
BaseModule.class.getName()}));
  @@ -463,7 +463,7 @@
   
               if (point == null)
               {
  -                error(
  +                LOG.error(
                       HiveMind.format(
                           "RegistryBuilder.unknown-configuration-extension-point",
                           moduleId,
  @@ -492,7 +492,7 @@
               return;
   
           if (builder != null)
  -            addServiceExtension(sourceModule, pointId, builder);
  +            addServiceExtension(sourceModule, pointId, builder, true);
   
           int count = Tapestry.size(interceptors);
           for (int i = 0; i < count; i++)
  @@ -515,7 +515,7 @@
           List interceptors = csd.getInterceptors();
   
           if (builder != null)
  -            addServiceExtension(sourceModule, pointId, builder);
  +            addServiceExtension(sourceModule, pointId, builder, false);
   
           int count = Tapestry.size(interceptors);
           for (int i = 0; i < count; i++)
  @@ -535,7 +535,8 @@
       protected void addServiceExtension(
           BaseModule sourceModule,
           String pointId,
  -        InstanceBuilder builder)
  +        InstanceBuilder builder,
  +        boolean isInternal)
       {
           if (LOG.isDebugEnabled())
               LOG.debug("Adding " + builder + " to service extension point " + 
pointId);
  @@ -544,7 +545,7 @@
   
           if (sep == null)
           {
  -            error(
  +            LOG.error(
                   HiveMind.format(
                       "RegistryBuilder.unknown-service-extension-point",
                       sourceModule.getModuleId(),
  @@ -553,9 +554,9 @@
               return;
           }
   
  -        if (sep.getFactoryContribution() != null)
  +        if (sep.getFactoryContribution() != null && !sep.isOverridable())
           {
  -            error(
  +            LOG.error(
                   HiveMind.format(
                       "RegistryBuilder.duplicate-factory",
                       sourceModule.getModuleId(),
  @@ -571,6 +572,11 @@
           fc.setServiceExtensionPoint(sep);
   
           sep.setFactoryContribution(fc);
  +
  +        // The first non-internal contribution "locks" the 
  +        // extension point so that no further contribution may be made.
  +        if (!isInternal)
  +            sep.setOverridable(false);
       }
   
       protected void addServiceExtension(
  @@ -585,7 +591,7 @@
   
           if (sep == null)
           {
  -            error(
  +            LOG.error(
                   HiveMind.format(
                       "RegistryBuilder.unknown-service-extension-point",
                       sourceModule.getModuleId(),
  @@ -617,7 +623,8 @@
               if (point.getFactoryContribution() != null)
                   continue;
   
  -            error(HiveMind.format("RegistryBuilder.missing-service", 
point.getExtensionPointId()));
  +            LOG.error(
  +                HiveMind.format("RegistryBuilder.missing-service", 
point.getExtensionPointId()));
           }
       }
   
  @@ -677,20 +684,9 @@
                       new Integer(count),
                       HiveMind.getMessage(key));
   
  -            error(message);
  +            LOG.error(message);
           }
   
       }
   
  -    /**
  -     * Pass non-fatal errors through this method.  During testing, this method
  -     * may instead cause a fatal error (that the test case can catch).
  -     */
  -    protected void error(String message)
  -    {
  -        if (HiveMind.isBrittle())
  -            throw new ApplicationRuntimeException(message);
  -
  -        LOG.error(message);
  -    }
   }
  
  
  
  1.10      +103 -22   
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindTestCase.java
  
  Index: HiveMindTestCase.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindTestCase.java,v
  retrieving revision 1.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- HiveMindTestCase.java     30 Jun 2003 23:04:34 -0000      1.9
  +++ HiveMindTestCase.java     2 Jul 2003 15:40:39 -0000       1.10
  @@ -57,6 +57,7 @@
   
   package hivemind.test;
   
  +
   import java.io.File;
   import java.net.URL;
   import java.util.List;
  @@ -70,6 +71,9 @@
   import org.apache.commons.hivemind.parse.DescriptorParser;
   import org.apache.commons.hivemind.parse.ModuleDescriptor;
   import org.apache.commons.hivemind.util.URLResourceLocation;
  +import org.apache.log4j.Level;
  +import org.apache.log4j.LogManager;
  +import org.apache.log4j.Logger;
   import org.apache.log4j.spi.LoggingEvent;
   import org.apache.tapestry.ApplicationRuntimeException;
   import org.apache.tapestry.IResourceLocation;
  @@ -88,6 +92,9 @@
   
       private DescriptorParser _parser = new DescriptorParser();
   
  +    private String _interceptedLoggerName;
  +    private StoreAppender _appender;
  +
       public HiveMindTestCase(String name)
       {
           super(name);
  @@ -162,13 +169,52 @@
                   "Exception message (" + message + ") does not contain [" + 
substring + "]");
       }
   
  +    protected void interceptLogging()
  +    {
  +        interceptLogging("org.apache.commons.hivemind");
  +    }
  +
  +    /**
  +     * Sets up a [EMAIL PROTECTED] StoreLogger} to intercept logging.
  +     */
  +
  +    protected void interceptLogging(String loggerName)
  +    {
  +        Logger logger = LogManager.getLogger(loggerName);
  +
  +        logger.removeAllAppenders();
  +
  +        _interceptedLoggerName = loggerName;
  +        _appender = new StoreAppender();
  +
  +        logger.setLevel(Level.DEBUG);
  +        logger.setAdditivity(false);
  +        logger.addAppender(_appender);
  +    }
  +
       /**
  -     * Resets the brittle flag to false.
  +     * Gets the list of events most recently intercepted.
  +     * @see #interceptLogging(String)
  +     * @see StoreAppender#getEvents()
        */
  +    protected List getInterceptedLogEvents()
  +    {
  +        return _appender.getEvents();
  +    }
  +
       protected void tearDown() throws Exception
       {
  -     HiveMind.setDefault(null);
  -        HiveMind.setBrittle(false);
  +        HiveMind.setDefault(null);
  +
  +        if (_appender != null)
  +        {
  +            _appender = null;
  +
  +            Logger logger = LogManager.getLogger(_interceptedLoggerName);
  +            logger.setLevel(null);
  +            logger.setAdditivity(true);
  +            logger.removeAllAppenders();
  +        }
       }
   
       protected void unreachable()
  @@ -187,30 +233,65 @@
           return new URLResourceLocation(f.toURL());
       }
   
  +    /**
  +     * Digs down through a stack of ARE's to find the first non-ARE, or
  +     * the deepest ARE.
  +     */
  +
  +    protected Throwable findNestedException(ApplicationRuntimeException ex)
  +    {
  +        Throwable cause = ex.getRootCause();
  +
  +        if (cause == null || cause == ex)
  +            return ex;
  +
  +        if (cause instanceof ApplicationRuntimeException)
  +            return findNestedException((ApplicationRuntimeException) cause);
   
  -     /**
  -      * Digs down through a stack of ARE's to find the first non-ARE, or
  -      * the deepest ARE.
  -      */
  -     
  -     protected Throwable findNestedException(ApplicationRuntimeException ex)
  -     {
  -             Throwable cause = ex.getRootCause();
  -     
  -             if (cause == null || cause == ex)
  -                     return ex;
  -     
  -             if (cause instanceof ApplicationRuntimeException)
  -                     return findNestedException((ApplicationRuntimeException)cause);
  -                     
  -             return cause;
  -     }
  +        return cause;
  +    }
   
  +    /**
  +     * Checks to see if a specific event matches the name and message.
  +     */
       protected void checkLoggingEvent(String name, String message, List events, int 
index)
       {
           LoggingEvent e = (LoggingEvent) events.get(index);
  -    
  +
           assertEquals("Logger name", name, e.getLoggerName());
           assertEquals("Message", message, e.getMessage());
       }
  +
  +    protected void checkLoggingEvent(String name, String message)
  +    {
  +        checkLoggingEvent(name, message, getInterceptedLogEvents());
  +    }
  +
  +    /**
  +     * Checks to see if any LoggingEvent in the list of events matches the name and 
message.
  +     * @param name logger name to match
  +     * @param message substring to look for in the message
  +     * @param event list of LoggingEvent to search.
  +     */
  +    protected void checkLoggingEvent(String name, String message, List events)
  +    {
  +        int count = events.size();
  +
  +        for (int i = 0; i < count; i++)
  +        {
  +            LoggingEvent e = (LoggingEvent) events.get(i);
  +
  +            if (!e.getLoggerName().equals(name))
  +                continue;
  +
  +            String eventMessage = e.getMessage().toString();
  +
  +            if (eventMessage.indexOf(message) >= 0)
  +                return;
  +
  +        }
  +
  +        throw new AssertionFailedError("Could not find logging event: [" + name + 
"] " + message);
  +    }
  +
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/StoreAppender.java
  
  Index: StoreAppender.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.util.ArrayList;
  import java.util.List;
  
  import org.apache.log4j.AppenderSkeleton;
  import org.apache.log4j.spi.LoggingEvent;
  
  /**
   * Used to test logging provided by the [EMAIL PROTECTED] 
org.apache.commons.hivemind.impl.LoggingInterceptorFactory}.
   *
   * @author Howard Lewis Ship
   * @version $Id: StoreAppender.java,v 1.1 2003/07/02 15:40:39 hlship Exp $
   */
  public class StoreAppender extends AppenderSkeleton
  {
      private List _events = new ArrayList(0);
  
      /**
       * Returns any accumulated events since the last invocations of this method.
       * @return List of [EMAIL PROTECTED] LoggingEvent}.
       */
      public List getEvents()
      {
          List result = new ArrayList(_events);
  
          _events.clear();
  
          return result;
      }
  
      protected void append(LoggingEvent event)
      {
          _events.add(event);
      }
  
      /**
       * Does nothing.
       */
      public void close()
      {
      }
  
      /**
       * Returns false.
       */
      public boolean requiresLayout()
      {
          return false;
      }
  
  }
  
  
  
  1.8       +7 -0      jakarta-commons-sandbox/hivemind/src/xsl/hivemind.xsl
  
  Index: hivemind.xsl
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/src/xsl/hivemind.xsl,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- hivemind.xsl      1 Jul 2003 20:13:02 -0000       1.7
  +++ hivemind.xsl      2 Jul 2003 15:40:39 -0000       1.8
  @@ -274,6 +274,13 @@
                                                <xsl:value-of select="@required"/>
                                        </td>
                                </tr>
  +                             <tr>
  +                                     <th>Overridable</th>
  +                                     <td>
  +                                             <xsl:if 
test="not(@overridable)">false</xsl:if>
  +                                             <xsl:value-of select="@overridable"/>
  +                                     </td>
  +                             </tr>                           
                                <xsl:if test="description">
                                        <tr>
                                                <td colspan="2" class="description">
  
  
  
  1.10      +53 -59    
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.9
  retrieving revision 1.10
  diff -u -r1.9 -r1.10
  --- TestServices.java 30 Jun 2003 23:04:45 -0000      1.9
  +++ TestServices.java 2 Jul 2003 15:40:40 -0000       1.10
  @@ -70,9 +70,6 @@
   import org.apache.commons.hivemind.Registry;
   import org.apache.commons.hivemind.impl.RegistryBuilder;
   import org.apache.commons.hivemind.parse.DescriptorParser;
  -import org.apache.log4j.Level;
  -import org.apache.log4j.LogManager;
  -import org.apache.log4j.Logger;
   import org.apache.tapestry.ApplicationRuntimeException;
   
   /**
  @@ -89,6 +86,14 @@
           super(name);
       }
   
  +    protected void tearDown() throws Exception
  +    {
  +        super.tearDown();
  +
  +        NameLookupHack._context = null;
  +        NameLookupHack._properties = null;
  +    }
  +
       public void testSimple() throws Exception
       {
           Registry r = buildRegistry("SimpleModule.xml");
  @@ -178,13 +183,7 @@
           b.processModule(_resolver, p.parse(getMasterModuleLocation()));
           b.processModule(_resolver, p.parse(getLocation("TestLogging.xml")));
   
  -        Logger logger = LogManager.getLogger("hivemind.test.services.Demo");
  -        logger.removeAllAppenders();
  -        logger.setLevel(Level.DEBUG);
  -        logger.setAdditivity(false);
  -
  -        StoreAppender a = new StoreAppender();
  -        logger.addAppender(a);
  +        interceptLogging("hivemind.test.services.Demo");
   
           Registry r = b.constructRegistry();
           DemoService s =
  @@ -192,7 +191,7 @@
   
           s.add(5, 3);
   
  -        List l = a.getEvents();
  +        List l = getInterceptedLogEvents();
           assertEquals(2, l.size());
   
           checkLoggingEvent("hivemind.test.services.Demo", "BEGIN add(5, 3)", l, 0);
  @@ -200,7 +199,7 @@
   
           s.noResult();
   
  -        l = a.getEvents();
  +        l = getInterceptedLogEvents();
           assertEquals(2, l.size());
   
           checkLoggingEvent("hivemind.test.services.Demo", "BEGIN noResult()", l, 0);
  @@ -216,7 +215,7 @@
               checkException(ex, "Failure in method alwaysFail.");
           }
   
  -        l = a.getEvents();
  +        l = getInterceptedLogEvents();
           assertEquals(2, l.size());
   
           checkLoggingEvent("hivemind.test.services.Demo", "BEGIN alwaysFail()", l, 
0);
  @@ -263,9 +262,7 @@
           NameLookupHack._context = context;
   
           SimpleRemote object =
  -            (SimpleRemote) r.getService(
  -                "hivemind.test.services.SimpleRemote",
  -                SimpleRemote.class);
  +            (SimpleRemote) r.getService("hivemind.test.services.SimpleRemote", 
SimpleRemote.class);
   
           assertEquals(7, object.add(4, 3));
           // Exercise several code paths where objects are ready or cached.
  @@ -286,9 +283,7 @@
           NameLookupHack._context = context;
   
           SimpleRemote object =
  -            (SimpleRemote) r.getService(
  -                "hivemind.test.services.SimpleRemote",
  -                SimpleRemote.class);
  +            (SimpleRemote) r.getService("hivemind.test.services.SimpleRemote", 
SimpleRemote.class);
   
           try
           {
  @@ -305,47 +300,46 @@
               checkException(t, "Forced error: hivemind.test.services.Simple");
           }
       }
  -    
  -     public void testEJBProxyRemoteFailure() throws Exception
  -     {
  -             RegistryBuilder b = new RegistryBuilder();
  -             DescriptorParser p = new DescriptorParser();
  -             b.processModule(_resolver, p.parse(getMasterModuleLocation()));
  -             b.processModule(_resolver, p.parse(getLocation("EJBProxy.xml")));
  -             Registry r = b.constructRegistry();
  -
  -             SimpleHomeImpl home = new SimpleHomeImpl();
  -             home.setForceError(true);
  -             
  -             FakeContext context = new FakeContext();
  -             context.bind("hivemind.test.services.Simple", home);
  -             NameLookupHack._context = context;
  -
  -             NameLookupHack._context = context;
  -
  -             SimpleRemote object =
  -                     (SimpleRemote) r.getService(
  -                             "hivemind.test.services.SimpleRemote",
  -                             SimpleRemote.class);
  -
  -             try
  -             {
  -
  -                     object.add(4, 3);
  -                     unreachable();
  -             }
  -             catch (RemoteException ex)
  -             {
  -                     checkException(ex, "Forced error.");
  -             }
  -     }    
   
  -    protected void tearDown() throws Exception
  +    public void testEJBProxyRemoteFailure() throws Exception
       {
  -        super.tearDown();
  -        
  -        NameLookupHack._context = null;
  -        NameLookupHack._properties = null;
  +        RegistryBuilder b = new RegistryBuilder();
  +        DescriptorParser p = new DescriptorParser();
  +        b.processModule(_resolver, p.parse(getMasterModuleLocation()));
  +        b.processModule(_resolver, p.parse(getLocation("EJBProxy.xml")));
  +        Registry r = b.constructRegistry();
  +
  +        SimpleHomeImpl home = new SimpleHomeImpl();
  +        home.setForceError(true);
  +
  +        FakeContext context = new FakeContext();
  +        context.bind("hivemind.test.services.Simple", home);
  +        NameLookupHack._context = context;
  +
  +        NameLookupHack._context = context;
  +
  +        SimpleRemote object =
  +            (SimpleRemote) r.getService("hivemind.test.services.SimpleRemote", 
SimpleRemote.class);
  +
  +        try
  +        {
  +
  +            object.add(4, 3);
  +            unreachable();
  +        }
  +        catch (RemoteException ex)
  +        {
  +            checkException(ex, "Forced error.");
  +        }
       }
   
  +     public void testServiceOverride() throws Exception
  +     {
  +             Registry r = buildRegistry("ServiceOverride.xml");
  +             
  +             SimpleService s = 
(SimpleService)r.getService("hivemind.test.services.ServiceOverride", 
SimpleService.class);
  +             
  +             // The bad impl multiplies, not add.
  +             assertEquals(28, s.add(4, 7));
  +     }
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/ServiceOverride.xml
  
  Index: ServiceOverride.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: ServiceOverride.xml,v 1.1 2003/07/02 15:40:40 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="ServiceOverride" interface="hivemind.test.services.SimpleService" 
overridable="true">
          <create-instance class="hivemind.test.services.impl.SimpleServiceImpl"/>
        </service>
        
        <contribute-service service-id="hivemind.test.services.ServiceOverride">
                <create-instance 
class="hivemind.test.services.impl.BaseSimpleServiceImpl"/>
        </contribute-service>
  </module>
  
  
  1.12      +46 -62    
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.11
  retrieving revision 1.12
  diff -u -r1.11 -r1.12
  --- TestConfiguration.java    1 Jul 2003 20:13:01 -0000       1.11
  +++ TestConfiguration.java    2 Jul 2003 15:40:41 -0000       1.12
  @@ -69,6 +69,7 @@
   import org.apache.commons.hivemind.Registry;
   import org.apache.commons.hivemind.impl.RegistryBuilder;
   import org.apache.commons.hivemind.parse.DescriptorParser;
  +import org.apache.log4j.spi.LoggingEvent;
   import org.apache.tapestry.ApplicationRuntimeException;
   import org.apache.tapestry.ILocation;
   import org.apache.tapestry.IResourceLocation;
  @@ -91,37 +92,40 @@
   
       public void testCheckRequired() throws Exception
       {
  -        try
  -        {
  -            HiveMind.setBrittle(true);
  +        interceptLogging();
   
  -            buildRegistry("CheckRequired.xml");
  +        Registry r = buildRegistry("CheckRequired.xml");
   
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.RegistryBuilder",
  +            "Configuration extension point hivemind.test.config.Required contains 
no contributions but expects exactly one contribution.");
  +
  +        try
  +        {
  +            r.getService("hivemind.test.config.Required", Object.class);
               unreachable();
           }
  -        catch (Exception ex)
  +        catch (ApplicationRuntimeException ex)
           {
               checkException(
                   ex,
  -                "Configuration extension point hivemind.test.config.Required 
contains no contributions but expects exactly one contribution.");
  +                "Service extension point hivemind.test.config.Required does not 
exist.");
           }
  +
       }
  +
       public void testCheckRequiredOver() throws Exception
       {
  -        try
  -        {
  -            HiveMind.setBrittle(true);
  +        interceptLogging();
  +        Registry r = buildRegistry("CheckRequiredOver.xml");
   
  -            buildRegistry("CheckRequiredOver.xml");
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.RegistryBuilder",
  +            "Configuration extension point hivemind.test.config.RequiredOver 
contains 3 contributions but expects exactly one contribution.");
   
  -            unreachable();
  -        }
  -        catch (Exception ex)
  -        {
  -            checkException(
  -                ex,
  -                "Configuration extension point hivemind.test.config.RequiredOver 
contains 3 contributions but expects exactly one contribution.");
  -        }
  +        List l = r.getConfiguration("hivemind.test.config.RequiredOver");
  +
  +        assertEquals(3, l.size());
       }
   
       public void testRequiredExact() throws Exception
  @@ -136,20 +140,17 @@
   
       public void testCheckOptional() throws Exception
       {
  -        try
  -        {
  -            HiveMind.setBrittle(true);
  +        interceptLogging();
   
  -            buildRegistry("CheckOptional.xml");
  +        Registry r = buildRegistry("CheckOptional.xml");
   
  -            unreachable();
  -        }
  -        catch (Exception ex)
  -        {
  -            checkException(
  -                ex,
  -                "Configuration extension point hivemind.test.config.CheckOptional 
contains 2 contributions but expects an optional contribution.");
  -        }
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.RegistryBuilder",
  +            "Configuration extension point hivemind.test.config.CheckOptional 
contains 2 contributions but expects an optional contribution.");
  +
  +        List l = r.getConfiguration("hivemind.test.config.CheckOptional");
  +
  +        assertEquals(2, l.size());
       }
   
       public void testOptional() throws Exception
  @@ -165,20 +166,17 @@
   
       public void testCheckOnePlus() throws Exception
       {
  -        try
  -        {
  -            HiveMind.setBrittle(true);
  +        interceptLogging();
   
  -            buildRegistry("CheckOnePlus.xml");
  +        Registry r = buildRegistry("CheckOnePlus.xml");
   
  -            unreachable();
  -        }
  -        catch (Exception ex)
  -        {
  -            checkException(
  -                ex,
  -                "Configuration extension point hivemind.test.config.CheckOnePlus 
contains no contributions but expects at least one contribution.");
  -        }
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.RegistryBuilder",
  +            "Configuration extension point hivemind.test.config.CheckOnePlus 
contains no contributions but expects at least one contribution.");
  +
  +        List l = r.getConfiguration("hivemind.test.config.CheckOnePlus");
  +
  +        assertEquals(0, l.size());
       }
   
       public void testOnePlus() throws Exception
  @@ -212,7 +210,6 @@
       {
           try
           {
  -            HiveMind.setBrittle(true);
   
               Registry r = buildRegistry("ConvertFail.xml");
   
  @@ -446,30 +443,17 @@
   
       public void testWrongElementType() throws Exception
       {
  -        HiveMind.setBrittle(true);
  +        interceptLogging();
   
           Registry r = buildRegistry("WrongElementType.xml");
   
  -        try
  -        {
  +        List l = r.getConfiguration("hivemind.test.config.Create");
   
  -            r.getConfiguration("hivemind.test.config.Create");
  -            unreachable();
  -        }
  -        catch (ApplicationRuntimeException ex)
  -        {
  -            Throwable t = findNestedException(ex);
  -
  -            checkException(
  -                t,
  -                "Module hivemind.test.config has contributed element 
hivemind.test.config.ConfigElement@");
  -            checkException(t, "to service extension point 
hivemind.test.config.Create");
  -            checkException(
  -                t,
  -                "The element may not be converted to the declared element type, "
  -                    + "org.apache.commons.hivemind.SymbolSource, and has been 
ignored.");
  -        }
  +        assertEquals(1, l.size());
   
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.ConfigurationExtensionPointImpl",
  +            "The element may not be converted to the declared element type, 
org.apache.commons.hivemind.SymbolSource, and has been ignored.");
       }
   
       /**
  
  
  
  1.3       +2 -1      
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/config/WrongElementType.xml
  
  Index: WrongElementType.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/config/WrongElementType.xml,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WrongElementType.xml      30 Jun 2003 23:04:42 -0000      1.2
  +++ WrongElementType.xml      2 Jul 2003 15:40:41 -0000       1.3
  @@ -7,5 +7,6 @@
        version="1.0.0">
     <configuration id="Create" 
element-type="org.apache.commons.hivemind.SymbolSource">
                <create-instance class="hivemind.test.config.ConfigElement"/>
  +             <create-instance class="hivemind.test.external.MapSymbolSource"/>
     </configuration>
   </module>
  
  
  
  1.11      +29 -20    
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.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- TestDescriptorParser.java 1 Jul 2003 20:13:02 -0000       1.10
  +++ TestDescriptorParser.java 2 Jul 2003 15:40:43 -0000       1.11
  @@ -132,6 +132,7 @@
           assertEquals("Bar", s.getId());
           assertEquals("package.IBar", s.getInterfaceClassName());
           assertEquals(false, s.isRequired());
  +        assertEquals(false, s.isOverridable());
           assertNull(s.getDescription());
   
           s = d.getService("Foo");
  @@ -590,23 +591,31 @@
   
           assertEquals("foo/bar.baz", rd.getPath());
       }
  -    
  -     public void testSetResource() throws Exception
  -     {
  -             ModuleDescriptor d = parse("SetResource.xml");
  -             ConfigurationDescriptor cd = d.getConfiguration("Resource");
  -
  -             List l = cd.getProviders();
  -             assertEquals(1, l.size());
  -
  -             NewDescriptor nd = (NewDescriptor) l.get(0);
  -     
  -             l = nd.getConfigurators();
  -             assertEquals(1, l.size());
  -             
  -             ResourceDescriptor rd = (ResourceDescriptor) l.get(0);
  -
  -             assertEquals("foo", rd.getPropertyName());
  -             assertEquals("biff.blat", rd.getPath());                
  -     }    
  +
  +    public void testSetResource() throws Exception
  +    {
  +        ModuleDescriptor d = parse("SetResource.xml");
  +        ConfigurationDescriptor cd = d.getConfiguration("Resource");
  +
  +        List l = cd.getProviders();
  +        assertEquals(1, l.size());
  +
  +        NewDescriptor nd = (NewDescriptor) l.get(0);
  +
  +        l = nd.getConfigurators();
  +        assertEquals(1, l.size());
  +
  +        ResourceDescriptor rd = (ResourceDescriptor) l.get(0);
  +
  +        assertEquals("foo", rd.getPropertyName());
  +        assertEquals("biff.blat", rd.getPath());
  +    }
  +
  +    public void testOverridableService() throws Exception
  +    {
  +        ModuleDescriptor d = parse("OverridableService.xml");
  +        ServiceDescriptor sd = d.getService("Foo");
  +
  +        assertEquals(true, sd.isOverridable());
  +    }
   }
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/parse/OverridableService.xml
  
  Index: OverridableService.xml
  ===================================================================
  <?xml version="1.0" encoding="UTF-8"?>
  <!-- $Id: OverridableService.xml,v 1.1 2003/07/02 15:40:43 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.parse" 
        version="1.0.0">
    <service id="Foo" interface="package.foo.Fubar" overridable="true">
                <create-instance class="fie.fie.foe.Fum"/>
    </service>
  </module>
  
  
  1.7       +1 -26     
jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/HiveMind.java
  
  Index: HiveMind.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/HiveMind.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- HiveMind.java     30 Jun 2003 23:04:30 -0000      1.6
  +++ HiveMind.java     2 Jul 2003 15:40:43 -0000       1.7
  @@ -97,8 +97,6 @@
           _bundle = ResourceBundle.getBundle(HiveMind.class.getName() + "Messages");
       }
   
  -    private static boolean _brittle = false;
  -
       private HiveMind()
       {
           // Prevent instantiation
  @@ -180,29 +178,6 @@
           int count = keys.size();
   
           return (String[]) keys.toArray(new String[count]);
  -    }
  -
  -    /**
  -     * Returns true if HiveMind is operating in "brittle" mode,
  -     * which is only used for testing.  In brittle mode,
  -     * runtime warnings (such as missing services and modules)
  -     * become actual exceptions.  By default, HiveMind
  -     * is in normal (non-brittle) mode.
  -     * 
  -     **/
  -
  -    public static boolean isBrittle()
  -    {
  -        return _brittle;
  -    }
  -
  -    /**
  -     * Used to activate the "brittle" mode for testing
  -     * purposes only.
  -     */
  -    public static void setBrittle(boolean brittle)
  -    {
  -        _brittle = brittle;
       }
   
       public static ApplicationRuntimeException createMissingServiceException(
  
  
  
  1.5       +7 -3      jakarta-commons-sandbox/hivemind/src/META-INF/hivemodule.xml
  
  Index: hivemodule.xml
  ===================================================================
  RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/src/META-INF/hivemodule.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- hivemodule.xml    1 Jul 2003 11:28:53 -0000       1.4
  +++ hivemodule.xml    2 Jul 2003 15:40:43 -0000       1.5
  @@ -26,10 +26,14 @@
        
        <service id="NameLookup"
                        interface="org.apache.commons.hivemind.service.NameLookup"
  -                     required="false">
  +                     required="false"
  +                     overridable="true">
                <description>
                        A service which can perform name lookups of objects; typically 
an implementation based on JNDI is supplied.     
  -             </description>          
  +                     The default implementation uses JNDI but may be overriden for 
other environments, or to override its
  +                     configuration.
  +             </description>  
  +             <create-instance 
class="org.apache.commons.hivemind.service.impl.NameLookupImpl"/>      
        </service>
        
        <service id="EJBProxyFactory"
  
  
  
  1.1                  
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/services/impl/BaseSimpleServiceImpl.java
  
  Index: BaseSimpleServiceImpl.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.SimpleService;
  
  /**
   * Used to test overriding of service implementations.  Multiplies the arguments
   * instead of adding them, so that we can detect that the implementation has
   * been overriden.
   *
   * @author Howard Lewis Ship
   * @version $Id: BaseSimpleServiceImpl.java,v 1.1 2003/07/02 15:40:43 hlship Exp $
   */
  public class BaseSimpleServiceImpl implements SimpleService
  {
  
        /**
         * Multiplies the values!
         */
      public int add(int a, int b)
      {
          return a * b;
      }
  
  }
  
  
  
  1.5       +5 -2      
jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testBasic.xml
  
  Index: testBasic.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testBasic.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- testBasic.xml     1 Jul 2003 11:28:53 -0000       1.4
  +++ testBasic.xml     2 Jul 2003 15:40:43 -0000       1.5
  @@ -23,10 +23,13 @@
           </service>
           <service id="org.apache.commons.hivemind.NameLookup"
               interface="org.apache.commons.hivemind.service.NameLookup"
  -            required="false" uid="6">
  +            overridable="true" required="false" uid="6">
               <description>    A service which can perform name lookups of
                   objects; typically an implementation based on JNDI is
  -                supplied.    </description>
  +                supplied.     The default implementation uses JNDI but
  +                may be overriden for other environments, or to override
  +                its    configuration.   </description>
  +            <create-instance 
class="org.apache.commons.hivemind.service.impl.NameLookupImpl"/>
           </service>
           <service id="org.apache.commons.hivemind.EJBProxyFactory"
               interface="org.apache.commons.hivemind.ServiceImplementationFactory" 
uid="7">
  
  
  
  1.5       +5 -2      
jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testUptoDate.xml
  
  Index: testUptoDate.xml
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testUptoDate.xml,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- testUptoDate.xml  1 Jul 2003 11:28:53 -0000       1.4
  +++ testUptoDate.xml  2 Jul 2003 15:40:43 -0000       1.5
  @@ -23,10 +23,13 @@
           </service>
           <service id="org.apache.commons.hivemind.NameLookup"
               interface="org.apache.commons.hivemind.service.NameLookup"
  -            required="false" uid="6">
  +            overridable="true" required="false" uid="6">
               <description>    A service which can perform name lookups of
                   objects; typically an implementation based on JNDI is
  -                supplied.    </description>
  +                supplied.     The default implementation uses JNDI but
  +                may be overriden for other environments, or to override
  +                its    configuration.   </description>
  +            <create-instance 
class="org.apache.commons.hivemind.service.impl.NameLookupImpl"/>
           </service>
           <service id="org.apache.commons.hivemind.EJBProxyFactory"
               interface="org.apache.commons.hivemind.ServiceImplementationFactory" 
uid="7">
  
  
  
  1.8       +38 -27    
jakarta-commons-sandbox/hivemind/src/test/hivemind/test/external/TestExternalParser.java
  
  Index: TestExternalParser.java
  ===================================================================
  RCS file: 
/home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/external/TestExternalParser.java,v
  retrieving revision 1.7
  retrieving revision 1.8
  diff -u -r1.7 -r1.8
  --- TestExternalParser.java   30 Jun 2003 23:04:29 -0000      1.7
  +++ TestExternalParser.java   2 Jul 2003 15:40:43 -0000       1.8
  @@ -71,6 +71,7 @@
   import org.apache.commons.hivemind.parse.DescriptorParser;
   import org.apache.commons.hivemind.parse.ExternalParser;
   import org.apache.commons.hivemind.util.URLResourceLocation;
  +import org.apache.log4j.spi.LoggingEvent;
   import org.apache.tapestry.ApplicationRuntimeException;
   import org.apache.tapestry.IResourceLocation;
   import org.apache.tapestry.util.xml.DocumentParseException;
  @@ -253,6 +254,8 @@
   
       public void testXMLSymbols() throws Exception
       {
  +        interceptLogging();
  +
           RegistryBuilder b = new RegistryBuilder();
           DescriptorParser dp = new DescriptorParser();
   
  @@ -287,43 +290,51 @@
   
           assertEquals("${town}", e2.getContent());
   
  +        checkLoggingEvent(
  +            "org.apache.commons.hivemind.impl.RegistryImpl",
  +            "No value available for variable 'town'");
       }
  -    
  -     public void testSymbolSourceOrder() throws Exception
  -     {
  -             RegistryBuilder b = new RegistryBuilder();
  -             DescriptorParser dp = new DescriptorParser();
   
  -             b.processModule(_resolver, dp.parse(getMasterModuleLocation()));
  -             b.processModule(_resolver, 
dp.parse(getLocation("SymbolSourceOrder.xml")));
  +    public void testSymbolSourceOrder() throws Exception
  +    {
  +        interceptLogging();
  +
  +        RegistryBuilder b = new RegistryBuilder();
  +        DescriptorParser dp = new DescriptorParser();
   
  -             Registry r = b.constructRegistry();
  +        b.processModule(_resolver, dp.parse(getMasterModuleLocation()));
  +        b.processModule(_resolver, dp.parse(getLocation("SymbolSourceOrder.xml")));
   
  -             List elements = r.getConfiguration("hivemind.test.external.Elements");
  -             assertEquals(1, elements.size());
  +        Registry r = b.constructRegistry();
   
  -             Element e = (Element) elements.get(0);
  +        List elements = r.getConfiguration("hivemind.test.external.Elements");
  +        assertEquals(1, elements.size());
   
  -             assertEquals("family", e.getElementName());
  +        Element e = (Element) elements.get(0);
   
  -             Attribute a = (Attribute) e.getAttributes().get(0);
  -             assertEquals("husband", a.getName());
  -             assertEquals("Homer Simpson", a.getValue());
  +        assertEquals("family", e.getElementName());
   
  -             List l2 = e.getElements();
  -             Element e2 = (Element) l2.get(0);
  -             assertEquals("Wife: Wilma Flintstone", e2.getContent());
  +        Attribute a = (Attribute) e.getAttributes().get(0);
  +        assertEquals("husband", a.getName());
  +        assertEquals("Homer Simpson", a.getValue());
   
  -             e2 = (Element) l2.get(1);
  -             assertEquals("Barney Rubble", e2.getContent());
  +        List l2 = e.getElements();
  +        Element e2 = (Element) l2.get(0);
  +        assertEquals("Wife: Wilma Flintstone", e2.getContent());
   
  -             e2 = (Element) l2.get(2);
  -             assertEquals("Dino", e2.getContent());
  +        e2 = (Element) l2.get(1);
  +        assertEquals("Barney Rubble", e2.getContent());
   
  -             e2 = (Element) l2.get(3);
  -             // No value for this variable.
  +        e2 = (Element) l2.get(2);
  +        assertEquals("Dino", e2.getContent());
   
  -             assertEquals("${town}", e2.getContent());
  +        e2 = (Element) l2.get(3);
  +        // No value for this variable.
   
  -     }    
  +        assertEquals("${town}", e2.getContent());
  +        
  +             checkLoggingEvent(
  +                     "org.apache.commons.hivemind.impl.RegistryImpl",
  +                     "No value available for variable 'town'");
  +    }
   }
  
  
  

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

Reply via email to