KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > fr > jayasoft > ivy > resolver > ChainResolver


1 /*
2  * This file is subject to the license found in LICENCE.TXT in the root directory of the project.
3  *
4  * #SNAPSHOT#
5  */

6 package fr.jayasoft.ivy.resolver;
7
8 import java.io.File JavaDoc;
9 import java.io.IOException JavaDoc;
10 import java.text.ParseException JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.Arrays JavaDoc;
13 import java.util.Date JavaDoc;
14 import java.util.Iterator JavaDoc;
15 import java.util.List JavaDoc;
16
17 import fr.jayasoft.ivy.Artifact;
18 import fr.jayasoft.ivy.ArtifactInfo;
19 import fr.jayasoft.ivy.DependencyDescriptor;
20 import fr.jayasoft.ivy.DependencyResolver;
21 import fr.jayasoft.ivy.Ivy;
22 import fr.jayasoft.ivy.LatestStrategy;
23 import fr.jayasoft.ivy.ResolveData;
24 import fr.jayasoft.ivy.ResolvedModuleRevision;
25 import fr.jayasoft.ivy.report.ArtifactDownloadReport;
26 import fr.jayasoft.ivy.report.DownloadReport;
27 import fr.jayasoft.ivy.report.DownloadStatus;
28 import fr.jayasoft.ivy.util.Message;
29
30 /**
31  * @author Hanin
32  *
33  */

34 public class ChainResolver extends AbstractResolver {
35     public static class ResolvedModuleRevisionArtifactInfo implements ArtifactInfo {
36         private ResolvedModuleRevision _rmr;
37
38         public ResolvedModuleRevisionArtifactInfo(ResolvedModuleRevision rmr) {
39             _rmr = rmr;
40         }
41
42         public String JavaDoc getRevision() {
43             return _rmr.getId().getRevision();
44         }
45
46         public long getLastModified() {
47             return _rmr.getPublicationDate().getTime();
48         }
49
50     }
51
52     private boolean _returnFirst = false;
53     private List JavaDoc _chain = new ArrayList JavaDoc();
54     private boolean _dual;
55
56     public void add(DependencyResolver resolver) {
57         _chain.add(resolver);
58     }
59     
60     public ResolvedModuleRevision getDependency(DependencyDescriptor dd, ResolveData data) throws ParseException JavaDoc {
61         data = new ResolveData(data, doValidate(data));
62         ResolvedModuleRevision ret = null;
63         
64         List JavaDoc errors = new ArrayList JavaDoc();
65         
66         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext();) {
67             DependencyResolver resolver = (DependencyResolver) iter.next();
68             LatestStrategy oldLatest = setLatestIfRequired(resolver, getLatestStrategy());
69             ResolvedModuleRevision mr = null;
70             try {
71                 mr = resolver.getDependency(dd, data);
72             } catch (Exception JavaDoc ex) {
73                 Message.verbose("problem occured while resolving "+dd+" with "+resolver+": "+ex);
74                 errors.add(ex);
75             } finally {
76                 if (oldLatest != null) {
77                     setLatest(resolver, oldLatest);
78                 }
79             }
80             checkInterrupted();
81             if (mr != null) {
82                 boolean shouldReturn = _returnFirst;
83                 shouldReturn |= !getIvy().getVersionMatcher().isDynamic(dd.getDependencyRevisionId()) && ret != null && !ret.getDescriptor().isDefault();
84                 if (!shouldReturn) {
85                     // check if latest is asked and compare to return the most recent
86
String JavaDoc mrDesc = mr.getId()+(mr.getDescriptor().isDefault()?"[default]":"")+" from "+mr.getResolver().getName();
87                     Message.debug("\tchecking "+mrDesc+" against "+ret);
88                     if (ret == null) {
89                         Message.debug("\tmodule revision kept as first found: "+mrDesc);
90                         ret = mr;
91                     } else if (isAfter(mr, ret, data.getDate())) {
92                         Message.debug("\tmodule revision kept as younger: "+mrDesc);
93                         ret = mr;
94                     } else if (!mr.getDescriptor().isDefault() && ret.getDescriptor().isDefault()) {
95                             Message.debug("\tmodule revision kept as better (not default): "+mrDesc);
96                             ret = mr;
97                     } else {
98                         Message.debug("\tmodule revision discarded as older: "+mrDesc);
99                     }
100                     if (!getIvy().getVersionMatcher().isDynamic(dd.getDependencyRevisionId()) && !ret.getDescriptor().isDefault()) {
101                         Message.debug("\tmodule revision found and is not default: returning "+mrDesc);
102                         return resolvedRevision(mr);
103                     }
104                 } else {
105                     return resolvedRevision(mr);
106                 }
107             }
108         }
109         if (ret == null && !errors.isEmpty()) {
110             if (errors.size() == 1) {
111                 Exception JavaDoc ex = (Exception JavaDoc) errors.get(0);
112                 if (ex instanceof RuntimeException JavaDoc) {
113                     throw (RuntimeException JavaDoc)ex;
114                 } else if (ex instanceof ParseException JavaDoc) {
115                     throw (ParseException JavaDoc)ex;
116                 } else {
117                     throw new RuntimeException JavaDoc(ex.toString(), ex);
118                 }
119             } else {
120                 StringBuffer JavaDoc err = new StringBuffer JavaDoc();
121                 for (Iterator JavaDoc iter = errors.iterator(); iter.hasNext();) {
122                     Exception JavaDoc ex = (Exception JavaDoc) iter.next();
123                     err.append(ex).append("\n");
124                 }
125                 err.setLength(err.length() - 1);
126                 throw new RuntimeException JavaDoc("several problems occured while resolving "+dd+":\n"+err);
127             }
128         }
129         return resolvedRevision(ret);
130     }
131     
132     private ResolvedModuleRevision resolvedRevision(ResolvedModuleRevision mr) {
133         if (isDual() && mr != null) {
134             return new ResolvedModuleRevisionProxy(mr, this);
135         } else {
136             return mr;
137         }
138     }
139     
140
141     private LatestStrategy setLatestIfRequired(DependencyResolver resolver, LatestStrategy latestStrategy) {
142         String JavaDoc latestName = getLatestStrategyName(resolver);
143         if (latestName != null && !"default".equals(latestName)) {
144             LatestStrategy oldLatest = getLatest(resolver);
145             setLatest(resolver, latestStrategy);
146             return oldLatest;
147         } else {
148             return null;
149         }
150     }
151
152     /**
153      * Returns true if rmr1 is after rmr2, using the latest strategy to determine
154      * which is the latest
155      * @param rmr1
156      * @param rmr2
157      * @return
158      */

159     private boolean isAfter(ResolvedModuleRevision rmr1, ResolvedModuleRevision rmr2, Date JavaDoc date) {
160         ArtifactInfo[] ais = new ArtifactInfo[] {
161                 new ResolvedModuleRevisionArtifactInfo(rmr2),
162                 new ResolvedModuleRevisionArtifactInfo(rmr1)
163         };
164         return getLatestStrategy().findLatest(ais, date) != ais[0];
165     }
166
167     public void reportFailure() {
168         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext();) {
169             DependencyResolver resolver = (DependencyResolver) iter.next();
170             resolver.reportFailure();
171         }
172     }
173
174     public void reportFailure(Artifact art) {
175         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext();) {
176             DependencyResolver resolver = (DependencyResolver) iter.next();
177             resolver.reportFailure(art);
178         }
179     }
180
181     public DownloadReport download(Artifact[] artifacts, Ivy ivy, File JavaDoc cache, boolean useOrigin) {
182         List JavaDoc artifactsToDownload = new ArrayList JavaDoc(Arrays.asList(artifacts));
183         DownloadReport report = new DownloadReport();
184         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext() && !artifactsToDownload.isEmpty();) {
185             DependencyResolver resolver = (DependencyResolver) iter.next();
186             DownloadReport r = resolver.download((Artifact[])artifactsToDownload.toArray(new Artifact[artifactsToDownload.size()]), ivy, cache, useOrigin);
187             ArtifactDownloadReport[] adr = r.getArtifactsReports();
188             for (int i = 0; i < adr.length; i++) {
189                 if (adr[i].getDownloadStatus() != DownloadStatus.FAILED) {
190                     artifactsToDownload.remove(adr[i].getArtifact());
191                     report.addArtifactReport(adr[i]);
192                 }
193             }
194         }
195         for (Iterator JavaDoc iter = artifactsToDownload.iterator(); iter.hasNext();) {
196             Artifact art = (Artifact)iter.next();
197             ArtifactDownloadReport adr = new ArtifactDownloadReport(art);
198             adr.setDownloadStatus(DownloadStatus.FAILED);
199             report.addArtifactReport(adr);
200         }
201         return report;
202     }
203     public List JavaDoc getResolvers() {
204         return _chain;
205     }
206     public void publish(Artifact artifact, File JavaDoc src, boolean overwrite) throws IOException JavaDoc {
207         if (_chain.isEmpty()) {
208             throw new IllegalStateException JavaDoc("invalid chain resolver with no sub resolver");
209         }
210         ((DependencyResolver)_chain.get(0)).publish(artifact, src, overwrite);
211     }
212     public boolean isReturnFirst() {
213         return _returnFirst;
214     }
215     
216     public void setReturnFirst(boolean returnFirst) {
217         _returnFirst = returnFirst;
218     }
219     
220     public void dumpConfig() {
221         Message.verbose("\t"+getName()+" [chain] "+_chain);
222         Message.debug("\t\treturn first: "+isReturnFirst());
223         Message.debug("\t\tdual: "+isDual());
224         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext();) {
225             DependencyResolver r = (DependencyResolver)iter.next();
226             Message.debug("\t\t-> "+r.getName());
227         }
228     }
229     
230     public boolean exists(Artifact artifact) {
231         for (Iterator JavaDoc iter = _chain.iterator(); iter.hasNext();) {
232             DependencyResolver resolver = (DependencyResolver)iter.next();
233             if (resolver.exists(artifact)) {
234                 return true;
235             }
236         }
237         return false;
238     }
239
240
241     private static void setLatest(DependencyResolver resolver, LatestStrategy latest) {
242         if (resolver instanceof HasLatestStrategy) {
243             HasLatestStrategy r = (HasLatestStrategy)resolver;
244             r.setLatestStrategy(latest);
245         }
246     }
247
248     private static LatestStrategy getLatest(DependencyResolver resolver) {
249         if (resolver instanceof HasLatestStrategy) {
250             HasLatestStrategy r = (HasLatestStrategy)resolver;
251             return r.getLatestStrategy();
252         }
253         return null;
254     }
255
256     private static String JavaDoc getLatestStrategyName(DependencyResolver resolver) {
257         if (resolver instanceof HasLatestStrategy) {
258             HasLatestStrategy r = (HasLatestStrategy)resolver;
259             return r.getLatest();
260         }
261         return null;
262     }
263
264     public void setDual(boolean b) {
265         _dual = b;
266     }
267
268     public boolean isDual() {
269         return _dual;
270     }
271
272 }
273
Popular Tags