1 10 package org.mmbase.util; 11 12 import java.io.File ; 13 import java.util.Enumeration ; 14 import java.util.StringTokenizer ; 15 import java.util.Vector ; 16 17 import org.mmbase.util.logging.Logger; 18 import org.mmbase.util.logging.Logging; 19 20 30 public class DirectoryLister { 31 32 private static Logger log = Logging.getLoggerInstance(DirectoryLister.class.getName()); 34 35 38 private Vector vectorJoin (Vector v1, Vector v2) { 39 for (Enumeration e = v2.elements (); e.hasMoreElements ();) { 40 v1.addElement (e.nextElement ()); 41 } 42 return v1; 43 } 44 45 51 private Vector _directory (String dir, String ext) { 52 Vector v = new Vector (); 53 File d = new File (dir); String [] files = d.list (); String path = null; 56 57 if(files==null) { 58 log.error("Cannot read in directory - "+dir); 59 return v; 60 } 61 62 for (int i = 0; i < files.length; i++) { 63 path = dir + File.separator + files[i]; d = new File (path); 66 if ( !d.isDirectory() && files[i].endsWith(ext) ) { v.addElement(path); } else { 69 if (d.isDirectory()) { vectorJoin (v, _directory (path, ext)); 71 } 72 } 73 } 74 return v; 75 } 76 77 83 public Vector getDirectories(String args) { 84 String methodname ="getDirectories"; 85 Vector v = new Vector (); 86 String fileSpec=null; 87 88 log.debug(methodname+": Getting dirs using args: "+args); 89 90 StringTokenizer st = new StringTokenizer (args, ";"); 91 while (st.hasMoreTokens ()) { 92 93 97 fileSpec = st.nextToken (); 98 99 107 File f = new File (fileSpec); 108 if (f.isDirectory ()) { 109 vectorJoin (v, _directory (fileSpec, "")); 110 } else { 111 int li = fileSpec.lastIndexOf ('/'); 114 119 String dir = fileSpec.substring (0, li); 120 String file = fileSpec.substring (li + 1); 121 String ext = file.substring (1); 122 f = new File (dir); 123 if (f.isDirectory ()) vectorJoin (v, _directory (dir, ext)); 124 } 125 } 126 return v; 127 } 128 129 133 private Vector createFilesVector(Vector directories) { 134 Vector filesvec = new Vector (); 135 String filepathname=null; 136 File file=null; 137 138 Enumeration dirs_enum = directories.elements(); 139 while (dirs_enum.hasMoreElements()) { 140 filepathname = (String )dirs_enum.nextElement(); 141 file = new File (filepathname); 142 filesvec.addElement(file); } 144 return filesvec; 145 } 146 147 151 public Vector sortDirectoriesOnModTime(Vector directories) { 152 String methodname = "sortDirectoriesOnModTime"; 153 CompareInterface filecmp = new FileCompare(); 154 SortedVector sortedfilesvec = new SortedVector(filecmp); Vector dirs_sorted= new Vector (); 156 File file=null; 157 158 Vector filesvec = createFilesVector(directories); log.debug(methodname+": filesvec= "+filesvec); 160 161 Enumeration filesvec_enum = filesvec.elements(); while (filesvec_enum.hasMoreElements()) { 164 sortedfilesvec.addSorted(filesvec_enum.nextElement()); } 166 log.debug(methodname+": sortedfilesvec= "+sortedfilesvec); 167 168 Enumeration sortedfilesvec_enum = sortedfilesvec.elements(); 169 while (sortedfilesvec_enum.hasMoreElements()) { 170 file = (File )sortedfilesvec_enum.nextElement(); 171 dirs_sorted.addElement(file.getPath()); } 173 log.debug(methodname+": dirs_sorted = "+dirs_sorted); 174 return dirs_sorted; 175 } 176 177 183 public Vector sortDirectories(Vector directories, String comparefield) { 184 185 String methodname = "sortDirectories"; 186 CompareInterface xfilecmp = new XFileCompare(comparefield); SortedVector sortedxfiles = new SortedVector(xfilecmp); Vector sorteddirs = new Vector (); XFile xfile=null; 190 int modtime=0; 191 String filepath =null; 192 193 log.debug(methodname+": Sorting dirs using comparefield:"+comparefield); 194 195 Enumeration dirs_enum = directories.elements(); 196 while (dirs_enum.hasMoreElements()) { 197 filepath = (String )dirs_enum.nextElement(); 198 xfile = new XFile(filepath); 199 sortedxfiles.addSorted(xfile); } 201 202 Enumeration xfiles_enum = sortedxfiles.elements(); 203 while (xfiles_enum.hasMoreElements()) { xfile = (XFile)xfiles_enum.nextElement(); 205 filepath = xfile.getFilePath(); 206 modtime = (int) ((xfile.getModTime()-DateSupport.getMilliOffset())/1000); 208 sorteddirs.addElement(filepath); 210 sorteddirs.addElement(time2DateAndTime_NoYear(modtime)); 211 } 212 213 return sorteddirs; 214 } 215 216 221 public Vector createThreeItems(Vector sorted,StringTagger tagger) { 222 String methodname = "createThreeItems"; 223 Vector merged = new Vector (); 224 String typefmt=null,previewfmt=null,path=null,indexsymbol=null; 225 Enumeration sort_enum=null; 226 227 log.debug(methodname+": Creating 3 items vector."); 228 typefmt = tagger.Value("TYPEFORMAT"); previewfmt = tagger.Value("PREVIEWFORMAT"); indexsymbol= tagger.Value("INDEXSYMBOL"); 232 sort_enum = sorted.elements(); 233 if(sort_enum.hasMoreElements()) { 234 path = (String )sort_enum.nextElement(); 236 int lastSlash = path.lastIndexOf('/'); 237 path = path.substring(0,lastSlash+1); 238 239 if ((typefmt!=null)&&(previewfmt!=null)&&(indexsymbol!=null)) { log.debug(methodname+": TYPEFMT="+typefmt+" PREVIEWFMT="+previewfmt+" INDEXSYMBOL="+indexsymbol+" PROVIDED ->Creating vector"); 242 243 typefmt =path+typefmt; previewfmt=path+previewfmt; 245 246 sort_enum = sorted.elements(); while (sort_enum.hasMoreElements()) { 248 249 String sentry = (String ) sort_enum.nextElement(); 250 251 if(checkEntryformat(indexsymbol,typefmt,sentry)) { 253 merged.addElement(sentry); String date = (String ) sort_enum.nextElement(); 255 merged.addElement(date); 257 String pentry = createPreviewEntry(indexsymbol,typefmt,previewfmt,sentry); 259 if (sorted.contains(pentry)) { 260 merged.addElement(pentry); } else { 262 merged.addElement(sentry); } 264 }else{ String skipdate=(String )sort_enum.nextElement(); log.debug("skipping date " + skipdate); 267 } 268 } } else if ((typefmt==null)&&(previewfmt==null)&&(indexsymbol==null)) { log.debug(methodname+": TYPEFMT & PREVIEWFMT & INDEXSYMBOL EMPTY -> Creating std vector where ITEM3=ITEM1"); 271 272 sort_enum = sorted.elements(); 273 while (sort_enum.hasMoreElements()) { String sentry = (String ) sort_enum.nextElement(); 275 merged.addElement(sentry); String date = (String ) sort_enum.nextElement(); 277 merged.addElement(date); merged.addElement(sentry); } 280 } else { log.debug(methodname+": Error typefmt="+typefmt+" previewfmt="+previewfmt+" indexsymbol="+indexsymbol+" ->Returning empty vector."); 282 } 283 } 284 return merged; 285 } 286 287 290 private boolean checkEntryformat(String indexsymbol,String typefmt,String entry) { 291 boolean compatible=false; 292 int digits = 0; 293 int pos = typefmt.indexOf(indexsymbol); 294 String ls_typefmt = typefmt.substring(0,pos); 295 String ls_entry = entry.substring(0,pos); 296 if(ls_entry.equals(ls_typefmt)) { boolean checkHex = indexsymbol.equals("$"); 298 while ( ((entry.charAt(pos+digits)>='0')&&(entry.charAt(pos+digits)<='9')) 299 || ( checkHex 300 && (((entry.charAt(pos+digits)>='a') && (entry.charAt(pos+digits)<='f')) 301 || ((entry.charAt(pos+digits)>='A') && (entry.charAt(pos+digits)<='F'))))) { 302 digits++; } 304 if (entry.charAt(pos+digits)==typefmt.charAt(pos+1)) { 305 String rs_typefmt = typefmt.substring(pos+1); 306 String rs_entry = entry.substring(pos+digits); 307 if (rs_entry.equals(rs_typefmt)) { compatible=true; 309 } 310 } 311 } 312 return compatible; 313 } 314 315 323 private String createPreviewEntry(String indexsymbol,String typefmt,String previewfmt,String entry) { 324 int digits=0; 325 int pos = typefmt.indexOf(indexsymbol); 326 while ((entry.charAt(pos+digits)>='0')&&(entry.charAt(pos+digits)<='9')) { 327 digits++; 328 } 329 String number = entry.substring(pos,pos+digits); StringObject pfmt = new StringObject(previewfmt); 331 String pentry = pfmt.replace(indexsymbol,number).toString(); 332 return pentry; 333 } 334 335 336 340 private String time2DateAndTime(int time) { 341 return DateSupport.getTime(time)+" "+DateSupport.getMonthDay(time)+" "+DateStrings.DUTCH_DATESTRINGS.getShortMonth(DateSupport.getMonthInt(time))+" "+DateSupport.getYear(time); 342 } 343 347 private String time2DateAndTime_NoYear(int time) { 348 return DateSupport.getTime(time)+" "+DateSupport.getMonthDay(time)+" "+DateStrings.DUTCH_DATESTRINGS.getShortMonth(DateSupport.getMonthInt(time)); 349 } 350 351 352 355 public Vector reverse(Vector v) { 356 357 Vector rev = new Vector (); 358 int index= 0; 359 int size = v.size(); 360 361 for (int i=1;i<=size;i++) { 362 index = size - i; rev.addElement(v.elementAt(index)); 364 } 365 return rev; 366 } 367 368 372 public Vector reverse(Vector v,int items) { 373 374 Vector rev = new Vector (); 375 int index=0, sets=0; 376 int size = v.size(); 377 378 if ((size%items!=0) || (items>size)) { 379 log.debug("Reverse: Incompatible pair: Vectorsize: "+size+" Itemsnumber: "+items+ 380 ", Returning old vector instead"); 381 return v; 382 } 383 384 sets = size/items; 386 for (int i=1;i<=sets;i++) { 387 for (int item=0;item<items;item++) { 388 index = size - i*items + item; rev.addElement(v.elementAt(index)); 390 } 391 } 392 return rev; 393 } 394 } 395 | Popular Tags |