]> source.dussan.org Git - archiva.git/blob
f3eac71111f1b1d8ed233cec2cc1cd00efa79df5
[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 org.apache.struts2.StrutsException;
23 import org.apache.struts2.components.Component;
24
25 import com.opensymphony.xwork2.util.ValueStack;
26 import org.apache.commons.lang.StringEscapeUtils;
27 import org.apache.commons.lang.StringUtils;
28 import org.apache.maven.archiva.database.ArchivaDAO;
29 import org.apache.maven.archiva.database.ArchivaDatabaseException;
30 import org.apache.maven.archiva.database.Constraint;
31 import org.apache.maven.archiva.database.ObjectNotFoundException;
32 import org.apache.maven.archiva.database.constraints.ArtifactsRelatedConstraint;
33 import org.apache.maven.archiva.model.ArchivaArtifact;
34 import org.apache.maven.archiva.repository.ManagedRepositoryContent;
35 import org.apache.maven.archiva.repository.RepositoryContentFactory;
36 import org.apache.maven.archiva.repository.RepositoryException;
37 import org.apache.maven.archiva.repository.RepositoryNotFoundException;
38 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
39
40 import java.io.IOException;
41 import java.io.Writer;
42 import java.text.DecimalFormat;
43 import java.util.List;
44
45 import javax.servlet.http.HttpServletRequest;
46 import javax.servlet.http.HttpServletResponse;
47 import javax.servlet.jsp.PageContext;
48
49 /**
50  * DownloadArtifact
51  *
52  * @version $Id$
53  * @plexus.component role="org.apache.struts2.components.Component" role-hint="download-artifact"
54  * instantiation-strategy="per-lookup"
55  */
56 public class DownloadArtifact
57     extends Component
58 {
59     /**
60      * @plexus.requirement role-hint="jdo"
61      */
62     private ArchivaDAO dao;
63     
64     /**
65      * @plexus.requirement
66      */
67     private RepositoryContentFactory repositoryFactory;
68
69     private HttpServletRequest req;
70
71     @SuppressWarnings("unused")
72     private HttpServletResponse res;
73
74     private String groupId;
75
76     private String artifactId;
77
78     private String version;
79
80     private boolean mini = false;
81
82     private DecimalFormat decimalFormat;
83
84     public DownloadArtifact( ValueStack stack, PageContext pageContext )
85     {
86         super( stack );
87         decimalFormat = new DecimalFormat( "#,#00" );
88         this.req = (HttpServletRequest) pageContext.getRequest();
89         this.res = (HttpServletResponse) pageContext.getResponse();
90         try
91         {
92             dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE, "jdo" );
93             repositoryFactory = (RepositoryContentFactory) PlexusTagUtil.lookup( pageContext,
94                                                                                  RepositoryContentFactory.class );
95         }
96         catch ( ComponentLookupException e )
97         {
98             throw new RuntimeException( e.getMessage(), e );
99         }
100     }
101
102     @Override
103     public boolean end( Writer writer, String body )
104     {
105         StringBuffer sb = new StringBuffer();
106
107         try
108         {
109             Constraint constraint = new ArtifactsRelatedConstraint( groupId, artifactId, version );
110             List<ArchivaArtifact> relatedArtifacts = dao.getArtifactDAO().queryArtifacts( constraint );
111
112             if ( relatedArtifacts != null && relatedArtifacts.size() > 0 )
113             {
114                 String prefix = req.getContextPath() + "/repository/";
115
116                 if ( mini )
117                 {
118                     appendMini( sb, prefix, relatedArtifacts );
119                 }
120                 else
121                 {
122                     appendNormal( sb, prefix, relatedArtifacts );
123                 }
124             }
125         }
126         catch ( ObjectNotFoundException e )
127         {
128             appendError( sb, e );
129         }
130         catch ( ArchivaDatabaseException e )
131         {
132             appendError( sb, e );
133         }
134         catch ( RepositoryNotFoundException e )
135         {
136             // TODO Auto-generated catch block
137             e.printStackTrace();
138         }
139         catch ( RepositoryException e )
140         {
141             // TODO Auto-generated catch block
142             e.printStackTrace();
143         }
144
145         try
146         {
147             writer.write( sb.toString() );
148         }
149         catch ( IOException e )
150         {
151             throw new StrutsException( "IOError: " + e.getMessage(), e );
152         }
153
154         return super.end( writer, body );
155     }
156
157     private void appendError( StringBuffer sb, Exception e )
158     {
159         /* do nothing */
160     }
161
162     private void appendMini( StringBuffer sb, String prefix, List<ArchivaArtifact> relatedArtifacts )
163     {
164         // TODO: write 1 line download link for main artifact.
165     }
166
167     private void appendNormal( StringBuffer sb, String prefix, List<ArchivaArtifact> relatedArtifacts )
168         throws RepositoryNotFoundException, RepositoryException
169     {
170         /*
171          * <div class="download">
172          *   <div class="hd"> 
173          *     <div class="c"></div>
174          *   </div>
175          *   <div class="bd">
176          *     <div class="c">
177          *       <-- main content goes here -->
178          *     </div>
179          *   </div>
180          *   <div class="ft">
181          *     <div class="c"></div>
182          *   </div>
183          * </div>
184          */
185
186         sb.append( "<div class=\"download\">" );
187         sb.append( "<div class=\"hd\"><div class=\"c\"></div></div>" );
188         sb.append( "<div class=\"bd\"><div class=\"c\">" );
189
190         // Heading
191         sb.append( "<h2>" );
192         if ( relatedArtifacts.size() > 1 )
193         {
194             sb.append( "Downloads" );
195         }
196         else
197         {
198             sb.append( "Download" );
199         }
200         sb.append( "</h2>" );
201
202         // Body
203         sb.append( "<p class=\"body\">" );
204
205         sb.append( "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" );
206         for ( ArchivaArtifact artifact : relatedArtifacts )
207         {
208             String repoId = artifact.getModel().getRepositoryId();
209             ManagedRepositoryContent repo = repositoryFactory.getManagedRepositoryContent( repoId );
210
211             sb.append( "\n<tr>" );
212
213             sb.append( "<td class=\"icon\">" );
214             appendImageLink( sb, prefix + repoId, repo, artifact );
215             sb.append( "</td>" );
216
217             sb.append( "<td class=\"type\">" );
218             appendLink( sb, prefix + repoId, repo, artifact );
219             sb.append( "</td>" );
220
221             sb.append( "<td class=\"size\">" );
222             appendFilesize( sb, artifact );
223             sb.append( "</td>" );
224
225             sb.append( "</tr>" );
226         }
227         sb.append( "</table>" );
228         sb.append( "</p>" );
229
230         sb.append( "</div>" ); // close "downloadbox.bd.c"
231         sb.append( "</div>" ); // close "downloadbox.bd"
232
233         sb.append( "<div class=\"ft\"><div class=\"c\"></div></div>" );
234         sb.append( "</div>" ); // close "download"
235     }
236
237     private void appendImageLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
238                                   ArchivaArtifact artifact )
239     {
240         String type = artifact.getType();
241         String linkText = "<img src=\"" + req.getContextPath() + "/images/download-type-" + type + ".png\" />";
242         appendLink( sb, prefix, repo, artifact, linkText );
243     }
244
245     private static void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
246                                     ArchivaArtifact artifact, String linkText )
247     {
248         StringBuffer url = new StringBuffer();
249         
250         String path = repo.toPath( artifact );
251
252         url.append( prefix );
253         url.append( "/" ).append( path );
254
255         String filename = path.substring( path.lastIndexOf( "/" ) + 1 );
256
257         sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
258         sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( filename ) ).append( "\"" );
259         sb.append( ">" );
260
261         sb.append( linkText );
262
263         sb.append( "</a>" );
264     }
265
266     private void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
267                              ArchivaArtifact artifact )
268     {
269         String type = artifact.getType();
270         String linkText = StringUtils.capitalize( type );
271
272         appendLink( sb, prefix, repo, artifact, linkText );
273     }
274
275     private void appendFilesize( StringBuffer sb, ArchivaArtifact artifact )
276     {
277         sb.append( decimalFormat.format( artifact.getModel().getSize() ) );
278     }
279
280     public void setArtifactId( String artifactId )
281     {
282         this.artifactId = artifactId;
283     }
284
285     public void setGroupId( String groupId )
286     {
287         this.groupId = groupId;
288     }
289
290     public void setMini( boolean mini )
291     {
292         this.mini = mini;
293     }
294
295     public void setVersion( String version )
296     {
297         this.version = version;
298     }
299 }