1 10 package org.mmbase.util; 11 12 import java.util.*; 13 14 15 import org.mmbase.util.logging.Logger; 16 import org.mmbase.util.logging.Logging; 17 import org.mmbase.util.transformers.*; 18 19 20 53 public class Encode { 54 55 private static Logger log; 56 57 private Transformer trans; 59 private static Map encodings; private static Set registered = new HashSet(); 62 static { 63 log = Logging.getLoggerInstance(Encode.class); 64 encodings = new HashMap(); 65 66 try { 68 register("org.mmbase.util.transformers.MD5"); 69 register("org.mmbase.util.transformers.Base64"); 70 register("org.mmbase.util.transformers.Hex"); 71 register("org.mmbase.util.transformers.Xml"); 72 register("org.mmbase.util.transformers.Url"); 73 register("org.mmbase.util.transformers.Sql"); 74 register("org.mmbase.util.transformers.XmlField"); 75 register("org.mmbase.util.transformers.LinkFinder"); 76 register("org.mmbase.util.transformers.Censor"); 77 register("org.mmbase.util.transformers.Rot13"); 78 register("org.mmbase.util.transformers.Rot5"); 79 register("org.mmbase.util.transformers.UnicodeEscaper"); 80 } catch (IllegalArgumentException e) { 81 log.warn("", e); 82 } 83 } 84 85 93 public Encode(String encoding) { 94 if (encodings.containsKey(encoding.toUpperCase())) { Config e = (Config)encodings.get(encoding.toUpperCase()); try { 97 trans = (Transformer) e.clazz.newInstance(); 98 } catch (InstantiationException ex) { 99 throw new IllegalArgumentException ("encoding: '" + encoding + "' could not be instantiated"); 100 } catch (IllegalAccessException ex) { 101 } 102 if (trans instanceof ConfigurableTransformer) { 103 ((ConfigurableTransformer) trans).configure(e.config); 104 } 105 } else { 106 throw new IllegalArgumentException ("encoding: '" + encoding + "' unknown" + encodings.keySet()); 107 } 108 109 } 110 111 114 public Transformer getTransformer() { 115 return trans; 116 } 117 118 119 125 public static void register(String clazz) { 126 if (! registered.contains(clazz)) { log.service("registering encode class " + clazz); 128 try { 129 Class atrans = Class.forName(clazz); 130 if(Transformer.class.isAssignableFrom(atrans)) { if (ConfigurableTransformer.class.isAssignableFrom(atrans)) { 132 log.debug("A configurable transformer"); 133 ConfigurableTransformer transformer = (ConfigurableTransformer) atrans.newInstance(); 136 Map newencodings = transformer.transformers(); 137 encodings.putAll(newencodings); } else { 139 log.debug("Non configurable"); 140 Transformer transformer = (Transformer) atrans.newInstance(); 141 encodings.put(transformer.toString().toUpperCase(), new Config(atrans, -1, "Transformer: " + clazz)); 142 } 143 146 } else { 147 throw new IllegalArgumentException ("The class " + clazz + " does not implement " + Transformer.class.getName()); 148 } 149 } catch (ClassNotFoundException e) { 150 throw new IllegalArgumentException (e.toString()); 151 } catch (Exception e) { throw new IllegalArgumentException (e.toString()); 154 } 155 registered.add(clazz); 156 } 157 } 158 159 173 public static String encode(String encoding, String toEncode) { 174 Encode e = new Encode(encoding); 175 return e.encode(toEncode); 176 } 177 178 179 public static String encode(String encoding, byte[] bytes) { 180 Encode e = new Encode(encoding); 181 return e.encode(bytes); 182 } 183 184 185 193 194 public static String decode(String encoding, String toDecode) { 195 Encode e = new Encode(encoding); 196 return e.decode(toDecode); 197 } 198 199 public static byte[] decodeBytes(String encoding, String toDecode) { 200 Encode e = new Encode(encoding); 201 return e.decodeBytes(toDecode); 202 } 203 204 205 213 public String encode(String toEncode) { 214 if (isByteToCharEncoder()) { 215 return ((ByteToCharTransformer)trans).transform(toEncode.getBytes()); 216 } else { 217 return ((CharTransformer)trans).transform(toEncode); 218 } 219 } 220 225 public String encode(byte[] bytes) { 226 return ((ByteToCharTransformer)trans).transform(bytes); 227 } 228 229 235 public String decode(String toDecode) { 236 if (isByteToCharEncoder()) { 237 return new String (((ByteToCharTransformer)trans).transformBack(toDecode)); 238 } else { 239 return ((CharTransformer)trans).transformBack(toDecode); 240 } 241 } 242 public byte[] decodeBytes(String toDecode) { 243 if (isByteToCharEncoder()) { 244 return ((ByteToCharTransformer)trans).transformBack(toDecode); 245 } else { 246 return ((CharTransformer)trans).transformBack(toDecode).getBytes(); 247 } 248 } 249 254 255 public static Set possibleEncodings() { 256 return encodings.keySet(); 257 } 258 259 263 public static boolean isEncoding(String e) { 264 return encodings.containsKey(e.toUpperCase()); 265 } 266 269 public boolean isCharEncoder() { 270 return trans instanceof org.mmbase.util.transformers.CharTransformer; 271 } 272 275 public boolean isByteToCharEncoder() { 276 return trans instanceof org.mmbase.util.transformers.ByteToCharTransformer; 277 } 278 283 public String getEncoding() { 284 return trans.toString(); 285 } 286 289 public static void main(String [] argv) { 290 try { 291 org.mmbase.module.core.MMBaseContext.init(System.getProperty("mmbase.config"), false); 292 } catch (Throwable e) { 293 System.err.println("Could not intialize mmbase context, proceeding without it: " + e.getMessage()); 294 } 295 String coding = null; 296 boolean decode = false; 297 String string = null; 298 299 { int cur = 0; 301 while (cur < argv.length) { 302 if ("-decode".equals(argv[cur])) { 303 decode = true; 304 } else if ("-encode".equals(argv[cur])) { 305 } else if ("-class".equals(argv[cur])) { 306 register(argv[++cur]); 307 } else { 308 if (coding == null) { 309 coding = argv[cur]; 310 if (! isEncoding(coding)) { 311 throw new RuntimeException (coding + " is not a known coding"); 312 } 313 } else if (argv[cur].charAt(0) == '-') { 314 throw new RuntimeException ("unknown option " + argv[cur]); 315 } else { 316 if (string == null) string = ""; 317 string += " " + argv[cur]; 318 } 319 } 320 cur++; 321 } 322 } 323 324 if (coding == null) { System.out.println("org.mmbase.util.Encode main is for testing purposes only\n"); 326 System.out.println(" use: java -Dmmbase.config=... org.mmbase.util.Encode [-class <classname> [-class ..]] [-encode|-decode] <coding> [string]\n\n"); 327 System.out.println("On default it encodes and gets the string from STDIN\n\n"); 328 System.out.println("possible decoding are"); 329 List v = new ArrayList(possibleEncodings()); 330 java.util.Collections.sort(v); 331 Iterator i = v.iterator(); 332 while (i.hasNext()) { 333 String enc = (String )i.next(); 334 System.out.println(enc + " " + ((Config)encodings.get(enc)).info); 335 } 336 } else { 337 338 if (string == null) { 339 string = ""; 341 try { 342 java.io.BufferedReader stdinReader = new java.io.BufferedReader (new java.io.InputStreamReader (System.in)); 343 String line = stdinReader.readLine(); 344 while (line != null) { 345 string += line + "\n"; 346 line = stdinReader.readLine(); 347 } 348 log.service("----------------"); 349 } catch (java.io.IOException e) { 350 System.err.println(e.toString()); 351 } 352 } 353 354 if (decode) { 356 System.out.println(new String (decodeBytes(coding, string))); 357 } else { 359 System.out.println(encode(coding, string)); 360 } 361 } 362 } 363 } 364 | Popular Tags |