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]