1 6 package fr.jayasoft.ivy.resolver; 7 8 import java.io.IOException ; 9 import java.net.MalformedURLException ; 10 import java.net.URL ; 11 import java.util.ArrayList ; 12 import java.util.Arrays ; 13 import java.util.Iterator ; 14 import java.util.List ; 15 import java.util.regex.Matcher ; 16 import java.util.regex.Pattern ; 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 public static String [] listTokenValues(Repository rep, String pattern, String token) { 28 String fileSep = rep.getFileSeparator(); 29 pattern = rep.standardize(pattern); 30 String 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 String root = pattern.substring(0, index); 41 return listAll(rep, root); 42 } else { 43 int slashIndex = pattern.substring(0, index).lastIndexOf(fileSep); 44 String root = slashIndex == -1 ? "" : pattern.substring(0, slashIndex); 45 46 try { 47 Message.debug("\tusing "+rep+" to list all in "+root); 48 List all = rep.list(root); 49 if (all != null) { 50 Message.debug("\t\tfound "+all.size()+" urls"); 51 List ret = new ArrayList (all.size()); 52 int endNameIndex = pattern.indexOf(fileSep, slashIndex + 1); 53 String namePattern; 54 if (endNameIndex != -1) { 55 namePattern = pattern.substring(slashIndex+1, endNameIndex); 56 } else { 57 namePattern = pattern.substring(slashIndex + 1); 58 } 59 String acceptNamePattern = IvyPatternHelper.substituteToken(namePattern, token, "(.+)"); 60 Pattern p = Pattern.compile(acceptNamePattern); 61 for (Iterator iter = all.iterator(); iter.hasNext();) { 62 String path = (String )iter.next(); 63 int pathSlashIndex = path.lastIndexOf(fileSep); 64 String name = pathSlashIndex == -1 ? path : path.substring(pathSlashIndex+1); 65 Matcher m = p.matcher(name); 66 if (m.matches()) { 67 String value = m.group(1); 68 ret.add(value); 69 } 70 } 71 Message.debug("\t\t"+ret.size()+" matched "+pattern); 72 return (String [])ret.toArray(new String [ret.size()]); 73 } else { 74 return null; 75 } 76 } catch (Exception 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 [] listAll(Repository rep, String parent) { 84 try { 85 String fileSep = rep.getFileSeparator(); 86 Message.debug("\tusing "+rep+" to list all in "+parent); 87 List all = rep.list(parent); 88 if (all != null) { 89 Message.debug("\t\tfound "+all.size()+" resources"); 90 List names = new ArrayList (all.size()); 91 for (Iterator iter = all.iterator(); iter.hasNext();) { 92 String path = (String )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 [])names.toArray(new String [names.size()]); 100 } else { 101 Message.debug("\t\tno resources found"); 102 return null; 103 } 104 } catch (Exception 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 pattern, Artifact artifact) { 111 String partiallyResolvedPattern = IvyPatternHelper.substitute(pattern, ModuleRevisionId.newInstance(mrid, IvyPatternHelper.getTokenString(IvyPatternHelper.REVISION_KEY)), artifact); 113 Message.debug("\tlisting all in "+partiallyResolvedPattern); 114 115 String [] revs = listTokenValues(rep, partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY); 116 if (revs != null) { 117 Message.debug("\tfound revs: "+Arrays.asList(revs)); 118 List ret = new ArrayList (revs.length); 119 for (int i = 0; i < revs.length; i++) { 120 String rres = IvyPatternHelper.substituteToken(partiallyResolvedPattern, IvyPatternHelper.REVISION_KEY, revs[i]); 121 try { 122 ret.add(new ResolvedResource(rep.getResource(rres), revs[i])); 123 } catch (IOException 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 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 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 197 public static String [] listTokenValues(URLLister lister, String pattern, String token) { 199 pattern = standardize(pattern); 200 if (lister.accept(pattern)) { 201 String 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 String root = pattern.substring(0, index); 212 try { 213 return listAll(lister, new URL (root)); 214 } catch (MalformedURLException 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 root = slashIndex == -1 ? "" : pattern.substring(0, slashIndex); 221 222 try { 223 Message.debug("\tusing "+lister+" to list all in "+root); 224 List all = lister.listAll(new URL (root)); 225 Message.debug("\t\tfound "+all.size()+" urls"); 226 List ret = new ArrayList (all.size()); 227 int endNameIndex = pattern.indexOf('/', slashIndex + 1); 228 String namePattern; 229 if (endNameIndex != -1) { 230 namePattern = pattern.substring(slashIndex+1, endNameIndex); 231 } else { 232 namePattern = pattern.substring(slashIndex + 1); 233 } 234 String acceptNamePattern = IvyPatternHelper.substituteToken(namePattern, token, "(.+)"); 235 Pattern p = Pattern.compile(acceptNamePattern); 236 for (Iterator iter = all.iterator(); iter.hasNext();) { 237 URL url = (URL )iter.next(); 238 String path = standardize(url.getPath()); 239 int pathSlashIndex = path.lastIndexOf('/'); 240 String name = pathSlashIndex == -1 ? path : path.substring(pathSlashIndex+1); 241 Matcher m = p.matcher(name); 242 if (m.matches()) { 243 String value = m.group(1); 244 ret.add(value); 245 } 246 } 247 Message.debug("\t\t"+ret.size()+" matched "+pattern); 248 return (String [])ret.toArray(new String [ret.size()]); 249 } catch (Exception 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 standardize(String path) { 259 return path.replace('\\', '/'); 260 } 261 262 public static String [] listAll(URLLister lister, URL root) { 263 try { 264 if (lister.accept(root.toExternalForm())) { 265 Message.debug("\tusing "+lister+" to list all in "+root); 266 List all = lister.listAll(root); 267 Message.debug("\t\tfound "+all.size()+" urls"); 268 List names = new ArrayList (all.size()); 269 for (Iterator iter = all.iterator(); iter.hasNext();) { 270 URL dir = (URL )iter.next(); 271 String 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 [])names.toArray(new String [names.size()]); 279 } 280 return null; 281 } catch (Exception e) { 282 Message.warn("problem while listing directories in "+root+": "+e.getClass()+" "+e.getMessage()); 283 return null; 284 } 285 } 286 } 287 | Popular Tags |