1 3 5 22 23 package edu.neu.ccs.jmk; 24 25 import java.io.*; 26 import java.util.Vector ; 27 28 35 abstract class FileOperator 36 implements Operator 37 { 38 private final static char wildCard = '*'; 39 40 46 abstract boolean exec(File arg, PrintWriter out); 47 48 57 public void exec(String [] args, PrintWriter out) 58 throws CommandFailedException 59 { 60 StringBuffer sb = new StringBuffer (); exec(args, out, sb); 62 if (sb.length() != 0) { sb.insert(0, getName()); 64 throw new CommandFailedException(sb.toString()); 65 } 66 } 67 68 private void exec(String [] args, PrintWriter out, StringBuffer sb) { 69 for (int i = 0; i < args.length; i++) { 70 String fileName = args[i]; 71 if (fileName.indexOf(wildCard) < 0) { if (!exec(new File(fileName), out)) { 73 sb.append(' '); 74 sb.append(fileName); 75 } 76 } 77 else { try { 79 exec(glob(fileName), out, sb); 80 } 81 catch (CommandFailedException ex) { 82 sb.append(' '); 83 sb.append(fileName); 84 } 85 } 86 } 87 } 88 89 95 static String [] glob(String fileName) 96 throws CommandFailedException 97 { 98 int wildCardIndex = fileName.indexOf(wildCard); 99 if (wildCardIndex < 0) return new String [] { fileName }; 101 else { 102 int separatorIndex = fileName.lastIndexOf(File.separatorChar); 103 if (separatorIndex > wildCardIndex) { 104 String msg = "Cannot expand " + fileName; 105 throw new CommandFailedException(msg); 106 } 107 String pattern; 108 String dirName; 109 File dir; 110 if (separatorIndex >= 0) { 111 pattern = fileName.substring(separatorIndex + 1); 112 dirName = fileName.substring(0, separatorIndex + 1); 113 dir = new File(dirName); 114 } 115 else { 116 pattern = fileName; 117 dirName = ""; 118 dir = new File(System.getProperty("user.dir")); 119 } 120 String [] list = dir.list(new WildCardFilter(pattern, wildCard)); 121 if (list == null) 122 return new String [0]; 123 Vector v = new Vector (); 124 for (int i = 0; i < list.length; i++) 125 list[i] = dirName + list[i]; 126 return list; 127 } 128 } 129 130 135 static String [] glob(String [] args) 136 throws CommandFailedException 137 { 138 for (int i = 0; i < args.length; i++) { 139 if (args[i].indexOf(wildCard) >= 0) { Vector v = new Vector (); 141 for (int j = 0; j < i; j++) v.addElement(args[j]); 143 addStrings(v, glob(args[i])); for (int j = i + 1; j < args.length; j++) if (args[j].indexOf(wildCard) >= 0) 146 addStrings(v, glob(args[j])); 147 else 148 v.addElement(args[j]); 149 String [] result = new String [v.size()]; 150 v.copyInto(result); 151 return result; } 153 } 154 return args; } 156 157 private static void addStrings(Vector v, String [] s) { 158 for (int i = 0; i < s.length; i++) 159 v.addElement(s[i]); 160 } 161 162 166 static String [] dirs(String fileName) { 167 Vector v = new Vector (); 168 findDirs(new File(fileName), v); 169 String [] result = new String [v.size()]; 170 v.copyInto(result); 171 return result; 172 } 173 174 private static void findDirs(File f, Vector v) { 175 if (f.isDirectory()) { 176 v.addElement(f.getPath()); 177 String [] l = f.list(); 178 for (int i = 0; i < l.length; i++) 179 findDirs(new File(f, l[i]), v); 180 } 181 } 182 183 188 public static void main(String [] args) { 189 PrintWriter out = new PrintWriter(System.out, true); 190 FileOperator operator = new FileOperator() { 191 boolean exec(File arg, PrintWriter out) { 192 return arg.delete(); 193 } 194 public String getName() { 195 return "delete"; 196 } 197 }; 198 try { 199 operator.exec(args, out); 200 } 201 catch (Throwable t) { 202 System.err.println("Internal error: " + t.getMessage()); 203 t.printStackTrace(); 204 } 205 out.println("File command " + operator.getName() + " completed"); 206 } 207 } 208 | Popular Tags |