KickJava   Java API By Example, From Geeks To Geeks.

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


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.ByteArrayInputStream JavaDoc;
9 import java.io.File JavaDoc;
10 import java.io.IOException JavaDoc;
11 import java.util.Arrays JavaDoc;
12 import java.util.Collection JavaDoc;
13 import java.util.Date JavaDoc;
14 import java.util.Iterator JavaDoc;
15 import java.util.List JavaDoc;
16 import java.util.Map JavaDoc;
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 /**
35  * @author Xavier Hanin
36  *
37  */

38 public class RepositoryResolver extends AbstractResourceResolver {
39     
40     private Repository _repository;
41     private Boolean JavaDoc _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 JavaDoc 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 JavaDoc pattern, Artifact artifact, ResourceMDParser rmdparser, Date JavaDoc date) {
64         return findResourceUsingPattern(getName(), getRepository(), getLatestStrategy(), getIvy().getVersionMatcher(), rmdparser, mrid, pattern, artifact, date, isAlwaysCheckExactRevision());
65     }
66     
67     public static ResolvedResource findResourceUsingPattern(String JavaDoc name, Repository repository, LatestStrategy strategy, VersionMatcher versionMatcher, ResourceMDParser rmdparser, ModuleRevisionId mrid, String JavaDoc pattern, Artifact artifact, Date JavaDoc date, boolean alwaysCheckExactRevision) {
68         try {
69             if (!versionMatcher.isDynamic(mrid) || alwaysCheckExactRevision) {
70                 String JavaDoc 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 JavaDoc 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 JavaDoc ex) {
87             throw new RuntimeException JavaDoc(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 JavaDoc name,
93             Repository repository,
94             LatestStrategy strategy,
95             VersionMatcher versionMatcher,
96             ResourceMDParser rmdparser,
97             ModuleRevisionId mrid,
98             String JavaDoc pattern,
99             Artifact artifact,
100             Date JavaDoc 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 JavaDoc sorted = strategy.sort(rress);
108             for (Iterator JavaDoc 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 JavaDoc dest) throws IOException JavaDoc {
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 JavaDoc src, boolean overwrite) throws IOException JavaDoc {
157         String JavaDoc destPattern;
158         if ("ivy".equals(artifact.getType()) && !getIvyPatterns().isEmpty()) {
159             destPattern = (String JavaDoc)getIvyPatterns().get(0);
160         } else if (!getArtifactPatterns().isEmpty()) {
161             destPattern = (String JavaDoc)getArtifactPatterns().get(0);
162         } else {
163             throw new IllegalStateException JavaDoc("impossible to publish "+artifact+" using "+this+": no artifact pattern defined");
164         }
165         // Check for m2 compatibility
166
ModuleRevisionId mrid = artifact.getModuleRevisionId();
167         if (isM2compatible()) {
168             mrid = convertM2IdForResourceSearch(mrid);
169         }
170         
171         String JavaDoc 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 JavaDoc src, String JavaDoc dest, boolean overwrite) throws IOException JavaDoc {
180         _repository.put(artifact, src, dest, overwrite);
181         String JavaDoc[] 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 JavaDoc src, String JavaDoc dest, boolean overwrite, String JavaDoc algorithm) throws IOException JavaDoc {
188         File JavaDoc csFile = File.createTempFile("ivytemp", algorithm);
189         try {
190             FileUtil.copy(new ByteArrayInputStream JavaDoc(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 JavaDoc 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 JavaDoc names, List JavaDoc patterns, Map JavaDoc tokenValues, String JavaDoc token) {
209         for (Iterator JavaDoc iter = patterns.iterator(); iter.hasNext();) {
210             String JavaDoc pattern = (String JavaDoc)iter.next();
211             String JavaDoc partiallyResolvedPattern = IvyPatternHelper.substituteTokens(pattern, tokenValues);
212             String JavaDoc[] values = ResolverHelper.listTokenValues(_repository, partiallyResolvedPattern, token);
213             if (values != null) {
214                 names.addAll(Arrays.asList(values));
215             }
216         }
217     }
218     
219     public String JavaDoc 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