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/11/10 21:51:24 UTC
cvs commit: jakarta-hivemind/framework/src/java/org/apache/hivemind/service/impl BuilderFactoryLogic.java
hlship 2004/11/10 12:51:23
Modified: . status.xml
framework/src/java/org/apache/hivemind/util
ConstructorUtils.java
framework/src/java/org/apache/hivemind/parse
XmlResourceProcessor.java
framework/src/java/org/apache/hivemind/service/impl
BuilderFactoryLogic.java
Added: framework/src/test/org/apache/hivemind/util
TestConstructorUtils.java
framework/src/test/org/apache/hivemind/service/impl
InitializerErrorRunnable.java
TestBuilderFactory.java
Log:
HIVEMIND-77: Report real exceptoin in BuilderFactoryLogic, not the wrapping InvocationTargetException.
Revision Changes Path
1.1 jakarta-hivemind/framework/src/test/org/apache/hivemind/util/TestConstructorUtils.java
Index: TestConstructorUtils.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.util;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.test.HiveMindTestCase;
/**
* Tests for {@link org.apache.hivemind.util.ConstructorUtils}. Alas (for the moment), just fills a
* few gaps ... most of the code is tested indirectly by code that uses it.
*
* @author Howard M. Lewis Ship
* @since 1.1
*/
public class TestConstructorUtils extends HiveMindTestCase
{
public static class Troublemaker
{
public Troublemaker(ApplicationRuntimeException ex)
{
throw ex;
}
}
public void testInvocationTargetException()
{
Throwable inner = new ApplicationRuntimeException("Inner exception.");
try
{
ConstructorUtils.invokeConstructor(Troublemaker.class, new Object[]
{ inner });
unreachable();
}
catch (ApplicationRuntimeException ex)
{
String message = UtilMessages.invokeFailed(
Troublemaker.class.getConstructors()[0],
inner);
assertEquals(message, ex.getMessage());
assertSame(inner, ex.getCause());
}
}
}
1.1 jakarta-hivemind/framework/src/test/org/apache/hivemind/service/impl/InitializerErrorRunnable.java
Index: InitializerErrorRunnable.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 org.apache.hivemind.ApplicationRuntimeException;
/**
* @author Howard M. Lewis Ship
* @since 1.1
*/
public class InitializerErrorRunnable implements Runnable
{
public void run()
{
//
}
public void initializeService()
{
throw new ApplicationRuntimeException("Failure in initializeService().");
}
}
1.1 jakarta-hivemind/framework/src/test/org/apache/hivemind/service/impl/TestBuilderFactory.java
Index: TestBuilderFactory.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 org.apache.commons.logging.Log;
import org.apache.hivemind.ApplicationRuntimeException;
import org.apache.hivemind.ErrorLog;
import org.apache.hivemind.Location;
import org.apache.hivemind.ServiceImplementationFactoryParameters;
import org.apache.hivemind.impl.DefaultClassResolver;
import org.apache.hivemind.internal.Module;
import org.apache.hivemind.test.AggregateArgumentsMatcher;
import org.apache.hivemind.test.ArgumentMatcher;
import org.apache.hivemind.test.HiveMindTestCase;
import org.apache.hivemind.test.TypeMatcher;
import org.easymock.MockControl;
/**
* Additional tests for {@link org.apache.hivemind.service.impl.BuilderFactoryLogic}.
*
* @author Howard M. Lewis Ship
* @since 1.1
*/
public class TestBuilderFactory extends HiveMindTestCase
{
/**
* Tests for errors when actually invoking the initializer method (as opposed to an error
* finding the method).
*
* @since 1.1
*/
public void testErrorInInitializer() throws Exception
{
Location l = fabricateLocation(17);
MockControl fpc = newControl(ServiceImplementationFactoryParameters.class);
ServiceImplementationFactoryParameters fp = (ServiceImplementationFactoryParameters) fpc
.getMock();
Log log = (Log) newMock(Log.class);
MockControl mc = newControl(Module.class);
Module module = (Module) mc.getMock();
MockControl errorLogc = newControl(ErrorLog.class);
ErrorLog errorLog = (ErrorLog) errorLogc.getMock();
fp.getLog();
fpc.setReturnValue(log);
fp.getServiceId();
fpc.setReturnValue("foo.Bar");
fp.getInvokingModule();
fpc.setReturnValue(module);
module.getClassResolver();
mc.setReturnValue(new DefaultClassResolver());
fp.getErrorLog();
fpc.setReturnValue(errorLog);
Throwable cause = new ApplicationRuntimeException("Failure in initializeService().");
String message = ServiceMessages.unableToInitializeService(
"foo.Bar",
"initializeService",
InitializerErrorRunnable.class,
cause);
errorLog.error(message, l, new ApplicationRuntimeException(""));
errorLogc.setMatcher(new AggregateArgumentsMatcher(new ArgumentMatcher[]
{ null, null, new TypeMatcher() }));
BuilderParameter p = new BuilderParameter();
p.setClassName(InitializerErrorRunnable.class.getName());
p.setLocation(l);
replayControls();
BuilderFactoryLogic logic = new BuilderFactoryLogic(fp, p);
assertNotNull(logic.createService());
verifyControls();
}
}
1.81 +5 -1 jakarta-hivemind/status.xml
Index: status.xml
===================================================================
RCS file: /home/cvs/jakarta-hivemind/status.xml,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -r1.80 -r1.81
--- status.xml 9 Nov 2004 20:58:20 -0000 1.80
+++ status.xml 10 Nov 2004 20:51:23 -0000 1.81
@@ -68,7 +68,7 @@
<action type="fix" dev="HLS" fixes-bug="HIVEMIND-68">
Properly report the actual method name when invoking a service initializer method.
</action>
- <action type="add" dev="HLS">
+ <action type="add" dev="HLS" fixes-bug="HIVEMIND-66">
Move some logic related to primitive Java types and arrays from Tapestry directly into DefaultClassResolver.
</action>
<action type="update" dev="HLS">
@@ -99,6 +99,10 @@
<action type="fix" dev="HLS" fixes-bug="HIVEMIND-76">
Improve MethodSignature and MethodIterator to filter out duplicate methods that differ
only in terms of thrown exceptions.
+ </action>
+ <action type="fix" dev="HLS" fixes-bug="HIVEMIND-77">
+ Change BuilderFactoryLogic to report the actual exception, not the InvocationTargetException,
+ when an exception is thrown by a constructor or by a initializer method invocation.
</action>
</release>
1.7 +20 -14 jakarta-hivemind/framework/src/java/org/apache/hivemind/util/ConstructorUtils.java
Index: ConstructorUtils.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/util/ConstructorUtils.java,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
--- ConstructorUtils.java 9 Nov 2004 11:24:29 -0000 1.6
+++ ConstructorUtils.java 10 Nov 2004 20:51:23 -0000 1.7
@@ -15,6 +15,7 @@
package org.apache.hivemind.util;
import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
import java.util.HashMap;
import java.util.Map;
@@ -22,7 +23,7 @@
/**
* Static methods for invoking constructors.
- *
+ *
* @author Howard Lewis Ship
*/
public class ConstructorUtils
@@ -33,7 +34,8 @@
*/
private static final Map _primitiveMap = new HashMap();
- static {
+ static
+ {
_primitiveMap.put(boolean.class, Boolean.class);
_primitiveMap.put(byte.class, Byte.class);
_primitiveMap.put(char.class, Character.class);
@@ -53,11 +55,13 @@
/**
* Searches for a constructor matching against the provided arguments.
*
- * @param targetClass the class to be instantiated
- * @param parameters the parameters to pass to the constructor (may be null or empty)
+ * @param targetClass
+ * the class to be instantiated
+ * @param parameters
+ * the parameters to pass to the constructor (may be null or empty)
* @return the new instance
- * @throws ApplicationRuntimeException on any failure
- *
+ * @throws ApplicationRuntimeException
+ * on any failure
*/
public static Object invokeConstructor(Class targetClass, Object[] parameters)
{
@@ -72,10 +76,8 @@
return invokeMatchingConstructor(targetClass, parameterTypes, parameters);
}
- private static Object invokeMatchingConstructor(
- Class targetClass,
- Class[] parameterTypes,
- Object[] parameters)
+ private static Object invokeMatchingConstructor(Class targetClass, Class[] parameterTypes,
+ Object[] parameters)
{
Constructor[] constructors = targetClass.getConstructors();
@@ -87,9 +89,7 @@
return invoke(c, parameters);
}
- throw new ApplicationRuntimeException(
- UtilMessages.noMatchingConstructor(targetClass),
- null);
+ throw new ApplicationRuntimeException(UtilMessages.noMatchingConstructor(targetClass), null);
}
private static boolean isMatch(Constructor c, Class[] types)
@@ -135,9 +135,15 @@
{
return c.newInstance(parameters);
}
+ catch (InvocationTargetException ex)
+ {
+ Throwable cause = ex.getTargetException();
+
+ throw new ApplicationRuntimeException(UtilMessages.invokeFailed(c, cause), null, cause);
+ }
catch (Exception ex)
{
throw new ApplicationRuntimeException(UtilMessages.invokeFailed(c, ex), null, ex);
}
}
-}
+}
\ No newline at end of file
1.2 +1 -1 jakarta-hivemind/framework/src/java/org/apache/hivemind/parse/XmlResourceProcessor.java
Index: XmlResourceProcessor.java
===================================================================
RCS file: /home/cvs/jakarta-hivemind/framework/src/java/org/apache/hivemind/parse/XmlResourceProcessor.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- XmlResourceProcessor.java 10 Nov 2004 13:26:21 -0000 1.1
+++ XmlResourceProcessor.java 10 Nov 2004 20:51:23 -0000 1.2
@@ -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.8 +10 -5 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.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
--- BuilderFactoryLogic.java 9 Nov 2004 11:24:30 -0000 1.7
+++ BuilderFactoryLogic.java 10 Nov 2004 20:51:23 -0000 1.8
@@ -112,12 +112,10 @@
{
return instantiateConstructorAutowiredInstance(serviceClass);
}
- else
- {
- Object[] constructorParameters = buildConstructorParameters(parameters);
- return ConstructorUtils.invokeConstructor(serviceClass, constructorParameters);
- }
+ Object[] constructorParameters = buildConstructorParameters(parameters);
+
+ return ConstructorUtils.invokeConstructor(serviceClass, constructorParameters);
}
private Object[] buildConstructorParameters(List parameters)
@@ -239,6 +237,13 @@
try
{
findAndInvokeInitializerMethod(service, searchMethodName, allowMissing);
+ }
+ catch (InvocationTargetException ex)
+ {
+ Throwable cause = ex.getTargetException();
+
+ error(ServiceMessages.unableToInitializeService(_serviceId, searchMethodName, service
+ .getClass(), cause), _parameter.getLocation(), cause);
}
catch (Exception ex)
{
---------------------------------------------------------------------
To unsubscribe, e-mail: hivemind-cvs-unsubscribe@jakarta.apache.org
For additional commands, e-mail: hivemind-cvs-help@jakarta.apache.org