Skip to content

Instantly share code, notes, and snippets.

@neuro-sys
Last active August 29, 2015 14:04
Show Gist options
  • Save neuro-sys/74cf6b252c5e47c08b1d to your computer and use it in GitHub Desktop.
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.
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