1 6 package fr.jayasoft.ivy.resolver; 7 8 import java.io.ByteArrayInputStream ; 9 import java.io.File ; 10 import java.io.IOException ; 11 import java.util.Arrays ; 12 import java.util.Collection ; 13 import java.util.Date ; 14 import java.util.Iterator ; 15 import java.util.List ; 16 import java.util.Map ; 17 18 import fr.jayasoft.ivy.Artifact; 19 import fr.jayasoft.ivy.DefaultArtifact; 20 import fr.jayasoft.ivy.Ivy; 21 import fr.jayasoft.ivy.LatestStrategy; 22 import fr.jayasoft.ivy.ModuleDescriptor; 23 import fr.jayasoft.ivy.ModuleRevisionId; 24 import fr.jayasoft.ivy.report.DownloadReport; 25 import fr.jayasoft.ivy.repository.AbstractRepository; 26 import fr.jayasoft.ivy.repository.Repository; 27 import fr.jayasoft.ivy.repository.Resource; 28 import fr.jayasoft.ivy.util.ChecksumHelper; 29 import fr.jayasoft.ivy.util.FileUtil; 30 import fr.jayasoft.ivy.util.IvyPatternHelper; 31 import fr.jayasoft.ivy.util.Message; 32 import fr.jayasoft.ivy.version.VersionMatcher; 33 34 38 public class RepositoryResolver extends AbstractResourceResolver { 39 40 private Repository _repository; 41 private Boolean _alwaysCheckExactRevision = null; 42 43 44 public RepositoryResolver() { 45 } 46 47 public Repository getRepository() { 48 return _repository; 49 } 50 51 public void setRepository(Repository repository) { 52 _repository = repository; 53 } 54 55 public void setName(String name) { 56 super.setName(name); 57 if (_repository instanceof AbstractRepository) { 58 ((AbstractRepository)_repository).setName(name); 59 } 60 } 61 62 63 protected ResolvedResource findResourceUsingPattern(ModuleRevisionId mrid, String pattern, Artifact artifact, ResourceMDParser rmdparser, Date date) { 64 return findResourceUsingPattern(getName(), getRepository(), getLatestStrategy(), getIvy().getVersionMatcher(), rmdparser, mrid, pattern, artifact, date, isAlwaysCheckExactRevision()); 65 } 66 67 public static ResolvedResource findResourceUsingPattern(String name, Repository repository, LatestStrategy strategy, VersionMatcher versionMatcher, ResourceMDParser rmdparser, ModuleRevisionId mrid, String pattern, Artifact artifact, Date date, boolean alwaysCheckExactRevision) { 68 try { 69 if (!versionMatcher.isDynamic(mrid) || alwaysCheckExactRevision) { 70 String resourceName = IvyPatternHelper.substitute(pattern, mrid, artifact); 71 Message.debug("\t trying "+resourceName); 72 Resource res = repository.getResource(resourceName); 73 boolean reachable = res.exists(); 74 if (reachable) { 75 String revision = pattern.indexOf(IvyPatternHelper.REVISION_KEY) == -1? "working@"+name : mrid.getRevision(); 76 return new ResolvedResource(res, revision); 77 } else if (versionMatcher.isDynamic(mrid)) { 78 return findDynamicResourceUsingPattern(name, repository, strategy, versionMatcher, rmdparser, mrid, pattern, artifact, date); 79 } else { 80 Message.debug("\t"+name+": resource not reachable for "+mrid+": res="+res); 81 return null; 82 } 83 } else { 84 return findDynamicResourceUsingPattern(name, repository, strategy, versionMatcher, rmdparser, mrid, pattern, artifact, date); 85 } 86 } catch (IOException ex) { 87 throw new RuntimeException (name+": unable to get resource for "+mrid+": res="+IvyPatternHelper.substitute(pattern, mrid, artifact)+": "+ex, ex); 88 } 89 } 90 91 private static ResolvedResource findDynamicResourceUsingPattern( 92 String name, 93 Repository repository, 94 LatestStrategy strategy, 95 VersionMatcher versionMatcher, 96 ResourceMDParser rmdparser, 97 ModuleRevisionId mrid, 98 String pattern, 99 Artifact artifact, 100 Date date) { 101 ResolvedResource[] rress = ResolverHelper.findAll(repository, mrid, pattern, artifact); 102 if (rress == null) { 103 Message.debug("\t"+name+": unable to list resources for "+mrid+": pattern="+pattern); 104 return null; 105 } else { 106 ResolvedResource found = null; 107 List sorted = strategy.sort(rress); 108 for (Iterator iter = sorted.iterator(); iter.hasNext();) { 109 ResolvedResource rres = (ResolvedResource) iter.next(); 110 if ((date != null && rres.getLastModified() > date.getTime())) { 111 Message.debug("\t"+name+": too young: "+rres); 112 continue; 113 } 114 ModuleRevisionId foundMrid = ModuleRevisionId.newInstance(mrid, rres.getRevision()); 115 if (!versionMatcher.accept(mrid, foundMrid)) { 116 Message.debug("\t"+name+": rejected by version matcher: "+rres); 117 continue; 118 } 119 if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) { 120 ResolvedResource r = rmdparser.parse(rres.getResource(), rres.getRevision()); 121 ModuleDescriptor md = ((MDResolvedResource)r).getResolvedModuleRevision().getDescriptor(); 122 if (md.isDefault()) { 123 Message.debug("\t"+name+": default md rejected by version matcher requiring module descriptor: "+rres); 124 continue; 125 } else if (!versionMatcher.accept(mrid, md)) { 126 Message.debug("\t"+name+": md rejected by version matcher: "+rres); 127 continue; 128 } else { 129 found = r; 130 } 131 132 } else { 133 found = rres; 134 } 135 } 136 if (found == null) { 137 Message.debug("\t"+name+": no resource found for "+mrid+": pattern="+pattern); 138 } else if (!found.getResource().exists()) { 139 Message.debug("\t"+name+": resource not reachable for "+mrid+": res="+found.getResource()); 140 return null; 141 } 142 return found; 143 } 144 } 145 146 protected long get(Resource resource, File dest) throws IOException { 147 Message.verbose("\t"+getName()+": downloading "+resource.getName()); 148 Message.debug("\t\tto "+dest); 149 if (dest.getParentFile() != null) { 150 dest.getParentFile().mkdirs(); 151 } 152 _repository.get(resource.getName(), dest); 153 return dest.length(); 154 } 155 156 public void publish(Artifact artifact, File src, boolean overwrite) throws IOException { 157 String destPattern; 158 if ("ivy".equals(artifact.getType()) && !getIvyPatterns().isEmpty()) { 159 destPattern = (String )getIvyPatterns().get(0); 160 } else if (!getArtifactPatterns().isEmpty()) { 161 destPattern = (String )getArtifactPatterns().get(0); 162 } else { 163 throw new IllegalStateException ("impossible to publish "+artifact+" using "+this+": no artifact pattern defined"); 164 } 165 ModuleRevisionId mrid = artifact.getModuleRevisionId(); 167 if (isM2compatible()) { 168 mrid = convertM2IdForResourceSearch(mrid); 169 } 170 171 String dest = IvyPatternHelper.substitute(destPattern, 172 mrid, 173 artifact); 174 175 put(artifact, src, dest, overwrite); 176 Message.info("\tpublished "+artifact.getName()+" to "+hidePassword(dest)); 177 } 178 179 private void put(Artifact artifact, File src, String dest, boolean overwrite) throws IOException { 180 _repository.put(artifact, src, dest, overwrite); 181 String [] checksums = getChecksumAlgorithms(); 182 for (int i = 0; i < checksums.length; i++) { 183 putChecksum(artifact, src, dest, overwrite, checksums[i]); 184 } 185 } 186 187 private void putChecksum(Artifact artifact, File src, String dest, boolean overwrite, String algorithm) throws IOException { 188 File csFile = File.createTempFile("ivytemp", algorithm); 189 try { 190 FileUtil.copy(new ByteArrayInputStream (ChecksumHelper.computeAsString(src, algorithm).getBytes()), csFile, null); 191 _repository.put(DefaultArtifact.cloneWithAnotherTypeAndExt(artifact, algorithm, artifact.getExt()+"."+algorithm), csFile, dest+"."+algorithm, overwrite); 192 } finally { 193 csFile.delete(); 194 } 195 } 196 197 public DownloadReport download(Artifact[] artifacts, Ivy ivy, File cache, boolean useOrigin) { 198 try { 199 _repository.addTransferListener(ivy); 200 return super.download(artifacts, ivy, cache, useOrigin); 201 } finally { 202 if (ivy != null) { 203 _repository.removeTransferListener(ivy); 204 } 205 } 206 } 207 208 protected void findTokenValues(Collection names, List patterns, Map tokenValues, String token) { 209 for (Iterator iter = patterns.iterator(); iter.hasNext();) { 210 String pattern = (String )iter.next(); 211 String partiallyResolvedPattern = IvyPatternHelper.substituteTokens(pattern, tokenValues); 212 String [] values = ResolverHelper.listTokenValues(_repository, partiallyResolvedPattern, token); 213 if (values != null) { 214 names.addAll(Arrays.asList(values)); 215 } 216 } 217 } 218 219 public String getTypeName() { 220 return "repository"; 221 } 222 public void dumpConfig() { 223 super.dumpConfig(); 224 Message.debug("\t\trepository: "+getRepository()); 225 } 226 227 public void setIvy(Ivy ivy) { 228 super.setIvy(ivy); 229 if (ivy != null) { 230 if (_alwaysCheckExactRevision == null) { 231 _alwaysCheckExactRevision = Boolean.valueOf(ivy.getVariable("ivy.default.always.check.exact.revision")); 232 } 233 } 234 } 235 236 public boolean isAlwaysCheckExactRevision() { 237 return _alwaysCheckExactRevision == null ? true : _alwaysCheckExactRevision.booleanValue(); 238 } 239 240 public void setAlwaysCheckExactRevision(boolean alwaysCheckExactRevision) { 241 _alwaysCheckExactRevision = Boolean.valueOf(alwaysCheckExactRevision); 242 } 243 } 244 | Popular Tags |