hlship 2003/09/22 13:06:00
Modified: hivemind/framework/src/java/org/apache/commons/hivemind/impl
DefaultClassResolver.java
DeferredServiceExtensionPointImpl.java
RegistryBuilder.java ConfigurationImpl.java
ServiceInterceptorContributionImpl.java
ThreadedServiceExtensionPointImpl.java
hivemind/framework/src/test/hivemind/test/services
TestServices.java TestThreadedModel.java
hivemind/framework/src/test/hivemind/test/parse
TestDescriptorParser.java TestToString.java
hivemind/framework/src/java/org/apache/commons/hivemind/parse
ModuleDescriptor.java
hivemind/framework/src/test/hivemind/test TestMisc.java
hivemind/framework/src/test/hivemind/test/rules
TestClassTranslator.java
Added: hivemind/framework/src/java/org/apache/commons/hivemind/impl
ProxyBuilder.java
SingletonServiceExtensionPointImpl.java
AbstractServiceExtensionPoint.java
Removed: hivemind/framework/src/java/org/apache/commons/hivemind/impl
ServiceExtensionPointImpl.java
Log:
Refactor the three service point implementations.
Split out most code-generation logic into new class, ProxyBuilder.
Change the implementation of the deferred service model to use a pair of proxies (to
avoid the need for synchronization).
Remove some unused imports.
Revision Changes Path
1.2 +1 -2
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/DefaultClassResolver.java
Index: DefaultClassResolver.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/DefaultClassResolver.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DefaultClassResolver.java 16 Sep 2003 18:51:07 -0000 1.1
+++ DefaultClassResolver.java 22 Sep 2003 20:05:59 -0000 1.2
@@ -58,7 +58,6 @@
package org.apache.commons.hivemind.impl;
import java.net.URL;
-import java.util.Map;
import org.apache.commons.hivemind.ApplicationRuntimeException;
import org.apache.commons.hivemind.ClassResolver;
1.2 +91 -127
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/DeferredServiceExtensionPointImpl.java
Index: DeferredServiceExtensionPointImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/DeferredServiceExtensionPointImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DeferredServiceExtensionPointImpl.java 16 Sep 2003 18:51:07 -0000 1.1
+++ DeferredServiceExtensionPointImpl.java 22 Sep 2003 20:05:59 -0000 1.2
@@ -58,26 +58,21 @@
package org.apache.commons.hivemind.impl;
import java.lang.reflect.Constructor;
-import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.commons.hivemind.ApplicationRuntimeException;
-import org.apache.commons.hivemind.HiveMind;
-import org.apache.commons.hivemind.Registry;
import org.apache.commons.hivemind.service.BodyBuilder;
import org.apache.commons.hivemind.service.ClassFab;
-import org.apache.commons.hivemind.service.ClassFabUtils;
-import org.apache.commons.hivemind.service.ClassFactory;
/**
- * Subclass of [EMAIL PROTECTED]
org.apache.commons.hivemind.impl.ServiceExtensionPointImpl}
+ * Subclass of [EMAIL PROTECTED]
org.apache.commons.hivemind.impl.SingletonServiceExtensionPointImpl}
* which supports creation of a deferred service proxy (deferring the actual
* construction of the service until absolutely necessary).
*
* @author Howard Lewis Ship
* @version $Id$
*/
-public class DeferredServiceExtensionPointImpl extends ServiceExtensionPointImpl
+public class DeferredServiceExtensionPointImpl extends AbstractServiceExtensionPoint
{
/**
* Name of a method in the deferred proxy that is used to obtain
@@ -86,37 +81,25 @@
protected static final String SERVICE_ACCESSOR_METHOD_NAME = "_service";
private Object _serviceProxy;
+ private Object _constructedService;
- /**
- * Invokes [EMAIL PROTECTED]
ServiceExtensionPointImpl#constructServiceImplementation()}
- * and clears the deferred proxy. This method is, itself, invoked
- * by the deferred proxy.
- *
- */
- public Object constructServiceImplementation()
+ public synchronized Object getService()
{
- Object result = super.constructServiceImplementation();
+ if (_constructedService != null)
+ return _constructedService;
- // After succesfully constructing the service implementation,
- // we don't need the proxy any more.
-
- _serviceProxy = null;
-
- return result;
+ return getServiceProxy();
}
/**
- * Returns the constructed service if it exists; otherwise,
- * returns a deferred proxy for the service.
+ * This is invoked by the proxy to create the actual implementation.
*/
- protected synchronized Object getService()
+ public synchronized Object getServiceImplementation()
{
- Object result = super.getService();
-
- if (result == null)
- result = getServiceProxy();
+ if (_constructedService == null)
+ _constructedService = constructServiceImplementation();
- return result;
+ return _constructedService;
}
/**
@@ -127,7 +110,7 @@
protected Object getServiceProxy()
{
if (_serviceProxy == null)
- _serviceProxy = createServiceProxyClass();
+ _serviceProxy = createDeferredProxy();
return _serviceProxy;
}
@@ -135,7 +118,7 @@
/**
* Creates a proxy class for the service and then constructs the class itself.
*/
- private Object createServiceProxyClass()
+ private Object createDeferredProxy()
{
checkBuilding();
@@ -143,11 +126,28 @@
{
setBuilding(true);
+ // Create the outer proxy, the one visible to client code
(including
+ // other services). It is dependent on an inner proxy.
+
Class proxyClass = createDeferredProxyClass();
+
+ // Create the inner proxy, whose job is to replace itself
+ // when the first service method is invoked.
+
+ Class innerProxyClass = createInnerProxyClass(proxyClass);
+
+ // Create the outer proxy.
+
+ Object result = proxyClass.newInstance();
+
+ // The inner proxy's construct invokes a method on the
+ // outer proxy to connect the two.
+
+ Constructor c = innerProxyClass.getConstructor(new Class[] {
proxyClass, getClass()});
- Constructor c = proxyClass.getConstructor(new Class[] { getClass()});
+ c.newInstance(new Object[] { result, this });
- return c.newInstance(new Object[] { this });
+ return result;
}
catch (Exception ex)
{
@@ -168,123 +168,87 @@
*/
private Class createDeferredProxyClass()
{
- Registry registry = getModule().getRegistry();
+ ProxyBuilder builder = new ProxyBuilder("DeferredProxy", this);
- ClassFactory factory =
- (ClassFactory) registry.getService("hivemind.ClassFactory",
ClassFactory.class);
-
- String className = ClassFabUtils.generateClassName("Proxy");
-
- ClassFab classFab = factory.newClass(className, Object.class, getModule());
+ ClassFab classFab = builder.getClassFab();
Class serviceInterface = getServiceInterface();
+
+ // This will initally be the inner proxy, then switch over to the
+ // service implementation.
+
+ classFab.addField("_inner", serviceInterface);
- classFab.addInterface(serviceInterface);
-
- addConstructor(classFab);
-
- addServiceAccessor(classFab, serviceInterface);
+ classFab.addMethod(
+ Modifier.PUBLIC | Modifier.SYNCHRONIZED | Modifier.FINAL,
+ "_setInner",
+ Void.TYPE,
+ new Class[] { serviceInterface },
+ null,
+ "{ _inner = $1; }");
- addServiceMethods(classFab, serviceInterface);
+ builder.addServiceMethods("_inner");
return classFab.createClass();
}
- /**
- * Adds a field, _serviceExtensionPoint, whose type
- * matches this class, and a constructor which sets
- * the field.
- */
- protected void addConstructor(ClassFab classFab)
+ private Class createInnerProxyClass(Class deferredProxyClass)
{
+ Class serviceInterface = getServiceInterface();
+ ProxyBuilder builder = new ProxyBuilder("InnerProxy", this);
+
+ ClassFab classFab = builder.getClassFab();
+
+ classFab.addField("_deferredProxy", deferredProxyClass);
+ classFab.addField("_service", serviceInterface);
classFab.addField("_serviceExtensionPoint", getClass());
+ BodyBuilder body = new BodyBuilder();
+
+ // The constructor remembers the outer proxy and registers itself
+ // with the outer proxy.
+
+ body.begin();
+ body.addln("super();");
+ body.addln("_deferredProxy = $1;");
+ body.addln("_serviceExtensionPoint = $2;");
+ body.addln("_deferredProxy._setInner(this);");
+ body.end();
+
classFab.addConstructor(
- new Class[] { getClass()},
+ new Class[] { deferredProxyClass, getClass()},
null,
- "{ super(); _serviceExtensionPoint = $1; }");
- }
+ body.toString());
- /**
- * Defines a instance variable, _service, of the right type; the created
- * method (private, final, synchronized) lazily obtains a value for _service by
- * invoking [EMAIL PROTECTED] #constructServiceImplementation()}.
- */
- protected void addServiceAccessor(ClassFab classFab, Class serviceInterface)
- {
- classFab.addField("_service", serviceInterface);
+ // Method _service() will look up the service implementation,
+ // then update the deferred proxy to go directly to the
+ // service implementation, bypassing itself!
+
+ body.clear();
+ body.begin();
+ body.add("if (_service == null)");
+ body.begin();
+ body.add("_service = (");
+ body.add(serviceInterface.getName());
+ body.addln(") _serviceExtensionPoint.getServiceImplementation();");
- BodyBuilder builder = new BodyBuilder();
+ body.add("_deferredProxy._setInner(_service);");
+ body.end();
- builder.begin();
- builder.addln("if (_service == null)");
- builder.begin();
- builder.add("_service = (");
- builder.add(serviceInterface.getName());
- builder.addln(") _serviceExtensionPoint.constructServiceImplementation();");
- builder.end();
- builder.add("return _service;");
- builder.end();
+ body.add("return _service;");
+ body.end();
classFab.addMethod(
- Modifier.PRIVATE | Modifier.SYNCHRONIZED | Modifier.FINAL,
- SERVICE_ACCESSOR_METHOD_NAME,
+ Modifier.PRIVATE | Modifier.FINAL | Modifier.SYNCHRONIZED,
+ "_service",
serviceInterface,
null,
null,
- builder.toString());
- }
-
- /**
- * Adds service methods, and a <code>toString()</code> method as well.
- *
- */
- private void addServiceMethods(ClassFab classFab, Class serviceInterface)
- {
- boolean toString = false;
-
- Method[] methods = serviceInterface.getMethods();
-
- BodyBuilder builder = new BodyBuilder();
-
- for (int i = 0; i < methods.length; i++)
- {
- Method m = methods[i];
+ body.toString());
- String methodName = m.getName();
+ builder.addServiceMethods("_service()");
- builder.clear();
-
- builder.begin();
-
- builder.add("return ($r) ");
- builder.add(SERVICE_ACCESSOR_METHOD_NAME);
- builder.add("().");
- builder.add(methodName);
- builder.add("($$);");
-
- builder.end();
-
- classFab.addMethod(
- Modifier.PUBLIC | Modifier.FINAL,
- methodName,
- m.getReturnType(),
- m.getParameterTypes(),
- m.getExceptionTypes(),
- builder.toString());
-
- toString |= ClassFabUtils.isToString(m);
- }
-
- if (!toString)
- createToString(classFab, serviceInterface);
- }
-
- private void createToString(ClassFab classFab, Class serviceInterface)
- {
- ClassFabUtils.addToStringMethod(
- classFab,
- "<Proxy for " + getExtensionPointId() + "(" +
serviceInterface.getName() + ")>");
+ return classFab.createClass();
}
}
1.4 +17 -15
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/RegistryBuilder.java
Index: RegistryBuilder.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/RegistryBuilder.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- RegistryBuilder.java 18 Sep 2003 20:08:59 -0000 1.3
+++ RegistryBuilder.java 22 Sep 2003 20:05:59 -0000 1.4
@@ -75,8 +75,8 @@
import org.apache.commons.hivemind.Occurances;
import org.apache.commons.hivemind.Registry;
import org.apache.commons.hivemind.Resource;
-import org.apache.commons.hivemind.parse.ContributionDescriptor;
import org.apache.commons.hivemind.parse.ConfigurationPointDescriptor;
+import org.apache.commons.hivemind.parse.ContributionDescriptor;
import org.apache.commons.hivemind.parse.DescriptorParser;
import org.apache.commons.hivemind.parse.ImplementationDescriptor;
import org.apache.commons.hivemind.parse.InstanceBuilder;
@@ -132,7 +132,7 @@
private Map _modules = new HashMap();
/**
- * Map of [EMAIL PROTECTED] ServiceExtensionPointImpl} (or subclass) keyed on
fully qualified id.
+ * Map of [EMAIL PROTECTED] SingletonServiceExtensionPointImpl} (or subclass)
keyed on fully qualified id.
*/
private Map _servicePoints = new HashMap();
@@ -326,7 +326,7 @@
// whether the service is create-on-first-reference
// or create-on-first-use (deferred).
- ServiceExtensionPointImpl point = null;
+ AbstractServiceExtensionPoint point = null;
ServiceModel model = sd.getModel();
@@ -336,7 +336,7 @@
if (model == ServiceModel.THREADED)
point = new ThreadedServiceExtensionPointImpl();
else
- point = new ServiceExtensionPointImpl();
+ point = new SingletonServiceExtensionPointImpl();
point.setExtensionPointId(pointId);
point.setLocation(sd.getLocation());
@@ -388,7 +388,10 @@
}
}
- private void addContributionElements(Module sourceModule,
ConfigurationPointImpl point, List elements)
+ private void addContributionElements(
+ Module sourceModule,
+ ConfigurationPointImpl point,
+ List elements)
{
if (size(elements) == 0)
return;
@@ -589,7 +592,8 @@
if (LOG.isDebugEnabled())
LOG.debug("Adding " + builder + " to service extension point " +
pointId);
- ServiceExtensionPointImpl sep = (ServiceExtensionPointImpl)
_servicePoints.get(pointId);
+ AbstractServiceExtensionPoint sep =
+ (AbstractServiceExtensionPoint) _servicePoints.get(pointId);
if (sep == null)
{
@@ -616,15 +620,13 @@
sep.setServiceConstructor(builder.createConstructor(sep, sourceModule));
}
- private void addInterceptor(
- ModuleImpl sourceModule,
- String pointId,
- InterceptorDescriptor id)
+ private void addInterceptor(ModuleImpl sourceModule, String pointId,
InterceptorDescriptor id)
{
if (LOG.isDebugEnabled())
LOG.debug("Adding " + id + " to service extension point " + pointId);
- ServiceExtensionPointImpl sep = (ServiceExtensionPointImpl)
_servicePoints.get(pointId);
+ AbstractServiceExtensionPoint sep =
+ (AbstractServiceExtensionPoint) _servicePoints.get(pointId);
if (sep == null)
{
@@ -659,7 +661,7 @@
Iterator i = _servicePoints.values().iterator();
while (i.hasNext())
{
- ServiceExtensionPointImpl point = (ServiceExtensionPointImpl) i.next();
+ AbstractServiceExtensionPoint point = (AbstractServiceExtensionPoint)
i.next();
if (point.getServiceConstructor() != null)
continue;
@@ -747,9 +749,9 @@
{
ClassResolver resolver = new DefaultClassResolver();
RegistryBuilder builder = new RegistryBuilder();
-
+
builder.processModules(resolver);
-
+
return builder.constructRegistry(Locale.getDefault());
}
1.2 +1 -2
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ConfigurationImpl.java
Index: ConfigurationImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ConfigurationImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ConfigurationImpl.java 18 Sep 2003 19:00:58 -0000 1.1
+++ ConfigurationImpl.java 22 Sep 2003 20:05:59 -0000 1.2
@@ -61,7 +61,6 @@
import java.util.Collections;
import java.util.List;
-import org.apache.commons.hivemind.Element;
import org.apache.commons.hivemind.Configuration;
import org.apache.commons.hivemind.Module;
1.2 +1 -2
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ServiceInterceptorContributionImpl.java
Index: ServiceInterceptorContributionImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ServiceInterceptorContributionImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ServiceInterceptorContributionImpl.java 16 Sep 2003 18:51:07 -0000 1.1
+++ ServiceInterceptorContributionImpl.java 22 Sep 2003 20:06:00 -0000 1.2
@@ -64,7 +64,6 @@
import org.apache.commons.hivemind.Module;
import org.apache.commons.hivemind.Registry;
import org.apache.commons.hivemind.ServiceExtensionPoint;
-import org.apache.commons.hivemind.ServiceImplementationFactory;
import org.apache.commons.hivemind.ServiceInterceptorContribution;
import org.apache.commons.hivemind.ServiceInterceptorFactory;
import org.apache.commons.hivemind.schema.Schema;
1.2 +98 -8
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ThreadedServiceExtensionPointImpl.java
Index: ThreadedServiceExtensionPointImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ThreadedServiceExtensionPointImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- ThreadedServiceExtensionPointImpl.java 16 Sep 2003 18:51:07 -0000 1.1
+++ ThreadedServiceExtensionPointImpl.java 22 Sep 2003 20:06:00 -0000 1.2
@@ -57,10 +57,10 @@
package org.apache.commons.hivemind.impl;
+import java.lang.reflect.Constructor;
import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.List;
+import org.apache.commons.hivemind.ApplicationRuntimeException;
import org.apache.commons.hivemind.Registry;
import org.apache.commons.hivemind.service.BodyBuilder;
import org.apache.commons.hivemind.service.ClassFab;
@@ -78,15 +78,22 @@
* @author Howard Lewis Ship
* @version $Id$
*/
-public class ThreadedServiceExtensionPointImpl extends
DeferredServiceExtensionPointImpl
+public class ThreadedServiceExtensionPointImpl extends AbstractServiceExtensionPoint
{
+ /**
+ * Name of a method in the deferred proxy that is used to obtain
+ * the constructed service.
+ */
+ protected static final String SERVICE_ACCESSOR_METHOD_NAME = "_service";
+
+ private Object _constructedService;
+ private Object _serviceProxy;
private ThreadEventNotifier _notifier;
class CleanupListener implements ThreadCleanupListener
{
public void threadDidCleanup()
{
-
_notifier.removeThreadCleanupListener(this);
discardActiveService();
@@ -107,21 +114,100 @@
}
/**
+ * Returns the proxy, creating it if necessary.
+ *
+ */
+
+ protected Object getServiceProxy()
+ {
+ if (_serviceProxy == null)
+ _serviceProxy = createServiceProxy();
+
+ return _serviceProxy;
+ }
+
+ /**
+ * Creates a proxy class for the service and then constructs the class itself.
+ */
+ private Object createServiceProxy()
+ {
+ checkBuilding();
+
+ try
+ {
+ setBuilding(true);
+
+ Class proxyClass = createDeferredProxyClass();
+
+ Constructor c = proxyClass.getConstructor(new Class[] { getClass()});
+
+ return c.newInstance(new Object[] { this });
+ }
+ catch (Exception ex)
+ {
+ throw new ApplicationRuntimeException(ex);
+ }
+ finally
+ {
+ setBuilding(false);
+ }
+
+ }
+
+ /**
+ * Creates a class that implements the service interface. Implements
+ * a private synchronized method, _service(), that constructs the service
+ * as needed, and has each service interface method re-invoke on _service().
+ * Adds a toString() method if the service interface does not define toString().
+ */
+ private Class createDeferredProxyClass()
+ {
+ ProxyBuilder builder = new ProxyBuilder("ThreadedProxy", this);
+
+ ClassFab classFab = builder.getClassFab();
+
+ addConstructor(classFab);
+
+ addServiceAccessor(classFab);
+
+ builder.addServiceMethods(SERVICE_ACCESSOR_METHOD_NAME + "()");
+
+ return classFab.createClass();
+ }
+
+ /**
+ * Adds a field, _serviceExtensionPoint, whose type
+ * matches this class, and a constructor which sets
+ * the field.
+ */
+ protected void addConstructor(ClassFab classFab)
+ {
+ classFab.addField("_serviceExtensionPoint", getClass());
+
+ classFab.addConstructor(
+ new Class[] { getClass()},
+ null,
+ "{ super(); _serviceExtensionPoint = $1; }");
+ }
+
+ /**
* Here's the difference between a threaded service mode (this class) and a
merely
* deferred one. The [EMAIL PROTECTED] DeferredServiceExtensionPointImpl}
implementation
* gets the actual service implementation in the generated method. Here we
* construct a method that always goes through the service extension point's
* [EMAIL PROTECTED] #obtainServiceImplementation()}.
*/
- protected void addServiceAccessor(ClassFab classFab, Class serviceInterface)
+ protected void addServiceAccessor(ClassFab classFab)
{
+ Class serviceInterface = getServiceInterface();
+
classFab.addField(SERVICE_ACCESSOR_METHOD_NAME, serviceInterface);
BodyBuilder builder = new BodyBuilder();
builder.add("return (");
builder.add(serviceInterface.getName());
- builder.add(") _serviceExtensionPoint.obtainServiceImplementation();");
+ builder.add(") _serviceExtensionPoint.getServiceImplementation();");
classFab.addMethod(
Modifier.PRIVATE | Modifier.FINAL,
@@ -137,7 +223,7 @@
* the active service impl for this thread,
* constructing it as necessary.
*/
- public synchronized Object obtainServiceImplementation()
+ public synchronized Object getServiceImplementation()
{
if (_activeService == null)
_activeService = new ThreadLocal();
@@ -152,6 +238,10 @@
private Object constructServiceForCurrentThread()
{
+ // Note: don't call constructServiceImplementation since that discards the
+ // service instance constructor and interceptor contributions; we need
+ // to be able to build new instances of the service again and again.
+
Object result = constructNewServiceImplementation();
if (_notifier == null)
1.1
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/ProxyBuilder.java
Index: ProxyBuilder.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 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.impl;
import java.lang.reflect.Method;
import java.lang.reflect.Modifier;
import org.apache.commons.hivemind.Module;
import org.apache.commons.hivemind.Registry;
import org.apache.commons.hivemind.ServiceExtensionPoint;
import org.apache.commons.hivemind.service.BodyBuilder;
import org.apache.commons.hivemind.service.ClassFab;
import org.apache.commons.hivemind.service.ClassFabUtils;
import org.apache.commons.hivemind.service.ClassFactory;
/**
* Class used to assist service extension points in creating proxies.
*
* @author Howard Lewis Ship
* @version $Id: ProxyBuilder.java,v 1.1 2003/09/22 20:05:59 hlship Exp $
*/
public class ProxyBuilder
{
private ServiceExtensionPoint _point;
private Class _serviceInterface;
private ClassFab _classFab;
private String _type;
ProxyBuilder(String type, ServiceExtensionPoint point)
{
_point = point;
_type = type;
_serviceInterface = point.getServiceInterface();
Module module = point.getModule();
Registry registry = module.getRegistry();
ClassFactory factory =
(ClassFactory) registry.getService("hivemind.ClassFactory",
ClassFactory.class);
_classFab = factory.newClass(ClassFabUtils.generateClassName(type),
Object.class, module);
_classFab.addInterface(_serviceInterface);
}
public ClassFab getClassFab()
{
return _classFab;
}
/**
* Creates the service methods for the class.
* @parameter indirection the name of a variable, or a method invocation snippet,
* used to redirect the invocation on the proxy to the actual service
implementation.
*/
public void addServiceMethods(String indirection)
{
BodyBuilder builder = new BodyBuilder();
boolean toString = false;
Method[] methods = _serviceInterface.getMethods();
for (int i = 0; i < methods.length; i++)
{
Method m = methods[i];
String methodName = m.getName();
builder.clear();
builder.begin();
builder.add("return ($r) ");
builder.add(indirection);
builder.add(".");
builder.add(methodName);
builder.addln("($$);");
builder.end();
_classFab.addMethod(
Modifier.PUBLIC,
methodName,
m.getReturnType(),
m.getParameterTypes(),
m.getExceptionTypes(),
builder.toString());
toString |= ClassFabUtils.isToString(m);
}
if (!toString)
ClassFabUtils.addToStringMethod(
_classFab,
"<"
+ _type
+ " for "
+ _point.getExtensionPointId()
+ "("
+ _serviceInterface.getName()
+ ")>");
}
}
1.1
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/SingletonServiceExtensionPointImpl.java
Index: SingletonServiceExtensionPointImpl.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 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.impl;
/**
* Implementation of [EMAIL PROTECTED]
org.apache.commons.hivemind.ServiceExtensionPoint}.
*
* @author Howard Lewis Ship
* @version $Id: SingletonServiceExtensionPointImpl.java,v 1.1 2003/09/22 20:05:59
hlship Exp $
*/
public class SingletonServiceExtensionPointImpl extends AbstractServiceExtensionPoint
{
private Object _constructedService;
/**
* Constructs the service (the first time this is invoked)
* and returns it.
*/
protected synchronized Object getService()
{
if (_constructedService == null)
_constructedService = constructServiceImplementation();
return _constructedService;
}
}
1.1
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/impl/AbstractServiceExtensionPoint.java
Index: AbstractServiceExtensionPoint.java
===================================================================
/*
* ====================================================================
*
* The Apache Software License, Version 1.1
*
* Copyright (c) 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.impl;
import java.util.ArrayList;
import java.util.List;
import org.apache.commons.hivemind.ApplicationRuntimeException;
import org.apache.commons.hivemind.ClassResolver;
import org.apache.commons.hivemind.HiveMind;
import org.apache.commons.hivemind.Initializable;
import org.apache.commons.hivemind.ServiceExtensionPoint;
import org.apache.commons.hivemind.ServiceImplementationConstructor;
import org.apache.commons.hivemind.ServiceInterceptorContribution;
import org.apache.commons.hivemind.schema.Schema;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
/**
* Abstract implementation of [EMAIL PROTECTED]
org.apache.commons.hivemind.ServiceExtensionPoint}
* that provides most of the machinery for creating new services ... subclasses
* implement different service models; the service models determine when the
* service is actually constructed.
*
* @author Howard Lewis Ship
* @version $Id: AbstractServiceExtensionPoint.java,v 1.1 2003/09/22 20:06:00 hlship
Exp $
*/
public abstract class AbstractServiceExtensionPoint
extends AbstractExtensionPoint
implements ServiceExtensionPoint
{
private static final Log LOG =
LogFactory.getLog(AbstractServiceExtensionPoint.class);
private String _serviceInterfaceName;
private boolean _building;
private Class _serviceInterface;
private ServiceImplementationConstructor _serviceConstructor;
private List _interceptorContributions;
private boolean _interceptorsSorted;
private Schema _parametersSchema;
protected void extendDescription(ToStringBuilder builder)
{
builder.append("serviceInterfaceName", _serviceInterfaceName);
builder.append("factoryContribution", _serviceConstructor);
builder.append("interceptorContributions", _interceptorContributions);
builder.append("parametersSchema", _parametersSchema);
}
public void addInterceptorContribution(ServiceInterceptorContribution
contribution)
{
if (_interceptorContributions == null)
_interceptorContributions = new ArrayList();
_interceptorContributions.add(contribution);
}
public String getServiceInterfaceName()
{
return _serviceInterfaceName;
}
public synchronized Class getServiceInterface()
{
if (_serviceInterface == null)
_serviceInterface = lookupServiceInterface();
return _serviceInterface;
}
private Class lookupServiceInterface()
{
ClassResolver resolver = getModule().getClassResolver();
Class result = null;
try
{
result = resolver.findClass(_serviceInterfaceName);
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.bad-interface",
_serviceInterfaceName,
getExtensionPointId()),
getLocation(),
ex);
}
if (!result.isInterface())
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.interface-required",
_serviceInterfaceName,
getExtensionPointId()),
getLocation(),
null);
return result;
}
public void setServiceConstructor(ServiceImplementationConstructor contribution)
{
_serviceConstructor = contribution;
}
public void setServiceInterfaceName(String string)
{
_serviceInterfaceName = string;
}
public void setParametersSchema(Schema schema)
{
_parametersSchema = schema;
}
public void setInterceptorContributions(List interceptorContributions)
{
_interceptorContributions = interceptorContributions;
}
protected Object addInterceptors(Object core)
{
if (_interceptorContributions == null || _interceptorContributions.size() ==
0)
return core;
if (!_interceptorsSorted)
{
_interceptorContributions =
HiveMind.sortOrderables(_interceptorContributions);
_interceptorsSorted = true;
}
int count = _interceptorContributions.size();
InterceptorStackImpl stack = new InterceptorStackImpl(this, core);
for (int i = 0; i < count; i++)
{
ServiceInterceptorContribution ic =
(ServiceInterceptorContribution) _interceptorContributions.get(i);
stack.process(ic);
}
// Whatever's on top is the final service.
return stack.peek();
}
protected void setBuilding(boolean building)
{
_building = building;
}
public Schema getParametersSchema()
{
return _parametersSchema;
}
public ServiceImplementationConstructor getServiceConstructor()
{
return _serviceConstructor;
}
/**
* Checks the [EMAIL PROTECTED] #isBuilding() building flag}, throwing an
exception
* if true; this is used to detect unresolvable build cycles (which are
* now very rare, since most services use deferred service model).
*/
protected void checkBuilding()
{
if (_building)
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.recursive-service-build",
getExtensionPointId()));
}
/**
* Constructs the core service implementation (by invoking the
* [EMAIL PROTECTED] ServiceImplementationConstructor}), and checks
* that the result is non-null and assignable
* to the service interface.
*/
protected Object constructCoreServiceImplementation()
{
Class serviceType = getServiceInterface();
ServiceImplementationConstructor constructor = getServiceConstructor();
Object result = constructor.constructCoreServiceImplementation();
if (result == null)
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.factory-returned-null",
getExtensionPointId()),
constructor.getLocation(),
null);
if (!serviceType.isAssignableFrom(result.getClass()))
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.factory-wrong-interface",
getExtensionPointId(),
result,
serviceType.getName()),
constructor.getLocation(),
null);
return result;
}
/**
* Invoked after the service has been constructed to utilize
* the [EMAIL PROTECTED] Initializable} call back interface, if the
* core implementation implements it.
*/
protected void initializeCoreServiceImplementation(Object core, Object
intercepted)
{
if (core instanceof Initializable)
{
Initializable initializeCore = (Initializable) core;
initializeCore.initializeService(intercepted);
}
}
/**
* Constructs the service implementation; this is invoked
* from [EMAIL PROTECTED] #getService(Class)} and from the generated
* deferrable proxy. Primarily, invokes
* [EMAIL PROTECTED] #constructNewServiceImplementation()} from
* within a block that checks for recursive builds.
*/
protected Object constructServiceImplementation()
{
checkBuilding();
Object result = null;
try
{
setBuilding(true);
result = constructNewServiceImplementation();
// After succesfully building, we don't need
// some of the definition stuff again.
setServiceConstructor(null);
setInterceptorContributions(null);
}
finally
{
setBuilding(false);
}
return result;
}
/**
* Constructs a new implementation of the service, starting with
* a core implementation, then adding any interceptors.
*/
protected Object constructNewServiceImplementation()
{
try
{
if (LOG.isDebugEnabled())
LOG.debug("Constructing core instance for service " +
getExtensionPointId());
Object core = constructCoreServiceImplementation();
Object intercepted = addInterceptors(core);
initializeCoreServiceImplementation(core, intercepted);
return intercepted;
}
catch (Exception ex)
{
throw new ApplicationRuntimeException(
HiveMind.format(
"ServiceExtensionPoint.unable-to-construct-service",
getExtensionPointId(),
ex.getMessage()),
ex);
}
}
/**
* Invoked by [EMAIL PROTECTED] #getService(Class)} to get a service
implementation or proxy.
* Implemented in subclasses to return either the actual service, or some form of
* service proxy, depending on the servce model and the state of the extension
point.
*
*/
protected abstract Object getService();
public Object getService(Class serviceInterface)
{
Object result = getService();
if (!serviceInterface.isAssignableFrom(result.getClass()))
{
throw new ApplicationRuntimeException(
HiveMind.format(
"BaseModule.service-wrong-interface",
getExtensionPointId(),
serviceInterface.getName(),
getServiceInterfaceName()),
getLocation(),
null);
}
return result;
}
}
1.4 +2 -2
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/services/TestServices.java
Index: TestServices.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/services/TestServices.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestServices.java 19 Sep 2003 22:10:58 -0000 1.3
+++ TestServices.java 22 Sep 2003 20:06:00 -0000 1.4
@@ -121,7 +121,7 @@
CountFactory.reset();
assertEquals(
- "<Proxy for
hivemind.test.services.Simple(hivemind.test.services.SimpleService)>",
+ "<DeferredProxy for
hivemind.test.services.Simple(hivemind.test.services.SimpleService)>",
s.toString());
assertEquals(7, s.add(4, 3));
1.3 +1 -3
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/services/TestThreadedModel.java
Index: TestThreadedModel.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/services/TestThreadedModel.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- TestThreadedModel.java 19 Sep 2003 18:25:19 -0000 1.2
+++ TestThreadedModel.java 22 Sep 2003 20:06:00 -0000 1.3
@@ -57,8 +57,6 @@
package hivemind.test.services;
-import java.util.List;
-
import hivemind.test.FrameworkTestCase;
import org.apache.commons.hivemind.Registry;
@@ -116,7 +114,7 @@
assertNull(h.getValue());
assertEquals(
- "<Proxy for
hivemind.test.services.StringHolder(hivemind.test.services.StringHolder)>",
+ "<ThreadedProxy for
hivemind.test.services.StringHolder(hivemind.test.services.StringHolder)>",
h.toString());
assertLoggedMessages(
1.4 +2 -3
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/parse/TestDescriptorParser.java
Index: TestDescriptorParser.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/parse/TestDescriptorParser.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestDescriptorParser.java 19 Sep 2003 18:25:20 -0000 1.3
+++ TestDescriptorParser.java 22 Sep 2003 20:06:00 -0000 1.4
@@ -69,10 +69,9 @@
import org.apache.commons.hivemind.Attribute;
import org.apache.commons.hivemind.Element;
import org.apache.commons.hivemind.Occurances;
-import org.apache.commons.hivemind.parse.ContributionDescriptor;
import org.apache.commons.hivemind.parse.ConfigurationPointDescriptor;
+import org.apache.commons.hivemind.parse.ContributionDescriptor;
import org.apache.commons.hivemind.parse.CreateInstanceDescriptor;
-import org.apache.commons.hivemind.parse.DescriptorParser;
import org.apache.commons.hivemind.parse.ImplementationDescriptor;
import org.apache.commons.hivemind.parse.InterceptorDescriptor;
import org.apache.commons.hivemind.parse.ModuleDescriptor;
1.4 +8 -9
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/parse/TestToString.java
Index: TestToString.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/parse/TestToString.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestToString.java 19 Sep 2003 18:25:20 -0000 1.3
+++ TestToString.java 22 Sep 2003 20:06:00 -0000 1.4
@@ -61,23 +61,22 @@
import java.util.Locale;
-import org.apache.commons.hivemind.ConfigurationPoint;
import org.apache.commons.hivemind.Location;
import org.apache.commons.hivemind.Module;
import org.apache.commons.hivemind.ServiceExtensionPoint;
import org.apache.commons.hivemind.impl.AttributeImpl;
-import org.apache.commons.hivemind.impl.InterceptorStackImpl;
-import org.apache.commons.hivemind.impl.ModuleImpl;
-import org.apache.commons.hivemind.impl.ElementImpl;
import org.apache.commons.hivemind.impl.ConfigurationImpl;
import org.apache.commons.hivemind.impl.ConfigurationPointImpl;
+import org.apache.commons.hivemind.impl.ElementImpl;
+import org.apache.commons.hivemind.impl.InterceptorStackImpl;
+import org.apache.commons.hivemind.impl.ModuleImpl;
import org.apache.commons.hivemind.impl.RegistryImpl;
-import org.apache.commons.hivemind.impl.ServiceExtensionPointImpl;
import org.apache.commons.hivemind.impl.ServiceInterceptorContributionImpl;
+import org.apache.commons.hivemind.impl.SingletonServiceExtensionPointImpl;
+import org.apache.commons.hivemind.parse.ConfigurationPointDescriptor;
+import org.apache.commons.hivemind.parse.ContributionDescriptor;
import org.apache.commons.hivemind.parse.CreateInstanceDescriptor;
import org.apache.commons.hivemind.parse.ImplementationDescriptor;
-import org.apache.commons.hivemind.parse.ContributionDescriptor;
-import org.apache.commons.hivemind.parse.ConfigurationPointDescriptor;
import org.apache.commons.hivemind.parse.InterceptorDescriptor;
import org.apache.commons.hivemind.parse.InvokeFactoryDescriptor;
import org.apache.commons.hivemind.parse.ModuleDescriptor;
@@ -150,7 +149,7 @@
new ElementImpl().toString();
new AttributeImpl("foo", "bar").toString();
new ServiceInterceptorContributionImpl().toString();
- new ServiceExtensionPointImpl().toString();
+ new SingletonServiceExtensionPointImpl().toString();
new InterceptorStackImpl(new MockServiceExtensionPoint(), null).toString();
}
}
1.3 +1 -3
jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/parse/ModuleDescriptor.java
Index: ModuleDescriptor.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/java/org/apache/commons/hivemind/parse/ModuleDescriptor.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ModuleDescriptor.java 18 Sep 2003 19:01:00 -0000 1.2
+++ ModuleDescriptor.java 22 Sep 2003 20:06:00 -0000 1.3
@@ -58,10 +58,8 @@
package org.apache.commons.hivemind.parse;
import java.util.ArrayList;
-import java.util.HashMap;
import java.util.List;
-import org.apache.commons.hivemind.HiveMind;
import org.apache.commons.hivemind.impl.BaseLocatable;
import org.apache.commons.lang.builder.ToStringBuilder;
1.5 +3 -3
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/TestMisc.java
Index: TestMisc.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/TestMisc.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- TestMisc.java 19 Sep 2003 22:10:59 -0000 1.4
+++ TestMisc.java 22 Sep 2003 20:06:00 -0000 1.5
@@ -73,7 +73,7 @@
import org.apache.commons.hivemind.impl.CreateClassServiceConstructor;
import org.apache.commons.hivemind.impl.InvokeFactoryServiceConstructor;
import org.apache.commons.hivemind.impl.ModuleImpl;
-import org.apache.commons.hivemind.impl.ServiceExtensionPointImpl;
+import org.apache.commons.hivemind.impl.SingletonServiceExtensionPointImpl;
import org.apache.commons.hivemind.impl.SystemPropertiesSymbolSource;
/**
@@ -172,7 +172,7 @@
public void testInvokeFactoryServiceConstructorAccessors()
{
Module m = new ModuleImpl();
- ServiceExtensionPoint sep = new ServiceExtensionPointImpl();
+ ServiceExtensionPoint sep = new SingletonServiceExtensionPointImpl();
List p = new ArrayList();
InvokeFactoryServiceConstructor c = new InvokeFactoryServiceConstructor();
1.4 +1 -2
jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/rules/TestClassTranslator.java
Index: TestClassTranslator.java
===================================================================
RCS file:
/home/cvs/jakarta-commons-sandbox/hivemind/framework/src/test/hivemind/test/rules/TestClassTranslator.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- TestClassTranslator.java 19 Sep 2003 18:25:19 -0000 1.3
+++ TestClassTranslator.java 22 Sep 2003 20:06:00 -0000 1.4
@@ -68,7 +68,6 @@
import org.apache.commons.hivemind.impl.LocationImpl;
import org.apache.commons.hivemind.schema.SchemaProcessor;
import org.apache.commons.hivemind.schema.rules.ClassTranslator;
-import org.apache.commons.hivemind.schema.rules.RuleUtils;
/**
* Fill in some gaps in
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]