umm...

doing a naming lookup should only throw NamingExceptions.... so I think what 
should happen is that the reference should wrap the ValidationException in a 
NamingException.  Will this mess up the tck?

thanks
david jencks

On Oct 21, 2010, at 9:34 AM, David Jencks wrote:

> Hi Rick,
> 
> The code that does the lookup is here in the jetty integration code: 
> (GeronimoWebAppContext near line 104)
> 
>        try {
>            javax.naming.Context ctx = 
> integrationContext.getComponentContext();
>            Object validatorFactory = ctx.lookup("comp/ValidatorFactory");
>            
> setAttribute("javax.faces.validator.beanValidator.ValidatorFactory", 
> validatorFactory);
>        } catch (NamingException e) {
>            // ignore.  We just don't set the property if it's not available.
>        }
> 
> 
> I suspect it used to pass because we were only using default validatory 
> factories so we could always create one.  Either that, or we used to throw a 
> NamingException when we failed (the code you quote catches a naming 
> exception....).
> 
> I wonder if a better solution would be to also catch and ignore a 
> ValidationException here?
> 
> thanks
> david jencks
> 
> On Oct 21, 2010, at 7:55 AM, Rick McGuire wrote:
> 
>> I played around with different solutions and finally came up with something 
>> that fixes the problem.  Unfortunately, I'm not sure what I did is 
>> legitimate or not.  The root problem here is the naming reference 
>> implementations were throwing ValidationExceptions for any failures with 
>> creating a ValidatorFactory.  This probably was the behavior that should be 
>> implemented, but unfortunately, the getFederatedBindings() processing was 
>> triggering the resolution of these objects and the resulting exceptions were 
>> causing deploy failures.  The test cases in question were testing the very 
>> conditions that triggered the exceptions.  The exception was raised, but at 
>> deploy time, resulting in a test case failure.
>> 
>> I managed to fix this by having the reference objects we bind into jndi 
>> catch the exceptions and just return null.  Everything is passing in the TCK 
>> now, but I'm not sure returning null is the correct thing to do here.
>> 
>> I'm not really sure how we every were passing 100% in the container with the 
>> original code.  I would have thought that if the same sequence of calls were 
>> getting made to resolve the provider, then some of the same failures would 
>> have been seen.  I'm going to hold off on committing my changes until I get 
>> some feedback on this.
>> 
>> Rick
>> 
>> On 10/21/2010 7:48 AM, Rick McGuire wrote:
>>> We're down to 13 bean validation failures in the tck now, but these 
>>> failures are a little puzzling.   The tests in error are all giving deploy 
>>> failures, with the root cause being an exception triggered by 
>>> getFederatedBindings():
>>> 
>>> java.lang.RuntimeException: javax.naming.NamingException: Validator [Root 
>>> exception is javax.validation.ValidationException: Unable to find suitable 
>>> provider: class org.hibernate.jsr303.tck.common.TCKValidationProvider]
>>>       at 
>>> org.apache.xbean.naming.context.ContextUtil$ReadOnlyBinding.getObject(ContextUtil.java:201)
>>>       at 
>>> org.apache.xbean.naming.context.ContextFederation.getFederatedBindings(ContextFederation.java:118)
>>>       at 
>>> org.apache.xbean.naming.context.AbstractFederatedContext.getBindings(AbstractFederatedContext.java:99)
>>>       at 
>>> org.apache.xbean.naming.context.AbstractFederatedContext.getBinding(AbstractFederatedContext.java:86)
>>>       at 
>>> org.apache.xbean.naming.context.AbstractContext.lookup(AbstractContext.java:133)
>>>       at 
>>> org.apache.xbean.naming.context.AbstractContext.lookup(AbstractContext.java:605)
>>>       at 
>>> org.apache.geronimo.jetty8.handler.GeronimoWebAppContext.<init>(GeronimoWebAppContext.java:104)
>>>       at 
>>> org.apache.geronimo.jetty8.WebAppContextWrapper.<init>(WebAppContextWrapper.java:211)
>>>       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native 
>>> Method)
>>>       at 
>>> sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
>>>       at 
>>> sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
>>>       at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
>>>       at 
>>> org.apache.xbean.recipe.ReflectionUtil$ConstructorFactory.create(ReflectionUtil.java:952)
>>>       at 
>>> org.apache.xbean.recipe.ObjectRecipe.internalCreate(ObjectRecipe.java:276)
>>>       at 
>>> org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:96)
>>>       at 
>>> org.apache.xbean.recipe.AbstractRecipe.create(AbstractRecipe.java:61)
>>>       at 
>>> org.apache.geronimo.gbean.runtime.GBeanInstance.createInstance(GBeanInstance.java:933)
>>>       at 
>>> org.apache.geronimo.gbean.runtime.GBeanInstanceState.attemptFullStart(GBeanInstanceState.java:271)
>>>       at 
>>> org.apache.geronimo.gbean.runtime.GBeanInstanceState.start(GBeanInstanceState.java:105)
>>> 
>>> 
>>> The root cause of this failure is an exception in 
>>> DefaultValidatorReference.getContent():
>>> 
>>>   @Override
>>>   public  Object  getContent()throws  NamingException  {
>>>       ValidatorFactory  factory  =null;
>>>               try  {
>>>           factory  = (ValidatorFactory)new  
>>> InitialContext().lookup("java:comp/ValidatorFactory");
>>>       }catch(NamingException  e) {
>>>           factory  =Validation.buildDefaultValidatorFactory();
>>>       }
>>>               return  factory.getValidator();
>>>   }
>>> 
>>> The root cause of this failure is the NamingException on the .lookup() 
>>> call.  Since this occurs during the building of the federated context, I 
>>> suspect the initial context is not initialized correctly at this phase.  
>>> There's a bit of a chicken-and-egg problem here.  The 
>>> buildDefaultValidatorFactory() call is failing because the incorrect thread 
>>> context classloader is getting used to resolve the provider.
>>> 
>>> The puzzling piece to me is why this process is making the getContent() 
>>> calls in the first place.  Since this binding will create a new instance 
>>> each time it is requested, either A) an instance is getting created 
>>> needlessly and thrown away or B) this instance is ending up bound to the 
>>> JNDI context as a one-off, which would be an incorrect result.
>>> 
>>> I think I can fix this by making the DefaultValidatorReference look up the 
>>> ValidatorFactoryGBean to obtain the factory used to create the 
>>> ValidatorInstance rather than doing a jndi lookup, but I want to verify 
>>> that the lookup occurring at this point is the correct behavior and there's 
>>> not a better solution available.
>>> 
>>> Rick
>> 
> 

Reply via email to