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