hlship 2003/06/12 13:57:40 Modified: hivemind/src/test/hivemind/test/ant TestManifestClassPath.java hivemind/xdocs configuration.xml navigation.xml services.xml hivemind/xdocs/ant index.xml hivemind/src/test/hivemind/test HiveMindSuite.java HiveMindTestCase.java hivemind maven.xml project.properties hivemind/src/java/org/apache/commons/hivemind HiveMind.java Added: hivemind/src/test/hivemind/test/ant TestConstructRegistry.java hivemind/xdocs/ant ConstructRegistry.xml hivemind/xdocs/images InterceptorStack.png hivemind/src/test-data/TestConstructRegistry testBasic.xml testUptoDate.xml hivemind/src/images InterceptorStack.psp hivemind/src/java/org/apache/commons/hivemind/ant ConstructRegistry.java Log: Add ConstructRegistry Ant task. Use the ManifestClassPath Ant task when building the HiveMind JAR. Add an image to illustrate interceptors. Revision Changes Path 1.3 +27 -50 jakarta-commons-sandbox/hivemind/src/test/hivemind/test/ant/TestManifestClassPath.java Index: TestManifestClassPath.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/ant/TestManifestClassPath.java,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- TestManifestClassPath.java 10 Jun 2003 21:29:25 -0000 1.2 +++ TestManifestClassPath.java 12 Jun 2003 20:57:39 -0000 1.3 @@ -67,36 +67,37 @@ import org.apache.tools.ant.Target; import org.apache.tools.ant.types.Path; +/** + * Tests the [EMAIL PROTECTED] org.apache.commons.hivemind.ant.ManifestClassPath} + * Ant task. + * + * @author Howard Lewis Ship + * @version $Id$ + */ public class TestManifestClassPath extends HiveMindTestCase { - public class Driver extends ManifestClassPath - { - public Driver() - { - project = new Project(); - project.init(); - - taskType = "manifestClassPath"; - taskName = "manfiestClassPath"; - - target = new Target(); - } - } + protected Project _project = new Project(); public TestManifestClassPath(String name) { super(name); } - public void testSimple() throws Exception + protected ManifestClassPath create() { - Project p = new Project(); Target t = new Target(); - ManifestClassPath mcp = new ManifestClassPath(); - mcp.setProject(p); - mcp.setOwningTarget(t); - mcp.setTaskName("manifestClassPath"); + ManifestClassPath result = new ManifestClassPath(); + result.setProject(_project); + result.setOwningTarget(t); + result.setTaskName("manifestClassPath"); + + return result; + } + + public void testSimple() throws Exception + { + ManifestClassPath mcp = create(); mcp.setProperty("output"); @@ -114,18 +115,12 @@ mcp.execute(); - assertEquals("hivemodule.xml HiveMind.properties", p.getProperty("output")); + assertEquals("hivemodule.xml HiveMind.properties", _project.getProperty("output")); } public void testDirectory() throws Exception { - Project p = new Project(); - Target t = new Target(); - - ManifestClassPath mcp = new ManifestClassPath(); - mcp.setProject(p); - mcp.setOwningTarget(t); - mcp.setTaskName("manifestClassPath"); + ManifestClassPath mcp = create(); mcp.setProperty("output"); @@ -155,18 +150,12 @@ assertEquals( "META-INF/hivemodule.xml java/org/apache/commons/hivemind/HiveMind.properties", - p.getProperty("output")); + _project.getProperty("output")); } public void testEmpty() throws Exception { - Project p = new Project(); - Target t = new Target(); - - ManifestClassPath mcp = new ManifestClassPath(); - mcp.setProject(p); - mcp.setOwningTarget(t); - mcp.setTaskName("manifestClassPath"); + ManifestClassPath mcp = create(); mcp.setProperty("zap"); @@ -176,19 +165,13 @@ mcp.execute(); - assertEquals("", p.getProperty("zap")); + assertEquals("", _project.getProperty("zap")); } public void testNoProperty() throws Exception { - Project p = new Project(); - Target t = new Target(); - - ManifestClassPath mcp = new ManifestClassPath(); - mcp.setProject(p); - mcp.setOwningTarget(t); - mcp.setTaskName("manifestClassPath"); + ManifestClassPath mcp = create(); mcp.createClasspath(); @@ -207,13 +190,7 @@ public void testNoClasspath() throws Exception { - Project p = new Project(); - Target t = new Target(); - - ManifestClassPath mcp = new ManifestClassPath(); - mcp.setProject(p); - mcp.setOwningTarget(t); - mcp.setTaskName("manifestClassPath"); + ManifestClassPath mcp = create(); mcp.setProperty("bar"); 1.1 jakarta-commons-sandbox/hivemind/src/test/hivemind/test/ant/TestConstructRegistry.java Index: TestConstructRegistry.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.ant; import hivemind.test.HiveMindTestCase; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.io.InputStreamReader; import java.io.LineNumberReader; import org.apache.commons.hivemind.ant.ConstructRegistry; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Project; import org.apache.tools.ant.Target; import org.apache.tools.ant.types.Path; public class TestConstructRegistry extends HiveMindTestCase { protected Project _project = new Project(); public TestConstructRegistry(String name) { super(name); } protected ConstructRegistry create() { Target t = new Target(); ConstructRegistry result = new ConstructRegistry(); result.setProject(_project); result.setOwningTarget(t); result.setTaskName("constructRegistry"); return result; } public void testNoFile() throws Exception { ConstructRegistry cr = create(); try { cr.execute(); unreachable(); } catch (BuildException ex) { checkException(ex, "You must specify an output file"); } } public void testNoDescriptors() throws Exception { ConstructRegistry cr = create(); File f = File.createTempFile("registry-", ".xml"); cr.setOutput(f); assertSame(f, cr.getOutput()); try { cr.execute(); unreachable(); } catch (BuildException ex) { checkException(ex, "You must specify a set of module descriptors"); } } public void testBasic() throws Exception { ConstructRegistry cr = create(); Path p = cr.createDescriptors(); p.createPath().setLocation(new File("src/META-INF/hivemodule.xml")); p.createPath().setLocation(new File("src/test/hivemind/test/config/ValueVariables.xml")); File output = File.createTempFile("registry-", ".xml"); // Delete the file, to force the task to re-create it. output.delete(); cr.setOutput(output); cr.execute(); compare(output, "src/test-data/TestConstructRegistry/testBasic.xml"); } public void testUptoDate() throws Exception { ConstructRegistry cr = create(); Path p = cr.createDescriptors(); p.createPath().setLocation(new File("src/META-INF/hivemodule.xml")); p.createPath().setLocation(new File("src/test/hivemind/test/config/CheckRequired.xml")); File output = File.createTempFile("registry-", ".xml"); // Delete the file, to force the task to re-create it. output.delete(); cr.setOutput(output); cr.execute(); compare(output, "src/test-data/TestConstructRegistry/testUptoDate.xml"); long stamp = output.lastModified(); cr.execute(); assertEquals(stamp, output.lastModified()); } protected void compare(File actual, String expectedPath) throws Exception { String expectedContent = readFile(new File(expectedPath)); String actualContent = readFile(actual); assertEquals(expectedContent, actualContent); } protected String readFile(File f) throws Exception { InputStream in = new FileInputStream(f); BufferedInputStream bin = new BufferedInputStream(in); InputStreamReader reader = new InputStreamReader(bin); BufferedReader br = new BufferedReader(reader); LineNumberReader r = new LineNumberReader(br); StringBuffer buffer = new StringBuffer(); while (true) { String line = r.readLine(); if (line == null) break; buffer.append(line); buffer.append("\n"); } r.close(); return buffer.toString(); } } 1.2 +5 -5 jakarta-commons-sandbox/hivemind/xdocs/configuration.xml Index: configuration.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/configuration.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- configuration.xml 11 Jun 2003 18:43:12 -0000 1.1 +++ configuration.xml 12 Jun 2003 20:57:39 -0000 1.2 @@ -138,7 +138,7 @@ HiveMind supports this notion through <em>substitution variables</em>. These are references to values that are supplied at runtime. Substitution variables can appear inside literal values and OGNL expressions (in a module descriptor). In addition, when the &xml; element reads an external XML file, substitution variables -in attribute and inside element content are expanded. +in attributes and inside element content are expanded. </p> <p> @@ -196,8 +196,8 @@ <li><strong>Why contribute objects? Why not just strings, or just XML?</strong> <p> - The whole point of HiveMind is to reduce code clutter. When configuration data is just strings - (in a .properties file) or just XML, that puts a lot of burden on the developer who + A central goal of HiveMind is to reduce code clutter. When configuration data is just strings + (in a .properties file) or just XML, that puts a lot of burden on the developer whose code <em>reads</em> the configuration to then massage it into useful objects. That kind of ad-hoc code is notoriously buggy; in HiveMind it is almost entirely absent. Instead, all the XML parsing occurs inside HiveMind, which typically creates and configures objects based on the XML (with exceptional @@ -206,7 +206,7 @@ <p> You can still limit yourself to strings, and you can even store configuration data as - XML (that you must interpret yourself), but the path of least resistance it + XML (that you must interpret yourself), but the path of least resistance is to use &create-instance; and nested &set; elements to create the objects to be contributed. </p> 1.5 +1 -0 jakarta-commons-sandbox/hivemind/xdocs/navigation.xml Index: navigation.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/navigation.xml,v retrieving revision 1.4 retrieving revision 1.5 diff -u -r1.4 -r1.5 --- navigation.xml 11 Jun 2003 18:43:12 -0000 1.4 +++ navigation.xml 12 Jun 2003 20:57:39 -0000 1.5 @@ -11,6 +11,7 @@ <item name="Module Descriptor" href="/descriptor.html"/> <item name="Ant Tasks" href="/ant/index.html" collapse="true"> <item name="ManifestClassPath" href="/ant/ManifestClassPath.html"/> + <item name="ConstructRegistry" href="/ant/ConstructRegistry.html"/> </item> </menu> </body> 1.6 +15 -7 jakarta-commons-sandbox/hivemind/xdocs/services.xml Index: services.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/services.xml,v retrieving revision 1.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- services.xml 10 Jun 2003 17:58:20 -0000 1.5 +++ services.xml 12 Jun 2003 20:57:39 -0000 1.6 @@ -81,12 +81,20 @@ contributions. If the order in which interceptors are applied is important, then the optional order attribute can be specified; it is used to sort the interceptors into the order in which they will be - applied. The default order is 0. Low numbers are executed first, and - are therefore "closer" to the core instance. Larger numbers are - executed later, and are "closer" to the client code. So you might use - an order of 200 for a logging interceptor, and an order of 100 for a - performance monitor interceptor. The logging interceptor will execute - before the performance monitor, and so won't affect its timing.</p> + applied.</p> + + <img src="images/InterceptorStack.png"/> + + <p> + The lowest order ("Security", with an order of 100) is applied first, wrapping around + the core implementation. Then comes "Performance" and last "Logging". When a client + invokes a method, it is really invoking it on the "Logging" interceptor, which then re-invokes the method + on the "Performance" interceptor, and so in, down to the core implementation. Each interceptor + can perform work before and/or after re-invoking the method on the next layer. In this example, + "Logging" was given a high order so that it wouldn't affect the "Performance" interceptor. Security + was given a lower order than "Performance" so that the time for security checks would be included in the + "Performance" analysis. + </p> </subsection> </section> <section name="A short example"> 1.2 +7 -1 jakarta-commons-sandbox/hivemind/xdocs/ant/index.xml Index: index.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/xdocs/ant/index.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- index.xml 10 Jun 2003 17:58:19 -0000 1.1 +++ index.xml 12 Jun 2003 20:57:39 -0000 1.2 @@ -36,6 +36,12 @@ for ensuring that all modules will be in the classpath when executing an application as an Enterprise Application Archive.</td> </tr> + + <tr> + <td><a href="ConstructRegistry.html">ConstructRegistry</a></td> + <td>org.apache.commons.hivemind.ant.ConstructRegistry</td> + <td>Reads multiple HiveMind module descriptors, creating a single XML file from them.</td> + </tr> </table> </section> </body> 1.1 jakarta-commons-sandbox/hivemind/xdocs/ant/ConstructRegistry.xml Index: ConstructRegistry.xml =================================================================== <?xml version="1.0"?> <!-- $Id: ConstructRegistry.xml,v 1.1 2003/06/12 20:57:39 hlship Exp $ --> <document> <properties> <title>ConstructRegistry Ant Task</title> <author email="[EMAIL PROTECTED]">Howard M. Lewis Ship</author> </properties> <body> <section name="Description"> <p> Reads some number of HiveMind module descriptors and assembles a single registry file from them. The output registry consists of a <registry> element which contains one <module> element for each module descriptor read. This registry is useful for generating documentation. </p> <p> The registry XML is only updated if it does not exist, or if any of the module deployment descriptor is newer. </p> </section> <section name="Parameters"> <table> <tr> <th>Attribute</th> <th>Description</th> <th>Required</th> </tr> <tr> <td>output</td> <td>The file to write the registry to.</td> <td>Yes</td> </tr> </table> </section> <section name="Parameters specified as nested elements"> <subsection name="descriptors"> <p>A path-like structure, used to identify which identifies which HiveMind module descriptors (<code>hivemodule.xml</code>) should be included. </p> </subsection> </section> <section name="Examples"> <p> Generate a list of JARs inside the <code>${target}</code> directory as relative paths and use it to set the Class-Path manifest attribute. </p> <source><![CDATA[ <constructregistry output="target/registry.xml"> <descriptors> <fileset dir="src"> <include name="**/hivemodule.xml"/> </fileset> </descriptors> </constructregistry> ]]> </source> </section> </body> </document> 1.1 jakarta-commons-sandbox/hivemind/xdocs/images/InterceptorStack.png <<Binary file>> 1.7 +9 -0 jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindSuite.java Index: HiveMindSuite.java =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/src/test/hivemind/test/HiveMindSuite.java,v retrieving revision 1.6 retrieving revision 1.7 diff -u -r1.6 -r1.7 --- HiveMindSuite.java 10 Jun 2003 17:58:20 -0000 1.6 +++ HiveMindSuite.java 12 Jun 2003 20:57:39 -0000 1.7 @@ -57,6 +57,7 @@ package hivemind.test; +import hivemind.test.ant.TestConstructRegistry; import hivemind.test.ant.TestManifestClassPath; import hivemind.test.config.TestConfiguration; import hivemind.test.external.TestExternalParser; @@ -66,6 +67,13 @@ import junit.framework.Test; import junit.framework.TestSuite; +/** + * Composes a test suite for all the HiveMind tests. Not used by + * Maven, but handy inside Eclipse. + * + * @author Howard Lewis Ship + * @version $Id$ + */ public class HiveMindSuite extends TestSuite { public static Test suite() @@ -79,6 +87,7 @@ suite.addTestSuite(TestRegistryBuilder.class); suite.addTestSuite(TestToString.class); suite.addTestSuite(TestManifestClassPath.class); + suite.addTestSuite(TestConstructRegistry.class); return suite; } 1.6 +2 -3 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.5 retrieving revision 1.6 diff -u -r1.5 -r1.6 --- HiveMindTestCase.java 6 Jun 2003 21:56:30 -0000 1.5 +++ HiveMindTestCase.java 12 Jun 2003 20:57:39 -0000 1.6 @@ -160,12 +160,11 @@ } /** - * Resets the brittle flag to false and flushes the Clover code-coverage cache to disk. + * Resets the brittle flag to false. */ protected void tearDown() throws Exception { HiveMind.setBrittle(false); - HiveMind.flushCloverCache(); } protected void unreachable() 1.2 +31 -23 jakarta-commons-sandbox/hivemind/maven.xml Index: maven.xml =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/maven.xml,v retrieving revision 1.1 retrieving revision 1.2 diff -u -r1.1 -r1.2 --- maven.xml 9 Jun 2003 22:23:07 -0000 1.1 +++ maven.xml 12 Jun 2003 20:57:39 -0000 1.2 @@ -1,25 +1,33 @@ <?xml version="1.0"?> <!-- $Id$ --> - -<project - xmlns:m="maven" - xmlns:ant="jelly:ant" - xmlns:j="jelly:core" - xmlns:u="jelly:util"> - - <postGoal name="jar:jar"> - - <ant:echo>Adding META-INF/hivemodule.xml to ${maven.final.name}.jar</ant:echo> - <ant:jar - jarfile="${maven.build.dir}/${maven.final.name}.jar" - basedir="${maven.build.dest}" - update="true" - excludes="${maven.jar.excludes}"> - - <ant:fileset dir="src"> - <ant:include name="META-INF/**"/> - </ant:fileset> - </ant:jar> - </postGoal> - +<project xmlns:j="jelly:core"> + <postGoal name="jar:jar"> + <echo>Adding META-INF/hivemodule.xml to ${maven.final.name}.jar</echo> + + <taskdef name="manifestClassPath" classname="org.apache.commons.hivemind.ant.ManifestClassPath"> + <classpath> + <pathelement location="${maven.build.dest}"/> + </classpath> + </taskdef> + + <manifestClassPath property="hivemind.manifest.class.path"> + <classpath> + <path refid="maven.dependency.classpath"/> + </classpath> + </manifestClassPath> + + <jar jarfile="${maven.build.dir}/${maven.final.name}.jar" + basedir="${maven.build.dest}" update="true" + excludes="${maven.jar.excludes}"> + + <fileset dir="src"> + <include name="META-INF/**"/> + </fileset> + + <manifest> + <attribute name="Class-Path" value="${hivemind.manifest.class.path}"/> + </manifest> + + </jar> + </postGoal> </project> 1.3 +2 -1 jakarta-commons-sandbox/hivemind/project.properties Index: project.properties =================================================================== RCS file: /home/cvs/jakarta-commons-sandbox/hivemind/project.properties,v retrieving revision 1.2 retrieving revision 1.3 diff -u -r1.2 -r1.3 --- project.properties 9 Jun 2003 22:23:07 -0000 1.2 +++ project.properties 12 Jun 2003 20:57:39 -0000 1.3 @@ -2,3 +2,4 @@ maven.username=hlship maven.xdoc.date=left +maven.junit.fork=yes 1.4 +1 -11 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.3 retrieving revision 1.4 diff -u -r1.3 -r1.4 --- HiveMind.java 4 Jun 2003 23:52:49 -0000 1.3 +++ HiveMind.java 12 Jun 2003 20:57:40 -0000 1.4 @@ -192,14 +192,4 @@ { _brittle = brittle; } - - /** - * Utility invoked from unit test suite to force - * a flush of cached code coverage data. - * @see <a href="http://www.thecortex.net/clover/userguide/directives.html">Clover User Guide</a> - */ - public static void flushCloverCache() - { - ///CLOVER:FLUSH - } } 1.1 jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testBasic.xml Index: testBasic.xml =================================================================== <?xml version="1.0"?> <registry> <module id="org.apache.commons.hivemind" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd"> <configuration element-type="org.apache.commons.hivemind.VariableSourceContribution" id="VariableSource"> <description>Provides a list of sources for substitution variables.</description> </configuration> </module> <module id="hivemind.test.config" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd"> <contribute-configuration configuration-id="org.apache.commons.hivemind.VariableSource"> <create-instance class="org.apache.commons.hivemind.VariableSourceContribution"> <set-create class="hivemind.test.external.PropertiesVariableSource" property="source"/> </create-instance> </contribute-configuration> <configuration element-type="java.lang.String" id="Dogs"> <value>${dog}</value> </configuration> </module> </registry> 1.1 jakarta-commons-sandbox/hivemind/src/test-data/TestConstructRegistry/testUptoDate.xml Index: testUptoDate.xml =================================================================== <?xml version="1.0"?> <registry> <module id="org.apache.commons.hivemind" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd"> <configuration element-type="org.apache.commons.hivemind.VariableSourceContribution" id="VariableSource"> <description>Provides a list of sources for substitution variables.</description> </configuration> </module> <module id="hivemind.test.config" version="1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://jakarta.apache.org/commons/hivemind/schema/HiveMind_1.0.xsd"> <configuration count="1" element-type="java.lang.String" id="Required"/> </module> </registry> 1.1 jakarta-commons-sandbox/hivemind/src/images/InterceptorStack.psp <<Binary file>> 1.1 jakarta-commons-sandbox/hivemind/src/java/org/apache/commons/hivemind/ant/ConstructRegistry.java Index: ConstructRegistry.java =================================================================== /* * ==================================================================== * * The Apache Software License, Version 1.1 * * Copyright (c) 1999-2003 The Apache Software Foundation. All rights * reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, if * any, must include the following acknowlegement: * "This product includes software developed by the * Apache Software Foundation (http://www.apache.org/)." * Alternately, this acknowlegement may appear in the software itself, * if and wherever such third-party acknowlegements normally appear. * * 4. The names "The Jakarta Project", "Commons", and "Apache Software * Foundation" must not be used to endorse or promote products derived * from this software without prior written permission. For written * permission, please contact [EMAIL PROTECTED] * * 5. Products derived from this software may not be called "Apache" * nor may "Apache" appear in their names without prior written * permission of the Apache Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Apache Software Foundation. For more * information on the Apache Software Foundation, please see * <http://www.apache.org/>. * */ package org.apache.commons.hivemind.ant; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.apache.tools.ant.BuildException; import org.apache.tools.ant.Task; import org.apache.tools.ant.types.Path; import org.apache.xml.serialize.OutputFormat; import org.apache.xml.serialize.XMLSerializer; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; /** * Reads some number of hivemodule deployment descriptors (specified as a fileset) * and builds a composite registry by simply concatinating them all. * * * @author Howard Lewis Ship * @version $Id: ConstructRegistry.java,v 1.1 2003/06/12 20:57:40 hlship Exp $ */ public class ConstructRegistry extends Task { private File _output; private Path _descriptorsPath; public void execute() throws BuildException { if (_output == null) throw new BuildException("You must specify an output file"); if (_descriptorsPath == null) throw new BuildException("You must specify a set of module descriptors"); long outputStamp = _output.lastModified(); String[] paths = _descriptorsPath.list(); int count = paths.length; boolean needsUpdate = false; File[] descriptors = new File[count]; for (int i = 0; i < count; i++) { File f = new File(paths[i]); if (f.lastModified() > outputStamp) needsUpdate = true; descriptors[i] = f; } if (needsUpdate) { Document registry = constructRegistry(descriptors); log("Writing registry to " + _output); writeDocument(registry, _output); } } protected DocumentBuilder getBuilder() throws ParserConfigurationException { DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); factory.setIgnoringComments(true); return factory.newDocumentBuilder(); } protected Document constructRegistry(File[] moduleDescriptors) throws BuildException { try { DocumentBuilder builder = getBuilder(); Document result = builder.newDocument(); Element registry = result.createElement("registry"); result.appendChild(registry); for (int i = 0; i < moduleDescriptors.length; i++) { File f = moduleDescriptors[i]; log("Reading " + f); Document module = builder.parse(f); Element e = module.getDocumentElement(); Node eCopy = result.importNode(e, true); registry.appendChild(eCopy); } return result; } catch (Exception ex) { throw new BuildException(ex); } } protected void writeDocument(Document document, File file) throws BuildException { try { OutputStream out = new FileOutputStream(file); BufferedOutputStream buffered = new BufferedOutputStream(out); writeDocument(document, buffered); buffered.close(); } catch (IOException ex) { throw new BuildException( "Unable to write registry to " + file + ": " + ex.getMessage(), ex); } } protected void writeDocument(Document document, OutputStream out) throws IOException { XMLSerializer serializer = new XMLSerializer(out, new OutputFormat(document, null, true)); serializer.serialize(document); } public Path createDescriptors() { _descriptorsPath = new Path(project); return _descriptorsPath; } public File getOutput() { return _output; } public void setOutput(File file) { _output = file; } }
--------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]