I finally got around to making a test case for a miss leading error message I was getting.
My situation is that I use constructor arguments for all my required parameters of objects. The code inside of the BuilderFactoryLogic uses the BuilderPropertyFactet.isAssignableFrom() method to figure out if a particular parameter in a constructor is right. The BuilderPropertyFactet.isAssignableFrom() eats an ApplicationRuntimeException and returns false. This is bad when you miss-spell a service name, for instance: <service>service:MyServic</service> When you meant, <service>service:MyService</service> The error that Hivemind throws is that it had trouble finding a valid constructor, when the real problem was that it had problems finding your service to even check if the constructor was valid. here is a patch to TestBuilderPropertyFacet that shows what I think should be happening: Index: framework/src/test/org/apache/hivemind/service/impl/TestBuilderPropertyFacet .java =================================================================== RCS file: /home/cvspublic/jakarta-hivemind/framework/src/test/org/apache/hivemind/serv ice/impl/TestBuilderPropertyFacet.java,v retrieving revision 1.1 diff -u -r1.1 TestBuilderPropertyFacet.java --- framework/src/test/org/apache/hivemind/service/impl/TestBuilderPropertyFacet .java 27 Apr 2005 12:23:46 -0000 1.1 +++ framework/src/test/org/apache/hivemind/service/impl/TestBuilderPropertyFacet .java 18 May 2005 17:17:17 -0000 @@ -14,6 +14,7 @@ package org.apache.hivemind.service.impl; +import org.apache.hivemind.ApplicationRuntimeException; import org.apache.hivemind.ServiceImplementationFactoryParameters; import org.apache.hivemind.internal.Module; import org.apache.hivemind.schema.Translator; @@ -55,4 +56,43 @@ verifyControls(); } + + public void testAssignableFromBadValue() + { + MockControl moduleControl = newControl(Module.class); + Module module = (Module) moduleControl.getMock(); + + MockControl translatorControl = newControl(Translator.class); + Translator translator = (Translator) translatorControl.getMock(); + + MockControl paramsControl = newControl(ServiceImplementationFactoryParameters.class); + ServiceImplementationFactoryParameters params = (ServiceImplementationFactoryParameters) paramsControl + .getMock(); + + BuilderPropertyFacet facet = new BuilderPropertyFacet(); + + facet.setTranslator("foo"); + facet.setValue("bar"); + + params.getInvokingModule(); + paramsControl.setDefaultReturnValue(module); + + module.getTranslator("foo"); + moduleControl.setDefaultReturnValue(translator); + + translator.translate(module, Object.class, "bar", null); + translatorControl.setThrowable(new ApplicationRuntimeException("bad translate parameter")); + + replayControls(); + + try { + facet.isAssignableToType(params, Object.class); + unreachable(); + } + catch (ApplicationRuntimeException e) { + assertEquals("bad translate parameter", e.getMessage()); + } + + verifyControls(); + } } The following patch does what I think is reasonable. Index: framework/src/java/org/apache/hivemind/service/impl/BuilderPropertyFacet.jav a =================================================================== RCS file: /home/cvspublic/jakarta-hivemind/framework/src/java/org/apache/hivemind/serv ice/impl/BuilderPropertyFacet.java,v retrieving revision 1.12 diff -u -r1.12 BuilderPropertyFacet.java --- framework/src/java/org/apache/hivemind/service/impl/BuilderPropertyFacet.jav a 29 Apr 2005 07:40:55 -0000 1.12 +++ framework/src/java/org/apache/hivemind/service/impl/BuilderPropertyFacet.jav a 18 May 2005 17:26:07 -0000 @@ -66,20 +66,13 @@ public boolean isAssignableToType(ServiceImplementationFactoryParameters factoryParameters, Class targetType) { - try - { - // TODO should Translator declare an analoguous isAssignableToType method? - Object facetValue = getFacetValue(factoryParameters, targetType); + // TODO should Translator declare an analoguous isAssignableToType method? + Object facetValue = getFacetValue(factoryParameters, targetType); - if (facetValue == null) - return !targetType.isPrimitive(); + if (facetValue == null) + return !targetType.isPrimitive(); - return ConstructorUtils.isCompatible(targetType, facetValue.getClass()); - } - catch (ApplicationRuntimeException e) - { - return false; - } + return ConstructorUtils.isCompatible(targetType, facetValue.getClass()); } /** @since 1.1 */ When I use my hivemind from CVS with this patch to BuilderPropertyFacet, I get a very reasonable error messages that points me to the problem right away. The isAssignableToType() method seems to be used in the autowiring code quite a lot. After reviewing the code, I can't see that eating the ApplicationRuntimeException is a good thing. Richard --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]
