[ 
https://issues.apache.org/jira/browse/WW-3849?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13412559#comment-13412559
 ] 

Jose L Martinez-Avial commented on WW-3849:
-------------------------------------------

I would like to reuse the actions, excluding the prefix from the URI before 
calling the mapper. So the uris /mypackage/myaction, /en/mypackage/myaction and 
/pt/mypackage/myaction would be processed by the same action mapping.

The idea would be to provide a list of prefixes that need to be removed from 
the URI when looking for the corresponding ActionMapping. Initially I thought 
that the best option was using PrefixBaseActionMapper, but since it does not 
remove the prefix, I can not use it.

After some thinking, I ended extending the methods parseNameAndNamespace and 
getUriFromActionMapping from DefaultActionMapper. The method 
parseNameAndNamespace  checks the uri agains the prefixes, and removes the 
prefix if there is a match, and then calls the parent's method. Then the prefix 
is saved in the request context:

        private String prefixes[] = new String[] { "/en", "/pt", "/es" };

        public static final String PREFFIX_ATTRIBUTE_NAME = 
"PREFFIX_ATTRIBUTE_NAME";
        protected void parseNameAndNamespace(String uri, ActionMapping mapping, 
ConfigurationManager configManager) {
                String actionPrefix = null;

                for (String prefix1 : prefixes) {
                        if (uri.startsWith(prefix1)) {
                                actionPrefix = prefix1;
                                //LOG.debug("Removing preffix " + prefix1);
                                uri = uri.substring(prefix1.length());
                                //LOG.debug("New URI " + uri);
                                break;
                        }
                }
                super.parseNameAndNamespace(uri,mapping,configManager);
                if (actionPrefix != null) {
                        HttpServletRequest request = 
ServletActionContext.getRequest();
                        request.setAttribute(PREFFIX_ATTRIBUTE_NAME, 
actionPrefix);
                }

        }

On the method getUriFromActionMapping I retrieve the prefix from the request:

        public String getUriFromActionMapping(ActionMapping mapping) {
                String actionPrefix = "";
                HttpServletRequest request = ServletActionContext.getRequest();

                if (request.getAttribute(PREFFIX_ATTRIBUTE_NAME) != null)
                        actionPrefix = (String) 
request.getAttribute(PREFFIX_ATTRIBUTE_NAME);

                StringBuilder uri = new StringBuilder(actionPrefix);
[...]

It works fine, but it seems a bit of a hack, so maybe there is a better way to 
do this.

                
> Hability PrefixBasedActionMapper to exclude the prefix when retrieveing the 
> ActionMapper
> ----------------------------------------------------------------------------------------
>
>                 Key: WW-3849
>                 URL: https://issues.apache.org/jira/browse/WW-3849
>             Project: Struts 2
>          Issue Type: Improvement
>          Components: Dispatch Filter
>    Affects Versions: 2.2.3
>            Reporter: Jose L Martinez-Avial
>             Fix For: 2.3.x
>
>
> The PrefixBasedActionMapper is able to map different actions to different 
> mappers using prefixes. So you can have something like this:
> /preffix1:mapper1,/preffix2:mapper2,:defaultMapper
> And the following URIs would be processed by different mappers
> /preffix1/mynamespace1/myaction1 (by mapper1)
> /preffix2/mynamespace1/myaction1 (by mapper2)
> /mynamespace1/myaction1  (by defaultMapper)
> So you can have three different ActionMappers, one per prefix. The problem 
> with this is that you can not reuse the same actions for different 
> prefixes(ie, reuse an ActionMapper), since the ActionMapper will try to match 
> the full URI, without taking out the prefix. I suggest to parametrize the 
> PrefixBasedActionMapper to remove the preffix from the URI when calling the 
> ActionMapper, so the same mapper can be used more than once.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators: 
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to