hlship 2004/10/31 06:44:25
Modified: framework/src/java/org/apache/hivemind/util
PropertyUtils.java
framework/src/java/org/apache/hivemind/service/impl
EventLinkerImpl.java BuilderFactoryLogic.java
framework/src/java/org/apache/hivemind HiveMind.java
. status.xml
framework/src/java/org/apache/hivemind/impl
RegistryInfrastructureImpl.java
hivebuild forrestdoc.xml
Log:
HIVEMIND-68: Properly report the actual method name when invoking a service
initializer method.
Revision Changes Path
1.9 +49 -35
jakarta-hivemind/framework/src/java/org/apache/hivemind/util/PropertyUtils.java
Index: PropertyUtils.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/util/PropertyUtils.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- PropertyUtils.java 13 Sep 2004 14:48:16 -0000 1.8
+++ PropertyUtils.java 31 Oct 2004 14:44:25 -0000 1.9
@@ -13,6 +13,7 @@
// limitations under the License.
package org.apache.hivemind.util;
+
import java.beans.BeanInfo;
import java.beans.Introspector;
import java.util.HashMap;
@@ -20,10 +21,11 @@
import java.util.Map;
import org.apache.hivemind.ApplicationRuntimeException;
+import org.apache.hivemind.HiveMind;
/**
* A collection of static methods used to perform property-level access on
arbitrary objects.
- *
+ *
* @author Howard Lewis Ship
*/
public class PropertyUtils
@@ -38,9 +40,12 @@
/**
* Updates the property of the target object.
*
- * @param target the object to update
- * @param propertyName the name of the property to be updated
- * @param value the value to be stored into the target object property
+ * @param target
+ * the object to update
+ * @param propertyName
+ * the name of the property to be updated
+ * @param value
+ * the value to be stored into the target object property
*/
public static void write(Object target, String propertyName, Object
value)
{
@@ -52,8 +57,10 @@
/**
* Returns true of the instance contains a writable property of the
given type.
*
- * @param target the object to inspect
- * @param propertyName the name of the property to check
+ * @param target
+ * the object to inspect
+ * @param propertyName
+ * the name of the property to check
*/
public static boolean isWritable(Object target, String propertyName)
@@ -69,8 +76,10 @@
/**
* Updates the property of the target object.
*
- * @param target the object to update
- * @param propertyName the name of a property toread
+ * @param target
+ * the object to update
+ * @param propertyName
+ * the name of a property toread
*/
public static Object read(Object target, String propertyName)
@@ -83,8 +92,10 @@
/**
* Returns the type of the named property.
*
- * @param target the object to examine
- * @param propertyName the name of the property to check
+ * @param target
+ * the object to examine
+ * @param propertyName
+ * the name of the property to check
*/
public static Class getPropertyType(Object target, String propertyName)
{
@@ -94,9 +105,10 @@
}
/**
- * Returns the [EMAIL PROTECTED] PropertyAdaptor} for the given target
object and property name.
+ * Returns the [EMAIL PROTECTED] PropertyAdaptor}for the given target
object and property name.
*
- * @throws ApplicationRuntimeException if the property does not exist.
+ * @throws ApplicationRuntimeException
+ * if the property does not exist.
*/
public static PropertyAdaptor getPropertyAdaptor(Object target, String
propertyName)
{
@@ -106,8 +118,7 @@
}
/**
- * Returns an unordered List of the names of all readable properties
- * of the target.
+ * Returns an unordered List of the names of all readable properties of
the target.
*/
public static List getReadableProperties(Object target)
{
@@ -115,30 +126,32 @@
}
/**
- * Returns an unordered List of the names of all writable properties
- * of the target.
+ * Returns an unordered List of the names of all writable properties of
the target.
*/
public static List getWriteableProperties(Object target)
{
return getAdaptor(target).getWriteableProperties();
}
- private static synchronized ClassAdaptor getAdaptor(Object target)
+ private static ClassAdaptor getAdaptor(Object target)
{
if (target == null)
throw new ApplicationRuntimeException(UtilMessages.nullObject());
Class targetClass = target.getClass();
- ClassAdaptor result = (ClassAdaptor) _classAdaptors.get(targetClass);
-
- if (result == null)
+ synchronized (HiveMind.INTROSPECTOR_MUTEX)
{
- result = buildClassAdaptor(target, targetClass);
- _classAdaptors.put(targetClass, result);
- }
+ ClassAdaptor result = (ClassAdaptor)
_classAdaptors.get(targetClass);
- return result;
+ if (result == null)
+ {
+ result = buildClassAdaptor(target, targetClass);
+ _classAdaptors.put(targetClass, result);
+ }
+
+ return result;
+ }
}
private static ClassAdaptor buildClassAdaptor(Object target, Class
targetClass)
@@ -151,20 +164,21 @@
}
catch (Exception ex)
{
- throw new ApplicationRuntimeException(
- UtilMessages.unableToIntrospect(targetClass, ex),
- target,
- null,
- ex);
+ throw new
ApplicationRuntimeException(UtilMessages.unableToIntrospect(targetClass, ex),
+ target, null, ex);
}
}
- /**
- * Clears all cached information.
- */
- public static synchronized void clearCache()
+ /**
+ * Clears all cached information. Invokes [EMAIL PROTECTED]
Introspector#flushCaches()}.
+ */
+ public static void clearCache()
{
- _classAdaptors.clear();
+ synchronized (HiveMind.INTROSPECTOR_MUTEX)
+ {
+ _classAdaptors.clear();
+ Introspector.flushCaches();
+ }
}
-}
+}
\ No newline at end of file
1.7 +44 -49
jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/EventLinkerImpl.java
Index: EventLinkerImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/EventLinkerImpl.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- EventLinkerImpl.java 29 Jul 2004 13:18:52 -0000 1.6
+++ EventLinkerImpl.java 31 Oct 2004 14:44:25 -0000 1.7
@@ -30,15 +30,16 @@
import org.apache.hivemind.service.EventLinker;
/**
- * Implementation of [EMAIL PROTECTED]
org.apache.hivemind.service.EventLinker}. Will output warnings
- * whenever a consumer can't be registered for at least one event set (which
can happen
- * when the consumer does not implement the necessary interfaces).
- *
+ * Implementation of [EMAIL PROTECTED]
org.apache.hivemind.service.EventLinker}. Will output warnings whenever
+ * a consumer can't be registered for at least one event set (which can
happen when the consumer
+ * does not implement the necessary interfaces).
+ *
* @author Howard Lewis Ship
*/
public class EventLinkerImpl extends BaseLocatable implements EventLinker
{
private Log _log;
+
private ErrorHandler _errorHandler;
/**
@@ -52,11 +53,8 @@
_errorHandler = errorHandler;
}
- public void addEventListener(
- Object producer,
- String eventSetName,
- Object consumer,
- Location location)
+ public void addEventListener(Object producer, String eventSetName,
Object consumer,
+ Location location)
{
EventSetDescriptor[] sets = getEventSets(producer);
boolean nameMatch = HiveMind.isNonBlank(eventSetName);
@@ -77,11 +75,10 @@
addEventListener(producer, set, consumer, location);
else
{
- _errorHandler.error(
- _log,
- ServiceMessages.notCompatibleWithEvent(consumer,
set, producer),
- location,
- null);
+ _errorHandler.error(_log,
ServiceMessages.notCompatibleWithEvent(
+ consumer,
+ set,
+ producer), location, null);
}
return;
@@ -100,16 +97,16 @@
{
if (nameMatch)
_errorHandler.error(
- _log,
- ServiceMessages.noSuchEventSet(producer, eventSetName),
- location,
- null);
+ _log,
+ ServiceMessages.noSuchEventSet(producer,
eventSetName),
+ location,
+ null);
else
_errorHandler.error(
- _log,
- ServiceMessages.noEventMatches(consumer, producer),
- location,
- null);
+ _log,
+ ServiceMessages.noEventMatches(consumer, producer),
+ location,
+ null);
}
}
@@ -118,25 +115,24 @@
return set.getListenerType().isAssignableFrom(consumerClass);
}
- private void addEventListener(
- Object producer,
- EventSetDescriptor set,
- Object consumer,
- Location location)
+ private void addEventListener(Object producer, EventSetDescriptor set,
Object consumer,
+ Location location)
{
Method m = set.getAddListenerMethod();
try
{
- m.invoke(producer, new Object[] { consumer });
+ m.invoke(producer, new Object[]
+ { consumer });
}
catch (Exception ex)
{
- _errorHandler.error(
- _log,
- ServiceMessages.unableToAddListener(producer, set, consumer,
location, ex),
- location,
- ex);
+ _errorHandler.error(_log, ServiceMessages.unableToAddListener(
+ producer,
+ set,
+ consumer,
+ location,
+ ex), location, ex);
}
}
@@ -167,26 +163,25 @@
private EventSetDescriptor[] findEventSets(Class producerClass)
{
- try
+ synchronized (HiveMind.INTROSPECTOR_MUTEX)
{
- BeanInfo beanInfo = Introspector.getBeanInfo(producerClass);
+ try
+ {
+ BeanInfo beanInfo = Introspector.getBeanInfo(producerClass);
- // Will return an empty array (not null) when the class contains
- // no event sets.
+ // Will return an empty array (not null) when the class
contains
+ // no event sets.
- return beanInfo.getEventSetDescriptors();
- }
- catch (IntrospectionException ex)
- {
- _errorHandler.error(
- _log,
- ServiceMessages.unableToIntrospectClass(producerClass, ex),
- null,
- ex);
+ return beanInfo.getEventSetDescriptors();
+ }
+ catch (IntrospectionException ex)
+ {
+ _errorHandler.error(_log, ServiceMessages
+ .unableToIntrospectClass(producerClass, ex), null,
ex);
- return new EventSetDescriptor[0];
+ return new EventSetDescriptor[0];
+ }
}
-
}
-}
+}
\ No newline at end of file
1.5 +1 -1
jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/BuilderFactoryLogic.java
Index: BuilderFactoryLogic.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl/BuilderFactoryLogic.java,v
retrieving revision 1.4
retrieving revision 1.5
diff -u -r1.4 -r1.5
--- BuilderFactoryLogic.java 19 Jul 2004 14:07:36 -0000 1.4
+++ BuilderFactoryLogic.java 31 Oct 2004 14:44:25 -0000 1.5
@@ -142,7 +142,7 @@
_log,
ServiceMessages.unableToInitializeService(
_serviceId,
- methodName,
+ searchMethodName,
service.getClass(),
ex),
_parameter.getLocation(),
1.13 +28 -24
jakarta-hivemind/framework/src/java/org/apache/hivemind/HiveMind.java
Index: HiveMind.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/HiveMind.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- HiveMind.java 18 Aug 2004 23:20:11 -0000 1.12
+++ HiveMind.java 31 Oct 2004 14:44:25 -0000 1.13
@@ -18,17 +18,25 @@
/**
* Static utility class for HiveMind.
- *
+ *
* @author Howard Lewis Ship
*/
public final class HiveMind
{
/**
- * The full id of the [EMAIL PROTECTED]
org.apache.hivemind.service.ThreadEventNotifier}
- * service.
+ * The full id of the [EMAIL PROTECTED]
org.apache.hivemind.service.ThreadEventNotifier}service.
*/
public static final String THREAD_EVENT_NOTIFIER_SERVICE =
"hivemind.ThreadEventNotifier";
+ /**
+ * An object used to synchronize access to [EMAIL PROTECTED]
java.beans.Introspector}(which is not fully
+ * threadsafe).
+ *
+ * @since 3.1
+ */
+
+ public static final Object INTROSPECTOR_MUTEX = new Object();
+
private HiveMind()
{
// Prevent instantiation
@@ -40,10 +48,8 @@
}
/**
- * Selects the first [EMAIL PROTECTED] Location} in an array of objects.
- * Skips over nulls. The objects may be instances of
- * Location or [EMAIL PROTECTED] Locatable}. May return null
- * if no Location can be found.
+ * Selects the first [EMAIL PROTECTED] Location}in an array of objects.
Skips over nulls. The objects may
+ * be instances of Location or [EMAIL PROTECTED] Locatable}. May return
null if no Location can be found.
*/
public static Location findLocation(Object[] locations)
@@ -63,8 +69,8 @@
}
/**
- * Extracts a location from an object, checking to see if it
- * implement [EMAIL PROTECTED] Location} or [EMAIL PROTECTED] Locatable}.
+ * Extracts a location from an object, checking to see if it implement
[EMAIL PROTECTED] Location}or
+ * [EMAIL PROTECTED] Locatable}.
*
* @returns the Location, or null if it can't be found
*/
@@ -87,9 +93,8 @@
}
/**
- * Invokes [EMAIL PROTECTED] #getLocation(Object)}, then translate the
result
- * to a string value, or "unknown location" if null.
- *
+ * Invokes [EMAIL PROTECTED] #getLocation(Object)}, then translate the
result to a string value, or
+ * "unknown location" if null.
*/
public static String getLocationString(Object object)
{
@@ -103,10 +108,9 @@
/**
* Returns true if the string is null, empty, or contains only
whitespace.
- *
* <p>
- * The commons-lang library provides a version of this, but the naming
and behavior
- * changed between 1.0 and 2.0, which causes some dependency issues.
+ * The commons-lang library provides a version of this, but the naming
and behavior changed
+ * between 1.0 and 2.0, which causes some dependency issues.
*/
public static boolean isBlank(String string)
{
@@ -128,11 +132,12 @@
}
/**
- * Updates the location of an object, if the object implements
- * [EMAIL PROTECTED] LocationHolder}.
+ * Updates the location of an object, if the object implements [EMAIL
PROTECTED] LocationHolder}.
*
- * @param holder the object to be updated
- * @param location the location to assign to the holder object
+ * @param holder
+ * the object to be updated
+ * @param location
+ * the location to assign to the holder object
*/
public static void setLocation(Object holder, Location location)
{
@@ -145,15 +150,14 @@
}
/**
- * Checks if the value (a constructor or method parameter) is null,
- * and throws an InvalidArgumentException if so.
+ * Checks if the value (a constructor or method parameter) is null, and
throws an
+ * InvalidArgumentException if so.
*/
public static void checkNullParameter(String parameterName, Object value)
{
if (value == null)
- throw new IllegalArgumentException(
- HiveMindMessages.nullParameterInvalid(parameterName));
+ throw new
IllegalArgumentException(HiveMindMessages.nullParameterInvalid(parameterName));
}
/**
@@ -163,4 +167,4 @@
{
return c == null || c.isEmpty();
}
-}
+}
\ No newline at end of file
1.70 +9 -0 jakarta-hivemind/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/status.xml,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -r1.69 -r1.70
--- status.xml 27 Oct 2004 15:16:55 -0000 1.69
+++ status.xml 31 Oct 2004 14:44:25 -0000 1.70
@@ -59,6 +59,15 @@
<action type="fix" dev="HLS" fixes-bug="HIVEMIND-56" due-to="Bruce
Synder">
CVS connection string on website is incorrect
</action>
+ <action type="update" dev="HLS">
+ Synchronize all access to java.beans.Introspector through a common
mutex.
+ </action>
+ <action type="update" dev="HLS">
+ Clear the PropertyUtils and Introspector caches when the Registry is
shutdown.
+ </action>
+ <action type="fix" dev="HLS" fixes-bug="HIVEMIND-68">
+ Properly report the actual method name when invoking a service
initializer method.
+ </action>
</release>
<release version="1.0" date="Sep 22 2004">
1.2 +6 -0
jakarta-hivemind/framework/src/java/org/apache/hivemind/impl/RegistryInfrastructureImpl.java
Index: RegistryInfrastructureImpl.java
===================================================================
RCS file:
/home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/impl/RegistryInfrastructureImpl.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- RegistryInfrastructureImpl.java 25 Sep 2004 17:08:34 -0000 1.1
+++ RegistryInfrastructureImpl.java 31 Oct 2004 14:44:25 -0000 1.2
@@ -41,6 +41,7 @@
import org.apache.hivemind.order.Orderer;
import org.apache.hivemind.schema.Translator;
import org.apache.hivemind.service.ThreadEventNotifier;
+import org.apache.hivemind.util.PropertyUtils;
import org.apache.hivemind.util.ToStringBuilder;
/**
@@ -318,6 +319,11 @@
_variableSources = null;
_serviceModelFactories = null;
_threadEventNotifier = null;
+
+ // It is believed that the cache held by PropertyUtils can affect
application shutdown
+ // and reload in some servlet containers (such as Tomcat); this
should clear that up.
+
+ PropertyUtils.clearCache();
}
private synchronized void checkShutdown()
1.4 +2 -2 jakarta-hivemind/hivebuild/forrestdoc.xml
Index: forrestdoc.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/hivebuild/forrestdoc.xml,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- forrestdoc.xml 27 Oct 2004 19:29:35 -0000 1.3
+++ forrestdoc.xml 31 Oct 2004 14:44:25 -0000 1.4
@@ -52,10 +52,10 @@
<target name="-initialize-report-menu-file">
- <mkdir dir="${project.forrest.xdocs.dir}"/>
+ <dirname property="report-menu.dir"
file="${forrest.report-menu.file}"/>
+ <mkdir dir="${report-menu.dir}"/>
<echo message="" file="${forrest.report-menu.file}"/>
-
</target>
<target name="marshall-documentation"
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]