/* * GroovyClassGenerator.java * * Created on September 17, 2007, 3:05 AM * * CodaServer and related original technologies are copyright 2008, 18th Street Software, LLC. * * Permission to use them is granted under the terms of the GNU GPLv2. */ package org.codalang.codaserver; import org.codalang.codaserver.language.objects.ProcedureParameter; import org.codalang.codaserver.language.objects.TableFieldDefinition; import java.io.IOException; import java.util.Vector; /** * * @author michaelarace */ public class GroovyClassGenerator { public static final String[] reservedWords = new String[] {"abstract","do","if","package","synchronized","boolean","double","implements","private","this","break","else","import","protected","throw","byte","extends","instanceof","public","throws","case","false","int","return","transient","catch","final","interface","short","true","char","finally","long","static","try","class","float","native","strictfp","void","const","for","new","super","volatile","continue", "goto", "null", "switch", "while","default","assert"}; /** Creates a new instance of GroovyClassGenerator */ public GroovyClassGenerator() { } public static String getTypeClass(String typeName, String validationMask, String saveMask) throws IOException { String groovy = "package org.codalang.codaserver.language.types.user\n" + "import org.codalang.codaserver.language.types.BaseCodaType\n" + "class " + CodaServer.camelCapitalize(typeName, true) + " extends BaseCodaType {\n" + "String getValidationString() {\n" + " return '" + validationMask.substring(1, validationMask.length() - 2).replace("\\", "\\\\") + "'\n" + "}\n" + "String getSaveString() {\n" + " return '" + saveMask.substring(1, saveMask.length() - 2).replace("\\", "\\\\") + "'\n" + "}\n" + "}\n"; /* GroovyClassLoader loader = new GroovyClassLoader(); Class groovyClass = loader.parseClass(groovy); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArray); out.writeObject(groovyClass); return byteArray.toByteArray(); InputStream inStream = groovyClass.getResourceAsStream("/" + CodaServer.capitalize(typeName)); byte[] retval = new byte [0]; try { retval = new byte [inStream.available()]; } catch(Exception ex) { int i = 1; } inStream.read(retval); */ return groovy; } public static String getTableClass(String tableName, Vector<TableFieldDefinition> fields) throws IOException { String groovy = "package org.codalang.codaserver.language.tables\n" + "import org.codalang.codaserver.language.types.*\n" + "class " + CodaServer.camelCapitalize(tableName, true) + " implements BaseCodaTable {\n"; for(TableFieldDefinition field : fields) { groovy += CodaServer.camelCapitalize(field.getTypeName(), true) + " " + CodaServer.camelCapitalize(field.getFieldName(), false) + "\n"; } groovy += "void setFields(Hashtable fields) {\n" + "if (fields != null) {\n"; for(TableFieldDefinition field : fields) { groovy += "this." + CodaServer.camelCapitalize(field.getFieldName(), false) + " = fields[\""+ field.getFieldName().toLowerCase() +"\"]\n"; } groovy += "}\n"; groovy += "}\n"; groovy += "}\n"; /* GroovyClassLoader loader = new GroovyClassLoader(); Class groovyClass = loader.parseClass(groovy); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArray); out.writeObject(groovyClass); */ return groovy; } public static String getProcedureClass (String procedureName, Vector<ProcedureParameter> parameters, String procedureBody) throws IOException { String declarations = ""; for (ProcedureParameter parameter : parameters) { declarations += CodaServer.camelCapitalize(parameter.getParameterType(), true) + (parameter.isArrayFlag() ? "[] " : " " )+ CodaServer.camelCapitalize(parameter.getParameterName(), false) + " = parameters[\""+parameter.getParameterName().toUpperCase()+"\"];\n"; } String groovy = "package org.codalang.codaserver.language.procedures\n" + "import org.codalang.codaserver.language.types.*\n" + "import org.codalang.codaserver.language.types.user.*\n" + "import org.codalang.codaserver.language.tables.*\n" + "import org.codalang.codaserver.CodaException\n" + "class " + CodaServer.camelCapitalize(procedureName, true) + " implements BaseCodaProcedure {\n" + "Object execute(Database database, Hashtable parameters) throws CodaException {\n" + declarations + procedureBody + " \n" + "}\n" + "}\n"; /* GroovyClassLoader loader = new GroovyClassLoader(); Class groovyClass = loader.parseClass(groovy); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArray); out.writeObject(groovyClass); */ return groovy; } public static String getTriggerClass (String tableName, String operation, String beforeAfterString, String triggerBody) throws IOException { String groovy = "package org.codalang.codaserver.language.triggers\n" + "import org.codalang.codaserver.language.types.*\n" + "import org.codalang.codaserver.language.types.user.*\n" + "import org.codalang.codaserver.language.tables.*\n" + "import org.codalang.codaserver.CodaException\n" + "class " + CodaServer.camelCapitalize(tableName, true) + CodaServer.camelCapitalize(beforeAfterString, true) + CodaServer.camelCapitalize(operation, true) + " implements BaseCodaTrigger {\n" + "void fire(Database database, BaseCodaTable next, BaseCodaTable prev) throws CodaException {\n" + triggerBody + " \n" + "}\n" + "}\n"; /* GroovyClassLoader loader = new GroovyClassLoader(); Class groovyClass = loader.parseClass(groovy); ByteArrayOutputStream byteArray = new ByteArrayOutputStream(); ObjectOutputStream out = new ObjectOutputStream(byteArray); out.writeObject(groovyClass); */ return groovy; } }