001: package org.apache.maven.project.build.model;
002:
003: /*
004: * Licensed to the Apache Software Foundation (ASF) under one
005: * or more contributor license agreements. See the NOTICE file
006: * distributed with this work for additional information
007: * regarding copyright ownership. The ASF licenses this file
008: * to you under the Apache License, Version 2.0 (the
009: * "License"); you may not use this file except in compliance
010: * with the License. You may obtain a copy of the License at
011: *
012: * http://www.apache.org/licenses/LICENSE-2.0
013: *
014: * Unless required by applicable law or agreed to in writing,
015: * software distributed under the License is distributed on an
016: * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
017: * KIND, either express or implied. See the License for the
018: * specific language governing permissions and limitations
019: * under the License.
020: */
021:
022: import org.apache.maven.model.Model;
023:
024: import java.io.File;
025: import java.util.ArrayList;
026: import java.util.Collections;
027: import java.util.Iterator;
028: import java.util.List;
029:
030: /**
031: * @see org.apache.maven.project.build.model.ModelLineage
032: */
033: public class DefaultModelLineage implements ModelLineage {
034:
035: private List tuples = new ArrayList();
036:
037: /**
038: * @see org.apache.maven.project.build.model.ModelLineage#addParent(org.apache.maven.model.Model, java.io.File, java.util.List)
039: */
040: public void addParent(Model model, File pomFile,
041: List artifactRepositories) {
042: if (tuples.isEmpty()) {
043: throw new IllegalStateException(
044: "You must call setOrigin(..) before adding a parent to the lineage.");
045: }
046:
047: tuples.add(new ModelLineageTuple(model, pomFile,
048: artifactRepositories));
049: }
050:
051: /**
052: * @see org.apache.maven.project.build.model.ModelLineage#artifactRepositoryListIterator()
053: */
054: public Iterator artifactRepositoryListIterator() {
055: return new Iterator() {
056:
057: private int idx = 0;
058:
059: public boolean hasNext() {
060: return tuples.size() > idx;
061: }
062:
063: public Object next() {
064: return ((ModelLineageTuple) tuples.get(idx++)).remoteRepositories;
065: }
066:
067: public void remove() {
068: tuples.remove(idx);
069: }
070:
071: };
072: }
073:
074: /**
075: * @see org.apache.maven.project.build.model.ModelLineage#fileIterator()
076: */
077: public Iterator fileIterator() {
078: return new Iterator() {
079:
080: private int idx = 0;
081:
082: public boolean hasNext() {
083: return tuples.size() > idx;
084: }
085:
086: public Object next() {
087: return ((ModelLineageTuple) tuples.get(idx++)).file;
088: }
089:
090: public void remove() {
091: tuples.remove(idx);
092: }
093:
094: };
095: }
096:
097: /**
098: * @see org.apache.maven.project.build.model.ModelLineage#getArtifactRepositories(org.apache.maven.model.Model)
099: */
100: public List getArtifactRepositories(Model model) {
101: int index = tuples.indexOf(new ModelLineageTuple(model));
102:
103: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(index);
104:
105: return tuple != null ? tuple.remoteRepositories : null;
106: }
107:
108: public List getArtifactRepositoryListsInDescendingOrder() {
109: if (tuples.isEmpty()) {
110: return Collections.EMPTY_LIST;
111: }
112:
113: List tuplesInReverse = new ArrayList(tuples);
114: Collections.reverse(tuplesInReverse);
115:
116: List results = new ArrayList(tuplesInReverse.size());
117: for (Iterator it = tuplesInReverse.iterator(); it.hasNext();) {
118: ModelLineageTuple tuple = (ModelLineageTuple) it.next();
119:
120: results.add(tuple.remoteRepositories);
121: }
122:
123: return results;
124: }
125:
126: /**
127: * @see org.apache.maven.project.build.model.ModelLineage#getFile(org.apache.maven.model.Model)
128: */
129: public File getFile(Model model) {
130: int index = tuples.indexOf(new ModelLineageTuple(model));
131:
132: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(index);
133:
134: return tuple != null ? tuple.file : null;
135: }
136:
137: public List getFilesInDescendingOrder() {
138: if (tuples.isEmpty()) {
139: return Collections.EMPTY_LIST;
140: }
141:
142: List tuplesInReverse = new ArrayList(tuples);
143: Collections.reverse(tuplesInReverse);
144:
145: List results = new ArrayList(tuplesInReverse.size());
146: for (Iterator it = tuplesInReverse.iterator(); it.hasNext();) {
147: ModelLineageTuple tuple = (ModelLineageTuple) it.next();
148:
149: results.add(tuple.file);
150: }
151:
152: return results;
153: }
154:
155: public List getModelsInDescendingOrder() {
156: if (tuples.isEmpty()) {
157: return Collections.EMPTY_LIST;
158: }
159:
160: List tuplesInReverse = new ArrayList(tuples);
161: Collections.reverse(tuplesInReverse);
162:
163: List results = new ArrayList(tuplesInReverse.size());
164: for (Iterator it = tuplesInReverse.iterator(); it.hasNext();) {
165: ModelLineageTuple tuple = (ModelLineageTuple) it.next();
166:
167: results.add(tuple.model);
168: }
169:
170: return results;
171: }
172:
173: public List getOriginatingArtifactRepositoryList() {
174: if (tuples.isEmpty()) {
175: return null;
176: }
177:
178: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(0);
179:
180: return tuple.remoteRepositories;
181: }
182:
183: public Model getOriginatingModel() {
184: if (tuples.isEmpty()) {
185: return null;
186: }
187:
188: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(0);
189:
190: return tuple.model;
191: }
192:
193: public File getOriginatingPOMFile() {
194: if (tuples.isEmpty()) {
195: return null;
196: }
197:
198: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(0);
199:
200: return tuple.file;
201: }
202:
203: public List getDeepestAncestorArtifactRepositoryList() {
204: if (tuples.isEmpty()) {
205: return null;
206: }
207:
208: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(tuples
209: .size() - 1);
210:
211: return tuple.remoteRepositories;
212: }
213:
214: public File getDeepestAncestorFile() {
215: if (tuples.isEmpty()) {
216: return null;
217: }
218:
219: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(tuples
220: .size() - 1);
221:
222: return tuple.file;
223: }
224:
225: public Model getDeepestAncestorModel() {
226: if (tuples.isEmpty()) {
227: return null;
228: }
229:
230: ModelLineageTuple tuple = (ModelLineageTuple) tuples.get(tuples
231: .size() - 1);
232:
233: return tuple.model;
234: }
235:
236: /**
237: * @see org.apache.maven.project.build.model.ModelLineage#modelIterator()
238: */
239: public Iterator modelIterator() {
240: return new Iterator() {
241:
242: private int idx = 0;
243:
244: public boolean hasNext() {
245: return tuples.size() > idx;
246: }
247:
248: public Object next() {
249: return ((ModelLineageTuple) tuples.get(idx++)).model;
250: }
251:
252: public void remove() {
253: tuples.remove(idx);
254: }
255:
256: };
257: }
258:
259: public void setOrigin(Model model, File pomFile,
260: List artifactRepositories) {
261: if (!tuples.isEmpty()) {
262: throw new IllegalStateException(
263: "Origin already set; you must use addParent(..) for successive additions to the lineage.");
264: }
265:
266: tuples.add(new ModelLineageTuple(model, pomFile,
267: artifactRepositories));
268: }
269:
270: /**
271: * @see org.apache.maven.project.build.model.ModelLineage#size()
272: */
273: public int size() {
274: return tuples.size();
275: }
276:
277: private static final class ModelLineageTuple {
278: private Model model;
279:
280: private File file;
281:
282: private List remoteRepositories;
283:
284: private ModelLineageTuple(Model model) {
285: this .model = model;
286: }
287:
288: private ModelLineageTuple(Model model, File file,
289: List remoteRepositories) {
290: this .model = model;
291: this .file = file;
292: this .remoteRepositories = remoteRepositories;
293: }
294:
295: public boolean equals(Object other) {
296: if (this == other) {
297: return true;
298: } else if (other instanceof ModelLineageTuple) {
299: ModelLineageTuple otherTuple = (ModelLineageTuple) other;
300:
301: return model.getId().equals(otherTuple.model.getId());
302: }
303:
304: return false;
305: }
306: }
307:
308: public ModelLineageIterator lineageIterator() {
309: return new ModelLineageIterator() {
310:
311: private int idx = -1;
312:
313: public boolean hasNext() {
314: return tuples.size() > idx + 1;
315: }
316:
317: public Object next() {
318: return ((ModelLineageTuple) tuples.get((++idx))).model;
319: }
320:
321: public void remove() {
322: tuples.remove(idx);
323: }
324:
325: public List getArtifactRepositories() {
326: return ((ModelLineageTuple) tuples.get(idx)).remoteRepositories;
327: }
328:
329: public Model getModel() {
330: return ((ModelLineageTuple) tuples.get(idx)).model;
331: }
332:
333: public File getPOMFile() {
334: return ((ModelLineageTuple) tuples.get(idx)).file;
335: }
336:
337: };
338: }
339:
340: public ModelLineageIterator reversedLineageIterator() {
341: return new ModelLineageIterator() {
342:
343: private int idx = tuples.size();
344:
345: public boolean hasNext() {
346: return idx > 0;
347: }
348:
349: public Object next() {
350: return ((ModelLineageTuple) tuples.get((--idx))).model;
351: }
352:
353: public void remove() {
354: tuples.remove(idx);
355: }
356:
357: public List getArtifactRepositories() {
358: return ((ModelLineageTuple) tuples.get(idx)).remoteRepositories;
359: }
360:
361: public Model getModel() {
362: return ((ModelLineageTuple) tuples.get(idx)).model;
363: }
364:
365: public File getPOMFile() {
366: return ((ModelLineageTuple) tuples.get(idx)).file;
367: }
368:
369: };
370: }
371:
372: }
|