/* * Licensed 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. * * Other licenses: * ----------------------------------------------------------------------------- * Commercial licenses for this work are available. These replace the above * ASL 2.0 and offer limited warranties, support, maintenance, and commercial * database integrations. * * For more information, please visit: http://www.jooq.org/licenses * * * * * * * * * * * * * */ package org.jooq.util; import java.util.ArrayList; import java.util.List; import org.jooq.tools.StringUtils; // ... /** * The default naming strategy for the {@link JavaGenerator} * * @author Lukas Eder */ public class DefaultGeneratorStrategy extends AbstractGeneratorStrategy { private String targetDirectory; private String targetPackage; private boolean instanceFields = true; private boolean javaBeansGettersAndSetters = false; // ------------------------------------------------------------------------- // Initialisation // ------------------------------------------------------------------------- @Override public void setInstanceFields(boolean instanceFields) { this.instanceFields = instanceFields; } @Override public boolean getInstanceFields() { return instanceFields; } @Override public void setJavaBeansGettersAndSetters(boolean javaBeansGettersAndSetters) { this.javaBeansGettersAndSetters = javaBeansGettersAndSetters; } @Override public boolean getJavaBeansGettersAndSetters() { return javaBeansGettersAndSetters; } @Override public String getTargetDirectory() { return targetDirectory; } @Override public void setTargetDirectory(String directory) { this.targetDirectory = directory; } @Override public String getTargetPackage() { return targetPackage; } @Override public void setTargetPackage(String packageName) { this.targetPackage = packageName; } // ------------------------------------------------------------------------- // Strategy methods // ------------------------------------------------------------------------- @Override public String getFileHeader(Definition definition, Mode mode) { return "This file is generated by jOOQ."; } @Override public String getJavaIdentifier(Definition definition) { String identifier = getFixedJavaIdentifier(definition); if (identifier != null) return identifier; else return definition.getOutputName().toUpperCase(); } private String getterSetterSuffix(Definition definition) { // [#5354] Please forgive me but this is how it works. if (javaBeansGettersAndSetters) { String name = getJavaMemberName(definition); if (Character.isUpperCase(name.charAt(0))) return name; if (name.length() > 1 && Character.isUpperCase(name.charAt(1))) return name; char chars[] = name.toCharArray(); chars[0] = Character.toUpperCase(chars[0]); return new String(chars); } else return getJavaClassName0(definition, Mode.DEFAULT); } @Override public String getJavaSetterName(Definition definition, Mode mode) { return "set" + getterSetterSuffix(definition); } @Override public String getJavaGetterName(Definition definition, Mode mode) { return "get" + getterSetterSuffix(definition); } @Override public String getJavaMethodName(Definition definition, Mode mode) { return getJavaClassName0LC(definition, Mode.DEFAULT); } @Override public String getJavaClassExtends(Definition definition, Mode mode) { return null; } @Override public List<String> getJavaClassImplements(Definition definition, Mode mode) { return new ArrayList<String>(); } @Override public String getJavaClassName(Definition definition, Mode mode) { String name = getFixedJavaClassName(definition); if (name != null) return name; else return getJavaClassName0(definition, mode); } @Override public String getJavaPackageName(Definition definition, Mode mode) { StringBuilder sb = new StringBuilder(); sb.append(getTargetPackage()); // [#2032] In multi-catalog setups, the catalog name goes into the package if (definition.getDatabase().getCatalogs().size() > 1) { sb.append("."); sb.append(getJavaIdentifier(definition.getCatalog()).toLowerCase()); } if (!(definition instanceof CatalogDefinition)) { // [#282] In multi-schema setups, the schema name goes into the package if (definition.getDatabase().getSchemata().size() > 1) { sb.append("."); sb.append(getJavaIdentifier(definition.getSchema()).toLowerCase()); } if (!(definition instanceof SchemaDefinition)) { // Some definitions have their dedicated subpackages, e.g. "tables", "routines" if (!StringUtils.isBlank(getSubPackage(definition))) { sb.append("."); sb.append(getSubPackage(definition)); } // Record are yet in another subpackage if (mode == Mode.RECORD) { sb.append(".records"); } // POJOs too else if (mode == Mode.POJO) { sb.append(".pojos"); } // DAOs too else if (mode == Mode.DAO) { sb.append(".daos"); } // Interfaces too else if (mode == Mode.INTERFACE) { sb.append(".interfaces"); } } } return sb.toString(); } @Override public String getJavaMemberName(Definition definition, Mode mode) { return getJavaClassName0LC(definition, mode); } private String getJavaClassName0LC(Definition definition, Mode mode) { String result = getJavaClassName0(definition, mode); return result.substring(0, 1).toLowerCase() + result.substring(1); } private String getJavaClassName0(Definition definition, Mode mode) { StringBuilder result = new StringBuilder(); // [#4562] Some characters should be treated like underscore result.append(StringUtils.toCamelCase( definition.getOutputName() .replace(' ', '_') .replace('-', '_') .replace('.', '_') )); if (mode == Mode.RECORD) { result.append("Record"); } else if (mode == Mode.DAO) { result.append("Dao"); } else if (mode == Mode.INTERFACE) { result.insert(0, "I"); } return result.toString(); } private String getSubPackage(Definition definition) { if (definition instanceof TableDefinition) { return "tables"; } // [#799] UDT's are also packages else if (definition instanceof UDTDefinition) { UDTDefinition udt = (UDTDefinition) definition; // [#330] A UDT inside of a package is a PL/SQL RECORD type if (udt.getPackage() == null) return "udt"; else return "packages." + getJavaIdentifier(udt.getPackage()).toLowerCase(); } else if (definition instanceof PackageDefinition) { return "packages"; } else if (definition instanceof RoutineDefinition) { RoutineDefinition routine = (RoutineDefinition) definition; if (routine.getPackage() instanceof UDTDefinition) { return "udt." + getJavaIdentifier(routine.getPackage()).toLowerCase(); } else if (routine.getPackage() != null) { return "packages." + getJavaIdentifier(routine.getPackage()).toLowerCase(); } else { return "routines"; } } else if (definition instanceof EnumDefinition) { return "enums"; } else if (definition instanceof DomainDefinition) { return "domains"; } else if (definition instanceof ArrayDefinition) { return "udt"; } // Default always to the main package return ""; } @Override public String getOverloadSuffix(Definition definition, Mode mode, String overloadIndex) { return overloadIndex; } }