/** * * 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; } }