blob: 691ce406dd7edc8a4041987407109ee8e337ec49 [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;
}
}