KickJava   Java API By Example, From Geeks To Geeks.

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


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.IOException JavaDoc;
9 import java.net.MalformedURLException JavaDoc;
10 import java.net.URL JavaDoc;
11 import java.util.ArrayList JavaDoc;
12 import java.util.Arrays JavaDoc;
13 import java.util.Iterator JavaDoc;
14 import java.util.List JavaDoc;
15 import java.util.regex.Matcher JavaDoc;
16 import java.util.regex.Pattern JavaDoc;
17
18 import fr.jayasoft.ivy.Artifact;
19 import fr.jayasoft.ivy.ModuleRevisionId;
20 import fr.jayasoft.ivy.repository.Repository;
21 import fr.jayasoft.ivy.repository.Resource;
22 import fr.jayasoft.ivy.util.IvyPatternHelper;
23 import fr.jayasoft.ivy.util.Message;
24
25 public class ResolverHelper {
26     // lists all the values a token can take in a pattern, as listed by a given url lister
27
public static String JavaDoc[] listTokenValues(Repository rep, String JavaDoc pattern, String JavaDoc token) {
28         String JavaDoc fileSep = rep.getFileSeparator();
29         pattern = rep.standardize(pattern);
30         String JavaDoc tokenString = IvyPatternHelper.getTokenString(token);
31         int index = pattern.indexOf(tokenString);
32         if (index == -1) {
33             Message.verbose("unable to list "+token+" in "+pattern+": token not found in pattern");
34             return null;
35         }
36         if (((pattern.length() <= index + tokenString.length())
37                 || fileSep.equals(pattern.substring(index + tokenString.length(), index + tokenString.length() + 1)))
38                 && (index == 0 || fileSep.equals(pattern.substring(index - 1, index)))) {
39             // the searched token is a whole name
40
String JavaDoc root = pattern.substring(0, index);
41             return listAll(rep, root);
42         } else {
43             int slashIndex = pattern.substring(0, index).lastIndexOf(fileSep);
44             String JavaDoc root = slashIndex == -1 ? "" : pattern.substring(0, slashIndex);
45             
46             try {
47                 Message.debug("\tusing "+rep+" to list all in "+root);
48                 List JavaDoc all = rep.list(root);
49                 if (all != null) {
50                     Message.debug("\t\tfound "+all.size()+" urls");
51                     List JavaDoc ret = new ArrayList JavaDoc(all.size());
52                     int endNameIndex = pattern.indexOf(fileSep, slashIndex + 1);
53                     String JavaDoc namePattern;
54                     if (endNameIndex != -1) {
55                         namePattern = pattern.substring(slashIndex+1, endNameIndex);
56                     } else {
57                         namePattern = pattern.substring(slashIndex + 1);
58                     }
59                     String JavaDoc acceptNamePattern = IvyPatternHelper.substituteToken(namePattern, token, "(.+)");
60                     Pattern JavaDoc p = Pattern.compile(acceptNamePattern);
61                     for (Iterator JavaDoc iter = all.iterator(); iter.hasNext();) {
62                         String JavaDoc path = (String JavaDoc)iter.next();
63                         int pathSlashIndex = path.lastIndexOf(fileSep);
64                         String JavaDoc name = pathSlashIndex == -1 ? path : path.substring(pathSlashIndex+1);
65                         Matcher JavaDoc m = p.matcher(name);
66                         if (m.matches()) {
67                             String JavaDoc value = m.group(1);
68                             ret.add(value);
69                         }
70                     }
71                     Message.debug("\t\t"+ret.size()+" matched "+pattern);
72                     return (String JavaDoc[])ret.toArray(new String JavaDoc[ret.size()]);
73                 } else {
74                     return null;
75                 }
76             } catch (Exception JavaDoc e) {
77                 Message.warn("problem while listing resources in "+root+" with "+rep+": "+e.getClass()+" "+e.getMessage());
78                 return null;
79             }
80         }
81     }
82     
83     public static String JavaDoc[] listAll(Repository rep, String JavaDoc parent) {
84         try {
85             String JavaDoc fileSep = rep.getFileSeparator();
86             Message.debug("\tusing "+rep+" to list all in "+parent);
87             List JavaDoc all = rep.list(parent);
88             if (all != null) {
89                 Message.debug("\t\tfound "+all.size()+" resources");
90                 List JavaDoc names = new ArrayList JavaDoc(all.size());
91                 for (Iterator JavaDoc iter = all.iterator(); iter.hasNext();) {
92                     String JavaDoc path = (String JavaDoc)iter.next();
93                    if (path.endsWith(fileSep)) {
94                         path = path.substring(0, path.length() - 1);
95                     }
96                     int slashIndex = path.lastIndexOf(fileSep);
97                     names.add(path.substring(slashIndex +1));
98                 }
99                 return (String JavaDoc[])names.toArray(new String JavaDoc[names.size()]);
100             } else {
101                 Message.debug("\t\tno resources found");
102                 return null;
103             }
104         } catch (Exception JavaDoc e) {
105             Message.warn("problem while listing resources in "+parent+" with "+rep+": "+e.getClass()+" "+e.getMessage());
106             return null;
107         }
108     }
109     
110     public static ResolvedResource[] findAll(Repository rep, ModuleRevisionId mrid, String JavaDoc pattern, Artifact artifact) {
111         // substitute all but revision
112
String JavaDoc partiallyResolvedPattern = IvyPatternHelper.substitute(pattern, ModuleRevisionId.newInstance(mrid, IvyPatternHelper.getTokenString(IvyPatternHelper.REVISION_KEY)), artifact);
113         Message.debug("\tlisting all in "+partiallyResolvedPattern);
114         
115         String JavaDoc[] revs = listTokenValues(rep, partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY);
116         if (revs != null) {
117             Message.debug("\tfound revs: "+Arrays.asList(revs));
118             List JavaDoc ret = new ArrayList JavaDoc(revs.length);
119             for (int i = 0; i < revs.length; i++) {
120                 String JavaDoc rres = IvyPatternHelper.substituteToken(partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY, revs[i]);
121                 try {
122                     ret.add(new ResolvedResource(rep.getResource(rres), revs[i]));
123                 } catch (IOException JavaDoc e) {
124                     Message.warn("impossible to get resource from name listed by repository: "+rres+": "+e.getMessage());
125                 }
126             }
127             if (revs.length != ret.size()) {
128                 Message.debug("\tfound resolved res: "+ret);
129             }
130             return (ResolvedResource[])ret.toArray(new ResolvedResource[ret.size()]);
131         } else if (partiallyResolvedPattern.indexOf("["+IvyPatternHelper.REVISION_KEY+"]") == -1) {
132             // the partially resolved pattern is completely resolved, check the resource
133
try {
134                 Resource res = rep.getResource(partiallyResolvedPattern);
135                 if (res.exists()) {
136                     Message.debug("\tonly one resource found without real listing: using and defining it as working@"+rep.getName()+" revision: "+res.getName());
137                     return new ResolvedResource[] {new ResolvedResource(res, "working@"+rep.getName())};
138                 }
139             } catch (IOException JavaDoc e) {
140                 Message.debug("\timpossible to get resource from name listed by repository: "+partiallyResolvedPattern+": "+e.getMessage());
141             }
142             Message.debug("\tno revision found");
143         }
144         return null;
145     }
146
147 // public static ResolvedResource[] findAll(Repository rep, ModuleRevisionId mrid, String pattern, Artifact artifact, VersionMatcher versionMatcher, ResourceMDParser mdParser) {
148
// // substitute all but revision
149
// String partiallyResolvedPattern = IvyPatternHelper.substitute(pattern, new ModuleRevisionId(mrid.getModuleId(), IvyPatternHelper.getTokenString(IvyPatternHelper.REVISION_KEY), mrid.getExtraAttributes()), artifact);
150
// Message.debug("\tlisting all in "+partiallyResolvedPattern);
151
//
152
// String[] revs = listTokenValues(rep, partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY);
153
// if (revs != null) {
154
// Message.debug("\tfound revs: "+Arrays.asList(revs));
155
// List ret = new ArrayList(revs.length);
156
// String rres = null;
157
// for (int i = 0; i < revs.length; i++) {
158
// ModuleRevisionId foundMrid = new ModuleRevisionId(mrid.getModuleId(), revs[i], mrid.getExtraAttributes());
159
// if (versionMatcher.accept(mrid, foundMrid)) {
160
// rres = IvyPatternHelper.substituteToken(partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY, revs[i]);
161
// try {
162
// ResolvedResource resolvedResource;
163
// if (versionMatcher.needModuleDescriptor(mrid, foundMrid)) {
164
// resolvedResource = mdParser.parse(rep.getResource(rres), revs[i]);
165
// if (!versionMatcher.accept(mrid, ((MDResolvedResource)resolvedResource).getResolvedModuleRevision().getDescriptor())) {
166
// continue;
167
// }
168
// } else {
169
// resolvedResource = new ResolvedResource(rep.getResource(rres), revs[i]);
170
// }
171
// ret.add(resolvedResource);
172
// } catch (IOException e) {
173
// Message.warn("impossible to get resource from name listed by repository: "+rres+": "+e.getMessage());
174
// }
175
// }
176
// }
177
// if (revs.length != ret.size()) {
178
// Message.debug("\tfound resolved res: "+ret);
179
// }
180
// return (ResolvedResource[])ret.toArray(new ResolvedResource[ret.size()]);
181
// } else {
182
// // maybe the partially resolved pattern is completely resolved ?
183
// try {
184
// Resource res = rep.getResource(partiallyResolvedPattern);
185
// if (res.exists()) {
186
// Message.debug("\tonly one resource found without real listing: using and defining it as working@"+rep.getName()+" revision: "+res.getName());
187
// return new ResolvedResource[] {new ResolvedResource(res, "working@"+rep.getName())};
188
// }
189
// } catch (IOException e) {
190
// Message.debug("\timpossible to get resource from name listed by repository: "+partiallyResolvedPattern+": "+e.getMessage());
191
// }
192
// Message.debug("\tno revision found");
193
// }
194
// return null;
195
// }
196

197     // lists all the values a token can take in a pattern, as listed by a given url lister
198
public static String JavaDoc[] listTokenValues(URLLister lister, String JavaDoc pattern, String JavaDoc token) {
199         pattern = standardize(pattern);
200         if (lister.accept(pattern)) {
201             String JavaDoc tokenString = IvyPatternHelper.getTokenString(token);
202             int index = pattern.indexOf(tokenString);
203             if (index == -1) {
204                 Message.verbose("unable to list "+token+" in "+pattern+": token not found in pattern");
205                 return null;
206             }
207             if (((pattern.length() <= index + tokenString.length())
208                     || "/".equals(pattern.substring(index + tokenString.length(), index + tokenString.length() + 1)))
209                     && (index == 0 || "/".equals(pattern.substring(index - 1, index)))) {
210                 // the searched token is a whole name
211
String JavaDoc root = pattern.substring(0, index);
212                 try {
213                     return listAll(lister, new URL JavaDoc(root));
214                 } catch (MalformedURLException JavaDoc e) {
215                     Message.warn("malformed url from pattern root: "+root+": "+e.getMessage());
216                     return null;
217                 }
218             } else {
219                 int slashIndex = pattern.substring(0, index).lastIndexOf('/');
220                 String JavaDoc root = slashIndex == -1 ? "" : pattern.substring(0, slashIndex);
221
222                 try {
223                     Message.debug("\tusing "+lister+" to list all in "+root);
224                     List JavaDoc all = lister.listAll(new URL JavaDoc(root));
225                     Message.debug("\t\tfound "+all.size()+" urls");
226                     List JavaDoc ret = new ArrayList JavaDoc(all.size());
227                     int endNameIndex = pattern.indexOf('/', slashIndex + 1);
228                     String JavaDoc namePattern;
229                     if (endNameIndex != -1) {
230                         namePattern = pattern.substring(slashIndex+1, endNameIndex);
231                     } else {
232                         namePattern = pattern.substring(slashIndex + 1);
233                     }
234                     String JavaDoc acceptNamePattern = IvyPatternHelper.substituteToken(namePattern, token, "(.+)");
235                     Pattern JavaDoc p = Pattern.compile(acceptNamePattern);
236                     for (Iterator JavaDoc iter = all.iterator(); iter.hasNext();) {
237                         URL JavaDoc url = (URL JavaDoc)iter.next();
238                         String JavaDoc path = standardize(url.getPath());
239                         int pathSlashIndex = path.lastIndexOf('/');
240                         String JavaDoc name = pathSlashIndex == -1 ? path : path.substring(pathSlashIndex+1);
241                         Matcher JavaDoc m = p.matcher(name);
242                         if (m.matches()) {
243                             String JavaDoc value = m.group(1);
244                             ret.add(value);
245                         }
246                     }
247                     Message.debug("\t\t"+ret.size()+" matched "+pattern);
248                     return (String JavaDoc[])ret.toArray(new String JavaDoc[ret.size()]);
249                 } catch (Exception JavaDoc e) {
250                     Message.warn("problem while listing files in "+root+": "+e.getClass()+" "+e.getMessage());
251                     return null;
252                 }
253             }
254         }
255         return null;
256     }
257     
258     private static String JavaDoc standardize(String JavaDoc path) {
259         return path.replace('\\', '/');
260     }
261
262     public static String JavaDoc[] listAll(URLLister lister, URL JavaDoc root) {
263         try {
264             if (lister.accept(root.toExternalForm())) {
265                 Message.debug("\tusing "+lister+" to list all in "+root);
266                 List JavaDoc all = lister.listAll(root);
267                 Message.debug("\t\tfound "+all.size()+" urls");
268                 List JavaDoc names = new ArrayList JavaDoc(all.size());
269                 for (Iterator JavaDoc iter = all.iterator(); iter.hasNext();) {
270                     URL JavaDoc dir = (URL JavaDoc)iter.next();
271                     String JavaDoc path = dir.getPath();
272                     if (path.endsWith("/")) {
273                         path = path.substring(0, path.length() - 1);
274                     }
275                     int slashIndex = path.lastIndexOf('/');
276                     names.add(path.substring(slashIndex +1));
277                 }
278                 return (String JavaDoc[])names.toArray(new String JavaDoc[names.size()]);
279             }
280             return null;
281         } catch (Exception JavaDoc e) {
282             Message.warn("problem while listing directories in "+root+": "+e.getClass()+" "+e.getMessage());
283             return null;
284         }
285     }
286 }
287
Popular Tags