Issue: 10030 Part 1: make @Resource work for Validator and ValidatorFactory Author: Ken Saks and Ed Burns SECTION: Changes M deployment/dol/src/main/java/com/sun/enterprise/deployment/JmsDestinationReferenceDescriptor.java - Make this class aware of Validator and ValidatorFactory as valid JmsDestinations. M common/container-common/src/main/java/com/sun/enterprise/container/common/impl/ComponentEnvManagerImpl.java - Factory boilerplate code for obtaining a reference to an instance of Validator or ValidatorFactory. Ken, how do I store it in the ctx so subsequent lookups can find it there? When I try to bind() it says I can't store into the comp: namespace. M tests/quicklook/bean-validator/integration-test-servlet/metadata/web.xml A tests/quicklook/bean-validator/integration-test-servlet/src/java/integration_test_servlet/ValidatorFactoryInjectionTestServlet.java - Automated test code SECTION: Diffs Index: deployment/dol/src/main/java/com/sun/enterprise/deployment/JmsDestinationReferenceDescriptor.java =================================================================== --- deployment/dol/src/main/java/com/sun/enterprise/deployment/JmsDestinationReferenceDescriptor.java (revision 32299) +++ deployment/dol/src/main/java/com/sun/enterprise/deployment/JmsDestinationReferenceDescriptor.java (working copy) @@ -50,6 +50,8 @@ private static final String EJB_CTX_TYPE ="javax.ejb.EJBContext"; private static final String EJB_TIMER_SERVICE_TYPE = "javax.ejb.TimerService"; + private static final String VALIDATION_VALIDATOR ="javax.validation.Validator"; + private static final String VALIDATION_VALIDATOR_FACTORY ="javax.validation.ValidatorFactory"; private static final String CDI_BEAN_MANAGER_TYPE = "javax.enterprise.inject.spi.BeanManager"; @@ -106,6 +108,14 @@ getRefType().equals(EJB_TIMER_SERVICE_TYPE)); } + public boolean isValidator() { + return (getRefType().equals(VALIDATION_VALIDATOR)); + } + + public boolean isValidatorFactory() { + return (getRefType().equals(VALIDATION_VALIDATOR_FACTORY)); + } + public boolean isCDIBeanManager() { return (getRefType().equals(CDI_BEAN_MANAGER_TYPE)); } Index: common/container-common/src/main/java/com/sun/enterprise/container/common/impl/ComponentEnvManagerImpl.java =================================================================== --- common/container-common/src/main/java/com/sun/enterprise/container/common/impl/ComponentEnvManagerImpl.java (revision 32299) +++ common/container-common/src/main/java/com/sun/enterprise/container/common/impl/ComponentEnvManagerImpl.java (working copy) @@ -66,6 +66,11 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.logging.Level; import java.util.logging.Logger; +import javax.validation.Validation; +import javax.validation.ValidationException; +import javax.validation.Validator; +import javax.validation.ValidatorContext; +import javax.validation.ValidatorFactory; @Service public class ComponentEnvManagerImpl @@ -552,6 +557,10 @@ Object value = null; if (next.isEJBContext()) { value = new EjbContextProxy(next.getRefType()); + } else if( next.isValidator() ) { + value = new ValidatorProxy(); + } else if( next.isValidatorFactory() ) { + value = new ValidatorFactoryProxy(); } else if( next.isCDIBeanManager() ) { value = namingUtils.createLazyNamingObjectFactory(name, "java:comp/BeanManager", false); } else { @@ -839,6 +848,110 @@ } + private class ValidatorProxy + implements NamingObjectProxy { + + private volatile ValidatorFactory validatorFactory; + private volatile Validator validator; + + ValidatorProxy() { + } + + @Override + public Object create(Context ctx) + throws NamingException { + final String nameForValidator = "java:comp/Validator"; + String exceptionMessage = "Can not obtain reference to Validator instance "; + boolean foundInCtx = false; + + // Phase 1, obtain a reference to the Validator + + // case 1, try to look in the ctx + try { + foundInCtx = (null != (validator = (Validator) ctx.lookup(nameForValidator))); + } catch (NamingException ne) { + exceptionMessage = "Unable to lookup " + + nameForValidator + ":" + ne.toString(); + } + + // case 2, Create a new Validator instance + if (null == validator) { + + // case 2a no validatorFactory + if (null == validatorFactory) { + ValidatorFactoryProxy factoryProxy = new ValidatorFactoryProxy(); + validatorFactory = (ValidatorFactory) factoryProxy.create(ctx); + } + + // Use the ValidatorFactory to create a Validator + if (null != validatorFactory) { + ValidatorContext validatorContext = validatorFactory.usingContext(); + validator = validatorContext.getValidator(); + } + } + + if (!foundInCtx) { + // How do I store a comp: namespace entry? + // ctx.bind(nameForValidator, validator); + } + + if( validator == null ) { + throw new NameNotFoundException(exceptionMessage); + } + + return validator; + } + + } + + private class ValidatorFactoryProxy + implements NamingObjectProxy { + + private volatile ValidatorFactory validatorFactory; + + ValidatorFactoryProxy() { + } + + @Override + public Object create(Context ctx) + throws NamingException { + final String nameForValidatorFactory = "java:comp/ValidatorFactory"; + String exceptionMessage = "Can not obtain reference to ValidatorFactory instance "; + boolean foundInCtx = false; + + // Phase 1, obtain a reference to the ValidatorFactory + + // case 1, try to look in the ctx + if (null == validatorFactory) { + try { + foundInCtx = (null != (validatorFactory = (ValidatorFactory) + ctx.lookup(nameForValidatorFactory))); + } catch (NamingException ne) { + exceptionMessage = "Unable to lookup " + + nameForValidatorFactory + ":" + ne.toString(); + } + } + + // case 2, create the ValidatorFactory using the spec. + if (null == validatorFactory) { + try { + validatorFactory = Validation.buildDefaultValidatorFactory(); + } catch (ValidationException e) { + exceptionMessage = "Could not build a default Bean Validator factory: " + + e.toString(); + } + } + + if (!foundInCtx) { + // How do I store a comp: namespace entry? + // ctx.bind(nameForValidatorFactory, validatorFactory); + } + + return validatorFactory; + } + + } + private class WebServiceRefProxy implements NamingObjectProxy { Index: tests/quicklook/bean-validator/integration-test-servlet/metadata/web.xml =================================================================== --- tests/quicklook/bean-validator/integration-test-servlet/metadata/web.xml (revision 32299) +++ tests/quicklook/bean-validator/integration-test-servlet/metadata/web.xml (working copy) @@ -1,7 +1,7 @@ - + xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> BVIntegrationTestServlet integration_test_servlet.BVIntegrationTestServlet @@ -10,5 +10,28 @@ BVIntegrationTestServlet /test/* + + + ValidatorFactoryInjectionTestServlet + integration_test_servlet.ValidatorFactoryInjectionTestServlet + + + ValidatorFactoryInjectionTestServlet + /testInject/* + + + +