blob: ff3b86ac4707d79780e79898dac98732359292b9 [file] [log] [blame]
package org.apache.maven.archiva.web.tags;
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import org.apache.struts2.StrutsException;
import org.apache.struts2.components.Component;
import com.opensymphony.xwork2.util.ValueStack;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.database.ArchivaDAO;
import org.apache.maven.archiva.database.ArchivaDatabaseException;
import org.apache.maven.archiva.database.Constraint;
import org.apache.maven.archiva.database.ObjectNotFoundException;
import org.apache.maven.archiva.database.constraints.ArtifactsRelatedConstraint;
import org.apache.maven.archiva.model.ArchivaArtifact;
import org.apache.maven.archiva.repository.ManagedRepositoryContent;
import org.apache.maven.archiva.repository.RepositoryContentFactory;
import org.apache.maven.archiva.repository.RepositoryException;
import org.apache.maven.archiva.repository.RepositoryNotFoundException;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import java.io.IOException;
import java.io.Writer;
import java.text.DecimalFormat;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.jsp.PageContext;
/**
* DownloadArtifact
*
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
* @plexus.component role="org.apache.struts2.components.Component" role-hint="download-artifact"
* instantiation-strategy="per-lookup"
*/
public class DownloadArtifact
extends Component
{
/**
* @plexus.requirement role-hint="jdo"
*/
private ArchivaDAO dao;
/**
* @plexus.requirement
*/
private RepositoryContentFactory repositoryFactory;
private HttpServletRequest req;
@SuppressWarnings("unused")
private HttpServletResponse res;
private String groupId;
private String artifactId;
private String version;
private boolean mini = false;
private DecimalFormat decimalFormat;
public DownloadArtifact( ValueStack stack, PageContext pageContext )
{
super( stack );
decimalFormat = new DecimalFormat( "#,#00" );
this.req = (HttpServletRequest) pageContext.getRequest();
this.res = (HttpServletResponse) pageContext.getResponse();
try
{
dao = (ArchivaDAO) PlexusTagUtil.lookup( pageContext, ArchivaDAO.ROLE, "jdo" );
repositoryFactory = (RepositoryContentFactory) PlexusTagUtil.lookup( pageContext,
RepositoryContentFactory.class );
}
catch ( ComponentLookupException e )
{
throw new RuntimeException( e.getMessage(), e );
}
}
@Override
public boolean end( Writer writer, String body )
{
StringBuffer sb = new StringBuffer();
try
{
Constraint constraint = new ArtifactsRelatedConstraint( groupId, artifactId, version );
List<ArchivaArtifact> relatedArtifacts = dao.getArtifactDAO().queryArtifacts( constraint );
if ( relatedArtifacts != null && relatedArtifacts.size() > 0 )
{
String repoId = ( (ArchivaArtifact) relatedArtifacts.get( 0 ) ).getModel().getRepositoryId();
ManagedRepositoryContent repo = repositoryFactory.getManagedRepositoryContent( repoId );
String prefix = req.getContextPath() + "/repository/" + repoId;
if ( mini )
{
appendMini( sb, prefix, repo, relatedArtifacts );
}
else
{
appendNormal( sb, prefix, repo, relatedArtifacts );
}
}
}
catch ( ObjectNotFoundException e )
{
appendError( sb, e );
}
catch ( ArchivaDatabaseException e )
{
appendError( sb, e );
}
catch ( RepositoryNotFoundException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
catch ( RepositoryException e )
{
// TODO Auto-generated catch block
e.printStackTrace();
}
try
{
writer.write( sb.toString() );
}
catch ( IOException e )
{
throw new StrutsException( "IOError: " + e.getMessage(), e );
}
return super.end( writer, body );
}
private void appendError( StringBuffer sb, Exception e )
{
/* do nothing */
}
private void appendMini( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
List<ArchivaArtifact> relatedArtifacts )
{
// TODO: write 1 line download link for main artifact.
}
private void appendNormal( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
List<ArchivaArtifact> relatedArtifacts )
{
/*
* <div class="download">
* <div class="hd">
* <div class="c"></div>
* </div>
* <div class="bd">
* <div class="c">
* <-- main content goes here -->
* </div>
* </div>
* <div class="ft">
* <div class="c"></div>
* </div>
* </div>
*/
sb.append( "<div class=\"download\">" );
sb.append( "<div class=\"hd\"><div class=\"c\"></div></div>" );
sb.append( "<div class=\"bd\"><div class=\"c\">" );
// Heading
sb.append( "<h2>" );
if ( relatedArtifacts.size() > 1 )
{
sb.append( "Downloads" );
}
else
{
sb.append( "Download" );
}
sb.append( "</h2>" );
// Body
sb.append( "<p class=\"body\">" );
sb.append( "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">" );
for ( ArchivaArtifact artifact : relatedArtifacts )
{
sb.append( "\n<tr>" );
sb.append( "<td class=\"icon\">" );
appendImageLink( sb, prefix, repo, artifact );
sb.append( "</td>" );
sb.append( "<td class=\"type\">" );
appendLink( sb, prefix, repo, artifact );
sb.append( "</td>" );
sb.append( "<td class=\"size\">" );
appendFilesize( sb, artifact );
sb.append( "</td>" );
sb.append( "</tr>" );
}
sb.append( "</table>" );
sb.append( "</p>" );
sb.append( "</div>" ); // close "downloadbox.bd.c"
sb.append( "</div>" ); // close "downloadbox.bd"
sb.append( "<div class=\"ft\"><div class=\"c\"></div></div>" );
sb.append( "</div>" ); // close "download"
}
private void appendImageLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
ArchivaArtifact artifact )
{
String type = artifact.getType();
String linkText = "<img src=\"" + req.getContextPath() + "/images/download-type-" + type + ".png\" />";
appendLink( sb, prefix, repo, artifact, linkText );
}
private static void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
ArchivaArtifact artifact, String linkText )
{
StringBuffer url = new StringBuffer();
String path = repo.toPath( artifact );
url.append( prefix );
url.append( "/" ).append( path );
String filename = path.substring( path.lastIndexOf( "/" ) + 1 );
sb.append( "<a href=\"" ).append( StringEscapeUtils.escapeXml( url.toString() ) ).append( "\"" );
sb.append( " title=\"" ).append( "Download " ).append( StringEscapeUtils.escapeXml( filename ) ).append( "\"" );
sb.append( ">" );
sb.append( linkText );
sb.append( "</a>" );
}
private void appendLink( StringBuffer sb, String prefix, ManagedRepositoryContent repo,
ArchivaArtifact artifact )
{
String type = artifact.getType();
String linkText = StringUtils.capitalize( type );
appendLink( sb, prefix, repo, artifact, linkText );
}
private void appendFilesize( StringBuffer sb, ArchivaArtifact artifact )
{
sb.append( decimalFormat.format( artifact.getModel().getSize() ) );
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public void setMini( boolean mini )
{
this.mini = mini;
}
public void setVersion( String version )
{
this.version = version;
}
}