blob: f30804f8ec2b751e1460c306c8ee094b564ced20 [file] [log] [blame]
/**
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package generators;
import java.util.ArrayList;
import java.util.List;
import model.JPAClassField;
import model.JPAClassModel;
import model.JPAPKClassModel;
import model.SQLData;
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*
*/
public class JPAClassGenerator extends AbstractGenerator {
// private static final Logger log = LoggerFactory.getLogger(JPAClassGenerator.class);
private String jpaClassPackageName;
public JPAClassModel createJPAClassModel(SQLData sqlData) {
JPAClassModel model = new JPAClassModel();
model.generatePKClass = sqlData.getPrimaryKeys().size() > 1;
model.tableName = sqlData.getTableName();
model.className = convertToJavaTitleCaseStringConvention(sqlData.getTableName());
if (model.generatePKClass) {
model.pkClassModel.className = model.className + "_PK";
}
for (String field : sqlData.getFieldData().keySet()) {
String dataType = null;
SQLGenerator.DataTypes sqlDataType = SQLGenerator.DataTypes.valueOf(
sqlData.getFieldData().get(field).get(0));
switch (sqlDataType) {
case LONGTEXT:
case VARCHAR:
dataType = "String";
break;
case INTEGER:
dataType = "int";
break;
case SMALLINT:
dataType = "boolean";
break;
case TIMESTAMP:
dataType = "Timestamp";
break;
case CLOB:
dataType = "String";
break;
}
String fieldTitleString = convertToJavaTitleCaseStringConvention(field);
String fieldName = convertToJavaVariableNameCaseStringConvention(field);
boolean foriegnKey = sqlData.getForiegnKeys().containsKey(field);
JPAClassField jpaField = new JPAClassField(
field,
fieldName,
dataType,
fieldTitleString,
sqlData.getPrimaryKeys().contains(field),
foriegnKey,
(foriegnKey ? sqlData.getForiegnKeys().get(field).jpaClassName : null),
(foriegnKey ? sqlData.getForiegnKeys().get(field).jpaResourceClassName : null));
model.fields.add(jpaField);
if (model.generatePKClass) {
if (sqlData.getPrimaryKeys().contains(field)) {
model.pkClassModel.pkFields.add(jpaField);
}
}
}
return model;
}
public String generateJPAClass(JPAClassModel model) {
String classStr = null;
String pkClassName = null;
classStr = addLines(classStr, "@DataCache");
classStr = addLines(classStr, "@Entity");
classStr = addLines(classStr, "@Table(name = \"" + model.tableName + "\")");
String className = model.className;
if (model.generatePKClass) {
pkClassName = model.pkClassModel.className;
classStr = addLines(classStr, "@IdClass(" + pkClassName + ".class)");
}
classStr = addLines(classStr, "public class " + className + " implements Serializable {");
List<String> columnFields = new ArrayList<String>();
List<String> fieldGetters = new ArrayList<String>();
List<String> fieldSetters = new ArrayList<String>();
for (JPAClassField jpaField : model.fields) {
String field = jpaField.tableColumnName;
String fieldString = null;
String fieldName = jpaField.fieldName;
String dataType = jpaField.fieldDataType;
String fieldTitleString = jpaField.fieldTitle;
fieldString = addLines(fieldString, tabs(1));
if (jpaField.primaryKey) {
fieldString = addLines(fieldString, tabs(1) + "@Id");
}
fieldString = addLines(fieldString, tabs(1) + "@Column(name = \"" + field + "\")");
fieldString = addLines(fieldString, tabs(1) + createFieldVarString(dataType, fieldName));
columnFields.add(fieldString);
fieldGetters.add(createGetterString(1, fieldName, dataType, fieldTitleString));
fieldSetters.add(createSetterString(1, fieldName, dataType, fieldTitleString));
if (jpaField.foriegnKey) {
fieldString = null;
fieldName = createVarNameFromClassName(jpaField.foriegnKeyJPAClass);
dataType = jpaField.foriegnKeyJPAClass;
fieldTitleString = jpaField.foriegnKeyJPAClass;
fieldString = addLines(fieldString, tabs(1));
fieldString = addLines(fieldString, tabs(1) + "@ManyToOne(cascade= CascadeType.MERGE)");
fieldString =
addLines(fieldString, tabs(1) + "@JoinColumn(name = \"" + jpaField.tableColumnName + "\")");
fieldString = addLines(fieldString, tabs(1) + createFieldVarString(dataType, fieldName));
columnFields.add(fieldString);
fieldGetters.add(createGetterString(1, fieldName, dataType, fieldTitleString));
fieldSetters.add(createSetterString(1, fieldName, dataType, fieldTitleString));
}
}
classStr = addLines(classStr, columnFields.toArray(new String[] {}));
classStr = addLines(classStr, fieldGetters.toArray(new String[] {}));
classStr = addLines(classStr, fieldSetters.toArray(new String[] {}));
classStr = addLines(classStr, "}");
return classStr;
}
public String generateJPAPKClass(JPAPKClassModel model) {
if (model.pkFields.size() == 0) {
return "";
}
String classStr = null;
classStr = addLines(classStr, "public class " + model.className + " implements Serializable {");
List<String> columnFields = new ArrayList<String>();
List<String> fieldGetters = new ArrayList<String>();
List<String> fieldSetters = new ArrayList<String>();
List<String> parameterList = new ArrayList<String>();
String constructorMethod = null;
for (JPAClassField jpaField : model.pkFields) {
String dataType = jpaField.fieldDataType;
String fieldTitleString = jpaField.fieldTitle;
String fieldName = jpaField.fieldName;
String fieldString = tabs(1) + createFieldVarString(dataType, fieldName);
columnFields.add(fieldString);
fieldGetters.add(createGetterString(1, fieldName, dataType, fieldTitleString));
fieldSetters.add(createSetterString(1, fieldName, dataType, fieldTitleString));
parameterList.add(dataType + " " + fieldName);
constructorMethod = addLines(constructorMethod, tabs(2) + "this." + fieldName + " = " + fieldName + ";");
}
classStr = addLines(classStr, columnFields.toArray(new String[] {}));
String constructorParametersString = commaSeperatedString(parameterList, ", ");
constructorMethod = addLines(
tabs(1),
tabs(1) + "public " + model.className + "(" + constructorParametersString + "){",
constructorMethod);
constructorMethod = addLines(constructorMethod, tabs(1) + "}");
String emptyConstructorMethod = null;
emptyConstructorMethod = addLines(tabs(1), tabs(1) + "public " + model.className + "(){", tabs(1) + "}");
classStr = addLines(classStr, emptyConstructorMethod);
classStr = addLines(classStr, constructorMethod);
classStr = addLines(classStr, tabs(1));
classStr = addLines(classStr, tabs(1) + "@Override");
classStr = addLines(classStr, tabs(1) + "public boolean equals(Object o) {");
classStr = addLines(classStr, tabs(2) + "return false;");
classStr = addLines(classStr, tabs(1) + "}");
classStr = addLines(classStr, tabs(1));
classStr = addLines(classStr, tabs(1) + "@Override");
classStr = addLines(classStr, tabs(1) + "public int hashCode() {");
classStr = addLines(classStr, tabs(2) + "return 1;");
classStr = addLines(classStr, tabs(1) + "}");
classStr = addLines(classStr, fieldGetters.toArray(new String[] {}));
classStr = addLines(classStr, fieldSetters.toArray(new String[] {}));
classStr = addLines(classStr, "}");
return classStr;
}
public String generatePersistenceXmlEntry(JPAClassModel model) {
String xmlEntry = null;
xmlEntry = addLines(
xmlEntry,
"<persistence xmlns=\"http://java.sun.com/xml/ns/persistence\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" version=\"1.0\">");
xmlEntry = addLines(xmlEntry, tabs(1) + "<persistence-unit name=\"appcatalog_data\">");
xmlEntry = addLines(
xmlEntry, tabs(2) + "<provider>org.apache.openjpa.persistence.PersistenceProviderImpl</provider>");
xmlEntry =
addLines(xmlEntry, tabs(2) + "<class>" + getJpaClassPackageName() + "." + model.className + "</class>");
xmlEntry = addLines(xmlEntry, tabs(2) + "<exclude-unlisted-classes>true</exclude-unlisted-classes>");
xmlEntry = addLines(xmlEntry, tabs(1) + "</persistence-unit>");
xmlEntry = addLines(xmlEntry, "</persistence>");
return xmlEntry;
}
public String getJpaClassPackageName() {
return jpaClassPackageName;
}
public void setJpaClassPackageName(String jpaClassPackageName) {
this.jpaClassPackageName = jpaClassPackageName;
}
}