You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tapestry.apache.org by "Andy Blower (JIRA)" <de...@tapestry.apache.org> on 2008/08/12 20:45:44 UTC

[jira] Closed: (TAPESTRY-2551) ArrayIndexOutOfBoundsException in Javassist when using addScript()

     [ https://issues.apache.org/jira/browse/TAPESTRY-2551?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Andy Blower closed TAPESTRY-2551.
---------------------------------

       Resolution: Fixed
    Fix Version/s: 5.0.14

Fixed with Javassist update included in .14

> ArrayIndexOutOfBoundsException in Javassist when using addScript()
> ------------------------------------------------------------------
>
>                 Key: TAPESTRY-2551
>                 URL: https://issues.apache.org/jira/browse/TAPESTRY-2551
>             Project: Tapestry
>          Issue Type: Bug
>    Affects Versions: 5.0.13
>         Environment: Version
>     5.0.13
>            Reporter: Andy Blower
>             Fix For: 5.0.14
>
>
> I'm converting inline JS to addScript method calls in the Java as you suggested. So far this has been a real pain, which is especially galling since it was working just fine to my mind. Anyhow, I have the following in my Java:
> 	@CleanupRender
> 	void initClickEventsJS()
> 	{
> //		renderSupport.addScript("for (int i=1; i <= %d; i++) { ", filterIdx);
> //		renderSupport.addScript("var filterHeader = $('filter' + i + '-header');");
> //		renderSupport.addScript("var filterDiv = $('filter' + i + '-div');");
> //		renderSupport.addScript("filterHeader.observe('click', toggleFilter.bindAsEventListener(filterHeader, filterDiv)); };");
> 		
> 		for (int i = 1; i <= filterIdx; i++) {
> 			renderSupport.addScript("var filterHeader = $('filter%d-header');", i);
> 			renderSupport.addScript("var filterDiv = $('filter%d-div');", i);
> 			renderSupport.addScript("filterHeader.observe('click', toggleFilter.bindAsEventListener(filterHeader, filterDiv));");
> 		}
> 	}
> The commented out bit wont work because of TAPESTRY-2429, so I'm trying to get the for loop working in the Java code instead but it fails with the huge stack trace below. If, however, I add a second parameter to the last addScript method call it seems to work.
>     * java.lang.ClassNotFoundException
>       caught an exception while obtaining a class file for com.proquest.apps.corelib.components.SimpleResultsFilters
>       exception
>           org.apache.tapestry5.internal.services.TransformationException: 7
>     * org.apache.tapestry5.internal.services.TransformationException
>       7
>       transformation
>           InternalClassTransformation[
>           public com.proquest.apps.corelib.components.SimpleResultsFilters extends com.proquest.apps.corelib.base.ResultsFilterBase
>           add field: private java.util.Map _$getAppliedFilters;
>           add field: private boolean _$getAppliedFilters$called;
>           add field: private org.apache.tapestry5.Binding _$getAppliedFilters$binding;
>           add field: private java.lang.Object _$getAppliedFilters$bindingValue;
>           add field: protected final org.apache.tapestry5.services.BindingSource _$getAppliedFilters$bindingsource;
>           extend method: public void containingPageDidLoad()
>           _$getAppliedFilters$binding = _$getAppliedFilters$bindingsource.newBinding("Watch expression", _$resources, "prop", "grouper");
>           extend method: public void containingPageDidDetach()
>           {
>             _$getAppliedFilters = null;
>             _$getAppliedFilters$called = false;
>             _$getAppliedFilters$bindingValue = null;
>           }
>           prefix method: public java.util.Map getAppliedFilters()
>           {
>             if (_$getAppliedFilters$called && _$getAppliedFilters$bindingValue == _$getAppliedFilters$binding.get()) return _$getAppliedFilters;
>             _$getAppliedFilters$bindingValue = _$getAppliedFilters$binding.get();
>             _$getAppliedFilters$called = true;
>           }
>           extend existing method: public java.util.Map getAppliedFilters()
>           {
>             _$getAppliedFilters = $_;
>           }
>           add field: private java.util.List _$getFilterGroupings;
>           add field: private boolean _$getFilterGroupings$called;
>           add field: private org.apache.tapestry5.Binding _$getFilterGroupings$binding;
>           add field: private java.lang.Object _$getFilterGroupings$bindingValue;
>           extend method: public void containingPageDidLoad()
>           _$getFilterGroupings$binding = _$getAppliedFilters$bindingsource.newBinding("Watch expression", _$resources, "prop", "filters");
>           extend method: public void containingPageDidDetach()
>           {
>             _$getFilterGroupings = null;
>             _$getFilterGroupings$called = false;
>             _$getFilterGroupings$bindingValue = null;
>           }
>           prefix method: public java.util.List getFilterGroupings()
>           {
>             if (_$getFilterGroupings$called && _$getFilterGroupings$bindingValue == _$getFilterGroupings$binding.get()) return _$getFilterGroupings;
>             _$getFilterGroupings$bindingValue = _$getFilterGroupings$binding.get();
>             _$getFilterGroupings$called = true;
>           }
>           extend existing method: public java.util.List getFilterGroupings()
>           {
>             _$getFilterGroupings = $_;
>           }
>           add method: private void _$write_LOGGER_0(org.slf4j.Logger $1)
>           throw new java.lang.RuntimeException("Field com.proquest.apps.corelib.components.SimpleResultsFilters.LOGGER is read-only.");
>           replace write LOGGER: _$write_LOGGER_0();
>           add method: private void _$write_messages(org.apache.tapestry5.ioc.Messages $1)
>           throw new java.lang.RuntimeException("Field com.proquest.apps.corelib.components.SimpleResultsFilters.messages is read-only.");
>           replace write messages: _$write_messages();
>           extend method: public boolean dispatchComponentEvent(org.apache.tapestry5.runtime.ComponentEvent $1)
>           {
>             if ($1.isAborted()) return $_;
>             try
>             {
>               if ($1.matches("filter", "", 2))
>               {
>                 $_ = true;
>                 $1.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.doFilter(java.lang.String, java.lang.String) (at SimpleResultsFilters.java:184)");
>                 doFilter((java.lang.String)$1.coerceContext(0, "java.lang.String"), (java.lang.String)$1.coerceContext(1, "java.lang.String"));
>               }
>               if ($1.matches("unfilter", "", 2))
>               {
>                 $_ = true;
>                 $1.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.removeFilter(java.lang.String, java.lang.String) (at SimpleResultsFilters.java:196)");
>                 removeFilter((java.lang.String)$1.coerceContext(0, "java.lang.String"), (java.lang.String)$1.coerceContext(1, "java.lang.String"));
>               }
>             }
>             catch (RuntimeException ex) { throw ex; }
>             catch (Exception ex) { throw new RuntimeException(ex); } 
>           }
>           add field: private boolean _$filters_cached;
>           add field: private java.lang.String _$filters_default;
>           add field: private boolean _$filters_invariant;
>           extend method: public void containingPageDidLoad()
>           {
>             _$filters_invariant = _$resources.isInvariant("filters");
>             _$filters_default = filters;
>           }
>           extend method: public void postRenderCleanup()
>           if (! _$filters_invariant)
>           {
>             filters = _$filters_default;
>             _$filters_cached = false;
>           }
>           add method: private java.lang.String _$read_parameter_filters()
>           {
>             if (_$filters_cached || ! _$resources.isLoaded() || ! _$resources.isBound("filters")) return filters;
>             java.lang.String result = ($r) ((java.lang.String) _$resources.readParameter("filters", "java.lang.String"));
>             if (_$filters_invariant || _$resources.isRendering())
>             {
>               filters = result;
>               _$filters_cached = true;
>             }
>             return result;
>           }
>           replace read filters: _$read_parameter_filters();
>           add method: private void _$update_parameter_filters(java.lang.String $1)
>           {
>             if (! _$resources.isLoaded())
>             {
>               filters = $1;
>               return;
>             }
>             if (_$resources.isBound("filters"))
>               _$resources.writeParameter("filters", ($w)$1);
>             filters = $1;
>             _$filters_cached = _$resources.isRendering();
>           }
>           replace write filters: _$update_parameter_filters();
>           add field: private boolean _$results_cached;
>           add field: private com.proquest.apps.corelib.search.ResultsList _$results_default;
>           add field: private boolean _$results_invariant;
>           extend method: public void containingPageDidLoad()
>           {
>             _$results_invariant = _$resources.isInvariant("source");
>             _$results_default = results;
>           }
>           extend method: public void postRenderCleanup()
>           if (! _$results_invariant)
>           {
>             results = _$results_default;
>             _$results_cached = false;
>           }
>           add method: private com.proquest.apps.corelib.search.ResultsList _$read_parameter_source()
>           {
>             if (_$results_cached || ! _$resources.isLoaded() || ! _$resources.isBound("source")) return results;
>             com.proquest.apps.corelib.search.ResultsList result = ($r) ((com.proquest.apps.corelib.search.ResultsList) _$resources.readParameter("source", "com.proquest.apps.corelib.search.ResultsList"));
>             if (_$results_invariant || _$resources.isRendering())
>             {
>               results = result;
>               _$results_cached = true;
>             }
>             return result;
>           }
>           replace read results: _$read_parameter_source();
>           add method: private void _$update_parameter_source(com.proquest.apps.corelib.search.ResultsList $1)
>           {
>             if (! _$resources.isLoaded())
>             {
>               results = $1;
>               return;
>             }
>             if (_$resources.isBound("source"))
>               _$resources.writeParameter("source", ($w)$1);
>             results = $1;
>             _$results_cached = _$resources.isRendering();
>           }
>           replace write results: _$update_parameter_source();
>           add method: public void setupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           {
>             super.setupRender($$);
>             if ($2.isAborted()) return;
>             try
>             {
>               $2.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.initFilterList() (at SimpleResultsFilters.java:80)");
>               if ($2.storeResult(($w) initFilterList())) return;
>             }
>             catch (RuntimeException ex) { throw ex; }
>             catch (Exception ex) { throw new RuntimeException(ex); }
>           }
>           add method: public void beginRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           {
>             super.beginRender($$);
>             if ($2.isAborted()) return;
>             try
>             {
>               $2.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.nextFilter() (at SimpleResultsFilters.java:88)");
>               nextFilter();
>             }
>             catch (RuntimeException ex) { throw ex; }
>             catch (Exception ex) { throw new RuntimeException(ex); }
>           }
>           add method: public void afterRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           {
>             try
>             {
>               $2.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.moreFilters() (at SimpleResultsFilters.java:97)");
>               if ($2.storeResult(($w) moreFilters())) return;
>               super.afterRender($$);
>             }
>             catch (RuntimeException ex) { throw ex; }
>             catch (Exception ex) { throw new RuntimeException(ex); }
>           }
>           add method: public void cleanupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           {
>             try
>             {
>               $2.setMethodDescription("com.proquest.apps.corelib.components.SimpleResultsFilters.initClickEventsJS() (at SimpleResultsFilters.java:108)");
>               initClickEventsJS();
>               super.cleanupRender($$);
>             }
>             catch (RuntimeException ex) { throw ex; }
>             catch (Exception ex) { throw new RuntimeException(ex); }
>           }
>           add field: protected final org.apache.tapestry5.internal.services.ComponentResourcesOperation _$operation;
>           extend method: public void setupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           _$operation.perform(_$resources);
>           add field: protected final org.apache.tapestry5.internal.services.ComponentResourcesOperation _$operation_0;
>           extend method: public void setupRender(org.apache.tapestry5.MarkupWriter $1, org.apache.tapestry5.runtime.Event $2)
>           _$operation_0.perform(_$resources);
>           add transformed method: public final int getFilterIdx()
>           return filterIdx;
>           add transformed method: public final void setFilterIdx(int $1)
>           filterIdx = $1;
>           add transformed method: public final java.util.List getFilterList()
>           return filterList;
>           add transformed method: public final void setFilterList(java.util.List $1)
>           filterList = $1;
>           add transformed method: public final java.lang.String getFilters()
>           return filters;
>           add field: protected final org.apache.tapestry5.services.Environment _$environment;
>           add method: private org.apache.tapestry5.RenderSupport _$environment_read_renderSupport()
>           return ($r) _$environment.peekRequired($type);
>           replace read renderSupport: _$environment_read_renderSupport();
>           add method: private void _$write_renderSupport(org.apache.tapestry5.RenderSupport $1)
>           throw new java.lang.RuntimeException("Field com.proquest.apps.corelib.components.SimpleResultsFilters.renderSupport is read-only.");
>           replace write renderSupport: _$write_renderSupport();
>           remove field renderSupport;
>           add field: private int _$filterIdx_default;
>           extend method: public void containingPageDidLoad()
>           _$filterIdx_default = filterIdx;
>           extend method: public void containingPageDidDetach()
>           filterIdx = _$filterIdx_default;
>           add field: private java.util.Iterator _$filterIter_default;
>           extend method: public void containingPageDidLoad()
>           _$filterIter_default = filterIter;
>           extend method: public void containingPageDidDetach()
>           filterIter = _$filterIter_default;
>           add field: private java.util.List _$filterList_default;
>           extend method: public void containingPageDidLoad()
>           _$filterList_default = filterList;
>           extend method: public void containingPageDidDetach()
>           filterList = _$filterList_default;
>           Checking field write filterIter in method initFilterList(): field not transformed
>           Checking field write filterIdx in method initFilterList(): field not transformed
>           Checking field read filterIter in method initFilterList(): field not transformed
>           Checking field read filterIter in method nextFilter(): field not transformed
>           Checking field write filterList in method nextFilter(): field not transformed
>           Checking field read filterIdx in method nextFilter(): field not transformed
>           Checking field write filterIdx in method nextFilter(): field not transformed
>           Checking field read filterIter in method moreFilters(): field not transformed
>           Checking field read renderSupport in method initClickEventsJS(): replacing with $_ = $0._$environment_read_renderSupport();
>           ]
>     * java.lang.ArrayIndexOutOfBoundsException
>       7
>       Stack trace
>               o javassist.bytecode.ByteArray.write16bit(ByteArray.java:40)
>               o javassist.bytecode.StackMapTable$Shifter.update(StackMapTable.java:744)
>               o javassist.bytecode.StackMapTable$Shifter.sameFrame(StackMapTable.java:720)
>               o javassist.bytecode.StackMapTable$Walker.stackMapFrames(StackMapTable.java:194)
>               o javassist.bytecode.StackMapTable$Walker.parse(StackMapTable.java:179)
>               o javassist.bytecode.StackMapTable$Shifter.doit(StackMapTable.java:714)
>               o javassist.bytecode.StackMapTable.shiftPc(StackMapTable.java:693)
>               o javassist.bytecode.CodeIterator.insertGap0(CodeIterator.java:676)
>               o javassist.bytecode.CodeIterator.insertGap(CodeIterator.java:636)
>               o javassist.bytecode.CodeIterator.insertGapCore(CodeIterator.java:467)
>               o javassist.bytecode.CodeIterator.insertGap(CodeIterator.java:413)
>               o javassist.expr.Expr.replace0(Expr.java:298)
>               o javassist.expr.FieldAccess.replace(FieldAccess.java:213)
>               o org.apache.tapestry5.internal.services.InternalClassTransformationImpl$2.edit(InternalClassTransformationImpl.java:1685)
>               o javassist.expr.ExprEditor.loopBody(ExprEditor.java:197)
>               o javassist.expr.ExprEditor.doit(ExprEditor.java:90)
>               o javassist.CtClassType.instrument(CtClassType.java:1289)
>               o org.apache.tapestry5.internal.services.InternalClassTransformationImpl.replaceFieldAccess(InternalClassTransformationImpl.java:1691)
>               o org.apache.tapestry5.internal.services.InternalClassTransformationImpl.performFieldTransformations(InternalClassTransformationImpl.java:1619)
>               o org.apache.tapestry5.internal.services.InternalClassTransformationImpl.finish(InternalClassTransformationImpl.java:1298)
>               o org.apache.tapestry5.internal.services.ComponentClassTransformerImpl.transformComponentClass(ComponentClassTransformerImpl.java:160)
>               o org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl.onLoad(ComponentInstantiatorSourceImpl.java:171)
>               o javassist.Loader.findClass(Loader.java:340)
>               o org.apache.tapestry5.internal.services.ComponentInstantiatorSourceImpl$PackageAwareLoader.findClass(ComponentInstantiatorSourceImpl.java:78)
>               o javassist.Loader.loadClass(Loader.java:311)
>               o java.lang.ClassLoader.loadClass(ClassLoader.java:251)
>               o java.lang.ClassLoader.loadClassInternal(ClassLoader.java:319)
>               o java.lang.Class.getDeclaredMethods0(Native Method)
>               o java.lang.Class.privateGetDeclaredMethods(Class.java:2427)
>               o java.lang.Class.getDeclaredMethods(Class.java:1791)
>               o java.beans.Introspector$1.run(Introspector.java:1272)
>               o java.security.AccessController.doPrivileged(Native Method)
>               o java.beans.Introspector.getPublicDeclaredMethods(Introspector.java:1270)
>               o java.beans.Introspector.getTargetMethodInfo(Introspector.java:1136)
>               o java.beans.Introspector.getBeanInfo(Introspector.java:387)
>               o java.beans.Introspector.getBeanInfo(Introspector.java:159)
>               o org.apache.tapestry5.ioc.internal.services.PropertyAccessImpl.buildAdapter(PropertyAccessImpl.java:84)
>               o org.apache.tapestry5.ioc.internal.services.PropertyAccessImpl.getAdapter(PropertyAccessImpl.java:65)
>               o org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.readInfoForTerm(PropertyConduitSourceImpl.java:459)
>               o org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.writePropertyNavigationCode(PropertyConduitSourceImpl.java:281)
>               o org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.buildGetter(PropertyConduitSourceImpl.java:217)
>               o org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.build(PropertyConduitSourceImpl.java:174)
>               o org.apache.tapestry5.internal.services.PropertyConduitSourceImpl.create(PropertyConduitSourceImpl.java:120)
>               o org.apache.tapestry5.internal.bindings.PropBindingFactory.newBinding(PropBindingFactory.java:48)
>               o org.apache.tapestry5.internal.services.BindingSourceImpl.newBinding(BindingSourceImpl.java:78)
>               o org.apache.tapestry5.internal.services.PageElementFactoryImpl.newExpansionElement(PageElementFactoryImpl.java:176)
>               o org.apache.tapestry5.internal.services.PageLoaderProcessor.expansion(PageLoaderProcessor.java:356)
>               o org.apache.tapestry5.internal.services.PageLoaderProcessor.loadTemplateForComponent(PageLoaderProcessor.java:489)
>               o org.apache.tapestry5.internal.services.PageLoaderProcessor.workComponentQueue(PageLoaderProcessor.java:808)
>               o org.apache.tapestry5.internal.services.PageLoaderProcessor.loadPage(PageLoaderProcessor.java:393)
>               o org.apache.tapestry5.internal.services.PageLoaderImpl.loadPage(PageLoaderImpl.java:59)
>               o org.apache.tapestry5.internal.services.PagePoolCache.checkout(PagePoolCache.java:210)
>               o org.apache.tapestry5.internal.services.PagePoolImpl.checkout(PagePoolImpl.java:107)
>               o org.apache.tapestry5.internal.services.RequestPageCacheImpl.get(RequestPageCacheImpl.java:43)
>               o org.apache.tapestry5.internal.services.RequestSecurityManagerImpl.checkForInsecureRequest(RequestSecurityManagerImpl.java:59)
>               o org.apache.tapestry5.services.TapestryModule$28.handle(TapestryModule.java:1670)
>               o org.apache.tapestry5.internal.services.PageRenderDispatcher.process(PageRenderDispatcher.java:97)
>               o org.apache.tapestry5.internal.services.PageRenderDispatcher.dispatch(PageRenderDispatcher.java:73)
>               o org.apache.tapestry5.services.TapestryModule$12.service(TapestryModule.java:938)
>               o org.apache.tapestry5.internal.services.LocalizationFilter.service(LocalizationFilter.java:42)
>               o org.apache.tapestry5.services.TapestryModule$2.service(TapestryModule.java:586)
>               o org.apache.tapestry5.internal.services.RequestErrorFilter.service(RequestErrorFilter.java:26)
>               o org.apache.tapestry5.internal.services.StaticFilesFilter.service(StaticFilesFilter.java:79)
>               o com.proquest.apps.corelib.AppCoreLibModule$1.service(AppCoreLibModule.java:84)
>               o org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:93)
>               o org.apache.tapestry5.internal.services.CheckForUpdatesFilter$2.invoke(CheckForUpdatesFilter.java:84)
>               o org.apache.tapestry5.ioc.internal.util.ConcurrentBarrier.withRead(ConcurrentBarrier.java:75)
>               o org.apache.tapestry5.internal.services.CheckForUpdatesFilter.service(CheckForUpdatesFilter.java:106)
>               o org.apache.tapestry5.services.TapestryModule$11.service(TapestryModule.java:918)
>               o org.apache.tapestry5.internal.services.IgnoredPathsFilter.service(IgnoredPathsFilter.java:62)
>               o org.apache.tapestry5.TapestryFilter.doFilter(TapestryFilter.java:168)
>               o org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
>               o org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
>               o org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
>               o org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
>               o org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:722)
>               o org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:404)
>               o org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
>               o org.mortbay.jetty.Server.handle(Server.java:324)
>               o org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505)
>               o org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:828)
>               o org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
>               o org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
>               o org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:380)
>               o org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395)
>               o org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:450)

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.


---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tapestry.apache.org
For additional commands, e-mail: dev-help@tapestry.apache.org