1 package examples.binding; 2 3 import java.io.IOException ; 4 import java.io.PrintWriter ; 5 import java.io.FileWriter ; 6 import java.io.StringWriter ; 7 import java.util.Iterator ; 8 9 public class BeanGen { 10 11 private String destdir; 12 public BeanGen() {} 13 14 public void setDestDir(String dir) { 15 destdir = dir; 16 } 17 18 public String getDestDir() { 19 return destdir; 20 } 21 22 private static String capital(String oldString) { 23 return (oldString.substring(0,1)).toUpperCase()+ 24 oldString.substring(1,oldString.length()); 25 } 26 27 public void generatePropertyDecl(Property p, 28 PrintWriter writer) { 29 writer.print(" private "); 30 if (p.getType() == Property.STRING) 31 writer.println("String _"+p.getName()+";"); 32 if (p.getType() == Property.INTEGER) 33 writer.println("int _"+p.getName()+";"); 34 if (p.getType() == Property.BEAN) 35 writer.println(p.getRefType()+" _"+p.getName()+";"); 36 } 37 public void generateSetters(Property p, 38 PrintWriter writer) { 39 String name = capital(p.getName()); 40 if (p.getType() == Property.STRING) { 41 writer.print(" public void set"+name+"(String val)"); 42 writer.println("{ _"+p.getName()+"=val;}"); 43 writer.print(" public String get"+name+"()"); 44 writer.println("{ return _"+p.getName()+";}"); 45 } 46 if (p.getType() == Property.INTEGER) { 47 writer.print(" public void set"+name+"(int val)"); 48 writer.println("{ _"+p.getName()+"=val;}"); 49 writer.print(" public int get"+name+"()"); 50 writer.println("{ return _"+p.getName()+";}"); 51 } 52 if (p.getType() == Property.BEAN) { 53 writer.print(" public void set"+name+"("+p.getRefType()+" val)"); 54 writer.println("{ _"+p.getName()+"=val;}"); 55 writer.print(" public "+p.getRefType()+" get"+name+"()"); 56 writer.println("{ return _"+p.getName()+";}"); 57 } 58 } 59 60 public void generateBean(String packageName, 61 BeanInfo info) 62 throws IOException 63 { 64 65 String className = capital(info.getName()); 66 PrintWriter writer = new PrintWriter (new FileWriter (getDestDir()+"/"+className+".java")); 67 writer.println("//**-- "+className+".java--**"); 68 writer.println("package "+packageName+";"); 69 writer.println("public class "+className+" {"); 70 writer.println(" public "+className+"(){}"); 71 Property[] properties = info.getProperties(); 72 for(int i=0; i < properties.length; i++) { 73 generatePropertyDecl(properties[i], writer); 74 } 75 properties = info.getProperties(); 76 for(int i=0; i < properties.length; i++) { 77 generateSetters(properties[i], writer); 78 } 79 writer.println("}"); 80 writer.close(); 81 } 82 83 public void generate(BeanDescription desc) 84 throws IOException 85 { 86 87 Iterator i = desc.getBeans(); 88 while(i.hasNext()) { 89 BeanInfo info = (BeanInfo) i.next(); 90 generateBean(desc.getPackageName(), 91 info); 92 generateCodec(desc.getNamespaceName(), 93 desc.getPackageName(), 94 info); 95 } 96 } 97 98 99 public void generatePropertySerializer(String namespace, 100 String packageName, 101 Property p, 102 PrintWriter writer) { 103 String name = capital(p.getName()); 104 if (p.getType() == Property.STRING) { 105 writer.println(" writer.writeStartElement(_namespace,"+ 106 quote(name)+");"); 107 108 writer.println(" writer.writeCharacters(obj.get"+name+"());"); 109 writer.println(" writer.writeEndElement();"); 110 } 111 if (p.getType() == Property.INTEGER) { 112 writer.println(" writer.writeStartElement(_namespace,"+ 113 quote(name)+");"); 114 115 writer.println(" writer.writeCharacters(Integer.toString(obj.get"+name+"()));"); 116 writer.println(" writer.writeEndElement();"); 117 } 118 if (p.getType() == Property.BEAN) { 119 writer.println(" "+packageName+"."+p.getRefType()+"Codec.serialize(obj.get"+name+"()"+ 120 ",writer);"); 121 } 122 123 } 124 125 public String quote(String val) { 126 return "\""+val+"\""; 127 } 128 129 public void generateSerializer(String namespace, 130 String packageName, 131 BeanInfo info, 132 PrintWriter writer) 133 { 134 String className = capital(info.getName()); 135 writer.println(" public static void serialize("+className+ 136 " obj, XMLStreamWriter writer)"); 137 writer.println(" throws XMLStreamException"); 138 writer.println(" {"); 139 writer.println(" writer.setPrefix(\"a\",_namespace);"); 140 writer.println(" writer.writeStartElement(_namespace,"+ 141 quote(className)+");"); 142 writer.println(" writer.writeNamespace(\"a\",_namespace);"); 143 Property[] properties = info.getProperties(); 144 for(int i=0; i < properties.length; i++) { 145 generatePropertySerializer(namespace,packageName,properties[i], writer); 146 } 147 writer.println(" writer.writeEndElement();"); 148 writer.println(" }"); 149 } 150 151 public void skipSpace(PrintWriter writer) { 152 writer.println(" while(reader.isWhiteSpace() || !(reader.isStartElement() || reader.isEndElement() || reader.isCharacters())) reader.next();"); 153 } 154 155 public void next(PrintWriter writer) { 156 writer.println(" reader.next();"); 157 } 158 159 public void generatePropertyDeserializer(String namespace, 160 String packageName, 161 Property p, 162 PrintWriter writer) { 163 String name = capital(p.getName()); 164 if (p.getType() == Property.STRING) { 165 writer.println(" reader.require(XMLStreamReader.START_ELEMENT,"+ 166 "_namespace,"+ 167 quote(name)+");"); 168 next(writer); 169 170 writer.println(" obj.set"+name+"("+ 171 "reader.getText());"); 172 next(writer); 173 writer.println(" reader.require(XMLStreamReader.END_ELEMENT,"+ 174 "_namespace,"+ 175 quote(name)+");"); 176 next(writer); 177 178 } 179 if (p.getType() == Property.INTEGER) { 180 writer.println(" reader.require(XMLStreamReader.START_ELEMENT,"+ 181 "_namespace,"+ 182 quote(name)+");"); 183 next(writer); 184 185 writer.println(" obj.set"+name+"("+ 186 "(new Integer(reader.getText()).intValue()));"); 187 next(writer); 188 writer.println(" reader.require(XMLStreamReader.END_ELEMENT,"+ 189 "_namespace,"+ 190 quote(name)+");"); 191 next(writer); 192 193 } 194 if (p.getType() == Property.BEAN) { 195 writer.println(" obj.set"+name+"("+packageName+"."+p.getRefType()+"Codec.deserialize(" 196 +"reader));"); 197 } 198 199 } 200 201 public void generateDeserializer(String namespace, 202 String packageName, 203 BeanInfo info, 204 PrintWriter writer) 205 { 206 String className = capital(info.getName()); 207 writer.println(" public static "+className+" deserialize("+ 208 " XMLStreamReader reader)"); 209 writer.println(" throws XMLStreamException"); 210 writer.println(" {"); 211 skipSpace(writer); 212 writer.println(" "+className+" obj = new "+packageName+ 213 "."+className+"();"); 214 writer.println(" reader.require(XMLStreamReader.START_ELEMENT,"+ 215 "_namespace,"+ 216 quote(className)+");"); 217 next(writer); 218 Property[] properties = info.getProperties(); 219 for(int i=0; i < properties.length; i++) { 220 generatePropertyDeserializer(namespace,packageName,properties[i], writer); 221 } 222 writer.println(" reader.require(XMLStreamReader.END_ELEMENT,"+ 223 "_namespace,"+ 224 quote(className)+");"); 225 next(writer); 226 writer.println(" return obj;"); 227 writer.println(" }"); 228 } 229 230 public void generateCodec(String namespace, 231 String packageName, 232 BeanInfo info) 233 throws IOException 234 { 235 236 String className = capital(info.getName()+"Codec"); 237 PrintWriter writer = new PrintWriter (new FileWriter (getDestDir()+"/"+className+".java")); 238 writer.println("//**-- "+className+".java--**"); 239 writer.println("package "+packageName+";"); 240 writer.println("import javax.xml.stream.XMLStreamWriter;"); 241 writer.println("import javax.xml.stream.XMLStreamReader;"); 242 writer.println("import javax.xml.stream.XMLStreamException;"); 243 writer.println("public class "+className+" {"); 244 writer.println(" private static final String _namespace=\""+namespace+"\";"); 245 writer.println(" public "+className+"(){}"); 246 generateSerializer(namespace,packageName,info,writer); 247 generateDeserializer(namespace,packageName,info,writer); 248 writer.println("}"); 249 writer.close(); 250 } 251 252 public static void main(String args[]) 253 throws Exception 254 { 255 Parser parser = new Parser(new java.io.FileReader (args[0])); 256 BeanDescription description = parser.parse(); 257 258 StringWriter w = new StringWriter (); 259 BeanGen generator = new BeanGen(); 260 generator.setDestDir(args[1]); 261 generator.generate(description); 262 } 263 } 264 265 266 267 | Popular Tags |