You are viewing a plain text version of this content. The canonical link for it is here.
Posted to users@tiles.apache.org by "BR Brett Ryan (3456)" <Br...@johnsands.com.au> on 2014/02/24 06:58:42 UTC
Can I create a regex that matches an optional parameter?
I'd like to create the following definition:
<definition name="REGEXP:home(\.(mob|tab))?" extends="layout{1}"/>
Which I have three layouts, layout, layout.mob and layout.tab.
I'd like this definition to match "layout" if "home" is accessed, but I get an NPE.
The mob and tab variants do work.
Re: Can I create a regex that matches an optional parameter?
Posted by "BR Brett Ryan (3456)" <Br...@johnsands.com.au>.
Excellent, I've created a few templates using the pattern I described and it's working brilliantly.
Apologies for taking a little while to get back to you, I was trying to find the change in the Git repository, the fork banner was what confused me before I found it in svn.
I look forward to the 3.0.4 release.
Many thanks,
-Brett
On 25 Feb 2014, at 9:52 pm, mck <mc...@apache.org> wrote:
>
>> <definition name="layout" template="/WEB-INF/layout/web.jsp"/>
>> <definition name="layout.mob" template="/WEB-INF/layout/mob.jsp"/>
>> <definition name="layout.tab" template="/WEB-INF/layout/tab.jsp"/>
>> <definition name="REGEXP:home(\.(mob|tab))?" extends="layout{1}">
>> <put-attribute name="heading" value="Home" />
>> <put-list-attribute name="body">
>> <add-attribute value="/WEB-INF/views/home.jsp" />
>> </put-list-attribute>
>> </definition>
>
>
> Thanks.
> The code ends up looking for "layoutnull" instead of "layout".
>
> This comes from in RegexpDefinitionPatternMatcher.createDefinition(..)
> the call to matcher.group(i) returning null.
>
> Rather than fix it there though i'd rather put the fix in lower down in
> PatternUtil.replacePlaceholders(..) so that any nulls in the vars
> parameter are always replaced with blanks.
>
> see http://thread.gmane.org/gmane.comp.apache.tiles.scm/576
>
> Feel free to checkout this code, switch to "TILES_3_0_X" branch, build,
> depend on tiles-core-3.0.4-SNAPSHOT and test.
> Feedback would be great if you get the chance.
>
> ~mck
>
>
> --
> “So much of what we call management consists in making it difficult for
> people to work.” - Peter Drucker
>
> | http://github.com/finn-no | http://tech.finn.no |
>
Re: Can I create a regex that matches an optional parameter?
Posted by mck <mc...@apache.org>.
> <definition name="layout" template="/WEB-INF/layout/web.jsp"/>
> <definition name="layout.mob" template="/WEB-INF/layout/mob.jsp"/>
> <definition name="layout.tab" template="/WEB-INF/layout/tab.jsp"/>
> <definition name="REGEXP:home(\.(mob|tab))?" extends="layout{1}">
> <put-attribute name="heading" value="Home" />
> <put-list-attribute name="body">
> <add-attribute value="/WEB-INF/views/home.jsp" />
> </put-list-attribute>
> </definition>
Thanks.
The code ends up looking for "layoutnull" instead of "layout".
This comes from in RegexpDefinitionPatternMatcher.createDefinition(..)
the call to matcher.group(i) returning null.
Rather than fix it there though i'd rather put the fix in lower down in
PatternUtil.replacePlaceholders(..) so that any nulls in the vars
parameter are always replaced with blanks.
see http://thread.gmane.org/gmane.comp.apache.tiles.scm/576
Feel free to checkout this code, switch to "TILES_3_0_X" branch, build,
depend on tiles-core-3.0.4-SNAPSHOT and test.
Feedback would be great if you get the chance.
~mck
--
“So much of what we call management consists in making it difficult for
people to work.” - Peter Drucker
| http://github.com/finn-no | http://tech.finn.no |
Re: Can I create a regex that matches an optional parameter?
Posted by "BR Brett Ryan (3456)" <Br...@johnsands.com.au>.
Here is the definitions being used:
<definition name="layout" template="/WEB-INF/layout/web.jsp"/>
<definition name="layout.mob" template="/WEB-INF/layout/mob.jsp"/>
<definition name="layout.tab" template="/WEB-INF/layout/tab.jsp"/>
<definition name="REGEXP:home(\.(mob|tab))?" extends="layout{1}">
<put-attribute name="heading" value="Home" />
<put-list-attribute name="body">
<add-attribute value="/WEB-INF/views/home.jsp" />
</put-list-attribute>
</definition>
The above rules match a pattern employed with spring-mobile where views can be resolved based on (mob)ile/(tab)let/normal , as normal is a fallback it does not contain a suffix.
I can understand why this fails as the capture {1} does not exist in the found pattern, instead I'd like it to recognise this and evaluate to an empty string.
Full stack-trace is as follows:
java.lang.NullPointerException
at org.apache.tiles.BasicAttributeContext.inherit(BasicAttributeContext.java:212)
at org.apache.tiles.definition.dao.ResolvingLocaleUrlDefinitionDAO.getDefinitionFromResolver(ResolvingLocaleUrlDefinitionDAO.java:84)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:110)
at org.apache.tiles.definition.dao.CachingLocaleUrlDefinitionDAO.getDefinition(CachingLocaleUrlDefinitionDAO.java:49)
at org.apache.tiles.definition.UnresolvingLocaleDefinitionsFactory.getDefinition(UnresolvingLocaleDefinitionsFactory.java:89)
at org.apache.tiles.impl.BasicTilesContainer.getDefinition(BasicTilesContainer.java:286)
at org.apache.tiles.impl.BasicTilesContainer.isValidDefinition(BasicTilesContainer.java:273)
at org.apache.tiles.TilesContainerWrapper.isValidDefinition(TilesContainerWrapper.java:88)
at org.apache.tiles.impl.mgmt.CachingTilesContainer.isValidDefinition(CachingTilesContainer.java:100)
at org.apache.tiles.renderer.DefinitionRenderer.isRenderable(DefinitionRenderer.java:64)
at org.springframework.web.servlet.view.tiles3.TilesView.checkResource(TilesView.java:101)
at org.springframework.web.servlet.view.UrlBasedViewResolver.loadView(UrlBasedViewResolver.java:439)
at org.springframework.web.servlet.view.AbstractCachingViewResolver.createView(AbstractCachingViewResolver.java:244)
at org.springframework.web.servlet.view.UrlBasedViewResolver.createView(UrlBasedViewResolver.java:402)
at org.springframework.web.servlet.view.AbstractCachingViewResolver.resolveViewName(AbstractCachingViewResolver.java:156)
at org.springframework.mobile.device.view.AbstractDeviceDelegatingViewResolver.resolveViewName(AbstractDeviceDelegatingViewResolver.java:98)
at org.springframework.web.servlet.DispatcherServlet.resolveViewName(DispatcherServlet.java:1264)
at org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1204)
at org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1012)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:301)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.johnsands.web.filter.IECompatibilityFilter.doFilter(IECompatibilityFilter.java:57)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.authentication.switchuser.SwitchUserFilter.doFilter(SwitchUserFilter.java:181)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:136)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:74)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:509)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1015)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:651)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1575)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1533)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:744)
On 24 Feb 2014, at 6:20 pm, mck <mc...@apache.org>> wrote:
I'd like this definition to match "layout" if "home" is accessed, but
I get an NPE.
Would you mind posting the stacktrace?
~mck
Re: Can I create a regex that matches an optional parameter?
Posted by mck <mc...@apache.org>.
> I'd like this definition to match "layout" if "home" is accessed, but
> I get an NPE.
Would you mind posting the stacktrace?
~mck