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