]> source.dussan.org Git - archiva.git/blob
1cb8f854288193bba4e28f6ffa32c3f9ef970a0e
[archiva.git] /
1 package org.apache.maven.archiva.web.tags;
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 java.io.IOException;
23 import java.io.Writer;
24 import java.text.DecimalFormat;
25 import java.util.ArrayList;
26 import java.util.Collection;
27 import java.util.Collections;
28 import java.util.HashMap;
29 import java.util.List;
30 import java.util.Map;
31 import javax.servlet.http.HttpServletRequest;
32 import javax.servlet.jsp.PageContext;
33
34 import com.opensymphony.xwork2.ActionContext;
35 import com.opensymphony.xwork2.util.ValueStack;
36 import org.apache.archiva.metadata.model.ArtifactMetadata;
37 import org.apache.archiva.metadata.repository.MetadataResolver;
38 import org.apache.commons.lang.StringEscapeUtils;
39 import org.apache.commons.lang.StringUtils;
40 import org.apache.maven.archiva.model.ArtifactReference;
41 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
42 import org.apache.maven.archiva.repository.RepositoryContentFactory;
43 import org.apache.maven.archiva.repository.RepositoryException;
44 import org.apache.maven.archiva.repository.RepositoryNotFoundException;
45 import org.apache.maven.archiva.repository.layout.LayoutException;
46 import org.apache.maven.archiva.security.ArchivaSecurityException;
47 import org.apache.maven.archiva.security.ArchivaXworkUser;
48 import org.apache.maven.archiva.security.UserRepositories;
49 import org.apache.struts2.StrutsException;
50 import org.apache.struts2.components.Component;
51 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
52
53 public class DownloadArtifact
54     extends Component
55 {
56     private static final String DEFAULT_DOWNLOAD_IMAGE = "download-type-other.png";
57
58     private RepositoryContentFactory repositoryFactory;
59
60     private MetadataResolver metadataResolver;
61
62     private HttpServletRequest req;
63
64     private String groupId;
65
66     private String artifactId;
67
68     private String version;
69
70     private boolean mini = false;
71
72     private DecimalFormat decimalFormat;
73
74     private static final Map<String, String> DOWNLOAD_IMAGES = new HashMap<String, String>();
75
76     private UserRepositories userRepositories;
77
78     static
79     {
80         DOWNLOAD_IMAGES.put( "jar", "download-type-jar.png" );
81         DOWNLOAD_IMAGES.put( "java-source", "download-type-jar.png" );
82         DOWNLOAD_IMAGES.put( "pom", "download-type-pom.png" );
83         DOWNLOAD_IMAGES.put( "maven-plugin", "download-type-maven-plugin.png" );
84         DOWNLOAD_IMAGES.put( "maven-archetype", "download-type-archetype.png" );
85         DOWNLOAD_IMAGES.put( "maven-skin", "download-type-skin.png" );
86     }
87
88     public DownloadArtifact( ValueStack stack, PageContext pageContext )
89     {
90         super( stack );
91         decimalFormat = new DecimalFormat( "#,#00" );
92         this.req = (HttpServletRequest) pageContext.getRequest();
93         try
94         {
95             metadataResolver = (MetadataResolver) PlexusTagUtil.lookup( pageContext, MetadataResolver.class );
96             repositoryFactory =
97                 (RepositoryContentFactory) PlexusTagUtil.lookup( pageContext, RepositoryContentFactory.class );
98             userRepositories = (UserRepositories) PlexusTagUtil.lookup( pageContext, UserRepositories.class );
99         }
100         catch ( ComponentLookupException e )
101         {
102             throw new RuntimeException( e.getMessage(), e );
103         }
104     }
105
106     @Override
107     public boolean end( Writer writer, String body )
108     {
109         StringBuffer sb = new StringBuffer();
110
111         try
112         {
113             List<ArtifactMetadata> artifacts = new ArrayList<ArtifactMetadata>();
114             for ( String repoId : getObservableRepos() )
115             {
116                 artifacts.addAll( metadataResolver.getArtifacts( repoId, groupId, artifactId, version ) );
117             }
118
119             if ( !artifacts.isEmpty() )
120             {
121                 String prefix = req.getContextPath() + "/repository/";
122
123                 if ( mini )
124                 {
125                     // TODO: write 1 line download link for main artifact.
126                 }
127                 else
128                 {
129                     appendNormal( sb, prefix, artifacts );
130                 }
131             }
132         }
133         catch ( RepositoryNotFoundException e )
134         {
135             // TODO Auto-generated catch block
136             e.printStackTrace();
137         }
138         catch ( RepositoryException e )
139         {
140             // TODO Auto-generated catch block
141             e.printStackTrace();
142         }
143
144         try
145         {
146             writer.write( sb.toString() );
147         }
148         catch ( IOException e )
149         {
150             throw new StrutsException( "IOError: " + e.getMessage(), e );
151         }
152
153         return super.end( writer, body );
154     }
155
156     private void appendNormal( StringBuffer sb, String prefix, List<ArtifactMetadata> relatedArtifacts )
157         throws RepositoryException
158     {
159         /*
160          * <div class="download">
161          *   <div class="hd"> 
162          *     <div class="c"></div>
163          *   </div>
164          *   <div class="bd">
165          *     <div class="c">
166          *       <-- main content goes here -->
167          *     </div>
168          *   </div>
169          *   <div class="ft">
170          *     <div class="c"></div>
171          *   </div>
172          * </div>
173          */
174
175         sb.append( "<div class=\"download\">" );
176         sb.append( "<div class=\"hd\"><div class=\"c\"></div></div>" );
177         sb.append( "<div class=\"bd\"><div class=\"c\">" );
178
179         // Heading
180         sb.append( "<h2>" );
181         if ( relatedArtifacts.size() > 1 )
182         {
183             sb.append( "Downloads" );
184         }
185         else
186         {
187             sb.append( "Download" );
188         }
189         sb.append( "</h2>" );
190
191         // Body
192         sb.append( "<p class=\"body\">" );
193
194         sb.append( "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" );
195         for ( ArtifactMetadata artifact : relatedArtifacts )
196         {
197             String repoId = artifact.getRepositoryId();
198             ManagedRepositoryContent repo = repositoryFactory.getManagedRepositoryContent( repoId );
199
200             sb.append( "\n<tr>" );
201
202             sb.append( "<td class=\"icon\">" );
203             appendImageLink( sb, prefix + repoId, repo, artifact );
204             sb.append( "</td>" );
205
206             sb.append( "<td class=\"type\">" );
207             appendLink( sb, prefix + repoId, repo, artifact );
208             sb.append( "</td>" );
209
210             sb.append( "<td class=\"size\">" );
211             appendFilesize( sb, artifact );
212             sb.append( "</td>" );
213
214             sb.append( "</tr>" );
215         }
216         sb.append( "</table>" );
217         sb.append( "</p>" );
218
219         sb.append( "</div>" ); // close "downloadbox.bd.c"
220         sb.append( "</div>" ); // close "downloadbox.bd"
221
222         sb.append( "<div class=\"ft\"><div class=\"c\"></div></div>" );
223         sb.append( "</div>" ); // close "download"
224     }
225
226     private void appendImageLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
227                                   ArtifactMetadata artifact )
228     {
229         String path = getPath( repo, artifact );
230         String type = getType( repo, path );
231         String linkText = "<img src=\"" + req.getContextPath() + "/images/" + getDownloadImage( type ) + "\" />";
232         appendLink( sb, prefix, artifact, linkText, path );
233     }
234
235     private String getType( ManagedRepositoryContent repo, String path )
236     {
237         String type = null;
238         try
239         {
240             type = repo.toArtifactReference( path ).getType();
241         }
242         catch ( LayoutException e )
243         {
244             e.printStackTrace();  //TODO
245         }
246         return type;
247     }
248
249     private String getDownloadImage( String type )
250     {
251         String name = DOWNLOAD_IMAGES.get( type );
252         return name != null ? name : DEFAULT_DOWNLOAD_IMAGE;
253     }
254
255     private static void appendLink( StringBuffer sb, String prefix, ArtifactMetadata artifact, String linkText,
256                                     String path )
257     {
258
259         StringBuffer url = new StringBuffer();
260         url.append( prefix );
261         url.append( "/" ).append( path );
262
263         sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
264         sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( artifact.getId() ) ).append(
265             "\"" );
266         sb.append( ">" );
267
268         sb.append( linkText );
269
270         sb.append( "</a>" );
271     }
272
273     private static String getPath( ManagedRepositoryContent repo, ArtifactMetadata artifact )
274     {
275         // TODO: use metadata resolver capability instead
276         ArtifactReference ref = new ArtifactReference();
277         ref.setArtifactId( artifact.getProject() );
278         ref.setGroupId( artifact.getNamespace() );
279         ref.setVersion( artifact.getVersion() );
280         String path = repo.toPath( ref );
281         path = path.substring( 0, path.lastIndexOf( "/" ) + 1 ) + artifact.getId();
282         return path;
283     }
284
285     private void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo, ArtifactMetadata artifact )
286     {
287         String path = getPath( repo, artifact );
288         String type = getType( repo, path );
289         String linkText = StringUtils.capitalize( type );
290
291         appendLink( sb, prefix, artifact, linkText, path );
292     }
293
294     private void appendFilesize( StringBuffer sb, ArtifactMetadata artifact )
295     {
296         sb.append( decimalFormat.format( artifact.getSize() ) );
297     }
298
299     public void setArtifactId( String artifactId )
300     {
301         this.artifactId = artifactId;
302     }
303
304     public void setGroupId( String groupId )
305     {
306         this.groupId = groupId;
307     }
308
309     public void setMini( boolean mini )
310     {
311         this.mini = mini;
312     }
313
314     public void setVersion( String version )
315     {
316         this.version = version;
317     }
318
319     public Collection<String> getObservableRepos()
320     {
321         try
322         {
323             ActionContext context = ActionContext.getContext();
324             Map session = context.getSession();
325             return userRepositories.getObservableRepositoryIds( ArchivaXworkUser.getActivePrincipal( session ) );
326         }
327         catch ( ArchivaSecurityException e )
328         {
329             e.printStackTrace();  //TODO
330             return Collections.emptyList();
331         }
332     }
333 }