1 55 package org.lateralnz.panther.deploy; 56 57 import java.io.File ; 58 import java.io.FileWriter ; 59 import java.io.IOException ; 60 import java.io.Serializable ; 61 import java.lang.reflect.Method ; 62 import java.util.ArrayList ; 63 import java.util.Iterator ; 64 import java.util.List ; 65 import java.util.StringTokenizer ; 66 67 import org.apache.velocity.app.VelocityEngine; 68 import org.apache.velocity.Template; 69 import org.apache.velocity.VelocityContext; 70 71 import org.w3c.dom.Document ; 72 73 import org.lateralnz.common.util.Constants; 74 import org.lateralnz.common.util.ObjectUtils; 75 import org.lateralnz.common.util.StringUtils; 76 import org.lateralnz.common.util.XMLUtils; 77 78 import org.lateralnz.panther.util.EJBConstants; 79 80 83 public class SessionBeanGenerator implements Constants, Serializable { 84 private String ejbjarXML; 85 private String tempdir; 86 private String classesdir; 87 private String wrapperTemplate; 88 private String homeWrapperTemplate; 89 private String wrapperTemplateDir; 90 private String logfile; 91 92 95 public void setEJBJarXML(String ejbjarXML) { 96 this.ejbjarXML = ejbjarXML; 97 } 98 99 102 public void setTempDir(String tempdir) { 103 this.tempdir = StringUtils.toDirectory(tempdir); 104 } 105 106 109 public void setClassesDir(String classesdir) { 110 this.classesdir = StringUtils.toDirectory(classesdir); 111 } 112 113 116 public void setWrapperTemplate(String wrapperTemplate) { 117 this.wrapperTemplate = wrapperTemplate; 118 } 119 120 public void setHomeWrapperTemplate(String homeWrapperTemplate) { 121 this.homeWrapperTemplate = homeWrapperTemplate; 122 } 123 124 127 public void setWrapperTemplateDir(String wrapperTemplateDir) { 128 this.wrapperTemplateDir = wrapperTemplateDir; 129 } 130 131 public void setLogFile(String logfile) { 132 this.logfile = logfile; 133 } 134 135 138 public void execute() throws Exception { 139 VelocityEngine ve = new VelocityEngine(); 140 ve.setProperty(VelocityEngine.FILE_RESOURCE_LOADER_PATH, wrapperTemplateDir); 141 if (!StringUtils.isEmpty(logfile)) { 142 ve.setProperty(VelocityEngine.RUNTIME_LOG, logfile); 143 } 144 ve.init(); 145 146 Template ejbWrapper = ve.getTemplate(wrapperTemplate); 147 Template homeWrapper = ve.getTemplate(homeWrapperTemplate); 148 149 File f = new File (ejbjarXML); 150 String xml = StringUtils.readFromFile(ejbjarXML); 151 Document doc = XMLUtils.parse(xml); 152 153 File fworkingDir = new File (tempdir); 154 155 List ejbwrappers = new ArrayList (); 157 158 List l = EJBJarUtils.getSessionDescriptors(doc); 160 Iterator iter = l.iterator(); 161 while (iter.hasNext()) { 162 SessionDescriptor sd = (SessionDescriptor)iter.next(); 163 if (sd.getSessionType().equalsIgnoreCase(EJBConstants.STATEFUL)) { 164 iter.remove(); 165 166 System.out.println("note: stateful bean " + sd.getEJBName() + " is not supported"); 167 continue; 168 } 169 170 Class remote = Class.forName(sd.getEJBRemoteClass()); 172 Class home = Class.forName(sd.getEJBHomeClass()); 173 Class ejb = Class.forName(sd.getEJBClass()); 174 175 String packageName = sd.getEJBRemoteClass().substring(0, sd.getEJBRemoteClass().lastIndexOf('.')); 176 String packageDir = StringUtils.replace(packageName, DOT, FILE_SEPARATOR); 177 checkDirStructure(tempdir, packageDir); 178 String [] tmp = StringUtils.toArray(remote.getName(), DOT); 179 180 String wrapperName = tmp[tmp.length - 1] + "Impl"; 182 String homeName = tmp[tmp.length - 1] + "HomeImpl"; 183 String wrapperFullName = StringUtils.replace(sd.getEJBName(), FILE_SEPARATOR, UNDERSCORE); 184 185 String className = classesdir + packageDir + FILE_SEPARATOR + wrapperName + ".class"; 187 String signatureFile = tempdir + packageDir + FILE_SEPARATOR + wrapperName + ".sig"; 188 189 String oldsig = StringUtils.readFromFile(signatureFile); 191 String newsig = ObjectUtils.getMD5Signature(remote); 192 193 File tst = new File (className); 195 196 String logtmp = EMPTY + (tst.exists() ? ONE : ZERO) + (tst.canRead() ? ONE : ZERO) + (newsig.equals(oldsig) ? ONE : ZERO); 197 if (!tst.exists() || !tst.canRead() || !newsig.equals(oldsig)) { 198 Method [] methods = remote.getDeclaredMethods(); 200 ArrayList methodList = new ArrayList (); 201 for (int i = 0; i < methods.length; i++) { 202 if (!ObjectUtils.containsObject(methods[i].getExceptionTypes(), java.rmi.RemoteException .class)) { 203 continue; 204 } 205 boolean trans = false; 206 String tt = sd.getTransEntry(methods[i].getName()); 207 if (tt.equalsIgnoreCase(REQUIRED) 208 || tt.equalsIgnoreCase(REQUIRES_NEW)) { 209 trans = true; 210 } 211 methodList.add(new MethodDescriptor(methods[i], trans, tt)); 212 } 213 214 VelocityContext ctx = new VelocityContext(); 216 ctx.put("ejbpackage", packageName); 217 ctx.put("ejbname", wrapperFullName); 218 ctx.put("ejbwrapper", wrapperName); 219 ctx.put("ejbhomewrapper", homeName); 220 ctx.put("ejb", ejb.getName()); 221 ctx.put("ejbremote", remote.getName()); 222 ctx.put("ejbhome", home.getName()); 223 ctx.put("methods", methodList); 224 ctx.put("generator", this); 225 226 System.out.println("note: generating source for " + remote.getName() + " [" + logtmp + "]"); 227 228 FileWriter fw = new FileWriter (tempdir + packageDir + FILE_SEPARATOR + wrapperName + ".java"); 230 ejbWrapper.merge(ctx, fw); 231 fw.flush(); 232 fw.close(); 233 234 fw = new FileWriter (tempdir + packageDir + FILE_SEPARATOR + homeName + ".java"); 235 homeWrapper.merge(ctx, fw); 236 fw.flush(); 237 fw.close(); 238 239 tst = new File (signatureFile); 241 tst.delete(); 242 fw = new FileWriter (signatureFile); 243 fw.write(newsig); 244 fw.flush(); 245 fw.close(); 246 247 } 248 } 249 } 250 251 259 protected void checkDirStructure(String workingDir, String packageDir) throws IOException { 260 File f = new File (workingDir + packageDir); 261 if (f.exists()) { 262 return; 263 } 264 StringBuffer sb = new StringBuffer (workingDir); 265 StringTokenizer st = new StringTokenizer (packageDir, FILE_SEPARATOR); 266 while (st.hasMoreTokens()) { 267 String next = st.nextToken(); 268 sb.append(next).append(FILE_SEPARATOR); 269 f = new File (sb.toString()); 270 if (!f.exists()) { 271 if (!f.mkdir()) { 272 throw new IOException ("error creating directory : " + sb.toString()); 273 } 274 } 275 } 276 } 277 278 285 public int getLength(Object obj) { 286 try { 287 if (obj instanceof List ) { 288 return ((List )obj).size(); 289 } 290 else { 291 return java.lang.reflect.Array.getLength(obj); 292 } 293 } 294 catch (Exception e) { 295 e.printStackTrace(); 296 return 0; 297 } 298 } 299 300 303 public static final void main(String [] args) throws Exception { 304 SessionBeanGenerator sbg = new SessionBeanGenerator(); 305 sbg.setEJBJarXML(args[0]); 306 sbg.setTempDir(args[1]); 307 sbg.setClassesDir(args[2]); 308 sbg.setWrapperTemplate(args[3]); 309 sbg.setHomeWrapperTemplate(args[4]); 310 sbg.setWrapperTemplateDir(args[5]); 311 sbg.setLogFile(args[6]); 312 313 sbg.execute(); 314 } 315 }
| Popular Tags
|