/* * NOTE: This copyright does *not* cover user programs that use HQ * program services by normal system calls through the application * program interfaces provided as part of the Hyperic Plug-in Development * Kit or the Hyperic Client Development Kit - this is merely considered * normal use of the program, and does *not* fall under the heading of * "derived work". * * Copyright (C) [2004, 2005, 2006], Hyperic, Inc. * This file is part of HQ. * * HQ is free software; you can redistribute it and/or modify * it under the terms version 2 of the GNU General Public License as * published by the Free Software Foundation. This program is distributed * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without * even the implied warranty of MERCHANTABILITY or FITNESS FOR A * PARTICULAR PURPOSE. See the GNU General Public License for more * details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA. */ package org.hyperic.lather.util; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.PrintWriter; import org.hyperic.lather.LatherKeyNotFoundException; import org.hyperic.lather.LatherRemoteException; import org.hyperic.lather.LatherValue; import org.apache.commons.beanutils.DynaClass; import org.apache.commons.beanutils.DynaProperty; import org.apache.commons.beanutils.WrapDynaBean; /** * This utility, takes in a class which follows the JavaBean spec, * and writes out .java files which will be LatherValue representations. */ public class Latherize { public class LatherizeException extends Exception { public LatherizeException(String s){ super(s); } } private boolean isLatherStyleProp(DynaProperty prop){ if(prop.getName().equals("class") || (prop.isIndexed() && prop.getType() != byte[].class) || prop.isMapped()) { return false; } return true; } private String makePropVar(DynaProperty prop){ return "PROP_" + prop.getName().toUpperCase(); } private String capName(String name){ return name.substring(0, 1).toUpperCase() + name.substring(1); } private String makeGetter(DynaProperty prop){ return "get" + this.capName(prop.getName()); } private String makeSetter(DynaProperty prop){ return "set" + this.capName(prop.getName()); } public void latherize(boolean xDocletStyle, String outPackage, Class fClass, OutputStream os) throws LatherizeException, IOException { final String INDENT = " "; PrintWriter pWriter; DynaProperty[] dProps; WrapDynaBean dBean; DynaClass dClass; Object beanInstance; String className, lClassName; try { beanInstance = fClass.newInstance(); } catch(IllegalAccessException exc){ throw new LatherizeException("Illegal access trying to create " + "new instance"); } catch(InstantiationException exc){ throw new LatherizeException("Unable to instantiate: " + exc.getMessage()); } dBean = new WrapDynaBean(beanInstance); dClass = dBean.getDynaClass(); dProps = dClass.getDynaProperties(); pWriter = new PrintWriter(os); className = fClass.getName(); className = className.substring(className.lastIndexOf(".") + 1); lClassName = "Lather" + className; pWriter.println("package " + outPackage + ";"); pWriter.println(); pWriter.println("import " + LatherValue.class.getName() + ";"); pWriter.println("import " + LatherRemoteException.class.getName() + ";"); pWriter.println("import " + LatherKeyNotFoundException.class.getName()+ ";"); pWriter.println("import " + fClass.getName() + ";"); pWriter.println(); pWriter.println("public class " + lClassName); pWriter.println(" extends LatherValue"); pWriter.println("{"); for(int i=0; i<dProps.length; i++){ pWriter.print(" "); if(!this.isLatherStyleProp(dProps[i])){ pWriter.print("// "); } pWriter.println("private static final String " + this.makePropVar(dProps[i]) + " = \"" + dProps[i].getName() + "\";"); } pWriter.println(); pWriter.println(" public " + lClassName + "(){"); pWriter.println(" super();"); pWriter.println(" }"); pWriter.println(); pWriter.println(" public " + lClassName + "(" + className + " v){"); pWriter.println(" super();"); pWriter.println(); for(int i=0; i<dProps.length; i++){ String propVar = this.makePropVar(dProps[i]); String getter = "v." + this.makeGetter(dProps[i]) + "()"; if(!this.isLatherStyleProp(dProps[i])){ continue; } if(xDocletStyle){ String lName; lName = dProps[i].getName(); lName = lName.substring(0, 1).toLowerCase() + lName.substring(1); pWriter.println(INDENT + "if(v." + lName + "HasBeenSet()){"); pWriter.print(" "); } if(dProps[i].getType().equals(String.class)){ pWriter.println(INDENT + "this.setStringValue(" + propVar + ", " + getter + ");"); } else if(dProps[i].getType().equals(Integer.TYPE)){ pWriter.println(INDENT + "this.setIntValue(" + propVar + ", " + getter + ");"); } else if(dProps[i].getType().equals(Integer.class)){ pWriter.println(INDENT + "this.setIntValue(" + propVar + ", " + getter + ".intValue());"); } else if(dProps[i].getType().equals(Long.TYPE)){ pWriter.println(INDENT + "this.setDoubleValue(" + propVar + ", (double)" + getter + ");"); } else if(dProps[i].getType().equals(Long.class)){ pWriter.println(INDENT + "this.setDoubleValue(" + propVar + ", (double)" + getter + ".longValue());"); } else if(dProps[i].getType().equals(Boolean.TYPE)){ pWriter.println(INDENT + "this.setIntValue(" + propVar + ", " + getter + " ? 1 : 0);"); } else if(dProps[i].getType().equals(Boolean.class)){ pWriter.println(INDENT + "this.setIntValue(" + propVar + ", " + getter + ".booleanValue() ? 1 : 0);"); } else if(dProps[i].getType().equals(Double.TYPE)){ pWriter.println(INDENT + "this.setDoubleValue(" + propVar + ", " + getter + ");"); } else if(dProps[i].getType().equals(Double.class)){ pWriter.println(INDENT + "this.setDoubleValue(" + propVar + ", " + getter + ".doubleValue());"); } else if(dProps[i].getType().equals(byte[].class)){ pWriter.println(INDENT + "this.setByteAValue(" + propVar + ", " + getter + ");"); } else { pWriter.println(INDENT + "this.setObjectValue(" + "DONT KNOW HOW TO HANDLE THIS, " + getter + ");"); } if(xDocletStyle){ pWriter.println(INDENT + "}"); pWriter.println(); } } pWriter.println(" }"); pWriter.println(); pWriter.println(" public " + className + " get" + className +"(){"); pWriter.println(INDENT + className + " r = new " + className + "();"); pWriter.println(); for(int i=0; i<dProps.length; i++){ String propVar = this.makePropVar(dProps[i]); String setter = "r." + this.makeSetter(dProps[i]) + "("; if(!this.isLatherStyleProp(dProps[i])){ continue; } if(xDocletStyle){ pWriter.println(INDENT + "try {"); pWriter.print(" "); } pWriter.print(INDENT + setter); if(dProps[i].getType().equals(String.class)){ pWriter.println("this.getStringValue(" + propVar + "));"); } else if(dProps[i].getType().equals(Integer.TYPE)){ pWriter.println("this.getIntValue(" + propVar + "));"); } else if(dProps[i].getType().equals(Integer.class)){ pWriter.println("new Integer(this.getIntValue(" + propVar + ")));"); } else if(dProps[i].getType().equals(Long.TYPE)){ pWriter.println("(long)this.getDoubleValue(" + propVar + "));"); } else if(dProps[i].getType().equals(Long.class)){ pWriter.println("new Long((long)this.getDoubleValue(" + propVar + ")));"); } else if(dProps[i].getType().equals(Boolean.TYPE)){ pWriter.println("this.getIntValue(" + propVar + ") == 1 ? " + "true : false);"); } else if(dProps[i].getType().equals(Boolean.class)){ pWriter.println("this.getIntValue(" + propVar + ") == 1 ? " + "Boolean.TRUE : Boolean.FALSE);"); } else if(dProps[i].getType().equals(Double.TYPE)){ pWriter.println("this.getDoubleValue(" + propVar + "));"); } else if(dProps[i].getType().equals(Double.class)){ pWriter.println("new Double(this.getDoubleValue(" + propVar + ")));"); } else if(dProps[i].getType().equals(byte[].class)){ pWriter.println("this.getByteAValue(" + propVar + "));"); } else { pWriter.println("DONT KNOW HOW TO HANDLE " + propVar + "));"); } if(xDocletStyle){ pWriter.println(INDENT + "} catch(LatherKeyNotFoundException "+ "exc){}"); pWriter.println(); } } pWriter.println(INDENT + "return r;"); pWriter.println(" }"); pWriter.println(); pWriter.println(" protected void validate()"); pWriter.println(" throws LatherRemoteException"); pWriter.println(" {"); if(!xDocletStyle){ pWriter.println(" try { "); pWriter.println(" this.get" + className + "();"); pWriter.println(" } catch(LatherKeyNotFoundException e){"); pWriter.println(" throw new LatherRemoteException(\"" + "All values not set\");"); pWriter.println(" }"); } pWriter.println(" }"); pWriter.println("}"); pWriter.flush(); } public static void main(String[] args){ String outPackage; Latherize l; if(args.length < 2){ System.err.println("Syntax: Latherize <outPackage> <class1> " + "[class2] ..."); return; } l = new Latherize(); outPackage = args[0]; for(int i=1; i<args.length; i++){ try { Class fClass; File outFile; fClass = Class.forName(args[i]); System.err.println("Latherizing: " + args[i]); outFile = new File(args[i]); l.latherize(true, outPackage, fClass, new FileOutputStream(outFile)); } catch(ClassNotFoundException exc){ System.err.println("Unable to latherize '" + args[i] + "': Class not found in classpath"); } catch(LatherizeException exc){ System.err.println("Error latherizing class '" + args[i] + "': " + exc.getMessage()); } catch(IOException exc){ System.err.println("Error writing class '" + args[i] + "': " + exc.getMessage()); } } } }