/******************************************************************************* * Copyright (c) 1998, 2015 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 v1.0 and Eclipse Distribution License v. 1.0 * which accompanies this distribution. * The Eclipse Public License is available at http://www.eclipse.org/legal/epl-v10.html * and the Eclipse Distribution License is available at * http://www.eclipse.org/org/documents/edl-v10.php. * * 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; } }