]> source.dussan.org Git - archiva.git/blob
973a7c21e4390d67c08c97bbab4afbb8a13f747c
[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 repoId = ( (ArchivaArtifact) relatedArtifacts.get( 0 ) ).getModel().getRepositoryId();
115                 ManagedRepositoryContent repo = repositoryFactory.getManagedRepositoryContent( repoId );
116
117                 String prefix = req.getContextPath() + "/repository/" + repoId;
118
119                 if ( mini )
120                 {
121                     appendMini( sb, prefix, repo, relatedArtifacts );
122                 }
123                 else
124                 {
125                     appendNormal( sb, prefix, repo, relatedArtifacts );
126                 }
127             }
128         }
129         catch ( ObjectNotFoundException e )
130         {
131             appendError( sb, e );
132         }
133         catch ( ArchivaDatabaseException e )
134         {
135             appendError( sb, e );
136         }
137         catch ( RepositoryNotFoundException e )
138         {
139             // TODO Auto-generated catch block
140             e.printStackTrace();
141         }
142         catch ( RepositoryException e )
143         {
144             // TODO Auto-generated catch block
145             e.printStackTrace();
146         }
147
148         try
149         {
150             writer.write( sb.toString() );
151         }
152         catch ( IOException e )
153         {
154             throw new StrutsException( "IOError: " + e.getMessage(), e );
155         }
156
157         return super.end( writer, body );
158     }
159
160     private void appendError( StringBuffer sb, Exception e )
161     {
162         /* do nothing */
163     }
164
165     private void appendMini( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
166                              List<ArchivaArtifact> relatedArtifacts )
167     {
168         // TODO: write 1 line download link for main artifact.
169     }
170
171     private void appendNormal( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
172                                List<ArchivaArtifact> relatedArtifacts )
173     {
174         /*
175          * <div class="download">
176          *   <div class="hd"> 
177          *     <div class="c"></div>
178          *   </div>
179          *   <div class="bd">
180          *     <div class="c">
181          *       <-- main content goes here -->
182          *     </div>
183          *   </div>
184          *   <div class="ft">
185          *     <div class="c"></div>
186          *   </div>
187          * </div>
188          */
189
190         sb.append( "<div class=\"download\">" );
191         sb.append( "<div class=\"hd\"><div class=\"c\"></div></div>" );
192         sb.append( "<div class=\"bd\"><div class=\"c\">" );
193
194         // Heading
195         sb.append( "<h2>" );
196         if ( relatedArtifacts.size() > 1 )
197         {
198             sb.append( "Downloads" );
199         }
200         else
201         {
202             sb.append( "Download" );
203         }
204         sb.append( "</h2>" );
205
206         // Body
207         sb.append( "<p class=\"body\">" );
208
209         sb.append( "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" );
210         for ( ArchivaArtifact artifact : relatedArtifacts )
211         {
212             sb.append( "\n<tr>" );
213
214             sb.append( "<td class=\"icon\">" );
215             appendImageLink( sb, prefix, repo, artifact );
216             sb.append( "</td>" );
217
218             sb.append( "<td class=\"type\">" );
219             appendLink( sb, prefix, repo, artifact );
220             sb.append( "</td>" );
221
222             sb.append( "<td class=\"size\">" );
223             appendFilesize( sb, artifact );
224             sb.append( "</td>" );
225
226             sb.append( "</tr>" );
227         }
228         sb.append( "</table>" );
229         sb.append( "</p>" );
230
231         sb.append( "</div>" ); // close "downloadbox.bd.c"
232         sb.append( "</div>" ); // close "downloadbox.bd"
233
234         sb.append( "<div class=\"ft\"><div class=\"c\"></div></div>" );
235         sb.append( "</div>" ); // close "download"
236     }
237
238     private void appendImageLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
239                                   ArchivaArtifact artifact )
240     {
241         String type = artifact.getType();
242         String linkText = "<img src=\"" + req.getContextPath() + "/images/download-type-" + type + ".png\" />";
243         appendLink( sb, prefix, repo, artifact, linkText );
244     }
245
246     private static void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
247                                     ArchivaArtifact artifact, String linkText )
248     {
249         StringBuffer url = new StringBuffer();
250         
251         String path = repo.toPath( artifact );
252
253         url.append( prefix );
254         url.append( "/" ).append( path );
255
256         String filename = path.substring( path.lastIndexOf( "/" ) + 1 );
257
258         sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
259         sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( filename ) ).append( "\"" );
260         sb.append( ">" );
261
262         sb.append( linkText );
263
264         sb.append( "</a>" );
265     }
266
267     private void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
268                              ArchivaArtifact artifact )
269     {
270         String type = artifact.getType();
271         String linkText = StringUtils.capitalize( type );
272
273         appendLink( sb, prefix, repo, artifact, linkText );
274     }
275
276     private void appendFilesize( StringBuffer sb, ArchivaArtifact artifact )
277     {
278         sb.append( decimalFormat.format( artifact.getModel().getSize() ) );
279     }
280
281     public void setArtifactId( String artifactId )
282     {
283         this.artifactId = artifactId;
284     }
285
286     public void setGroupId( String groupId )
287     {
288         this.groupId = groupId;
289     }
290
291     public void setMini( boolean mini )
292     {
293         this.mini = mini;
294     }
295
296     public void setVersion( String version )
297     {
298         this.version = version;
299     }
300 }