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