| 1 33 34 package com.icesoft.faces.webapp.parser; 35 36 import com.icesoft.jasper.xmlparser.ParserUtils; 37 import org.apache.commons.digester.Digester; 38 import org.apache.commons.digester.Rule; 39 import org.apache.commons.logging.Log; 40 import org.apache.commons.logging.LogFactory; 41 import org.xml.sax.Attributes ; 42 43 import java.io.FileInputStream ; 44 import java.io.FileOutputStream ; 45 import java.io.FileWriter ; 46 import java.io.IOException ; 47 import java.io.InputStream ; 48 import java.io.ObjectInputStream ; 49 import java.io.ObjectOutputStream ; 50 import java.io.Serializable ; 51 import java.io.Writer ; 52 import java.util.Hashtable ; 53 54 61 public class TagToComponentMap implements Serializable { 62 63 public static final String XHTML_COMPONENT_TYPE = 64 "com.icesoft.faces.XhtmlComponent"; 65 public static final String XHTML_COMPONENT_CLASS = 66 "com.icesoft.faces.component.UIXhtmlComponent"; 67 private static ClassLoader loader = 68 TagToComponentMap.class.getClassLoader(); 69 private static final Log log = LogFactory.getLog(TagToComponentMap.class); 70 71 private Hashtable tagToComponentMap = new Hashtable (); 72 private Writer faceletsTaglibXmlWriter; 73 74 private void setFaceletsTaglibXmlWriter(Writer writer) { 75 faceletsTaglibXmlWriter = writer; 76 } 77 78 86 static TagToComponentMap loadFrom(InputStream fis) 87 throws IOException , ClassNotFoundException { 88 try { 89 ObjectInputStream ois = new ObjectInputStream (fis); 90 return (TagToComponentMap) ois.readObject(); 91 } catch (IOException e) { 92 log.error("Error building map from TLD tag names", e); 93 throw e; 94 } catch (ClassNotFoundException e) { 95 log.error("Error building map from TLD tag names", e); 96 throw e; 97 } 98 catch (Exception e) { 99 return new TagToComponentMap(); 100 } 101 } 102 103 108 public Hashtable getTagToComponentMap() { 109 return tagToComponentMap; 110 } 111 112 119 public void addTags(InputStream tldInput) throws IOException { 120 121 126 Digester digester = new Digester(); 127 digester.setNamespaceAware(true); 128 digester.setValidating(false); 129 digester.setEntityResolver(ParserUtils.entityResolver); 130 digester.setUseContextClassLoader(false); 131 132 134 digester.setClassLoader(loader); 135 136 digester.addObjectCreate("*/tag", 138 "com.icesoft.faces.webapp.parser.TagToTagClassElement"); 139 digester.addObjectCreate("*/uri", "java.lang.StringBuffer"); 140 141 NameRule nRule = 143 new NameRule(tagToComponentMap, faceletsTaglibXmlWriter); 144 digester.addRule("*/tag/tag-class", nRule); 145 digester.addRule("*/uri", nRule); 146 147 digester.addCallMethod("*/tag/name", "setTagName", 0); 149 digester.addCallMethod("*/tag/tag-class", "setTagClass", 0); 150 digester.addCallMethod("*/uri", "append", 0); 151 152 try { 153 digester.parse(tldInput); 154 } catch (Throwable e) { 155 IOException ioe = new IOException ("Can't parse tld " + tldInput.toString()); 156 ioe.initCause( e ); 157 throw ioe; 158 } 159 } 160 161 162 168 public static void main(String args[]) { 169 170 173 174 FileInputStream tldFile = null; 175 176 TagToComponentMap map = new TagToComponentMap(); 177 178 if (args[0].equals("new")) { 179 181 for (int i = 2; i < args.length; i++) { 182 try { 183 tldFile = new FileInputStream (args[i]); 184 map.addTags((InputStream ) tldFile); 185 } 186 catch (IOException e) { 187 e.printStackTrace(); 188 return; 189 } 190 } 191 192 try { 193 FileOutputStream fos = new FileOutputStream (args[1]); 194 ObjectOutputStream oos = new ObjectOutputStream (fos); 195 oos.writeObject(map); 196 oos.flush(); 197 oos.close(); 198 } catch (Exception e) { 199 e.printStackTrace(); 200 } 201 } else if (args[0].equals("old")) { 202 try { 204 FileInputStream fis = new FileInputStream (args[1]); 205 ObjectInputStream ois = new ObjectInputStream (fis); 206 map = (TagToComponentMap) ois.readObject(); 207 } catch (Exception e) { 208 e.printStackTrace(); 209 } 210 } else if (args[0].equals("facelets")) { 211 217 try { 218 FileWriter faceletsTaglibXmlWriter = new FileWriter (args[1]); 219 String preamble = 220 "<?xml version=\"1.0\"?>\n" + 221 "<!DOCTYPE facelet-taglib PUBLIC\n" + 222 " \"-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN\"\n" + 223 " \"http://java.sun.com/dtd/web-facesconfig_1_0.dtd\">\n\n" + 224 "<facelet-taglib>\n"; 225 String trailer = 226 "</facelet-taglib>\n"; 227 faceletsTaglibXmlWriter.write(preamble); 228 229 map.setFaceletsTaglibXmlWriter(faceletsTaglibXmlWriter); 230 tldFile = new FileInputStream (args[2]); 231 map.addTags((InputStream ) tldFile); 232 233 faceletsTaglibXmlWriter.write(trailer); 234 faceletsTaglibXmlWriter.flush(); 235 faceletsTaglibXmlWriter.close(); 236 } 237 catch (IOException e) { 238 e.printStackTrace(); 239 return; 240 } 241 } 242 } 243 } 244 245 246 249 final class NameRule extends Rule { 250 252 private Hashtable componentMap; 253 private Writer faceletsTaglibXmlWriter; 254 private String currentNamespace; 255 256 private static final Log log = LogFactory.getLog(NameRule.class); 257 258 264 public NameRule(Hashtable map, Writer writer) { 265 super(); 266 componentMap = map; 267 faceletsTaglibXmlWriter = writer; 268 currentNamespace = null; 269 } 270 271 278 public void begin(Attributes attributes) throws Exception { 279 280 } 281 282 288 public void end(String namespace, String name) { 289 if (name.equals("uri")) { 290 if (faceletsTaglibXmlWriter != null) { 291 try { 292 String ns = digester.peek().toString(); 293 boolean namespaceChanged = 294 (ns != null && ns.length() > 0) && 295 (currentNamespace == null || 296 !currentNamespace.equals(ns)); 297 if (namespaceChanged) { 298 currentNamespace = ns; 299 String nsOutput = 300 " <namespace>" + currentNamespace + 301 "</namespace>\n"; 302 faceletsTaglibXmlWriter.write(nsOutput); 303 System.out.print(nsOutput); 304 } 305 } 306 catch (Exception e) { 307 System.out.println( 308 "Problem writing namespace to Facelets taglib.xml. Exception: " + 309 e); 310 } 311 } 312 return; 313 } 314 315 TagToTagClassElement elem = (TagToTagClassElement) digester.peek(); 316 317 318 if (componentMap.get(elem.getTagName()) != null) { 319 if (log.isDebugEnabled()) { 320 log.debug("Duplicate Tag " + elem.getTagName() + 321 " not processed"); 322 } 323 return; 324 } 325 326 componentMap.put(elem.getTagName(), elem.getTagClass()); 327 if (log.isDebugEnabled()) { 328 log.debug( 329 "Adding " + elem.getTagName() + ": " + elem.getTagClass()); 330 } 331 332 if (faceletsTaglibXmlWriter != null) { 333 try { 334 String tagName = elem.getTagName(); 335 String tagClassStr = elem.getTagClass(); 336 if (tagName != null && tagClassStr != null && 337 tagClassStr.indexOf("com.icesoft") >= 0) { 338 if (tagName.equals("tabChangeListener")) { 343 StringBuffer sb = new StringBuffer (256); 344 sb.append("\t<tag>\n\t\t<tag-name>"); 345 sb.append(tagName); 346 sb.append("</tag-name>\n\t\t<handler-class>"); 347 sb.append( 348 "com.icesoft.faces.facelets.TabChangeListenerHandler"); 349 sb.append("</handler-class>\n\t</tag>\n"); 350 faceletsTaglibXmlWriter.write(sb.toString()); 351 System.out.print(sb.toString()); 352 } else { 353 Class tagClass = Class.forName(tagClassStr); 354 Object tagObj = tagClass.newInstance(); 355 java.lang.reflect.Method getComponentTypeMeth = 356 tagClass.getMethod("getComponentType", 357 new Class []{}); 358 String componentType = 359 (String ) getComponentTypeMeth.invoke( 360 tagObj, new Object []{}); 361 java.lang.reflect.Method getRendererTypeMeth = 362 tagClass.getMethod("getRendererType", 363 new Class []{}); 364 String rendererType = 365 (String ) getRendererTypeMeth.invoke( 366 tagObj, new Object []{}); 367 368 StringBuffer sb = new StringBuffer (256); 369 sb.append("\t<tag>\n\t\t<tag-name>"); 370 sb.append(tagName); 371 sb.append( 372 "</tag-name>\n\t\t<component>\n\t\t\t<component-type>"); 373 sb.append(componentType); 374 sb.append("</component-type>\n"); 375 if (rendererType != null) { 376 sb.append("\t\t\t<renderer-type>"); 377 sb.append(rendererType); 378 sb.append("</renderer-type>\n"); 379 } 380 sb.append("\t\t\t<handler-class>com.icesoft.faces.component.facelets.IceComponentHandler</handler-class>\n"); 381 sb.append("\t\t</component>\n\t</tag>\n"); 382 faceletsTaglibXmlWriter.write(sb.toString()); 383 System.out.print(sb.toString()); 384 } 385 } 386 } 387 catch (Exception e) { 388 System.out.println( 389 "Problem writing tag to Facelets taglib.xml. Tag name: " + 390 elem.getTagName() + 391 ", Tag class: " + elem.getTagClass() + 392 ", Exception: " + e); 393 } 394 } 395 } 396 } 397 | Popular Tags |