| 1 6 package fr.jayasoft.ivy.resolver; 7 8 import java.io.File ; 9 import java.io.IOException ; 10 import java.text.ParseException ; 11 import java.util.ArrayList ; 12 import java.util.Arrays ; 13 import java.util.Date ; 14 import java.util.Iterator ; 15 import java.util.List ; 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 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 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 _chain = new ArrayList (); 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 { 61 data = new ResolveData(data, doValidate(data)); 62 ResolvedModuleRevision ret = null; 63 64 List errors = new ArrayList (); 65 66 for (Iterator 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 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 String 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 ex = (Exception ) errors.get(0); 112 if (ex instanceof RuntimeException ) { 113 throw (RuntimeException )ex; 114 } else if (ex instanceof ParseException ) { 115 throw (ParseException )ex; 116 } else { 117 throw new RuntimeException (ex.toString(), ex); 118 } 119 } else { 120 StringBuffer err = new StringBuffer (); 121 for (Iterator iter = errors.iterator(); iter.hasNext();) { 122 Exception ex = (Exception ) iter.next(); 123 err.append(ex).append("\n"); 124 } 125 err.setLength(err.length() - 1); 126 throw new RuntimeException ("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 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 159 private boolean isAfter(ResolvedModuleRevision rmr1, ResolvedModuleRevision rmr2, Date 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 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 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 cache, boolean useOrigin) { 182 List artifactsToDownload = new ArrayList (Arrays.asList(artifacts)); 183 DownloadReport report = new DownloadReport(); 184 for (Iterator 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 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 getResolvers() { 204 return _chain; 205 } 206 public void publish(Artifact artifact, File src, boolean overwrite) throws IOException { 207 if (_chain.isEmpty()) { 208 throw new IllegalStateException ("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 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 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 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 |