You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hivemind.apache.org by hl...@apache.org on 2004/08/31 22:02:14 UTC
cvs commit: jakarta-hivemind/framework/src/test/hivemind/test/services TestClassFab.java
hlship 2004/08/31 13:02:14
Modified: framework/src/java/org/apache/hivemind/service/impl
LoggingUtils.java ClassFactoryImpl.java
CtClassSource.java ClassFactoryClassLoader.java
. .classpath status.xml
framework/src/test/hivemind/test TestContains.java
library/src/java/org/apache/hivemind/lib/impl
ServicePropertyFactory.java
library/src/test/org/apache/hivemind/lib/impl
TestServicePropertyFactory.java
Added: framework/src/java/org/apache/hivemind/service/impl
HiveMindClassPool.java
framework/src/test/org/apache/hivemind/service/impl
TestClassFab.java
library/src/test/org/apache/hivemind/lib/impl wonk.xml
ServicePropertyFactoryMaster.xml
Removed: framework/src/test/hivemind/test/services TestClassFab.java
Log:
HIVEMIND-48: Fix class loader issues surrounding fabricated classes that are used in multiple modules.
Revision Changes Path
1.2 +10 -10 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/LoggingUtils.java
Index: LoggingUtils.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/LoggingUtils.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- LoggingUtils.java 15 Aug 2004 15:41:57 -0000 1.1
+++ LoggingUtils.java 31 Aug 2004 20:02:13 -0000 1.2
@@ -1,16 +1,16 @@
-//Copyright 2004 The Apache Software Foundation
+// Copyright 2004 The Apache Software Foundation
//
-//Licensed under the Apache License, Version 2.0 (the "License");
-//you may not use this file except in compliance with the License.
-//You may obtain a copy of the License at
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
//
-// http://www.apache.org/licenses/LICENSE-2.0
+// http://www.apache.org/licenses/LICENSE-2.0
//
-//Unless required by applicable law or agreed to in writing, software
-//distributed under the License is distributed on an "AS IS" BASIS,
-//WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-//See the License for the specific language governing permissions and
-//limitations under the License.
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
package org.apache.hivemind.service.impl;
1.6 +6 -1 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryImpl.java
Index: ClassFactoryImpl.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryImpl.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- ClassFactoryImpl.java 29 Jul 2004 13:18:52 -0000 1.5
+++ ClassFactoryImpl.java 31 Aug 2004 20:02:13 -0000 1.6
@@ -36,6 +36,11 @@
*/
private Map _ctClassSourceMap = new HashMap();
+ /**
+ * ClassPool shared by all modules (all CtClassSource instances).
+ */
+ private HiveMindClassPool _pool = new HiveMindClassPool();
+
public ClassFab newClass(String name, Class superClass, Module module)
{
CtClassSource source = findCtClassSource(module);
@@ -63,7 +68,7 @@
if (result == null)
{
- result = new CtClassSource(module.getClassResolver().getClassLoader());
+ result = new CtClassSource(_pool, module.getClassResolver().getClassLoader());
_ctClassSourceMap.put(id, result);
}
1.2 +11 -9 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/CtClassSource.java
Index: CtClassSource.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/CtClassSource.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- CtClassSource.java 6 Jun 2004 00:29:25 -0000 1.1
+++ CtClassSource.java 31 Aug 2004 20:02:13 -0000 1.2
@@ -15,7 +15,6 @@
package org.apache.hivemind.service.impl;
import javassist.ClassPath;
-import javassist.ClassPool;
import javassist.CtClass;
import javassist.LoaderClassPath;
import javassist.NotFoundException;
@@ -33,18 +32,15 @@
*/
public class CtClassSource
{
- private ClassPool _pool;
- private ClassFactoryClassLoader _loader;
+ private HiveMindClassPool _pool;
- public CtClassSource(ClassLoader parentLoader)
+ public CtClassSource(HiveMindClassPool pool, ClassLoader parentLoader)
{
- _pool = new ClassPool(null);
+ _pool = pool;
ClassPath path = new LoaderClassPath(parentLoader);
_pool.appendClassPath(path);
-
- _loader = new ClassFactoryClassLoader(parentLoader);
}
public CtClass getCtClass(Class searchClass)
@@ -67,7 +63,9 @@
{
CtClass ctSuperClass = getCtClass(superClass);
- return _pool.makeClass(name, ctSuperClass);
+ CtClass result = _pool.makeClass(name, ctSuperClass);
+
+ return result;
}
public Class createClass(CtClass ctClass)
@@ -80,7 +78,11 @@
byte[] bytecode = _pool.write(className);
- return _loader.loadClass(className, bytecode);
+ Class result = _pool.loadClass(className, bytecode);
+
+ // _cache.add(className, bytecode);
+
+ return result;
}
catch (Throwable ex)
{
1.3 +1 -5 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryClassLoader.java
Index: ClassFactoryClassLoader.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/ClassFactoryClassLoader.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ClassFactoryClassLoader.java 6 Jun 2004 00:29:25 -0000 1.2
+++ ClassFactoryClassLoader.java 31 Aug 2004 20:02:13 -0000 1.3
@@ -18,14 +18,10 @@
* ClassLoader used to properly instantiate newly created classes.
*
* @author Howard Lewis Ship / Essl Christian
+ * @see org.apache.hivemind.service.impl.CtClassSource
*/
class ClassFactoryClassLoader extends ClassLoader
{
- public ClassFactoryClassLoader(ClassLoader parent)
- {
- super(parent);
- }
-
public Class loadClass(String name, byte[] bytecodes)
{
Class result = defineClass(name, bytecodes, 0, bytecodes.length);
1.1 jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/HiveMindClassPool.java
Index: HiveMindClassPool.java
===================================================================
// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.service.impl;
import javassist.ClassPath;
import javassist.ClassPool;
/**
* Used to ensure that {@link javassist.ClassPool#appendClassPath(javassist.ClassPath)} is
* invoked with a synchronized lock. Additionally, wraps around a shared
* {@link org.apache.hivemind.service.impl.ClassFactoryClassLoader}.
*
* @author Howard Lewis Ship
*/
public class HiveMindClassPool extends ClassPool
{
private ClassFactoryClassLoader _loader = new ClassFactoryClassLoader();
public HiveMindClassPool()
{
super(null);
}
/**
* Synchronizes this operation. {@link ClassPool#get(java.lang.String)} is already
* synchronized.
*
*/
public synchronized ClassPath appendClassPath(ClassPath cp)
{
return super.appendClassPath(cp);
}
public Class loadClass(String name, byte[] bytecodes)
{
return _loader.loadClass(name, bytecodes);
}
}
1.37 +1 -1 jakarta-hivemind/.classpath
Index: .classpath
===================================================================
RCS file: /home/cvs/jakarta-hivemind/.classpath,v
retrieving revision 1.36
retrieving revision 1.37
diff -u -r1.36 -r1.37
--- .classpath 3 Aug 2004 14:02:18 -0000 1.36
+++ .classpath 31 Aug 2004 20:02:13 -0000 1.37
@@ -17,7 +17,7 @@
<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER"/>
<classpathentry kind="lib" path="ext-package/lib/commons-logging-1.0.3.jar"/>
<classpathentry kind="lib" path="ext-package/lib/easymock-1.1.jar"/>
- <classpathentry kind="lib" path="ext-package/lib/javassist-2.6.jar"/>
+ <classpathentry kind="lib" path="ext-package/lib/javassist-2.6.jar" sourcepath="C:/Documents and Settings/Howard/Desktop/Downloads/Misc/javassist-2.6.zip"/>
<classpathentry kind="lib" path="ext-package/lib/log4j-1.2.7.jar"/>
<classpathentry kind="lib" path="ext-package/lib/oro-2.0.6.jar"/>
<classpathentry kind="lib" path="ext-package/lib/servletapi-2.3.jar"/>
1.55 +3 -0 jakarta-hivemind/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/status.xml,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -r1.54 -r1.55
--- status.xml 25 Aug 2004 22:42:24 -0000 1.54
+++ status.xml 31 Aug 2004 20:02:13 -0000 1.55
@@ -34,6 +34,9 @@
<action type="add" dev="HLS">
Add method <code>getSymbolValue()</code> to RegistryInfrastructure and Module
</action>
+ <action type="fix" dev="HLS" fixes-bug="HIVEMIND-48">
+ Fix class loader issues concerning fabricated classes in different modules.
+ </action>
</release>
1.1 jakarta-hivemind/framework/src/test/org/apache/hivemind/service/impl/TestClassFab.java
Index: TestClassFab.java
===================================================================
// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package org.apache.hivemind.service.impl;
import hivemind.test.services.AbstractIntWrapper;
import hivemind.test.services.FailService;
import hivemind.test.services.SimpleService;
import java.io.IOException;
import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
import java.util.List;
import javassist.CtClass;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.service.ClassFab;
import org.apache.hivemind.service.MethodFab;
import org.apache.hivemind.service.MethodSignature;
import org.apache.hivemind.test.HiveMindTestCase;
import org.apache.hivemind.util.PropertyUtils;
/**
* Tests related to {@link org.apache.hivemind.service.impl.ClassFabImpl},
* {@link org.apache.hivemind.service.impl.CtClassSource}, etc.
*
* @author Howard Lewis Ship
*/
public class TestClassFab extends HiveMindTestCase
{
private CtClassSource _source =
new CtClassSource(new HiveMindClassPool(), Thread.currentThread().getContextClassLoader());
private ClassFab newClassFab(String className, Class superClass)
{
CtClass ctClass = _source.newClass(className, superClass);
return new ClassFabImpl(_source, ctClass);
}
public void testCreateBean() throws Exception
{
ClassFab cf = newClassFab("TargetBean", Object.class);
cf.addField("_stringValue", String.class);
MethodSignature setStringValue =
new MethodSignature(void.class, "setStringValue", new Class[] { String.class }, null);
cf.addMethod(Modifier.PUBLIC, setStringValue, "_stringValue = $1;");
MethodSignature getStringValue =
new MethodSignature(String.class, "getStringValue", null, null);
cf.addMethod(Modifier.PUBLIC, getStringValue, "return _stringValue;");
Class targetClass = cf.createClass();
Object targetBean = targetClass.newInstance();
PropertyUtils.write(targetBean, "stringValue", "Fred");
String actual = (String) PropertyUtils.read(targetBean, "stringValue");
assertEquals("Fred", actual);
}
public void testConstructor() throws Exception
{
ClassFab cf = newClassFab("ConstructableBean", Object.class);
cf.addField("_stringValue", String.class);
cf.addConstructor(new Class[] { String.class }, null, "{ _stringValue = $1; }");
MethodSignature getStringValue =
new MethodSignature(String.class, "getStringValue", null, null);
cf.addMethod(Modifier.PUBLIC, getStringValue, "return _stringValue;");
Class targetClass = cf.createClass();
try
{
targetClass.newInstance();
unreachable();
}
catch (InstantiationException ex)
{
}
Constructor c = targetClass.getConstructors()[0];
Object targetBean = c.newInstance(new Object[] { "Buffy" });
String actual = (String) PropertyUtils.read(targetBean, "stringValue");
assertEquals("Buffy", actual);
}
public void testConstructorFromBaseClass() throws Exception
{
ClassFab cf = newClassFab("MyIntHolder", AbstractIntWrapper.class);
cf.addField("_intValue", int.class);
cf.addConstructor(new Class[] { int.class }, null, "{ _intValue = $1; }");
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(int.class, "getIntValue", null, null),
"return _intValue;");
Class targetClass = cf.createClass();
Constructor c = targetClass.getConstructors()[0];
AbstractIntWrapper targetBean =
(AbstractIntWrapper) c.newInstance(new Object[] { new Integer(137)});
assertEquals(137, targetBean.getIntValue());
}
public void testInvalidSuperClass() throws Exception
{
ClassFab cf = newClassFab("InvalidSuperClass", List.class);
try
{
cf.createClass();
unreachable();
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(ex, "Unable to create class InvalidSuperClass");
}
}
public void testAddInterface() throws Exception
{
ClassFab cf = newClassFab("SimpleService", Object.class);
cf.addInterface(SimpleService.class);
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(int.class, "add", new Class[] { int.class, int.class }, null),
"return $1 + $2;");
Class targetClass = cf.createClass();
SimpleService s = (SimpleService) targetClass.newInstance();
assertEquals(207, s.add(99, 108));
}
public void testSubclassFromFinal() throws Exception
{
ClassFab cf = newClassFab("StringSubclass", String.class);
try
{
cf.createClass();
}
catch (ApplicationRuntimeException ex)
{
assertEquals(
"Unable to create class StringSubclass: Cannot inherit from final class",
ex.getMessage());
}
}
public void testInPackage() throws Exception
{
ClassFab cf = newClassFab("org.apache.hivemind.InPackage", Object.class);
Class c = cf.createClass();
Object o = c.newInstance();
assertEquals("org.apache.hivemind.InPackage", o.getClass().getName());
}
public void testBadMethodBody() throws Exception
{
ClassFab cf = newClassFab("BadMethodBody", Object.class);
cf.addInterface(Runnable.class);
try
{
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(void.class, "run", null, null),
"fail;");
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(ex, "Unable to add method void run() to class BadMethodBody:");
}
}
public void testGetMethodFab() throws Exception
{
ClassFab cf = newClassFab("GetMethodFab", Object.class);
MethodSignature s = new MethodSignature(void.class, "run", null, null);
MethodFab mf = cf.addMethod(Modifier.PUBLIC, s, null);
assertSame(mf, cf.getMethodFab(s));
assertNull(cf.getMethodFab(new MethodSignature(void.class, "skip", null, null)));
}
public void testExtendMethod() throws Exception
{
ClassFab cf = newClassFab("ExtendMethod", Object.class);
MethodFab mf =
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(int.class, "getValue", null, null),
"return 1;");
mf.extend("return 2 * $_;", false);
Object bean = cf.createClass().newInstance();
assertEquals(new Integer(2), PropertyUtils.read(bean, "value"));
}
public void testExtendMethodAlterReturn() throws Exception
{
ClassFab cf = newClassFab("ExtendMethodAlterReturn", Object.class);
MethodFab mf =
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(int.class, "getValue", null, null),
"return 2;");
mf.extend("$_ = 3 * $_;", false);
Object bean = cf.createClass().newInstance();
assertEquals(new Integer(6), PropertyUtils.read(bean, "value"));
}
public void testExtendMethodFailure() throws Exception
{
ClassFab cf = newClassFab("ExtendMethodFailure", Object.class);
MethodFab mf =
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(int.class, "getValue", null, null),
"return 1;");
try
{
mf.extend("$_ =", true);
unreachable();
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(
ex,
"Unable to extend method int getValue() of class ExtendMethodFailure:");
}
}
public void testDupeMethodAdd() throws Exception
{
ClassFab cf = newClassFab("DupeMethodAdd", Object.class);
cf.addMethod(Modifier.PUBLIC, new MethodSignature(void.class, "foo", null, null), "{}");
try
{
cf.addMethod(Modifier.PUBLIC, new MethodSignature(void.class, "foo", null, null), "{}");
unreachable();
}
catch (ApplicationRuntimeException ex)
{
assertEquals(
"Attempt to redefine method void foo() of class DupeMethodAdd.",
ex.getMessage());
}
}
public void testBadConstructor() throws Exception
{
ClassFab cf = newClassFab("BadConstructor", Object.class);
try
{
cf.addConstructor(null, null, " woops!");
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(ex, "Unable to add constructor to class BadConstructor");
}
}
public void testCatchException() throws Exception
{
ClassFab cf = newClassFab("Fail", Object.class);
cf.addInterface(FailService.class);
MethodFab mf =
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(void.class, "fail", null, null),
"throw new java.lang.RuntimeException(\"Ouch!\");");
mf.addCatch(RuntimeException.class, "throw new java.io.IOException($e.getMessage());");
Class targetClass = cf.createClass();
FailService fs = (FailService) targetClass.newInstance();
try
{
fs.fail();
unreachable();
}
catch (IOException ex)
{
assertEquals("Ouch!", ex.getMessage());
}
}
public void testBadCatch() throws Exception
{
ClassFab cf = newClassFab("BadCatch", Object.class);
cf.addInterface(Runnable.class);
MethodFab mf =
cf.addMethod(
Modifier.PUBLIC,
new MethodSignature(void.class, "run", null, null),
"return;");
try
{
mf.addCatch(RuntimeException.class, "woops!");
unreachable();
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(
ex,
"Unable to add catch block for exception java.lang.RuntimeException to class BadCatch");
}
}
public void testInvalidField() throws Exception
{
ClassFab cf = newClassFab("InvalidField", Object.class);
cf.addField(".", String.class);
cf.addField("buffy", int.class);
cf.addField("", int.class);
try
{
cf.createClass();
unreachable();
}
catch (ApplicationRuntimeException ex)
{
assertExceptionSubstring(ex, "Unable to create class InvalidField");
}
// Javassist lets us down here; I can't think of a way to get addField() to actually
// fail.
}
}
1.3 +1 -1 jakarta-hivemind/framework/src/test/hivemind/test/TestContains.java
Index: TestContains.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/test/hivemind/test/TestContains.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestContains.java 19 Aug 2004 22:24:00 -0000 1.2
+++ TestContains.java 31 Aug 2004 20:02:14 -0000 1.3
@@ -1,4 +1,4 @@
-//Copyright 2004 The Apache Software Foundation
+// Copyright 2004 The Apache Software Foundation
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
1.4 +1 -1 jakarta-hivemind/library/src/java/org/apache/hivemind/lib/impl/ServicePropertyFactory.java
Index: ServicePropertyFactory.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/library/src/java/org/apache/hivemind/lib/impl/ServicePropertyFactory.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ServicePropertyFactory.java 18 Aug 2004 23:20:11 -0000 1.3
+++ ServicePropertyFactory.java 31 Aug 2004 20:02:14 -0000 1.4
@@ -92,7 +92,7 @@
{
return ConstructorUtils.invokeConstructor(proxyClass, new Object[] { targetService });
}
- catch (ApplicationRuntimeException ex)
+ catch (Throwable ex)
{
throw new ApplicationRuntimeException(ex.getMessage(), p.getLocation(), ex);
}
1.3 +28 -0 jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/TestServicePropertyFactory.java
Index: TestServicePropertyFactory.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/TestServicePropertyFactory.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestServicePropertyFactory.java 18 Aug 2004 19:34:12 -0000 1.2
+++ TestServicePropertyFactory.java 31 Aug 2004 20:02:14 -0000 1.3
@@ -181,4 +181,32 @@
verifyControls();
}
+
+ /**
+ * HIVEMIND-48: ServicePropertyFactory fails when the holding service
+ * and the property are in different modules. Class loader issue involving
+ * Javasssist.
+ */
+ public void testIntegratedTwoModules() throws Exception
+ {
+ Registry r = buildFrameworkRegistry("ServicePropertyFactoryMaster.xml");
+
+ WonkSource source = (WonkSource) r.getService(WonkSource.class);
+ Wonk wonkService = (Wonk) r.getService(Wonk.class);
+
+ Wonk wonk = (Wonk) newMock(Wonk.class);
+
+ source.setWonk(wonk);
+
+ wonk.wonkVoid();
+
+ replayControls();
+
+ // Invoking this (on the proxy) will cause the corresponding
+ // method (on the mock) to be invoked.
+
+ wonkService.wonkVoid();
+
+ verifyControls();
+ }
}
1.1 jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/wonk.xml
Index: wonk.xml
===================================================================
<?xml version="1.0"?>
<!--
Copyright 2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<module id="wonk" version="1.0.0">
<service-point id="WonkSource" interface="org.apache.hivemind.lib.impl.WonkSource">
<create-instance class="org.apache.hivemind.lib.impl.WonkHolder"/>
</service-point>
</module>
1.1 jakarta-hivemind/library/src/test/org/apache/hivemind/lib/impl/ServicePropertyFactoryMaster.xml
Index: ServicePropertyFactoryMaster.xml
===================================================================
<?xml version="1.0"?>
<!--
Copyright 2004 The Apache Software Foundation
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<module id="hivemind.lib.test" version="1.0.0">
<sub-module descriptor="wonk.xml"/>
<service-point id="Wonk" interface="org.apache.hivemind.lib.impl.Wonk">
<invoke-factory service-id="hivemind.lib.ServicePropertyFactory">
<construct service-id="wonk.WonkSource" property="wonk"/>
</invoke-factory>
</service-point>
</module>
---------------------------------------------------------------------
To unsubscribe, e-mail: hivemind-cvs-unsubscribe@jakarta.apache.org
For additional commands, e-mail: hivemind-cvs-help@jakarta.apache.org