/* * The MIT License (MIT) * * Copyright (c) 2016 Ferenc Karsany * * Permission is hereby granted, free of charge, to any person obtaining a copy of * this software and associated documentation files (the "Software"), to deal in * the Software without restriction, including without limitation the rights to * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of * the Software, and to permit persons to whom the Software is furnished to do so, * subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * */ package org.obridge.model.data; import org.obridge.mappers.builders.ParameterGetSetRegisterBuilder; import org.obridge.util.StringHelper; import org.obridge.util.TypeMapper; /** * User: fkarsany Date: 2013.11.18. */ public class ProcedureArgument { public static final String TABLE_DATATYPE_NAME = "TABLE"; private String argumentName; private String dataType; private String typeName; private boolean inParam; private boolean outParam; private String origTypeName; private int sequenceNumber; public ProcedureArgument(String argumentName, String dataType, String typeName, boolean inParam, boolean outParam, String origTypeName) { this.argumentName = argumentName; this.dataType = dataType; this.typeName = typeName; this.inParam = inParam; this.outParam = outParam; this.origTypeName = origTypeName; } public boolean isInParam() { return inParam; } public boolean isOutParam() { return outParam; } public String getArgumentName() { return argumentName; } public String getDataType() { return dataType; } public String getJavaPropertyName() { String r; if (this.argumentName == null) { return "functionReturn"; } else if (this.argumentName.startsWith("P_")) { r = this.argumentName.substring(2); } else { r = this.argumentName; } if (Character.isDigit(r.charAt(0))) { r = "P_" + r; } return StringHelper.unJavaKeyword(StringHelper.toCamelCaseSmallBegin(r)); } public String getJavaPropertyNameBig() { String javaPropName = this.getJavaPropertyName(); return javaPropName.substring(0, 1).toUpperCase() + javaPropName.substring(1); } public String getJavaTypeName() { if (isList()) { String mappedType = new TypeMapper().getJavaType(typeName, 0); if ("Object".equals(mappedType)) { return "List<" + StringHelper.toCamelCase(typeName) + ">"; } else { return "List<" + mappedType + ">"; } } else { return StringHelper.toCamelCase(typeName); } } public boolean isList() { return TABLE_DATATYPE_NAME.equals(dataType); } public boolean isPrimitiveList() { return isList() && !("Object".equals(new TypeMapper().getJavaType(typeName, 0))); } public String getUnderlyingTypeName() { if (isPrimitiveList()) { return new TypeMapper().getJavaType(typeName, 0); } else { return StringHelper.toCamelCase(typeName); } } public String getJavaDataType() { if (this.typeName != null) { return getJavaTypeName(); } else { return new TypeMapper().getJavaType(this.dataType, 1); } } public String getJDBCType() { return new TypeMapper().getJDBCType(dataType); } public boolean isJDBCTypeBoolean() { return "BOOLEAN".equals(getJDBCType()); } public String getParamSet(int sequenceNumber) { return new ParameterGetSetRegisterBuilder(this).setParameter(sequenceNumber); } public String getRegOutput(int sequenceNumber) { if ("OBJECT".equals(dataType) || TABLE_DATATYPE_NAME.equals(dataType)) { return String.format("ocs.registerOutParameter(%d, Types.%s, \"%s\"); // %s", sequenceNumber, getJDBCType(), origTypeName, argumentName); } else { return String.format("ocs.registerOutParameter(%d, %s); // %s", sequenceNumber, ("Types." + getJDBCType()).replace("Types.CURSOR", "-10").replace("Types.BOOLEAN", "Types.INTEGER"), argumentName); } } public String getParamGet(int sequenceNumber) { if ("OBJECT".equals(dataType)) { return String.format("ctx.set%s(%sConverter.getObject((Struct)ocs.getObject(%d))); // %s", getJavaPropertyNameBig(), getJavaDataType(), sequenceNumber, argumentName); } else if (TABLE_DATATYPE_NAME.equals(dataType)) { if (isPrimitiveList()) { return String.format("ctx.set%s(Arrays.asList((%s[]) ((Array) ocs.getObject(%d)).getArray())); // %s", getJavaPropertyNameBig(), getUnderlyingTypeName(), sequenceNumber, argumentName); } return String.format("ctx.set%s(%sConverter.getObjectList((Array)ocs.getObject(%d))); // %s", getJavaPropertyNameBig(), getUnderlyingTypeName(), sequenceNumber, argumentName); } else if ("Integer".equals(getJavaDataType())) { return String.format("ctx.set%s(ocs.getInt(%d)); // %s", getJavaPropertyNameBig(), sequenceNumber, argumentName); } else if ("BOOLEAN".equals(getJDBCType())) { return String.format("ctx.set%s(null == ocs.getBigDecimal(%d) ? null : BigDecimal.ONE.equals(ocs.getBigDecimal(%d)) ? true : BigDecimal.ZERO.equals(ocs.getBigDecimal(%d)) ? false : null); // %s", getJavaPropertyNameBig(), sequenceNumber, sequenceNumber, sequenceNumber, argumentName); } else if ("ResultSet".equals(getJavaDataType())) { return String.format("ctx.set%s((ResultSet)ocs.getObject(%d)); // %s", getJavaPropertyNameBig(), sequenceNumber, argumentName); } else if (TypeMapper.JAVA_BYTEARRAY.equals(getJavaDataType())) { return String.format("ctx.set%s(ocs.getBytes(%d)); // %s", getJavaPropertyNameBig(), sequenceNumber, argumentName); } else { return String.format("ctx.set%s(ocs.get%s(%d)); // %s", getJavaPropertyNameBig(), getJavaDataType(), sequenceNumber, argumentName); } } public int getSequenceNumber() { return sequenceNumber; } public void setSequenceNumber(int sequenceNumber) { this.sequenceNumber = sequenceNumber; } public String getOrigTypeName() { return origTypeName; } public boolean isOutputBooleanArgument() { return getArgumentName() != null && isJDBCTypeBoolean() && isOutParam(); } }