1 18 package org.apache.activemq.openwire.tool; 19 20 import org.apache.tools.ant.Project; 21 import org.apache.tools.ant.taskdefs.FixCRLF; 22 import org.codehaus.jam.JClass; 23 import org.codehaus.jam.JProperty; 24 import org.codehaus.jam.JamClassIterator; 25 26 import java.io.File ; 27 import java.io.FileWriter ; 28 import java.io.PrintWriter ; 29 import java.util.ArrayList ; 30 import java.util.HashSet ; 31 import java.util.List ; 32 import java.util.Set ; 33 34 38 public abstract class MultiSourceGenerator extends OpenWireGenerator { 39 protected Set manuallyMaintainedClasses = new HashSet (); 40 protected File destDir; 41 protected File destFile; 42 43 protected JClass jclass; 44 protected JClass superclass; 45 protected String simpleName; 46 protected String className; 47 protected String baseClass; 48 protected StringBuffer buffer; 49 50 public MultiSourceGenerator() { 51 initialiseManuallyMaintainedClasses(); 52 } 53 54 public Object run() { 55 if (destDir == null) { 56 throw new IllegalArgumentException ("No destDir defined!"); 57 } 58 System.out.println(getClass().getName() + " generating files in: " + destDir); 59 destDir.mkdirs(); 60 buffer = new StringBuffer (); 61 62 JamClassIterator iter = getClasses(); 63 while (iter.hasNext()) { 64 jclass = iter.nextClass(); 65 if (isValidClass(jclass)) { 66 processClass(jclass); 67 } 68 } 69 return null; 70 } 71 72 75 public List getProperties() { 76 List answer = new ArrayList (); 77 JProperty[] properties = jclass.getDeclaredProperties(); 78 for (int i = 0; i < properties.length; i++) { 79 JProperty property = properties[i]; 80 if (isValidProperty(property)) { 81 answer.add(property); 82 } 83 } 84 return answer; 85 } 86 87 protected boolean isValidClass(JClass jclass) { 88 if (jclass.getAnnotation("openwire:marshaller") == null) { 89 return false; 90 } 91 return !manuallyMaintainedClasses.contains(jclass.getSimpleName()); 92 } 93 94 protected void processClass(JClass jclass) { 95 simpleName = jclass.getSimpleName(); 96 superclass = jclass.getSuperclass(); 97 98 System.out.println(getClass().getName() + " processing class: " + simpleName); 99 100 className = getClassName(jclass); 101 102 destFile = new File (destDir, className + filePostFix); 103 104 baseClass = getBaseClassName(jclass); 105 106 PrintWriter out = null; 107 try { 108 out = new PrintWriter (new FileWriter (destFile)); 109 generateFile(out); 110 } 111 catch (Exception e) { 112 throw new RuntimeException (e); 113 } 114 finally { 115 if (out != null) { 116 out.close(); 117 } 118 } 119 120 Project project = new Project(); 123 project.init(); 124 FixCRLF fixCRLF = new FixCRLF(); 125 fixCRLF.setProject(project); 126 fixCRLF.setSrcdir(destFile.getParentFile()); 127 fixCRLF.setIncludes(destFile.getName()); 128 fixCRLF.execute(); 129 } 130 131 protected abstract void generateFile(PrintWriter out) throws Exception ; 132 133 protected String getBaseClassName(JClass jclass) { 134 String answer = "BaseDataStructure"; 135 if (superclass != null) { 136 String name = superclass.getSimpleName(); 137 if (name != null && !name.equals("Object")) { 138 answer = name; 139 } 140 } 141 return answer; 142 } 143 144 protected String getClassName(JClass jclass) { 145 return jclass.getSimpleName(); 146 } 147 148 public boolean isAbstractClass() { 149 return jclass != null & jclass.isAbstract(); 150 } 151 152 public String getAbstractClassText() { 153 return isAbstractClass() ? "abstract " : ""; 154 } 155 156 public boolean isMarshallerAware() { 157 return isMarshallAware(jclass); 158 } 159 160 protected void initialiseManuallyMaintainedClasses() { 161 String [] names = { "ActiveMQDestination", "ActiveMQTempDestination", "ActiveMQQueue", "ActiveMQTopic", "ActiveMQTempQueue", "ActiveMQTempTopic", 162 "BaseCommand", 163 "ActiveMQMessage", "ActiveMQTextMessage", "ActiveMQMapMessage", "ActiveMQBytesMessage", "ActiveMQStreamMessage", 164 "ActiveMQBlobMessage", "DataStructureSupport", "WireFormatInfo", "ActiveMQObjectMessage" }; 165 166 for (int i = 0; i < names.length; i++) { 167 manuallyMaintainedClasses.add(names[i]); 168 } 169 } 170 171 public String getBaseClass() { 172 return baseClass; 173 } 174 175 public void setBaseClass(String baseClass) { 176 this.baseClass = baseClass; 177 } 178 179 public String getClassName() { 180 return className; 181 } 182 183 public void setClassName(String className) { 184 this.className = className; 185 } 186 187 public File getDestDir() { 188 return destDir; 189 } 190 191 public void setDestDir(File destDir) { 192 this.destDir = destDir; 193 } 194 195 public File getDestFile() { 196 return destFile; 197 } 198 199 public void setDestFile(File destFile) { 200 this.destFile = destFile; 201 } 202 203 public JClass getJclass() { 204 return jclass; 205 } 206 207 public void setJclass(JClass jclass) { 208 this.jclass = jclass; 209 } 210 211 public Set getManuallyMaintainedClasses() { 212 return manuallyMaintainedClasses; 213 } 214 215 public void setManuallyMaintainedClasses(Set manuallyMaintainedClasses) { 216 this.manuallyMaintainedClasses = manuallyMaintainedClasses; 217 } 218 219 public String getSimpleName() { 220 return simpleName; 221 } 222 223 public void setSimpleName(String simpleName) { 224 this.simpleName = simpleName; 225 } 226 227 public JClass getSuperclass() { 228 return superclass; 229 } 230 231 public void setSuperclass(JClass superclass) { 232 this.superclass = superclass; 233 } 234 235 } 236 | Popular Tags |