blob: 05393904dd1297355d7bf13143ef750bc06f309c [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.commons.collections.CollectionUtils;
import org.apache.commons.collections.IteratorUtils;
import org.apache.commons.lang.StringUtils;
import org.apache.maven.archiva.common.ArchivaException;
import org.apache.maven.archiva.web.tags.DependencyTree.TreeEntry;
import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.IterationTag;
import javax.servlet.jsp.tagext.TagSupport;
import javax.servlet.jsp.tagext.TryCatchFinally;
/**
* DependencyTreeTag - just here to output the dependency tree to the browser.
* It was easier to do it this way, vs accessing the dependency graph via a JSP.
*
* <pre>
* <archiva:dependency-tree groupId="org.apache.maven.archiva"
* artifactId="archiva-common"
* version="1.0"
* nodevar="node">
* <b>${node.groupId}</b>:<b>${node.artifactId}</b>:<b>${node.version}</b> (${node.scope})
* </archiva:dependency-tree>
* </pre>
*
* @author <a href="mailto:joakime@apache.org">Joakim Erdfelt</a>
* @version $Id$
*/
public class DependencyTreeTag
extends TagSupport
implements IterationTag, TryCatchFinally
{
private String groupId;
private String artifactId;
private String version;
private String nodevar;
private Iterator treeIterator;
private List<TreeEntry> tree;
private TreeEntry currentTreeEntry;
private String modelVersion;
public int doAfterBody()
throws JspException
{
if ( currentTreeEntry != null )
{
out( currentTreeEntry.getPost() );
}
if ( treeIterator.hasNext() )
{
currentTreeEntry = (TreeEntry) treeIterator.next();
out( currentTreeEntry.getPre() );
exposeVariables();
return EVAL_BODY_AGAIN;
}
out( "\n</div><!-- end of dependency-graph -->" );
return SKIP_BODY;
}
public void doCatch( Throwable t )
throws Throwable
{
throw t;
}
public void doFinally()
{
unExposeVariables();
}
public int doStartTag()
throws JspException
{
DependencyTree deptree;
try
{
deptree = (DependencyTree) PlexusTagUtil.lookup( pageContext, DependencyTree.class.getName() );
}
catch ( ComponentLookupException e )
{
throw new JspException( "Unable to lookup DependencyTree: " + e.getMessage(), e );
}
if ( deptree == null )
{
throw new JspException( "Unable to process dependency tree. Component not found." );
}
if ( StringUtils.isBlank( nodevar ) )
{
nodevar = "node";
}
out( "<div class=\"dependency-graph\">" );
try
{
this.tree = deptree.gatherTreeList( groupId, artifactId, modelVersion, nodevar, pageContext );
if ( CollectionUtils.isEmpty( this.tree ) )
{
return SKIP_BODY;
}
treeIterator = tree.iterator();
currentTreeEntry = (TreeEntry) treeIterator.next();
out( currentTreeEntry.getPre() );
exposeVariables();
}
catch ( ArchivaException e )
{
treeIterator = IteratorUtils.EMPTY_LIST_ITERATOR;
out("<pre>");
e.printStackTrace( new PrintWriter( pageContext.getOut() ) );
out("</pre>");
}
return EVAL_BODY_INCLUDE;
}
public void release()
{
groupId = "";
artifactId = "";
version = "";
nodevar = "";
tree = null;
treeIterator = null;
super.release();
}
public void setArtifactId( String artifactId )
{
this.artifactId = artifactId;
}
public void setGroupId( String groupId )
{
this.groupId = groupId;
}
public void setNodevar( String nodevar )
{
this.nodevar = nodevar;
}
public void setVersion( String version )
{
this.version = version;
}
public void setModelVersion( String modelVersion )
{
this.modelVersion = modelVersion;
}
private void exposeVariables()
throws JspException
{
if ( currentTreeEntry == null )
{
pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
}
else
{
pageContext.setAttribute( nodevar, currentTreeEntry.getArtifact() );
}
}
private void out( String msg )
throws JspException
{
try
{
pageContext.getOut().print( msg );
}
catch ( IOException e )
{
throw new JspException( "Unable to output to jsp page context." );
}
}
private void unExposeVariables()
{
pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
}
}