| /* |
| * Copyright (c) 1998, 2020 Oracle and/or its affiliates. All rights reserved. |
| * |
| * This program and the accompanying materials are made available under the |
| * terms of the Eclipse Public License v. 2.0 which is available at |
| * http://www.eclipse.org/legal/epl-2.0, |
| * or the Eclipse Distribution License v. 1.0 which is available at |
| * http://www.eclipse.org/org/documents/edl-v10.php. |
| * |
| * SPDX-License-Identifier: EPL-2.0 OR BSD-3-Clause |
| */ |
| |
| // Contributors: |
| // Mike Norman - from Proof-of-concept, become production code |
| // quwang - Aug 9, 2006 |
| package dbws.testing.shadowddlgeneration.oldjpub; |
| |
| //javase imports |
| import java.util.Map; |
| |
| //EclipseLink imports |
| import dbws.testing.shadowddlgeneration.oldjpub.Util; |
| |
| /** |
| * NB - this class does <b>NOT</b> implement the {@link java.util.Map} API |
| */ |
| |
| public class Typemap { |
| |
| public static final int UNSUPPORTED_TYPE = 0; |
| public static final int BYTE_ARRAY = UNSUPPORTED_TYPE + 1; |
| public static final int DOUBLE = BYTE_ARRAY + 1; |
| public static final int FLOAT = DOUBLE + 1; |
| public static final int INT = FLOAT + 1; |
| public static final int SHORT = INT + 1; |
| public static final int BOOLEAN = SHORT + 1; |
| public static final int OS_BFILE = BOOLEAN + 1; |
| public static final int OS_BLOB = OS_BFILE + 1; |
| public static final int OS_CHAR = OS_BLOB + 1; |
| public static final int OS_CLOB = OS_CHAR + 1; |
| public static final int OS_DATE = OS_CLOB + 1; |
| public static final int OS_NUMBER = OS_DATE + 1; |
| public static final int OS_RAW = OS_NUMBER + 1; |
| public static final int OS_ROWID = OS_RAW + 1; |
| public static final int OS_NCHAR = OS_ROWID + 1; |
| public static final int OS_NCLOB = OS_NCHAR + 1; |
| public static final int OS_BINARY_FLOAT = OS_NCLOB + 1; |
| public static final int OS_BINARY_DOUBLE = OS_BINARY_FLOAT + 1; |
| public static final int OS_TIMESTAMP = OS_BINARY_DOUBLE + 1; |
| public static final int OS_TIMESTAMPTZ = OS_TIMESTAMP + 1; |
| public static final int OS_TIMESTAMPLTZ = OS_TIMESTAMPTZ + 1; |
| public static final int OS_CUSTOMDATUM = OS_TIMESTAMPLTZ + 1; |
| public static final int OS_NSTRING = OS_CUSTOMDATUM + 1; |
| public static final int JL_DOUBLE = OS_NSTRING + 1; |
| public static final int JL_FLOAT = JL_DOUBLE + 1; |
| public static final int JL_INTEGER = JL_FLOAT + 1; |
| public static final int JL_SHORT = JL_INTEGER + 1; |
| public static final int JL_STRING = JL_SHORT + 1; |
| public static final int JM_BIGDECIMAL = JL_STRING + 1; |
| public static final int JS_ARRAY = JM_BIGDECIMAL + 1; |
| public static final int JS_BLOB = JS_ARRAY + 1; |
| public static final int JS_CLOB = JS_BLOB + 1; |
| public static final int JS_REF = JS_CLOB + 1; |
| public static final int JS_RESULTSET = JS_REF + 1; |
| public static final int JS_SQLDATA = JS_RESULTSET + 1; |
| public static final int JS_DATE = JS_SQLDATA + 1; |
| public static final int JS_TIMESTAMP = JS_DATE + 1; |
| public static final int OCI_BFILELOCATOR = JS_TIMESTAMP + 1; |
| public static final int OCI_BLOBLOCATOR = OCI_BFILELOCATOR + 1; |
| public static final int OCI_CLOBLOCATOR = OCI_BLOBLOCATOR + 1; |
| public static final int OCI_DATE = OCI_CLOBLOCATOR + 1; |
| public static final int OCI_DATETIME = OCI_DATE + 1; |
| public static final int OCI_INTERVAL = OCI_DATETIME + 1; |
| public static final int OCI_NUMBER = OCI_INTERVAL + 1; |
| public static final int OCI_RAW = OCI_NUMBER + 1; |
| public static final int OCI_STRING = OCI_RAW + 1; |
| public static final int C_GENERATEDTYPE = OCI_STRING + 1; |
| public static final int OCI_TABLE = C_GENERATEDTYPE + 1; |
| public static final int OCCI_BFILE = OCI_TABLE + 1; |
| public static final int OCCI_BYTES = OCCI_BFILE + 1; |
| public static final int OCCI_BLOB = OCCI_BYTES + 1; |
| public static final int OCCI_CLOB = OCCI_BLOB + 1; |
| public static final int OCCI_DATE = OCCI_CLOB + 1; |
| public static final int OCCI_TIMESTAMP = OCCI_DATE + 1; |
| public static final int OCCI_INTERVALYM = OCCI_TIMESTAMP + 1; |
| public static final int OCCI_INTERVALDS = OCCI_INTERVALYM + 1; |
| public static final int OCCI_NUMBER = OCCI_INTERVALDS + 1; |
| public static final int CPP_STRING = OCCI_NUMBER + 1; |
| public static final int CPP_WSTRING = CPP_STRING + 1; |
| public static final int OCCI_COLLECTION = CPP_WSTRING + 1; |
| public static final int OCCI_REF = OCCI_COLLECTION + 1; |
| public static final int OCCI_OBJ = OCCI_REF + 1; |
| public static final int OCCI_COLLECTION_OF_REFS = OCCI_OBJ + 1; |
| private static final int ORACLE_TYPES_BINARY_DOUBLE = 101; |
| private static final int ORACLE_TYPES_BINARY_FLOAT = 100; |
| private static final int ORACLE_TYPES_JAVA_STRUCT = 2008; |
| private static final int ORACLE_TYPES_OPAQUE = 2007; |
| private static final int ORACLE_TYPES_TIMESTAMPLTZ = -102; |
| private static final int ORACLE_TYPES_TIMESTAMPTZ = -101; |
| |
| static final String[] NAMES = {"<unsupported type>", |
| "byte[]", "double", "float", "int", "short", "boolean", |
| "oracle.sql.BFILE", "oracle.sql.BLOB", "oracle.sql.CHAR", "oracle.sql.CLOB", "oracle.sql.DATE", |
| "oracle.sql.NUMBER", "oracle.sql.RAW", "oracle.sql.ROWID", |
| "oracle.sql.NCHAR", "oracle.sql.NCLOB", |
| "oracle.sql.BINARY_FLOAT", "oracle.sql.BINARY_DOUBLE", |
| "oracle.sql.TIMESTAMP", "oracle.sql.TIMESTAMPTZ", "oracle.sql.TIMESTAMPLTZ", |
| null, "java.lang.String", |
| "Double", "Float", "Integer", "Short", "String", |
| "java.math.BigDecimal", |
| "java.sql.Array", "java.sql.Blob", "java.sql.Clob", "java.sql.Ref", "java.sql.ResultSet", |
| null, "java.sql.Date", "java.sql.Timestamp", |
| "OCIBFileLocator *", "OCIBlobLocator *", "OCIClobLocator *", "OCIDate", |
| "OCIDateTime *", "OCIInterval *", |
| "OCINumber", "OCIRaw *", "OCIString *", null, null, |
| "oracle::occi::Bfile", "oracle::occi::Bytes", "oracle::occi::Blob", "oracle::occi::Clob", |
| "oracle::occi::Date", "oracle::occi::Timestamp", "oracle::occi::IntervalYM", |
| "oracle::occi::IntervalDS", "oracle::occi::Number", "OCCI_STD_NAMESPACE::string", |
| "OCCI_STD_NAMESPACE::wstring", null, null, null, null |
| }; |
| static final String[] ACCESSOR_METHODS = {null, // "<unsupported type>", |
| "Bytes", "Double", "Float", "Int", "Short", "Boolean", |
| "BFILE", "BLOB", "CHAR", "CLOB", "DATE", "NUMBER", "RAW", "ROWID", |
| "NCHAR", "NCLOB", |
| "Object", "Object", |
| "TIMESTAMP", "TIMESTAMPTZ", "TIMESTAMPLTZ", |
| null, "String", |
| "Double", "Float", "Int", "Short", "String", |
| "BigDecimal", |
| "Array", "Blob", "Clob", "Ref", "Cursor", null, "Date", "Timestamp", |
| null, // "nullOCIBFileLocator *", |
| null, // "OCIBlobLocator *", |
| null, // "OCIClobLocator *", |
| null, // "OCIDate", |
| null, // "OCIDateTime *", |
| null, // "OCIInterval *", |
| null, // "OCINumber", |
| null, // "OCIRaw *", |
| null, // "OCIString *", |
| null, null, |
| null, // "oracle::occi::Bfile", |
| null, // "oracle::occi::Bytes", |
| null, // "oracle::occi::Blob", |
| null, // "oracle::occi::Clob", |
| null, // "oracle::occi::Date", |
| null, // "oracle::occi::Timestamp", |
| null, // "oracle::occi::IntervalYM", |
| null, // "oracle::occi::IntervalDS", |
| null, // "oracle::occi::Number", |
| null, // "OCCI_STD_NAMESPACE::string", |
| null, // "OCCI_STD_NAMESPACE::wstring", |
| null, null, null, null |
| }; |
| |
| protected String m_package; |
| protected Map<String, String> m_field_map = null; |
| protected int m_mapping; |
| protected int arrayMap; |
| protected int bfileMap; |
| protected int binaryMap; |
| protected int blobMap; |
| protected int charMap; |
| protected int ncharMap; |
| protected int clobMap; |
| protected int cursorMap; |
| protected int dateMap; |
| protected int timeMap; |
| protected int timestampMap; |
| protected int intervalYMMap; |
| protected int intervalDSMap; |
| protected int decimalMap; |
| protected int doubleMap; |
| protected int floatMap; |
| protected int integerMap; |
| protected int longVarBinaryMap; |
| protected int numericMap; |
| protected int realMap; |
| protected int refMap; |
| protected int rowidMap; |
| protected int smallintMap; |
| protected int structMap; |
| protected int varcharMap; |
| protected int tableMap; |
| protected int binaryFloatMap; |
| protected int binaryDoubleMap; |
| protected SqlReflector m_reflector; |
| |
| public Typemap(TypeClass s, SqlReflector reflector) { |
| if (s != null && (s instanceof JavaType)) { |
| m_field_map = null; |
| m_package = s.getNameObject().getDeclPackage(); |
| } |
| else if (s != null) { |
| SqlName sn = ((SqlType)s).getSqlName(); |
| m_field_map = ((SqlType)s).getAttributes(); |
| m_package = sn.getDeclPackage(); |
| } |
| m_reflector = reflector; |
| mapInit(); |
| } |
| |
| void mapInit() { |
| bfileMap = OS_BFILE; |
| cursorMap = JS_RESULTSET; |
| rowidMap = OS_ROWID; |
| } |
| |
| /** |
| * Determine the programming language name for a given SQL field. |
| */ |
| public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered, |
| Name name) { |
| return null; |
| } |
| |
| public String getMemberNameAsSuffix(String sqlName) { |
| return null; |
| } |
| |
| public String getMemberName(String sqlName, Name name) { |
| return getMemberName(sqlName, false, false, name); |
| } |
| |
| public String getMemberName(String sqlName) { |
| return getMemberName(sqlName, false, false, null); |
| } |
| |
| public String getMemberName(String sqlName, boolean wordBoundary, boolean onlyIfRegistered) { |
| return getMemberName(sqlName, wordBoundary, onlyIfRegistered, null); |
| } |
| |
| /** |
| * Determine the programming language type for a given SQL type. |
| */ |
| public String writeTypeName(TypeClass type) { |
| return null; |
| } |
| |
| public String writeTypeName(TypeClass type, boolean itfIfPossible) { |
| return null; |
| } |
| |
| /** |
| */ |
| public int getMapping() { |
| return m_mapping; |
| } |
| |
| public int getJavaTypecode(int sqlTypecode) { |
| if (!m_mapInitialized) { |
| javaMapping(); |
| m_mapInitialized = true; |
| }; |
| |
| switch (sqlTypecode) { |
| case OracleTypes.ARRAY: |
| return arrayMap; |
| case OracleTypes.BFILE: |
| return bfileMap; |
| case OracleTypes.BINARY: |
| return binaryMap; |
| case OracleTypes.BLOB: |
| return blobMap; |
| case OracleTypes.CHAR: |
| return charMap; |
| case OracleTypes.CLOB: |
| return clobMap; |
| case OracleTypes.CURSOR: |
| return cursorMap; |
| case OracleTypes.DATE: |
| return dateMap; |
| case OracleTypes.TIME: |
| return timeMap; |
| case OracleTypes.TIMESTAMP: |
| return timestampMap; |
| case ORACLE_TYPES_TIMESTAMPTZ: |
| return (timestampMap == JS_TIMESTAMP) ? timestampMap : OS_TIMESTAMPTZ; |
| case ORACLE_TYPES_TIMESTAMPLTZ: |
| return OS_TIMESTAMPLTZ; |
| case OracleTypes.INTERVALYM: |
| return intervalYMMap; |
| case OracleTypes.INTERVALDS: |
| return intervalDSMap; |
| case OracleTypes.DECIMAL: |
| return decimalMap; |
| case OracleTypes.DOUBLE: |
| return doubleMap; |
| case OracleTypes.FLOAT: |
| return floatMap; |
| case OracleTypes.INTEGER: |
| return integerMap; |
| case OracleTypes.LONGVARBINARY: |
| return longVarBinaryMap; |
| case OracleTypes.NUMERIC: |
| return numericMap; |
| case ORACLE_TYPES_OPAQUE: |
| return OS_CUSTOMDATUM; |
| case ORACLE_TYPES_JAVA_STRUCT: |
| return structMap; |
| case OracleTypes.REAL: |
| return realMap; |
| case OracleTypes.REF: |
| return refMap; |
| case OracleTypes.ROWID: |
| return rowidMap; |
| case OracleTypes.SMALLINT: |
| return smallintMap; |
| case OracleTypes.STRUCT: |
| return structMap; |
| case OracleTypes.VARCHAR: |
| return varcharMap; |
| case OracleTypes.TABLE: |
| return tableMap; |
| case SqlType.ORACLE_TYPES_NCHAR: |
| return ncharMap; |
| case SqlType.ORACLE_TYPES_NCLOB: |
| return OS_NCLOB; |
| case SqlType.ORACLE_TYPES_BOOLEAN: |
| return BOOLEAN; |
| case OracleTypes.PLSQL_INDEX_TABLE: |
| return tableMap; |
| case OracleTypes.PLSQL_NESTED_TABLE: |
| return tableMap; |
| case OracleTypes.PLSQL_VARRAY_TABLE: |
| return tableMap; |
| case ORACLE_TYPES_BINARY_FLOAT: |
| return binaryFloatMap; |
| case ORACLE_TYPES_BINARY_DOUBLE: |
| return binaryDoubleMap; |
| default: |
| return UNSUPPORTED_TYPE; |
| } |
| } |
| |
| protected boolean m_mapInitialized = false; |
| |
| protected String writePredefinedName(int typecode) { |
| return NAMES[getJavaTypecode(typecode)]; |
| } |
| |
| protected void javaMapping() { |
| bfileMap = OS_BFILE; |
| cursorMap = JS_RESULTSET; |
| rowidMap = OS_ROWID; |
| } |
| |
| public SqlType getPlsqlTableType(SqlType elemType) { |
| int typecode = getJavaTypecode(elemType.getTypecode()); |
| switch (typecode) { |
| case DOUBLE: |
| return SqlReflector.plsqlTableDouble; |
| case FLOAT: |
| return SqlReflector.plsqlTableFloat; |
| case INT: |
| return SqlReflector.plsqlTableInt; |
| case SHORT: |
| return SqlReflector.plsqlTableShort; |
| case JL_DOUBLE: |
| return SqlReflector.plsqlTableJldouble; |
| case JL_FLOAT: |
| return SqlReflector.plsqlTableJlfloat; |
| case JL_INTEGER: |
| return SqlReflector.plsqlTableJlinteger; |
| case JL_SHORT: |
| return SqlReflector.plsqlTableJlshort; |
| case JM_BIGDECIMAL: |
| return SqlReflector.plsqlTableJmbigdecimal; |
| case JL_STRING: |
| return SqlReflector.plsqlTableString; |
| default: |
| return null; |
| } |
| } |
| |
| // Comparable to oracle.sqlj.codegen.engine.CGUnparser#accessorMethod |
| public String accessorMethod(TypeClass type) { |
| if ("boolean".equals(writeTypeName(type)) || "Boolean".equals(writeTypeName(type)) |
| || "java.lang.Boolean".equals(writeTypeName(type))) { |
| return "Boolean"; |
| } |
| else if (type instanceof PlsqlIndexTableType) { |
| return "PlsqlIndexTable"; |
| } |
| int typecode = getJavaTypecode(type.getTypecode()); |
| String acc = null; |
| if (typecode != UNSUPPORTED_TYPE) { |
| acc = ACCESSOR_METHODS[typecode]; |
| } |
| if (acc != null) { |
| return acc; |
| } |
| String className = writeTypeName(type); |
| if (className != null) { |
| if (Util.isWrappedType(className)) { |
| className = Util.getWrappedType(className); |
| } |
| if (className.equals("String")) { |
| return "String"; |
| } |
| else if (className.equals("byte")) { |
| return "Byte"; |
| } |
| else if (className.equals("char")) { |
| return "Byte"; |
| } |
| else if (className.equals("float")) { |
| return "Float"; |
| } |
| else if (className.equals("int")) { |
| return "Int"; |
| } |
| else if (className.equals("boolean")) { |
| return "Boolean"; |
| } |
| else if (className.equals("long")) { |
| return "Long"; |
| } |
| else if (className.equals("short")) { |
| return "Short"; |
| } |
| else if (className.equals("double")) { |
| return "Double"; |
| } |
| } |
| if (m_reflector.isUserType(type) && m_mapping == 0) { |
| return "CustomDatum"; |
| } |
| else if (isOpaque(type)) { |
| return "ORAData"; |
| } |
| return "Object"; |
| } |
| |
| private boolean isOpaque(TypeClass type) { |
| boolean opaque = false; |
| if (type instanceof SqlType) { |
| SqlType sqlType = (SqlType)type; |
| String name = sqlType.getSqlName().getFullTargetTypeName(Util.SCHEMA_ALWAYS); |
| if ("SYS.XMLTYPE".equalsIgnoreCase(name)) { |
| opaque = true; |
| } |
| } |
| return opaque; |
| } |
| |
| } |