Last active
August 29, 2015 14:04
-
-
Save neuro-sys/74cf6b252c5e47c08b1d to your computer and use it in GitHub Desktop.
It converts the Oracle Types that JDeveloper generates for accessing PL/SQL Stored Procedures into POJOs (for the native ones are not Serializable and hard to read). It also generates a POJO to JDeveloper's Oracle Types converter using Apache BinUtils.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package com.allianz.health.provision.ejb.util; | |
import java.io.BufferedReader; | |
import java.io.File; | |
import java.io.FileReader; | |
import java.io.IOException; | |
import java.io.PrintWriter; | |
import java.util.ArrayList; | |
import java.util.Date; | |
import java.util.List; | |
import java.util.regex.Matcher; | |
import java.util.regex.Pattern; | |
/** | |
* It converts the Oracle Types that JDeveloper generates for accessing | |
* PL/SQL Stored Procedures into POJOs (for the native ones are not Serializable | |
* and hard to read). It also generates a POJO to JDeveloper's Oracle Types | |
* converter using BinUtils. | |
* | |
* | |
* @author neuro_sys | |
* @TODO: Apache Velocity could be used for templating. | |
* | |
*/ | |
public class JDeveloperOracleTypeToPOJOConverter { | |
private String _sourceFolder = null; | |
private String _packageName = null; | |
private File _destinationPackageFolder = null; | |
private boolean _createWithAllOracleTypesInitialized = true; | |
public JDeveloperOracleTypeToPOJOConverter(String sourceFolder, String packageName) { | |
this._sourceFolder = sourceFolder; | |
this._packageName = packageName; | |
} | |
public void execute() throws Exception { | |
_destinationPackageFolder = new File("D:\\generatedJava\\" + _packageName.replace(".", System.getProperty("file.separator"))); | |
_destinationPackageFolder.mkdirs(); | |
File dir = new File(_sourceFolder); | |
File[] directoryListing = dir.listFiles(); | |
List<String> classNameList = new ArrayList<String>(); | |
for (File f : directoryListing) { | |
if (f.getName().contains(".java")) { | |
if (f.getName().endsWith("Typ.java") || f.getName().endsWith("Type.java") || f.getName().endsWith("Tbl.java") || f.getName().endsWith("Table.java")) { | |
createPOJOSourceFromOracleTypeSource(f); | |
classNameList.add(f.getName().substring(0, f.getName().indexOf(".java")) + "Bean"); | |
} | |
} | |
} | |
createBinutilsConverterSource(classNameList); | |
} | |
private static class Parameter { | |
private String typeName; | |
private String attributeName; | |
} | |
private void createBinutilsConverterSource(List<String> parameterList) throws Exception { | |
File file = new File(_destinationPackageFolder.getAbsolutePath() + "\\OracleTypeConverterUtilsBean" + ".java"); | |
PrintWriter out = new PrintWriter(file, "UTF-8"); | |
out.write("package " + _packageName + ";\n\n"); | |
out.write("import org.apache.commons.beanutils.ConvertUtilsBean;\n"); | |
out.write("import org.apache.commons.beanutils.Converter;\n"); | |
out.write("import org.apache.commons.beanutils.BeanUtilsBean;\n\n"); | |
out.write("import com.allianz.health.provision.ejb.dao.bean.*;\n\n"); | |
out.write("/* OracleTypePOJOGeneratorWithSourceParsing ile */\n"); | |
out.write("/* Otomatik yaratildi: " + new Date() + " */\n\n"); | |
out.write("public class OracleTypeConverterUtilsBean {\n\n"); | |
out.write("\tprivate static OracleTypeConverterUtilsBean _instance = new OracleTypeConverterUtilsBean();\n"); | |
out.write("\n"); | |
out.write("\tprivate static BeanUtilsBean _beanUtilsBean;\n"); | |
out.write("\n"); | |
out.write("\tprivate OracleTypeConverterUtilsBean() {\n"); | |
out.write(getTabCharacter(2) + "final BeanUtilsBean beanUtilsBean = new BeanUtilsBean();\n"); | |
out.write(getTabCharacter(2) + "ConvertUtilsBean convertUtilsBean = beanUtilsBean.getConvertUtils();\n\n"); | |
for (String s : parameterList) { | |
/* Tbl ya da Table ile biten Class isimleri icin farkli icerik gerekiyor. */ | |
if (s.contains("Type") || s.contains("Typ")) { | |
out.write(getTabCharacter(2) + "convertUtilsBean.register(new Converter() {\n"); | |
out.write(getTabCharacter(3) + "@Override\n"); | |
out.write(getTabCharacter(3) + "public <T> T convert(Class<T> arg0, Object orig) {\n"); | |
out.write(getTabCharacter(4) + makeConverterOracleTypeNameFromParamName(s) + " dest = new " + makeConverterOracleTypeNameFromParamName(s) + "();\n"); | |
out.write(getTabCharacter(4) + "try { beanUtilsBean.copyProperties(dest, orig); } catch (Exception e) {}\n"); | |
out.write(getTabCharacter(4) + "return (T) dest;\n"); | |
out.write(getTabCharacter(4) + "}\n"); | |
out.write(getTabCharacter(2) + "}, " + makeConverterOracleTypeNameFromParamName(s) + ".class);\n\n"); | |
/* Her Type ya da Typ ile biten Class'in array ([]) hali icin de converter yaratmak gerekiyor, zira farkli tipler. */ | |
out.write(getTabCharacter(2) + "convertUtilsBean.register(new Converter() {\n"); | |
out.write(getTabCharacter(3) + "@Override\n"); | |
out.write(getTabCharacter(3) + "public <T> T convert(Class<T> arg0, Object orig) {\n"); | |
out.write(getTabCharacter(4) + "" + s + "[] origType = (" + s + "[]) orig;\n"); | |
out.write(getTabCharacter(4) + "" + makeConverterOracleTypeNameFromParamName(s) + "[] dest = new " + makeConverterOracleTypeNameFromParamName(s) + "[origType.length];\n"); | |
out.write(getTabCharacter(4) + "for (int i = 0; i < origType.length; i++) {\n"); | |
out.write(getTabCharacter(4) + "dest[i] = new " + makeConverterOracleTypeNameFromParamName(s) + "();\n"); | |
out.write(getTabCharacter(4) + "try { beanUtilsBean.copyProperties(dest[i], origType[i]); } catch (Exception e) { e.printStackTrace(); }\n"); | |
out.write(getTabCharacter(4) + "}\n"); | |
out.write(getTabCharacter(4) + "try { beanUtilsBean.copyProperties(dest, orig); } catch (Exception e) {}\n"); | |
out.write(getTabCharacter(4) + "return (T) dest;\n"); | |
out.write(getTabCharacter(3) + "}\n"); | |
out.write(getTabCharacter(2) + "}, " + makeConverterOracleTypeNameFromParamName(s) + "[].class);\n\n"); | |
} else if (s.contains("Table") || s.contains("Tbl")) { | |
out.write(getTabCharacter(2) + "convertUtilsBean.register(new Converter() {\n"); | |
out.write(getTabCharacter(3) + "@Override\n"); | |
out.write(getTabCharacter(3) + "public <T> T convert(Class<T> arg0, Object orig) {\n"); | |
out.write(getTabCharacter(4) + "" + makeConverterOracleTypeNameFromParamName(s) + " dest = new " + makeConverterOracleTypeNameFromParamName(s) + "();\n"); | |
out.write(getTabCharacter(4) + "try { beanUtilsBean.copyProperty(dest, \"array\", ((" + s + ") orig).getA()); } catch (Exception e) {}\n"); | |
out.write(getTabCharacter(4) + "return (T) dest;\n"); | |
out.write(getTabCharacter(3) + "}\n"); | |
out.write(getTabCharacter(2) + "}, " + makeConverterOracleTypeNameFromParamName(s) + ".class);\n\n"); | |
} | |
} | |
out.write("\t\t_beanUtilsBean = beanUtilsBean;\n"); | |
out.write("\t}\n"); | |
out.write("\n"); | |
out.write("\tpublic static OracleTypeConverterUtilsBean getInstance() {\n"); | |
out.write("\t\tif (_instance == null) {\n"); | |
out.write("\t\t\t_instance = new OracleTypeConverterUtilsBean();\n"); | |
out.write("\t\t}\n"); | |
out.write("\n"); | |
out.write("\t\treturn _instance;\n"); | |
out.write("\t}\n"); | |
out.write("\n"); | |
out.write(getTabCharacter(1) + "@SuppressWarnings(\"unchecked\")\n"); | |
out.write(getTabCharacter(1) + "public static BeanUtilsBean getConvertUtilsBean() {\n"); | |
out.write(getTabCharacter(2) + "return _beanUtilsBean;\n"); | |
out.write(getTabCharacter(1) + "\n"); | |
out.write("\t}\n"); | |
out.write("}\n\n"); | |
out.close(); | |
} | |
private void createPOJOSourceFromOracleTypeSource(File f) throws Exception { | |
String fileContent = readFile(f.getAbsolutePath()); | |
int endIndex = fileContent.lastIndexOf("/* ORAData interface */"); | |
int beginIndex = fileContent.substring(0, endIndex).lastIndexOf("public "); | |
String relevantPart = fileContent.substring(beginIndex, endIndex); | |
String line = relevantPart.split("\n")[0]; | |
String type = ""; | |
String parameters = ""; | |
List<Parameter> parametersList = new ArrayList<Parameter>(); | |
Pattern typePattern = Pattern.compile(" (.*)\\("); | |
Matcher typeMatcher = typePattern.matcher(line); | |
if ( typeMatcher.find() ) { | |
type = typeMatcher.group(); | |
type = type.substring(1, type.length()-1); | |
} | |
Pattern parametersPattern = Pattern.compile("\\(.*\\)"); | |
Matcher parametersMatcher = parametersPattern.matcher(line); | |
if ( parametersMatcher.find() ) { | |
parameters = parametersMatcher.group(); | |
parameters = parameters.substring(1, parameters.length()-1); | |
String[] params = parameters.split(","); | |
for (String s : params) { | |
String typeAndName[] = s.trim().split(" "); | |
Parameter p = new Parameter(); | |
p.typeName = typeAndName[0]; | |
p.attributeName = typeAndName[1]; | |
if (isOracleType(p.typeName)) { | |
if ( p.typeName.contains("[]") ) p.typeName = p.typeName.replace("[]", "Bean[]"); | |
else p.typeName = p.typeName + "Bean"; | |
} | |
parametersList.add(p); | |
} | |
} | |
String className = f.getName().substring(0, f.getName().indexOf(".")); | |
File file = new File(_destinationPackageFolder.getAbsolutePath() + "\\" + className + "Bean.java"); | |
PrintWriter out = new PrintWriter(file, "UTF-8"); | |
out.write("package " + _packageName + ";\n\n"); | |
out.write("import static org.apache.commons.lang3.builder.ToStringStyle.SHORT_PREFIX_STYLE;\n\n"); | |
out.write("import java.io.Serializable;\n\n"); | |
out.write("import org.apache.commons.lang3.builder.ToStringBuilder;\n\n"); | |
out.write("/* OracleTypePOJOGeneratorWithSourceParsing ile */\n"); | |
out.write("/* Otomatik yaratildi: " + new Date() + " */\n\n"); | |
out.write("public class " + type + "Bean implements Serializable {\n\n"); | |
out.write(getTabCharacter(1) + "private static final long serialVersionUID = 1L;\n\n"); | |
out.write(getTabCharacter(1) + "/* Attributes */\n"); | |
for (Parameter param : parametersList) { | |
out.write(getTabCharacter(1) + "private " + param.typeName + " " + param.attributeName); | |
if (_createWithAllOracleTypesInitialized && isOracleType(param.typeName) && !param.typeName.endsWith("[]")) { | |
out.write(" = new " + param.typeName + "()"); | |
} | |
if (_createWithAllOracleTypesInitialized && isOracleType(param.typeName) && param.typeName.endsWith("[]")) { | |
out.write(" = new " + param.typeName.replace("[]", "") + "[1]"); | |
} | |
out.write(";\n"); | |
if (_createWithAllOracleTypesInitialized && isOracleType(param.typeName) && param.typeName.endsWith("[]")) { | |
out.write(getTabCharacter(1) + "{\n"); | |
out.write(getTabCharacter(2) + "a[0] = new " + param.typeName.replace("[]", "") + "();\n"); | |
out.write(getTabCharacter(1) + "}\n"); | |
} | |
out.write("\n"); | |
} | |
out.write(getTabCharacter(1) + "/* Accessors */\n"); | |
for (Parameter param : parametersList) { | |
out.write(getTabCharacter(1) + "public void set" + upperCaseFirstCharOfString(param.attributeName) + "(" + param.typeName + " " + param.attributeName + ") {\n"); | |
out.write(getTabCharacter(2) + "this." + param.attributeName + " = " + param.attributeName + ";\n"); | |
out.write(getTabCharacter(1) + "}\n"); | |
out.write(getTabCharacter(1) + "public " + param.typeName + " get" + upperCaseFirstCharOfString(param.attributeName) + "() {\n"); | |
out.write(getTabCharacter(2) + "return " + param.attributeName + ";\n"); | |
out.write(getTabCharacter(1) + "}\n"); | |
} | |
out.write(getTabCharacter(1) + "public String toString() {\n"); | |
out.write(getTabCharacter(2) + "return ToStringBuilder.reflectionToString(this, SHORT_PREFIX_STYLE);\n"); | |
out.write(getTabCharacter(1) + "}\n"); | |
out.write("}\n\n"); | |
out.close(); | |
} | |
/* Priate Util methods */ | |
private String makeConverterOracleTypeNameFromParamName(String paramName) { | |
return paramName.replace("Bean", ""); | |
} | |
private String getTabCharacter(int tabNumber) { | |
StringBuilder sb = new StringBuilder(); | |
while (tabNumber-- > 0) { | |
sb.append("\t"); | |
} | |
return sb.toString(); | |
} | |
private boolean isOracleType(String className) { | |
final String[] oracleTypeContainsList = { | |
"Type", | |
"Typ", | |
"Table", | |
"Tbl" | |
}; | |
for (String s : oracleTypeContainsList) { | |
if (className.contains(s)) { | |
return true; | |
} | |
} | |
return false; | |
} | |
private String readFile(String fileName) throws IOException { | |
BufferedReader br = new BufferedReader(new FileReader(fileName)); | |
try { | |
StringBuilder sb = new StringBuilder(); | |
String line = br.readLine(); | |
while (line != null) { | |
sb.append(line); | |
sb.append("\n"); | |
line = br.readLine(); | |
} | |
return sb.toString(); | |
} finally { | |
br.close(); | |
} | |
} | |
private String upperCaseFirstCharOfString(String string) { | |
return Character.toUpperCase(string.charAt(0)) + string.substring(1); | |
} | |
public boolean is_createWithAllOracleTypesInitialized() { | |
return _createWithAllOracleTypesInitialized; | |
} | |
public void set_createWithAllOracleTypesInitialized( | |
boolean withAllOracleTypesInitialized) { | |
_createWithAllOracleTypesInitialized = withAllOracleTypesInitialized; | |
} | |
public static void main(String[] args) throws Exception { | |
JDeveloperOracleTypeToPOJOConverter oracleTypePOJOGenerator = new JDeveloperOracleTypeToPOJOConverter( | |
"D:\\com\\insurance\\health\\provision\\ejb\\dao\\bean", | |
"com.insurance.health.provision.ejb.dao.bean.oracletypes" | |
); | |
oracleTypePOJOGenerator.execute(); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment