]> source.dussan.org Git - archiva.git/blob
591d2df8f06e9db1f24a197ff9923cca6a9c6ee9
[archiva.git] /
1 package org.apache.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.xwork2.ActionContext;
23 import org.apache.archiva.dependency.tree.maven2.DependencyTreeBuilder;
24 import org.apache.commons.lang.StringUtils;
25 import org.apache.maven.archiva.common.ArchivaException;
26 import org.apache.maven.archiva.model.Keys;
27 import org.apache.archiva.security.ArchivaXworkUser;
28 import org.apache.archiva.security.UserRepositories;
29 import org.apache.maven.artifact.Artifact;
30 import org.apache.maven.shared.dependency.tree.DependencyNode;
31 import org.apache.maven.shared.dependency.tree.DependencyTreeBuilderException;
32 import org.apache.maven.shared.dependency.tree.traversal.DependencyNodeVisitor;
33 import org.slf4j.Logger;
34 import org.slf4j.LoggerFactory;
35 import org.springframework.stereotype.Service;
36
37 import javax.inject.Inject;
38 import java.util.ArrayList;
39 import java.util.List;
40
41 /**
42  * DependencyTree
43  *
44  * @version $Id$
45  */
46 @Service( "dependencyTree" )
47 public class DependencyTree
48 {
49     private Logger log = LoggerFactory.getLogger( DependencyTree.class );
50
51     /**
52      * plexus.requirement role-hint="maven2"
53      */
54     @Inject
55     private DependencyTreeBuilder dependencyTreeBuilder;
56
57     /**
58      * plexus.requirement
59      */
60     @Inject
61     private UserRepositories userRepositories;
62
63     public static class TreeEntry
64     {
65         private String pre = "";
66
67         private String post = "";
68
69         private Artifact artifact;
70
71         public void setArtifact( Artifact artifact )
72         {
73             this.artifact = artifact;
74         }
75
76         public Artifact getArtifact()
77         {
78             return artifact;
79         }
80
81         public String getPost()
82         {
83             return post;
84         }
85
86         public String getPre()
87         {
88             return pre;
89         }
90
91         public void appendPre( String string )
92         {
93             this.pre += string;
94         }
95
96         public void appendPost( String string )
97         {
98             this.post += string;
99         }
100     }
101
102     public List<TreeEntry> gatherTreeList( String groupId, String artifactId, String modelVersion )
103         throws ArchivaException
104     {
105         if ( StringUtils.isBlank( groupId ) )
106         {
107             String emsg = "Error generating dependency tree [" + Keys.toKey( groupId, artifactId, modelVersion )
108                 + "]: groupId is blank.";
109             log.error( emsg );
110             throw new ArchivaException( emsg );
111         }
112
113         if ( StringUtils.isBlank( artifactId ) )
114         {
115             String emsg = "Error generating dependency tree [" + Keys.toKey( groupId, artifactId, modelVersion )
116                 + "]: artifactId is blank.";
117             log.error( emsg );
118             throw new ArchivaException( emsg );
119         }
120
121         if ( StringUtils.isBlank( modelVersion ) )
122         {
123             String emsg = "Error generating dependency tree [" + Keys.toKey( groupId, artifactId, modelVersion )
124                 + "]: version is blank.";
125             log.error( emsg );
126             throw new ArchivaException( emsg );
127         }
128
129         // TODO Cache the results to disk, in XML format, in the same place as the artifact is located.
130
131         TreeListVisitor visitor = new TreeListVisitor();
132         try
133         {
134             dependencyTreeBuilder.buildDependencyTree( userRepositories.getObservableRepositoryIds( getPrincipal() ),
135                                                        groupId, artifactId, modelVersion, visitor );
136         }
137         catch ( DependencyTreeBuilderException e )
138         {
139             throw new ArchivaException( "Unable to build dependency tree: " + e.getMessage(), e );
140         }
141
142         return visitor.getList();
143     }
144
145     private String getPrincipal()
146     {
147         return ArchivaXworkUser.getActivePrincipal( ActionContext.getContext().getSession() );
148     }
149
150     private static class TreeListVisitor
151         implements DependencyNodeVisitor
152     {
153         private List<TreeEntry> list;
154
155         private TreeEntry currentEntry;
156
157         boolean firstChild = true;
158
159         private DependencyNode firstNode;
160
161         public TreeListVisitor()
162         {
163             this.list = new ArrayList<TreeEntry>();
164         }
165
166         public List<TreeEntry> getList()
167         {
168             return this.list;
169         }
170
171         public boolean visit( DependencyNode node )
172         {
173             if ( firstNode == null )
174             {
175                 firstNode = node;
176             }
177
178             currentEntry = new TreeEntry();
179
180             if ( firstChild )
181             {
182                 currentEntry.appendPre( "<ul>" );
183             }
184
185             currentEntry.appendPre( "<li>" );
186             currentEntry.setArtifact( node.getArtifact() );
187             currentEntry.appendPost( "</li>" );
188             this.list.add( currentEntry );
189
190             if ( !node.getChildren().isEmpty() )
191             {
192                 firstChild = true;
193             }
194
195             return true;
196         }
197
198         public boolean endVisit( DependencyNode node )
199         {
200             firstChild = false;
201
202             if ( !node.getChildren().isEmpty() )
203             {
204                 currentEntry.appendPost( "</ul>" );
205             }
206
207             if ( node == firstNode )
208             {
209                 currentEntry.appendPost( "</ul>" );
210             }
211
212             return true;
213         }
214     }
215 }