]> source.dussan.org Git - archiva.git/blob
691062b994ba8374d3b375ccfbb9c72489872bb1
[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 com.opensymphony.webwork.WebWorkException;
23 import com.opensymphony.webwork.components.Component;
24 import com.opensymphony.xwork.util.OgnlValueStack;
25
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.model.ArchivaRepository;
35 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayout;
36 import org.apache.maven.archiva.repository.layout.BidirectionalRepositoryLayoutFactory;
37 import org.apache.maven.archiva.repository.layout.LayoutException;
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.Iterator;
44 import java.util.List;
45
46 import javax.servlet.http.HttpServletRequest;
47 import javax.servlet.http.HttpServletResponse;
48 import javax.servlet.jsp.PageContext;
49
50 /**
51  * DownloadArtifact 
52  *
53  * @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
54  * @version $Id$
55  * 
56  * @plexus.component role="com.opensymphony.webwork.components.Component" role-hint="download-artifact" 
57  *  instantiation-strategy="per-lookup"
58  */
59 public class DownloadArtifact
60     extends Component
61 {
62     /**
63      * @plexus.requirement role-hint="jdo"
64      */
65     private ArchivaDAO dao;
66
67     /**
68      * @plexus.requirement
69      */
70     private BidirectionalRepositoryLayoutFactory layoutFactory;
71
72     private HttpServletRequest req;
73
74     private HttpServletResponse res;
75
76     private String groupId;
77
78     private String artifactId;
79
80     private String version;
81
82     private boolean mini = false;
83
84     private DecimalFormat decimalFormat;
85
86     public DownloadArtifact( OgnlValueStack stack, PageContext pageContext )
87     {
88         super( stack );
89         decimalFormat = new DecimalFormat( "#,#00" );
90         this.req = (HttpServletRequest) pageContext.getRequest();
91         this.res = (HttpServletResponse) pageContext.getResponse();
92         try
93         {
94             dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE, "jdo" );
95             layoutFactory = (BidirectionalRepositoryLayoutFactory) PlexusTagUtil
96                 .lookup( pageContext, BidirectionalRepositoryLayoutFactory.class );
97         }
98         catch ( ComponentLookupException e )
99         {
100             throw new RuntimeException( e.getMessage(), e );
101         }
102     }
103
104     public boolean end( Writer writer, String body )
105     {
106         StringBuffer sb = new StringBuffer();
107
108         try
109         {
110             Constraint constraint = new ArtifactsRelatedConstraint( groupId, artifactId, version );
111             List relatedArtifacts = dao.getArtifactDAO().queryArtifacts( constraint );
112
113             if ( relatedArtifacts != null )
114             {
115                 String repoId = ( (ArchivaArtifact) relatedArtifacts.get( 0 ) ).getModel().getRepositoryId();
116                 ArchivaRepository repo = dao.getRepositoryDAO().getRepository( repoId );
117                 BidirectionalRepositoryLayout layout = layoutFactory.getLayout( repo.getLayoutType() );
118
119                 String prefix = req.getContextPath() + "/repository/" + repoId;
120
121                 if ( mini )
122                 {
123                     appendMini( sb, prefix, repo, layout, relatedArtifacts );
124                 }
125                 else
126                 {
127                     appendNormal( sb, prefix, repo, layout, relatedArtifacts );
128                 }
129             }
130         }
131         catch ( ObjectNotFoundException e )
132         {
133             appendError( sb, e );
134         }
135         catch ( ArchivaDatabaseException e )
136         {
137             appendError( sb, e );
138         }
139         catch ( LayoutException e )
140         {
141             appendError( sb, e );
142         }
143
144         try
145         {
146             writer.write( sb.toString() );
147         }
148         catch ( IOException e )
149         {
150             throw new WebWorkException( "IOError: " + e.getMessage(), e );
151         }
152
153         return super.end( writer, body );
154     }
155
156     private void appendError( StringBuffer sb, Exception e )
157     {
158         /* do nothing */
159     }
160
161     private void appendMini( StringBuffer sb, String prefix, ArchivaRepository repo,
162                              BidirectionalRepositoryLayout layout, List relatedArtifacts )
163     {
164         /* do nothing */
165     }
166
167     private void appendNormal( StringBuffer sb, String prefix, ArchivaRepository repo,
168                                BidirectionalRepositoryLayout layout, List relatedArtifacts )
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         Iterator it = relatedArtifacts.iterator();
207         while ( it.hasNext() )
208         {
209             ArchivaArtifact artifact = (ArchivaArtifact) it.next();
210             sb.append("\n<tr>");
211             
212             sb.append( "<td class=\"icon\">" );
213             appendImageLink( sb, prefix, layout, artifact );
214             sb.append( "</td>" );
215             
216             sb.append( "<td class=\"type\">" );
217             appendLink( sb, prefix, layout, artifact );
218             sb.append( "</td>" );
219             
220             sb.append( "<td class=\"size\">" );
221             appendFilesize( sb, artifact );
222             sb.append( "</td>" );
223             
224             sb.append("</tr>");
225         }
226         sb.append( "</table>" );
227         sb.append( "</p>" );
228
229         sb.append( "</div>" ); // close "downloadbox.bd.c"
230         sb.append( "</div>" ); // close "downloadbox.bd"
231
232         sb.append( "<div class=\"ft\"><div class=\"c\"></div></div>" );
233         sb.append( "</div>" ); // close "download"
234     }
235     
236     private void appendImageLink( StringBuffer sb, String prefix, BidirectionalRepositoryLayout layout, ArchivaArtifact artifact )
237     {
238         StringBuffer url = new StringBuffer();
239         String path = layout.toPath( artifact );
240         String type = artifact.getType();
241         
242         url.append( prefix );
243         url.append( "/" ).append( path );
244         
245         String filename = path.substring( path.lastIndexOf( "/" ) + 1 );
246         
247         sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
248         sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( filename ) ).append( "\"" );
249         sb.append( ">" );
250         
251         sb.append( "<img src=\"" ).append( req.getContextPath() );
252         sb.append( "/images/download-type-" ).append( type ).append( ".png\" />" );
253         
254         sb.append( "</a>" );
255     }
256
257     private void appendLink( StringBuffer sb, String prefix, BidirectionalRepositoryLayout layout,
258                              ArchivaArtifact artifact )
259     {
260         StringBuffer url = new StringBuffer();
261         String path = layout.toPath( artifact );
262         String type = artifact.getType();
263
264         url.append( prefix );
265         url.append( "/" ).append( path );
266
267         String filename = path.substring( path.lastIndexOf( "/" ) + 1 );
268
269         sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
270         sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( filename ) ).append( "\"" );
271         sb.append( ">" );
272
273         sb.append( StringUtils.capitalize( type ) );
274         sb.append( "</a>" );
275     }
276     
277     private void appendFilesize( StringBuffer sb, ArchivaArtifact artifact )
278     {
279         sb.append( decimalFormat.format( artifact.getModel().getSize() ) );
280     }
281
282     public void setArtifactId( String artifactId )
283     {
284         this.artifactId = artifactId;
285     }
286
287     public void setGroupId( String groupId )
288     {
289         this.groupId = groupId;
290     }
291
292     public void setMini( boolean mini )
293     {
294         this.mini = mini;
295     }
296
297     public void setVersion( String version )
298     {
299         this.version = version;
300     }
301 }