[ 
http://issues.apache.org/jira/browse/TAPESTRY-846?page=comments#action_12438230 
] 
            
Jeff Lubetkin commented on TAPESTRY-846:
----------------------------------------

I recently tracked down a problem in Zillow's code that has the same symptoms 
as TAPESTRY-846, and may be caused by a similar problem.  

We use a custom SpecificationResolverDelegate to keep our templates in WEB-INF. 
 I've documented the approach on the wiki: 
http://wiki.apache.org/tapestry/SpeclessPagesInWEB-INF.  We would get the 
exception from TAPESTRY-846 when our performance testers would hit a new, 
previously unloaded page with substantial load.  Simply requesting the page 
once before starting the test would prevent the issue.  I tracked the problem 
down to the custom resolver's setupImplicitPage method.  If two threads tried 
to load for the first time a new page simultaneously, two implicit 
ComponentSpecifications would be created.  Having two spec objects for the same 
page caused the "synchronized( specification )" to fail in 
ComponentConstructorFactoryImpl.getComponentConstructor, causing the same 
component to be enhanced twice, resulting in the exception.

I fixed this in our code by synchronizing 
AppSpecRelativeSpecificationResolverDelegate.setupImplicitPage and storing the 
created implicit ComponentSpecifications in a map keyed on the simpleName 
parameter.  The method checks the map first, guaranteeing that each page will 
only ever have one implicit spec object created.  We can no longer reproduce 
the exception.

I've looked at the code for PageSpecificationResolverImpl.setupImplicitPage, 
and I think it's subject to the same problem.  If two requests for the same 
implicitly-specced page get past the call to namespace.containsPage in the 
resolve method, two implict spec objects will be created and the 
getComponentConstructor syncronization will fail.  This may be what people are 
seeing, but since we don't use that code I don't know for sure.


> Random error accesing pages: Property " " has already been accounted for by 
> the element at Annotation ...
> ---------------------------------------------------------------------------------------------------------
>
>                 Key: TAPESTRY-846
>                 URL: http://issues.apache.org/jira/browse/TAPESTRY-846
>             Project: Tapestry
>          Issue Type: Bug
>          Components: Annotations
>    Affects Versions: 4.0
>         Environment: Linux, OS X, WXP
>            Reporter: Raul Raja Martinez
>         Assigned To: Jesse Kuhnert
>
> As posted in Tapestry mailing list:
> I have been unable to write a test to reproduce the error since it happens 
> randomly which makes me thing that it happens when classes are enhanced. I 
> have checked all my classes and 
> com.estudiowebs.CMS.components.AbstractCMSComponent is the only place where 
> that property is declared.
> Here is my code:
> public abstract class AbstractCMSComponent extends BaseComponent {
>     
>     @InjectPage("News")
>     public abstract News getNewsPage();
> }
> public abstract class AbstractCategoryLinker extends AbstractCMSComponent {
>  public IPage onClickMenuItem() {
>   Contact cp = getContactPage();
>   return cp;
> }
> public abstract class MenuNavigation extends AbstractCategoryLinker {
> }
> Here is the stack trace:
> org.apache.hivemind.ApplicationRuntimeException
> Property newsPage has already been accounted for by the element at Annotation 
> @org.apache.tapestry.annotations.InjectPage(value=News) of public abstract 
> com.estudiowebs.CMS.pages.News 
> com.estudiowebs.CMS.components.AbstractCMSComponent.getNewsPage().
> location:     Annotation 
> @org.apache.tapestry.annotations.InjectPage(value=News) of public abstract 
> com.estudiowebs.CMS.pages.News 
> com.estudiowebs.CMS.components.AbstractCMSComponent.getNewsPage()
> Stack Trace:
>     * 
> org.apache.tapestry.spec.ComponentSpecification.claimProperty(ComponentSpecification.java:674)
>     * 
> org.apache.tapestry.spec.ComponentSpecification.addInjectSpecification(ComponentSpecification.java:645)
>     * 
> org.apache.tapestry.annotations.InjectPageAnnotationWorker.performEnhancement(InjectPageAnnotationWorker.java:50)
>     * 
> org.apache.tapestry.annotations.AnnotationEnhancementWorker.performMethodEnhancement(AnnotationEnhancementWorker.java:142)
>     * 
> org.apache.tapestry.annotations.AnnotationEnhancementWorker.performMethodEnhancement(AnnotationEnhancementWorker.java:110)
>     * 
> org.apache.tapestry.annotations.AnnotationEnhancementWorker.performEnhancement(AnnotationEnhancementWorker.java:70)
>     * 
> $EnhancementWorker_108fb922aed.performEnhancement($EnhancementWorker_108fb922aed.java)
>     * 
> $EnhancementWorker_108fb922aef.performEnhancement($EnhancementWorker_108fb922aef.java)
>     * 
> $EnhancementWorker_108fb922acb.performEnhancement($EnhancementWorker_108fb922acb.java)
>     * 
> org.apache.tapestry.services.impl.ComponentConstructorFactoryImpl.getComponentConstructor(ComponentConstructorFactoryImpl.java:97)
>     * 
> $ComponentConstructorFactory_108fb922ab8.getComponentConstructor($ComponentConstructorFactory_108fb922ab8.java)
>     * 
> org.apache.tapestry.pageload.PageLoader.instantiateComponent(PageLoader.java:531)
>     * 
> org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:401)
>     * 
> org.apache.tapestry.pageload.PageLoader.createImplicitComponent(PageLoader.java:494)
>     * 
> $IPageLoader_108fb922aa8.createImplicitComponent($IPageLoader_108fb922aa8.java)
>     * 
> $IPageLoader_108fb922aa9.createImplicitComponent($IPageLoader_108fb922aa9.java)
>     * 
> org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.createImplicitComponent(ComponentTemplateLoaderLogic.java:218)
>     * 
> org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.process(ComponentTemplateLoaderLogic.java:172)
>     * 
> org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.process(ComponentTemplateLoaderLogic.java:111)
>     * 
> org.apache.tapestry.services.impl.ComponentTemplateLoaderLogic.loadTemplate(ComponentTemplateLoaderLogic.java:88)
>     * 
> org.apache.tapestry.services.impl.ComponentTemplateLoaderImpl.loadTemplate(ComponentTemplateLoaderImpl.java:60)
>     * 
> $ComponentTemplateLoader_108fb922abc.loadTemplate($ComponentTemplateLoader_108fb922abc.java)
>     * 
> org.apache.tapestry.pageload.PageLoader.loadTemplateForComponent(PageLoader.java:648)
>     * org.apache.tapestry.BaseComponent.readTemplate(BaseComponent.java:77)
>     * org.apache.tapestry.BaseComponent.finishLoad(BaseComponent.java:107)
>     * $Contact_470.finishLoad($Contact_470.java)
>     * 
> org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:439)
>     * org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613)
>     * $IPageLoader_108fb922aa8.loadPage($IPageLoader_108fb922aa8.java)
>     * $IPageLoader_108fb922aa9.loadPage($IPageLoader_108fb922aa9.java)
>     * org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:120)
>     * $IPageSource_108fb922a07.getPage($IPageSource_108fb922a07.java)
>     * org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:268)
>     * org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:251)
>     * $MenuNavigation_464.getContactPage($MenuNavigation_464.java)
>     * 
> com.estudiowebs.CMS.components.AbstractCategoryLinker.onClickMenuItem(AbstractCategoryLinker.java:20)
>     * sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>     * 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>     * 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>     * java.lang.reflect.Method.invoke(Method.java:585)
>     * 
> org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeTargetMethod(ListenerMethodInvokerImpl.java:214)
>     * 
> org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeListenerMethod(ListenerMethodInvokerImpl.java:155)
>     * 
> org.apache.tapestry.listener.ListenerMethodInvokerImpl.searchAndInvoke(ListenerMethodInvokerImpl.java:124)
>     * 
> org.apache.tapestry.listener.ListenerMethodInvokerImpl.invokeListenerMethod(ListenerMethodInvokerImpl.java:65)
>     * 
> org.apache.tapestry.listener.SyntheticListener.actionTriggered(SyntheticListener.java:51)
>     * 
> org.apache.tapestry.binding.ListenerMethodBinding.actionTriggered(ListenerMethodBinding.java:77)
>     * 
> org.apache.tapestry.listener.ListenerInvokerTerminator.invokeListener(ListenerInvokerTerminator.java:51)
>     * 
> $ListenerInvoker_108fb922a35.invokeListener($ListenerInvoker_108fb922a35.java)
>     * org.apache.tapestry.link.DirectLink.trigger(DirectLink.java:105)
>     * 
> org.apache.tapestry.engine.DirectService.triggerComponent(DirectService.java:146)
>     * org.apache.tapestry.engine.DirectService.service(DirectService.java:132)
>     * $IEngineService_108fb922a92.service($IEngineService_108fb922a92.java)
>     * 
> org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:66)
>     * 
> org.apache.tapestry.engine.AbstractEngine.service(AbstractEngine.java:248)
>     * 
> org.apache.tapestry.services.impl.InvokeEngineTerminator.service(InvokeEngineTerminator.java:60)
>     * 
> $WebRequestServicer_108fb922a6b.service($WebRequestServicer_108fb922a6b.java)
>     * 
> org.apache.tapestry.services.impl.DisableCachingFilter.service(DisableCachingFilter.java:48)
>     * 
> $WebRequestServicerFilter_108fb922a6d.service($WebRequestServicerFilter_108fb922a6d.java)
>     * 
> $WebRequestServicer_108fb922a6f.service($WebRequestServicer_108fb922a6f.java)
>     * 
> $WebRequestServicer_108fb922a67.service($WebRequestServicer_108fb922a67.java)
>     * 
> org.apache.tapestry.services.impl.WebRequestServicerPipelineBridge.service(WebRequestServicerPipelineBridge.java:56)
>     * 
> $ServletRequestServicer_108fb922a4b.service($ServletRequestServicer_108fb922a4b.java)
>     * 
> org.apache.tapestry.request.DecodedRequestInjector.service(DecodedRequestInjector.java:55)
>     * 
> $ServletRequestServicerFilter_108fb922a47.service($ServletRequestServicerFilter_108fb922a47.java)
>     * 
> $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java)
>     * 
> org.apache.tapestry.multipart.MultipartDecoderFilter.service(MultipartDecoderFilter.java:52)
>     * 
> $ServletRequestServicerFilter_108fb922a45.service($ServletRequestServicerFilter_108fb922a45.java)
>     * 
> $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java)
>     * 
> org.apache.tapestry.services.impl.SetupRequestEncoding.service(SetupRequestEncoding.java:53)
>     * 
> $ServletRequestServicerFilter_108fb922a49.service($ServletRequestServicerFilter_108fb922a49.java)
>     * 
> $ServletRequestServicer_108fb922a4d.service($ServletRequestServicer_108fb922a4d.java)
>     * 
> $ServletRequestServicer_108fb922a3f.service($ServletRequestServicer_108fb922a3f.java)
>     * 
> org.apache.tapestry.ApplicationServlet.doService(ApplicationServlet.java:123)
>     * org.apache.tapestry.ApplicationServlet.doGet(ApplicationServlet.java:79)
>     * javax.servlet.http.HttpServlet.service(HttpServlet.java:689)
>     * javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
>     * 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
>     * 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>     * 
> org.springframework.orm.hibernate3.support.OpenSessionInViewFilter.doFilterInternal(OpenSessionInViewFilter.java:172)
>     * 
> org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:76)
>     * 
> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)
>     * 
> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
>     * 
> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
>     * 
> org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
>     * 
> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
>     * 
> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
>     * 
> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
>     * 
> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
>     * 
> org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:868)
>     * 
> org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:663)
>     * 
> org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
>     * 
> org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
>     * 
> org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
>     * java.lang.Thread.run(Thread.java:613) 

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to