]> source.dussan.org Git - archiva.git/blob
9bc28f28a28c9158e54fad4d29aeaedd41b55977
[archiva.git] /
1 package org.apache.maven.archiva.web.mapper;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  *   http://www.apache.org/licenses/LICENSE-2.0
13  *
14  * Unless required by applicable law or agreed to in writing,
15  * software distributed under the License is distributed on an
16  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17  * KIND, either express or implied.  See the License for the
18  * specific language governing permissions and limitations
19  * under the License.
20  */
21
22 import com.opensymphony.xwork2.config.ConfigurationManager;
23 import org.apache.struts2.dispatcher.mapper.ActionMapping;
24 import org.apache.struts2.dispatcher.mapper.DefaultActionMapper;
25
26 import org.apache.commons.lang.StringUtils;
27
28 import java.util.HashMap;
29 import java.util.Map;
30
31 import javax.servlet.http.HttpServletRequest;
32
33 /**
34  * Map alternate URLs to specific actions. Used for the repository browser and the proxy.
35  *
36  */
37 public class RepositoryActionMapper
38     extends DefaultActionMapper
39 {
40     private static final String ACTION_BROWSE = "browse";
41
42     private static final String ACTION_BROWSE_ARTIFACT = "browseArtifact";
43
44     private static final String ACTION_BROWSE_GROUP = "browseGroup";
45
46     private static final String ACTION_SHOW_ARTIFACT = "showArtifact";
47
48     private static final String ACTION_SHOW_ARTIFACT_DEPENDEES = "showArtifactDependees";
49
50     private static final String ACTION_SHOW_ARTIFACT_DEPENDENCIES = "showArtifactDependencies";
51
52     private static final String ACTION_SHOW_ARTIFACT_DEPENDENCY_TREE = "showArtifactDependencyTree";
53
54     private static final String ACTION_SHOW_ARTIFACT_MAILING_LISTS = "showArtifactMailingLists";
55
56     private static final String BROWSE_PREFIX = "/browse";
57
58     private static final String METHOD_DEPENDENCIES = "dependencies";
59
60     private static final String METHOD_DEPENDENCY_TREE = "dependencyTree";
61
62     private static final String METHOD_MAILING_LISTS = "mailingLists";
63
64     private static final String METHOD_USEDBY = "usedby";
65
66     private static final String PARAM_ARTIFACT_ID = "artifactId";
67
68     private static final String PARAM_GROUP_ID = "groupId";
69
70     private static final String PARAM_VERSION = "version";
71     
72     private static final String ACTION_EXTENSION = "action";
73
74     public ActionMapping getMapping( HttpServletRequest httpServletRequest, ConfigurationManager manager )
75     {
76         String path = httpServletRequest.getServletPath();
77
78         if ("".equals(path)){
79                 // if JEE 5 spec is correctly implemented, the "/*" pattern implies an empty string in servletpath
80                 path = httpServletRequest.getPathInfo();
81         }
82         
83         if ( path.startsWith( BROWSE_PREFIX ) )
84         {
85             path = path.substring( BROWSE_PREFIX.length() );
86             if ( StringUtils.isBlank( path ) ||
87                  StringUtils.equals( path, "/" ) || 
88                  StringUtils.equals( path, ".action" ) )
89             {
90                 // Return "root" browse.
91                 return createActionMapping( ACTION_BROWSE, "/", "", null );
92             }
93             else
94             {
95                 Map<String, String> params = new HashMap<String, String>();
96
97                 if ( path.charAt( 0 ) == '/' )
98                 {
99                     path = path.substring( 1 );
100                 }
101
102                 String[] parts = path.split( "/" );
103                 switch ( parts.length )
104                 {
105                     case 1:
106                         params.put( PARAM_GROUP_ID, parts[0] );
107                         return createActionMapping( ACTION_BROWSE_GROUP, "/", "", params );
108
109                     case 2:
110                         params.put( PARAM_GROUP_ID, parts[0] );
111                         params.put( PARAM_ARTIFACT_ID, parts[1] );
112                         return createActionMapping( ACTION_BROWSE_ARTIFACT, "/", "", params );
113
114                     case 3:
115                         params.put( PARAM_GROUP_ID, parts[0] );
116                         params.put( PARAM_ARTIFACT_ID, parts[1] );
117                         params.put( PARAM_VERSION, parts[2] );
118                         return createActionMapping( ACTION_SHOW_ARTIFACT, "/", "", params );
119
120                     case 4:
121                         params.put( PARAM_GROUP_ID, parts[0] );
122                         params.put( PARAM_ARTIFACT_ID, parts[1] );
123                         params.put( PARAM_VERSION, parts[2] );
124
125                         if ( METHOD_DEPENDENCIES.equals( parts[3] ) )
126                         {
127                             return createActionMapping( ACTION_SHOW_ARTIFACT_DEPENDENCIES, "/", "", params );
128                         }
129                         else if ( METHOD_MAILING_LISTS.equals( parts[3] ) )
130                         {
131                             return createActionMapping( ACTION_SHOW_ARTIFACT_MAILING_LISTS, "/", "", params );
132                         }
133                         else if ( METHOD_USEDBY.equals( parts[3] ) )
134                         {
135                             return createActionMapping( ACTION_SHOW_ARTIFACT_DEPENDEES, "/", "", params );
136                         }
137                         else if ( METHOD_DEPENDENCY_TREE.equals( parts[3] ) )
138                         {
139                             return createActionMapping( ACTION_SHOW_ARTIFACT_DEPENDENCY_TREE, "/", "", params );
140                         }
141                         break;
142                 }
143             }
144         }
145
146         return super.getMapping( httpServletRequest, manager );
147     }
148
149     @SuppressWarnings("unchecked")
150     @Override
151     public String getUriFromActionMapping( ActionMapping actionMapping )
152     {
153         Map<String, Object> params = actionMapping.getParams();
154         if ( ACTION_BROWSE.equals( actionMapping.getName() ) )
155         {
156             return BROWSE_PREFIX;
157         }
158         else if ( ACTION_BROWSE_GROUP.equals( actionMapping.getName() ) )
159         {
160             return toUri( params, false, false, null );
161         }
162         else if ( ACTION_BROWSE_ARTIFACT.equals( actionMapping.getName() ) )
163         {
164             return toUri( params, true, false, null );
165         }
166         else if ( ACTION_SHOW_ARTIFACT.equals( actionMapping.getName() ) )
167         {
168             return toUri( params, true, true, null );
169         }
170         else if ( ACTION_SHOW_ARTIFACT_DEPENDENCIES.equals( actionMapping.getName() ) )
171         {
172             return toUri( params, true, true, METHOD_DEPENDENCIES );
173         }
174         else if ( ACTION_SHOW_ARTIFACT_MAILING_LISTS.equals( actionMapping.getName() ) )
175         {
176             return toUri( params, true, true, METHOD_MAILING_LISTS );
177         }
178         else if ( ACTION_SHOW_ARTIFACT_DEPENDEES.equals( actionMapping.getName() ) )
179         {
180             return toUri( params, true, true, METHOD_USEDBY );
181         }
182         else if ( ACTION_SHOW_ARTIFACT_DEPENDENCY_TREE.equals( actionMapping.getName() ) )
183         {
184             return toUri( params, true, true, METHOD_DEPENDENCY_TREE );
185         }
186
187         return super.getUriFromActionMapping( actionMapping );
188     }
189
190     private String toUri( Map<String, Object> params, boolean artifactId, boolean version, String method )
191     {
192         StringBuffer buf = new StringBuffer();
193
194         buf.append( BROWSE_PREFIX );
195         buf.append( '/' );
196         buf.append( params.remove( PARAM_GROUP_ID ) );
197
198         if ( artifactId )
199         {
200             buf.append( '/' );
201             buf.append( params.remove( PARAM_ARTIFACT_ID ) );
202
203             if ( version )
204             {
205                 buf.append( '/' );
206                 buf.append( params.remove( PARAM_VERSION ) );
207
208                 if ( StringUtils.isNotBlank( method ) )
209                 {
210                     buf.append( '/' );
211                     buf.append( method );
212                 }
213             }
214         }
215
216         return buf.toString();
217     }
218     
219     private ActionMapping createActionMapping( String name, String namespace, String method, Map params )
220     {
221         ActionMapping mapping = new ActionMapping( name, namespace, method, params );
222         mapping.setExtension( ACTION_EXTENSION );
223         
224         return mapping;
225     }
226 }