]> source.dussan.org Git - archiva.git/blob
985bcb618a7d98e78e18714599daa4418b851268
[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.commons.collections.CollectionUtils;
23 import org.apache.commons.collections.IteratorUtils;
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.maven.archiva.common.ArchivaException;
26 import org.apache.maven.archiva.web.tags.DependencyTree.TreeEntry;
27 import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
28
29 import java.io.IOException;
30 import java.io.PrintWriter;
31 import java.util.Iterator;
32 import java.util.List;
33
34 import javax.servlet.jsp.JspException;
35 import javax.servlet.jsp.PageContext;
36 import javax.servlet.jsp.tagext.IterationTag;
37 import javax.servlet.jsp.tagext.TagSupport;
38 import javax.servlet.jsp.tagext.TryCatchFinally;
39
40 /**
41  * DependencyTreeTag - just here to output the dependency tree to the browser.
42  * It was easier to do it this way, vs accessing the dependency graph via a JSP.
43  * 
44  * <pre>
45  *   <archiva:dependency-tree groupId="org.apache.maven.archiva" 
46  *                            artifactId="archiva-common" 
47  *                            version="1.0"
48  *                            nodevar="node">
49  *     <b>${node.groupId}</b>:<b>${node.artifactId}</b>:<b>${node.version}</b> (${node.scope})
50  *   </archiva:dependency-tree>
51  * </pre>
52  *
53  * @version $Id$
54  */
55 public class DependencyTreeTag
56     extends TagSupport
57     implements IterationTag, TryCatchFinally
58 {
59     private String groupId;
60
61     private String artifactId;
62
63     private String version;
64
65     private String nodevar;
66
67     private Iterator treeIterator;
68
69     private List<TreeEntry> tree;
70
71     private TreeEntry currentTreeEntry;
72
73     private String modelVersion;
74
75     public int doAfterBody()
76         throws JspException
77     {
78         if ( currentTreeEntry != null )
79         {
80             out( currentTreeEntry.getPost() );
81         }
82
83         if ( treeIterator.hasNext() )
84         {
85             currentTreeEntry = (TreeEntry) treeIterator.next();
86             out( currentTreeEntry.getPre() );
87             exposeVariables();
88             return EVAL_BODY_AGAIN;
89         }
90
91         out( "\n</div><!-- end of dependency-graph -->" );
92
93         return SKIP_BODY;
94     }
95
96     public void doCatch( Throwable t )
97         throws Throwable
98     {
99         throw t;
100     }
101
102     public void doFinally()
103     {
104         unExposeVariables();
105     }
106
107     public int doStartTag()
108         throws JspException
109     {
110         DependencyTree deptree;
111         try
112         {
113             deptree = (DependencyTree) PlexusTagUtil.lookup( pageContext, DependencyTree.class.getName() );
114         }
115         catch ( ComponentLookupException e )
116         {
117             throw new JspException( "Unable to lookup DependencyTree: " + e.getMessage(), e );
118         }
119
120         if ( deptree == null )
121         {
122             throw new JspException( "Unable to process dependency tree.  Component not found." );
123         }
124
125         if ( StringUtils.isBlank( nodevar ) )
126         {
127             nodevar = "node";
128         }
129
130         out( "<div class=\"dependency-graph\">" );
131         try
132         {
133             this.tree = deptree.gatherTreeList( groupId, artifactId, modelVersion, nodevar, pageContext );
134     
135             if ( CollectionUtils.isEmpty( this.tree ) )
136             {
137                 return SKIP_BODY;
138             }
139     
140             treeIterator = tree.iterator();
141     
142             currentTreeEntry = (TreeEntry) treeIterator.next();
143             out( currentTreeEntry.getPre() );
144             exposeVariables();
145         }
146         catch ( ArchivaException e )
147         {
148             treeIterator = IteratorUtils.EMPTY_LIST_ITERATOR;
149             
150             out("<pre>");
151             e.printStackTrace( new PrintWriter( pageContext.getOut() ) );
152             out("</pre>");
153         }
154
155         return EVAL_BODY_INCLUDE;
156     }
157
158     public void release()
159     {
160         groupId = "";
161         artifactId = "";
162         version = "";
163         nodevar = "";
164         tree = null;
165         treeIterator = null;
166         super.release();
167     }
168
169     public void setArtifactId( String artifactId )
170     {
171         this.artifactId = artifactId;
172     }
173
174     public void setGroupId( String groupId )
175     {
176         this.groupId = groupId;
177     }
178
179     public void setNodevar( String nodevar )
180     {
181         this.nodevar = nodevar;
182     }
183
184     public void setVersion( String version )
185     {
186         this.version = version;
187     }
188
189     public void setModelVersion( String modelVersion )
190     {
191         this.modelVersion = modelVersion;
192     }
193
194     private void exposeVariables()
195         throws JspException
196     {
197         if ( currentTreeEntry == null )
198         {
199             pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
200         }
201         else
202         {
203             pageContext.setAttribute( nodevar, currentTreeEntry.getArtifact() );
204         }
205     }
206
207     private void out( String msg )
208         throws JspException
209     {
210         try
211         {
212             pageContext.getOut().print( msg );
213         }
214         catch ( IOException e )
215         {
216             throw new JspException( "Unable to output to jsp page context." );
217         }
218     }
219
220     private void unExposeVariables()
221     {
222         pageContext.removeAttribute( nodevar, PageContext.PAGE_SCOPE );
223     }
224 }