1 package org.apache.maven.shared.runtime;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import java.io.IOException;
23 import java.io.InputStream;
24 import java.net.URL;
25 import java.net.URLConnection;
26 import java.util.ArrayList;
27 import java.util.Collections;
28 import java.util.List;
29
30 import org.apache.maven.model.Model;
31 import org.apache.maven.model.io.xpp3.MavenXpp3Reader;
32 import org.apache.maven.project.DuplicateProjectException;
33 import org.apache.maven.project.MavenProject;
34 import org.apache.maven.project.ProjectSorter;
35 import org.codehaus.plexus.util.IOUtil;
36 import org.codehaus.plexus.util.ReaderFactory;
37 import org.codehaus.plexus.util.dag.CycleDetectedException;
38 import org.codehaus.plexus.util.xml.pull.XmlPullParserException;
39
40
41
42
43
44
45
46 class XMLMavenRuntimeVisitor implements MavenRuntimeVisitor
47 {
48
49
50
51
52
53 private final List<MavenProject> projects;
54
55
56
57
58
59
60 public XMLMavenRuntimeVisitor()
61 {
62 projects = new ArrayList<MavenProject>();
63 }
64
65
66
67
68
69
70 public void visitProjectProperties( URL url ) throws MavenRuntimeException
71 {
72
73 }
74
75
76
77
78 public void visitProjectXML( URL url ) throws MavenRuntimeException
79 {
80 MavenProject project = parseProjectXML( url );
81
82 projects.add( project );
83 }
84
85
86
87
88
89
90
91
92 public List<MavenProject> getProjects()
93 {
94 return Collections.unmodifiableList( projects );
95 }
96
97
98
99
100
101
102
103
104 public List<MavenProject> getSortedProjects() throws MavenRuntimeException
105 {
106
107 List<MavenProject> mediatedProjects = new ArrayList<MavenProject>( projects );
108 MavenProjectUtils.mediateDependencyVersions( mediatedProjects );
109
110 try
111 {
112 ProjectSorter projectSorter = new ProjectSorter( mediatedProjects );
113
114 return genericList( projectSorter.getSortedProjects(), MavenProject.class );
115 }
116 catch ( CycleDetectedException exception )
117 {
118 throw new MavenRuntimeException( "Cannot sort projects", exception );
119 }
120 catch ( DuplicateProjectException exception )
121 {
122 throw new MavenRuntimeException( "Cannot sort projects", exception );
123 }
124 }
125
126
127
128
129
130
131
132
133
134
135
136
137 private MavenProject parseProjectXML( URL url ) throws MavenRuntimeException
138 {
139 MavenXpp3Reader reader = new MavenXpp3Reader();
140
141 InputStream in = null;
142
143 try
144 {
145 URLConnection connection = url.openConnection();
146 connection.setUseCaches( false );
147
148 in = connection.getInputStream();
149
150 Model model = reader.read( ReaderFactory.newXmlReader( in ) );
151
152 return new MavenProject( model );
153 }
154 catch ( XmlPullParserException exception )
155 {
156 throw new MavenRuntimeException( "Cannot read project XML: " + url, exception );
157 }
158 catch ( IOException exception )
159 {
160 throw new MavenRuntimeException( "Cannot read project XML: " + url, exception );
161 }
162 finally
163 {
164 IOUtil.close( in );
165 }
166 }
167
168
169
170
171
172
173
174
175
176
177
178
179 private static <T> List<T> genericList( List<?> list, Class<T> type )
180 {
181 List<T> genericList = new ArrayList<T>();
182
183 for ( Object element : list )
184 {
185 genericList.add( type.cast( element ) );
186 }
187
188 return genericList;
189 }
190 }