All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.eclipse.persistence.tools.dbws.Util Maven / Gradle / Ivy

There is a newer version: 5.0.0-B08
Show newest version
/*
 * Copyright (c) 1998, 2024 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:
//     Oracle - initial API and implementation from Oracle TopLink

package org.eclipse.persistence.tools.dbws;

//javase imports
import static java.sql.Types.BIGINT;
import static java.sql.Types.CHAR;
import static java.sql.Types.CLOB;
import static java.sql.Types.DATE;
import static java.sql.Types.DECIMAL;
import static java.sql.Types.DOUBLE;
import static java.sql.Types.FLOAT;
import static java.sql.Types.INTEGER;
import static java.sql.Types.LONGVARCHAR;
import static java.sql.Types.NCHAR;
import static java.sql.Types.NCLOB;
import static java.sql.Types.NUMERIC;
import static java.sql.Types.NVARCHAR;
import static java.sql.Types.REAL;
import static java.sql.Types.ROWID;
import static java.sql.Types.SMALLINT;
import static java.sql.Types.TIME;
import static java.sql.Types.TIMESTAMP;
import static java.sql.Types.TINYINT;
import static java.sql.Types.VARCHAR;
import static javax.xml.XMLConstants.DEFAULT_NS_PREFIX;
import static javax.xml.XMLConstants.NULL_NS_URI;
import static javax.xml.XMLConstants.W3C_XML_SCHEMA_NS_URI;
import static org.eclipse.persistence.internal.helper.ClassConstants.BIGDECIMAL;
import static org.eclipse.persistence.internal.helper.ClassConstants.BOOLEAN;
import static org.eclipse.persistence.internal.helper.ClassConstants.STRING;
import static org.eclipse.persistence.internal.oxm.Constants.BASE_64_BINARY_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.COLON;
import static org.eclipse.persistence.internal.oxm.Constants.DATE_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.DATE_TIME_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.DECIMAL_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.DOUBLE_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.EMPTY_STRING;
import static org.eclipse.persistence.internal.oxm.Constants.INTEGER_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.INT_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.SCHEMA_PREFIX;
import static org.eclipse.persistence.internal.oxm.Constants.STRING_QNAME;
import static org.eclipse.persistence.internal.oxm.Constants.TIME_QNAME;
import static org.eclipse.persistence.internal.xr.QNameTransformer.SCHEMA_QNAMES;
import static org.eclipse.persistence.internal.xr.Util.OPAQUE;
import static org.eclipse.persistence.internal.xr.XRDynamicClassLoader.COLLECTION_WRAPPER_SUFFIX;
import static org.eclipse.persistence.internal.xr.sxf.SimpleXMLFormat.DEFAULT_SIMPLE_XML_FORMAT_TAG;
import static org.eclipse.persistence.tools.dbws.XRPackager.__nullStream;
import static org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection.INOUT;
import static org.eclipse.persistence.tools.oracleddl.metadata.ArgumentTypeDirection.OUT;

import java.io.OutputStream;
import java.sql.Types;
import java.util.List;
import java.util.regex.Pattern;

//java eXtension imports
import javax.xml.namespace.QName;

//EclipseLink imports
import org.eclipse.persistence.descriptors.RelationalDescriptor;
import org.eclipse.persistence.internal.core.helper.CoreClassConstants;
import org.eclipse.persistence.internal.helper.ClassConstants;
import org.eclipse.persistence.internal.oxm.schema.model.Any;
import org.eclipse.persistence.internal.oxm.schema.model.ComplexType;
import org.eclipse.persistence.internal.oxm.schema.model.Schema;
import org.eclipse.persistence.internal.oxm.schema.model.Sequence;
import org.eclipse.persistence.internal.xr.Operation;
import org.eclipse.persistence.internal.xr.QueryOperation;
import org.eclipse.persistence.internal.xr.XRServiceModel;
import org.eclipse.persistence.oxm.NamespaceResolver;
import org.eclipse.persistence.oxm.XMLConstants;
import org.eclipse.persistence.oxm.XMLDescriptor;
import org.eclipse.persistence.oxm.schema.XMLSchemaURLReference;
//DDL parser imports
import org.eclipse.persistence.tools.oracleddl.metadata.ArgumentType;
import org.eclipse.persistence.tools.oracleddl.metadata.BinaryType;
import org.eclipse.persistence.tools.oracleddl.metadata.BlobType;
import org.eclipse.persistence.tools.oracleddl.metadata.CharType;
import org.eclipse.persistence.tools.oracleddl.metadata.ClobType;
import org.eclipse.persistence.tools.oracleddl.metadata.DatabaseType;
import org.eclipse.persistence.tools.oracleddl.metadata.DecimalType;
import org.eclipse.persistence.tools.oracleddl.metadata.DoubleType;
import org.eclipse.persistence.tools.oracleddl.metadata.FloatType;
import org.eclipse.persistence.tools.oracleddl.metadata.FunctionType;
import org.eclipse.persistence.tools.oracleddl.metadata.LongRawType;
import org.eclipse.persistence.tools.oracleddl.metadata.NCharType;
import org.eclipse.persistence.tools.oracleddl.metadata.NClobType;
import org.eclipse.persistence.tools.oracleddl.metadata.PLSQLCursorType;
import org.eclipse.persistence.tools.oracleddl.metadata.ProcedureType;
import org.eclipse.persistence.tools.oracleddl.metadata.RawType;
import org.eclipse.persistence.tools.oracleddl.metadata.RealType;
import org.eclipse.persistence.tools.oracleddl.metadata.ScalarDatabaseTypeEnum;
import org.eclipse.persistence.tools.oracleddl.metadata.TimeStampType;
import org.eclipse.persistence.tools.oracleddl.metadata.VarChar2Type;

public class Util {

    // type for Stored Procedure Arguments
    public enum InOut {
        IN, OUT, INOUT, RETURN
    }

    public static final String TOPLEVEL = "TOPLEVEL";
    public static final String CLASSES = "classes";
    public static final String DEFAULT_WSDL_LOCATION_URI = "REPLACE_WITH_ENDPOINT_ADDRESS";
    public static final String SWAREF_FILENAME = XMLConstants.SWA_REF.toLowerCase() + ".xsd";
    // leave this duplicate as someone may be referencing it...
    public static final String WSI_SWAREF_XSD_FILE = SWAREF_FILENAME;
    public static final String WEB_XML_FILENAME = "web.xml";
    public static final String DEFAULT_PLATFORM_CLASSNAME = "org.eclipse.persistence.platform.database.OraclePlatform";
    public static final String DOM_PLATFORM_CLASSNAME = "org.eclipse.persistence.oxm.platform.DOMPlatform";
    public static final String UNDER_DBWS = "_dbws";
    public static final String OX_PRJ_SUFFIX = "-dbws-ox";
    public static final String OR_PRJ_SUFFIX = "-dbws-or";
    public static final String XML_BINDINGS = "xml-bindings";
    public static final String XML_MIME_PREFIX = "xmime";
    public static final String WSI_SWAREF = XMLConstants.SWA_REF;
    public static final String WSI_SWAREF_PREFIX = XMLConstants.REF_PREFIX;
    public static final String WSI_SWAREF_URI = XMLConstants.REF_URL;
    public static final String WSI_SWAREF_XSD =
        " \n" +
        " \n" +
        "   \n" +
        "     \n" +
        "   \n" +
        "";
    public static final String THE_INSTANCE_NAME = "theInstance";
    public static final String FINDALL_QUERYNAME = "findAll";
    public static final String CREATE_OPERATION_NAME = "create";
    public static final String UPDATE_OPERATION_NAME = "update";
    public static final String REMOVE_OPERATION_NAME = "delete";
    public static final String DBWS_PROVIDER_PACKAGE = "_dbws";
    public static final String DBWS_PROVIDER_NAME = "DBWSProvider";
    public static final String DOT_CLASS = ".class";
    static final String DOT_JAVA = ".java";
    public static final String DBWS_PROVIDER_CLASS_FILE = DBWS_PROVIDER_NAME + DOT_CLASS;
    public static final String DBWS_PROVIDER_SOURCE_FILE = DBWS_PROVIDER_NAME + DOT_JAVA;
    static final String PROVIDER_LISTENER = "ProviderListener";
    public static final String PROVIDER_LISTENER_CLASS_FILE = PROVIDER_LISTENER + DOT_CLASS;
    public static final String PROVIDER_LISTENER_SOURCE_FILE = PROVIDER_LISTENER + DOT_JAVA;

    public static final String AT_SIGN = "@";
    public static final String COMMA = ",";
    public static final String SEMICOLON = ";";
    public static final String SINGLE_SPACE = " ";
    public static final String PERCENT = "%";
    public static final String UNDERSCORE = "_";

    public static final String BUILDING_QUERYOP_FOR = "Building QueryOperation for ";
    public static final String APP_OCTET_STREAM = "application/octet-stream";
    public static final String TYPE_STR = "Type";
    public static final String CURSOR_STR = "CURSOR";
    public static final String CURSOR_OF_STR = "cursor of ";
    public static final String OPEN_PAREN = "{";
    public static final String CLOSE_PAREN = "}";
    public static final String SLASH = "/";
    public static final String DOT = ".";
    public static final String OPEN_BRACKET = "(";
    public static final String CLOSE_BRACKET = ")";
    public static final String OPEN_SQUARE_BRACKET = "[";
    public static final String CLOSE_SQUARE_BRACKET = "]";
    public static final String SLASH_TEXT = "/text()";

    public static final String ARRAY_STR = "ARRAY";
    public static final String BIGINT_STR = "BIGINT";
    public static final String BINARY_STR = "BINARY";
    public static final String BLOB_STR = "BLOB";
    public static final String BOOLEAN_STR = "BOOLEAN";
    public static final String CHAR_STR = "CHAR";
    public static final String CLOB_STR = "CLOB";
    public static final String DATE_STR = "DATE";
    public static final String DECIMAL_STR = "DECIMAL";
    public static final String DOUBLE_STR = "DOUBLE";
    public static final String FLOAT_STR = "FLOAT";
    public static final String INTEGER_STR = "INTEGER";
    public static final String LONG_STR = "LONG";
    public static final String LONGRAW_STR = "LONG RAW";
    public static final String LONGVARBINARY_STR = "LONGVARBINARY";
    public static final String NCHAR_STR = "NCHAR";
    public static final String NCLOB_STR = "NCLOB";
    public static final String NUMBER_STR = "NUMBER";
    public static final String NUMERIC_STR = "NUMERIC";
    public static final String NVARCHAR_STR = "NVARCHAR";
    public static final String NVARCHAR2_STR = "NVARCHAR2";
    public static final String OTHER_STR = "OTHER";
    public static final String RAW_STR = "RAW";
    public static final String REAL_STR = "REAL";
    public static final String ROWID_STR = "ROWID";
    public static final String ROWTYPE_STR = "%ROWTYPE";
    public static final String SMALLINT_STR = "SMALLINT";
    public static final String STRUCT_STR = "STRUCT";
    public static final String TIME_STR = "TIME";
    public static final String TIMESTAMP_STR = "TIMESTAMP";
    public static final String TINYINT_STR = "TINYINT";
    public static final String UROWID_STR = "UROWID";
    public static final String VARBINARY_STR = "VARBINARY";
    public static final String VARCHAR_STR = "VARCHAR";
    public static final String VARCHAR2_STR = "VARCHAR2";
    public static final String BINARY_INTEGER_STR = "BINARY_INTEGER";
    public static final String PLS_INTEGER_STR = "PLS_INTEGER";
    public static final String NATURAL_STR = "NATURAL";
    public static final String POSITIVE_STR = "POSITIVE";
    public static final String SIGNTYPE_STR = "SIGNTYPE";
    public static final String BINARY_INTEGER_TYPE_STR = "BinaryInteger";
    public static final String PLS_BOOLEAN_TYPE_STR = "PLSQLBoolean";
    public static final String PLS_INTEGER_TYPE_STR = "PLSQLInteger";
    public static final String NATURAL_TYPE_STR = "Natural";
    public static final String POSITIVE_TYPE_STR = "Positive";
    public static final String SIGNTYPE_TYPE_STR = "SignType";

    public static final String SYS_XMLTYPE_STR = "SYS.XMLTYPE";
    public static final String XMLTYPE_STR = "XMLTYPE";
    public static final String _TYPE_STR = "_TYPE";

    public static final String ARRAY_CLS_STR = "java.sql.Array";
    public static final String OPAQUE_CLS_STR = "java.sql.Struct";
    public static final String ROWID_CLS_STR = "java.sql.RowId";
    public static final String STRUCT_CLS_STR = "oracle.sql.OPAQUE";

    /**
     * Return the JDBC type (as int) for a given type name.
     */
    public static int getJDBCTypeFromTypeName(String typeName) {
        int jdbcType = Types.OTHER;
        if (typeName.equals(NUMERIC_STR)) {
            jdbcType = Types.NUMERIC;
        }
        else if (typeName.equals(VARCHAR_STR)) {
            jdbcType = Types.VARCHAR;
        }
        else if (typeName.equals(VARCHAR2_STR)) {
            jdbcType = Types.VARCHAR;
        }
        else if (typeName.equals(NVARCHAR_STR)) {
            jdbcType = Types.NVARCHAR;
        }
        else if (typeName.equals(NVARCHAR2_STR)) {
            jdbcType = Types.NVARCHAR;
        }
        else if (typeName.equals(DATE_STR)) {
            jdbcType = Types.DATE;
        }
        else if (typeName.equals(TIME_STR)) {
            jdbcType = Types.TIME;
        }
        else if (typeName.equals(TIMESTAMP_STR)) {
            jdbcType = Types.TIMESTAMP;
        }
        else if (typeName.equals(DECIMAL_STR)) {
            jdbcType = Types.DECIMAL;
        }
        else if (typeName.equals(INTEGER_STR)) {
            jdbcType = Types.INTEGER;
        }
        else if (typeName.equals(CHAR_STR)) {
            jdbcType = Types.CHAR;
        }
        else if (typeName.equals(NCHAR_STR)) {
            jdbcType = Types.NCHAR;
        }
        else if (typeName.equals(FLOAT_STR)) {
            jdbcType = Types.FLOAT;
        }
        else if (typeName.equals(REAL_STR)) {
            jdbcType = Types.REAL;
        }
        else if (typeName.equals(DOUBLE_STR)) {
            jdbcType = Types.DOUBLE;
        }
        else if (typeName.equals(BINARY_STR)) {
            jdbcType = Types.BINARY;
        }
        else if (typeName.equals(BLOB_STR)) {
            jdbcType = Types.BLOB;
        }
        else if (typeName.equals(CLOB_STR) ||
                 typeName.equals(LONG_STR))  {
            jdbcType = Types.CLOB;
        }
        else if (typeName.equals(NCLOB_STR)) {
            jdbcType = Types.NCLOB;
        }
        else if (typeName.equals(RAW_STR)) {
            jdbcType = Types.VARBINARY;
        }
        else if (typeName.equals(LONGRAW_STR)) {
            jdbcType = Types.LONGVARBINARY;
        }
        else if (typeName.equals(ROWID_STR)) {
            jdbcType = Types.VARCHAR;
        }
        else if (typeName.equals(UROWID_STR)) {
            jdbcType = Types.VARCHAR;
        }
        else if (typeName.equals(BIGINT_STR)) {
            jdbcType = Types.BIGINT;
        }
        else if (typeName.equals(STRUCT_STR)) {
            jdbcType = Types.STRUCT;
        }
        else if (typeName.equals(ARRAY_STR)) {
            jdbcType = Types.ARRAY;
        }
        else if (typeName.equals(ROWID_STR)) {
            jdbcType = Types.ROWID;
        } else if (typeName.equalsIgnoreCase(XMLTYPE_STR) ||
                  (typeName.equalsIgnoreCase(SYS_XMLTYPE_STR))) {
            jdbcType = Types.VARCHAR;
        }
        else if (typeName.equals(BOOLEAN_STR)  ||
                 typeName.equals(INTEGER_STR)  ||
                 typeName.equals(SMALLINT_STR) ||
                 typeName.equals(TINYINT_STR)) {
            jdbcType = Types.INTEGER;
        }
        return jdbcType;
    }

    /**
     * Return the JDBC type name for a given JDBC type code.
     */
    public static String getJDBCTypeNameFromType(int jdbcType) {
        String typeName = switch (jdbcType) {
            case Types.NUMERIC -> NUMERIC_STR;
            case Types.VARCHAR -> VARCHAR_STR;
            case Types.NVARCHAR -> NVARCHAR_STR;
            case Types.DECIMAL -> DECIMAL_STR;
            case Types.CHAR -> CHAR_STR;
            case Types.NCHAR -> NCHAR_STR;
            case Types.FLOAT -> FLOAT_STR;
            case Types.REAL -> REAL_STR;
            case Types.DOUBLE -> DOUBLE_STR;
            case Types.BINARY -> BINARY_STR;
            case Types.BLOB -> BLOB_STR;
            case Types.CLOB -> CLOB_STR;
            case Types.NCLOB -> NCLOB_STR;
            case Types.VARBINARY -> VARBINARY_STR;
            case Types.LONGVARBINARY -> LONGVARBINARY_STR;
            case Types.DATE -> DATE_STR;
            case Types.TIME -> TIME_STR;
            case Types.TIMESTAMP -> TIMESTAMP_STR;
            case Types.BIGINT -> BIGINT_STR;
            case Types.ARRAY -> ARRAY_STR;
            case Types.STRUCT -> STRUCT_STR;
            case Types.ROWID -> ROWID_STR;
            default -> OTHER_STR;
        };
        return typeName;
    }

    /**
     * Return the JDBC enum name for a given JDBC type name.
     */
    public static String getJDBCEnumNameFromTypeName(String typeName) {
        if (getJDBCTypeFromTypeName(typeName) != Types.OTHER) {
            typeName += _TYPE_STR;
        }
        return typeName;
    }

    public static final QName SXF_QNAME_CURSOR = new QName("", "cursor of " + DEFAULT_SIMPLE_XML_FORMAT_TAG);
    /**
     * Return the XML type (as a QName) associated with the
     * given JDBC type name.
     */
    public static QName getXMLTypeFromJDBCTypeName(String jdbcTypeName) {
        return getXMLTypeFromJDBCType(getJDBCTypeFromTypeName(jdbcTypeName));
    }
    /**
     * Return the XML type (as a QName) associated with the
     * given JDBC type.
     */
    public static QName getXMLTypeFromJDBCType(Short jdbcType) {
        return getXMLTypeFromJDBCType(jdbcType.intValue());
    }
    /**
     * Return the XML type (as a QName) associated with the
     * given JDBC type.
     */
    public static QName getXMLTypeFromJDBCType(int jdbcType) {
        return switch (jdbcType) {
            case CHAR, NCHAR, LONGVARCHAR, VARCHAR, NVARCHAR, CLOB, NCLOB, ROWID -> STRING_QNAME;
            case BIGINT -> INTEGER_QNAME;
            case INTEGER, SMALLINT, TINYINT -> INT_QNAME;
            case NUMERIC, DECIMAL -> DECIMAL_QNAME;
            case DOUBLE, FLOAT, REAL -> DOUBLE_QNAME;
            case DATE -> DATE_QNAME;
            case TIME -> TIME_QNAME;
            case TIMESTAMP -> DATE_TIME_QNAME;
            default -> BASE_64_BINARY_QNAME;
        };
    }

    public static QName qNameFromString(String qNameAsString, Schema schema) {

        QName qName = null;
        String nsURI = null;
        String prefix = null;
        String localPart = null;
        if (qNameAsString != null) {
            if (qNameAsString.charAt(0) == '{') {
                int endOfNamespaceURI = qNameAsString.indexOf('}');
                if (endOfNamespaceURI == -1) {
                    throw new IllegalArgumentException(
                       "cannot create QName from \"" + qNameAsString + "\", missing closing \"}\"");
                }
                nsURI = qNameAsString.substring(1, endOfNamespaceURI);
                localPart = qNameAsString.substring(endOfNamespaceURI + 1);
            }
            else {
                int colonIdx = qNameAsString.indexOf(':');
                if (colonIdx > 0) {
                    prefix = qNameAsString.substring(0, colonIdx);
                    localPart = qNameAsString.substring(colonIdx+1);
                    nsURI = schema.getNamespaceResolver().resolveNamespacePrefix(prefix);
                    if (nsURI == null) {
                        if (prefix.equalsIgnoreCase(SCHEMA_PREFIX)) {
                            nsURI = W3C_XML_SCHEMA_NS_URI;
                        }
                        else {
                            nsURI = DEFAULT_NS_PREFIX;
                        }
                    }
                }
                else {
                    localPart = qNameAsString;
                }
            }
            // check for W3C_XML_SCHEMA_NS_URI - return TL_OX pre-built QName's
            if (W3C_XML_SCHEMA_NS_URI.equals(nsURI)) {
                qName = SCHEMA_QNAMES.get(localPart);
                if (qName == null) { // unknown W3C_XML_SCHEMA_NS_URI type ?
                    qName = new QName(W3C_XML_SCHEMA_NS_URI, localPart,
                        prefix == null ? DEFAULT_NS_PREFIX : prefix);
                }
            }
            else {
                qName = new QName(nsURI == null ? NULL_NS_URI : nsURI,
                    localPart, prefix == null ? DEFAULT_NS_PREFIX : prefix);
            }
        }
        return qName;
    }

    /**
     * Returns the class name associated with a given JDBC/SQL type code.
     *
     */
    public static String getClassNameForType(int jdbcType) {
        String typeName = switch (jdbcType) {
            case Types.NUMERIC -> ClassConstants.NUMBER.getName();
            case Types.DECIMAL -> ClassConstants.BIGDECIMAL.getName();
            case Types.CHAR -> ClassConstants.CHAR.getName();
            case Types.FLOAT -> ClassConstants.FLOAT.getName();
            case Types.DOUBLE, Types.REAL -> ClassConstants.DOUBLE.getName();
            case Types.BINARY, Types.VARBINARY, Types.LONGVARBINARY -> ClassConstants.ABYTE.getName();
            case Types.BLOB -> ClassConstants.BLOB.getName();
            case Types.CLOB -> ClassConstants.CLOB.getName();
            case Types.NCLOB -> "java.sql.NClob";
            case Types.DATE -> ClassConstants.SQLDATE.getName();
            case Types.TIME -> ClassConstants.TIME.getName();
            case Types.TIMESTAMP -> ClassConstants.TIMESTAMP.getName();
            case Types.BIGINT -> ClassConstants.BIGINTEGER.getName();
            case Types.ARRAY -> ARRAY_CLS_STR;
            case Types.STRUCT -> STRUCT_CLS_STR;
            case Types.ROWID -> ROWID_CLS_STR;
            case OPAQUE -> OPAQUE_CLS_STR;
            default -> ClassConstants.STRING.getName();
        };
        return typeName;
    }

    /**
     * Return a DatabaseType instance for a given JDCBType.  If applicable, precision
     * and scale values will be applied.  The default type instance will be
     * VarChar2Type.
     *
     */
    public static DatabaseType buildTypeForJDBCType(int jdbcType, int precision, int scale) {
        DatabaseType type = switch (jdbcType) {
            case Types.BINARY -> new BinaryType();
            case Types.BLOB -> new BlobType();
            case Types.CHAR -> new CharType();
            case Types.CLOB -> new ClobType();
            case Types.DATE -> ScalarDatabaseTypeEnum.DATE_TYPE;
            case Types.BIGINT -> ScalarDatabaseTypeEnum.BIGINT_TYPE;
            case Types.DECIMAL, Types.NUMERIC -> new DecimalType(precision, scale);
            case Types.DOUBLE -> new DoubleType(precision, scale);
            case Types.FLOAT -> new FloatType(precision, scale);
            case Types.LONGVARBINARY -> new LongRawType();
            case Types.NCHAR -> new NCharType();
            case Types.NCLOB -> new NClobType();
            case Types.REAL -> new RealType(precision, scale);
            case Types.TIME -> ScalarDatabaseTypeEnum.TIME_TYPE;
            case Types.TIMESTAMP -> new TimeStampType();
            case Types.VARBINARY -> new RawType();
            default -> new VarChar2Type();
        };
        return type;
    }

    /**
     * Get the attribute class for a given DatabaseType.
     */
    public static Class getAttributeClassForDatabaseType(DatabaseType dbType) {
        if (!dbType.isComposite()) {
            String typeName = dbType.getTypeName();
            if (NUMBER_STR.equals(typeName) || NUMERIC_STR.equals(typeName)) {
                return BIGDECIMAL;
            }
            if (INTEGER_STR.equals(typeName)) {
                return org.eclipse.persistence.internal.helper.ClassConstants.INTEGER;
            }
            if (BOOLEAN_STR.equals(typeName)) {
                return BOOLEAN;
            }
            if (DATE_STR.equals(typeName)) {
                return CoreClassConstants.SQLDATE;
            }
            if (TIMESTAMP_STR.equals(typeName)) {
                return CoreClassConstants.TIMESTAMP;
            }
        }
        return STRING;
    }

    /*
      
      
        
          
            
          
        
      
    */
    public static void addSimpleXMLFormat(Schema schema) {
        ComplexType anyType = new ComplexType();
        anyType.setName(DEFAULT_SIMPLE_XML_FORMAT_TAG);
        Sequence anySequence = new Sequence();
        Any any = new Any();
        any.setMinOccurs("0");
        anySequence.addAny(any);
        anyType.setSequence(anySequence);
        schema.addTopLevelComplexTypes(anyType);
    }

    public static boolean noOutArguments(ProcedureType storedProcedure) {

        boolean noOutArguments = true;
        if (storedProcedure.getArguments() != null &&
                !storedProcedure.getArguments().isEmpty()) {
            for (ArgumentType arg : storedProcedure.getArguments()) {
                if (arg.getDirection() ==  INOUT || arg.getDirection() == OUT) {
                    noOutArguments = false;
                    break;
                }
            }
        }
        return noOutArguments;
    }

    public static String escapePunctuation(String originalName) {
        if (originalName == null || originalName.isEmpty()) {
            return originalName;
        }
        // escape all punctuation except SQL 'LIKE' meta-characters:
        // '_' (underscore) - matches any one character) and
        // '%' (percent ) - matches a string of zero or more characters
        return originalName.trim().replaceAll("[\\p{Punct}&&[^_%]]", "\\\\$0");
    }

    public static boolean isNullStream(OutputStream outputStream) {
        return (outputStream == null | outputStream == __nullStream);
    }

    /**
     * Returns a Java class name based on a given name and project.  The returned
     * string  will be  in the format  'projectname.Name'.   For  example,  given
     * the name 'EMPLOYEE'  and projectName 'TEST', the  method would return  the
     * string 'test.Employee'.
     *
     */
    public static String getGeneratedJavaClassName(String name, String projectName) {
        String first = name.substring(0, 1).toUpperCase();
        String rest = name.toLowerCase().substring(1);
        return projectName.toLowerCase() + DOT + first + rest;
    }

    /**
     * Returns an alias (typically used as a descriptor alias) based on a given
     * table or type name.  The returned string will contain an upper case
     * first char, with the remaining chars in lower case format.
     */
    public static String getGeneratedAlias(String tableName) {
        String first = tableName.substring(0, 1).toUpperCase();
        String rest = tableName.toLowerCase().substring(1);
        return first.concat(rest);
    }

    /**
     * Returns a Java class name based on a given name and project.  The  returned
     * string  will be  in the format  'projectname.Name_CollectionWrapper'.   For
     * example, given the name 'EMPLOYEE' and projectName 'TEST', the method would
     * return the string 'test.Employee_CollectionWrapper'.
     *
     */
    public static String getGeneratedWrapperClassName(String name, String projectName) {
        return getGeneratedJavaClassName(name, projectName) + COLLECTION_WRAPPER_SUFFIX;
    }

    /**
     * Build a RelationalDescriptor for a given table.
     */
    public static RelationalDescriptor buildORDescriptor(String tableName, String projectName,
        List requireCRUDOperations, NamingConventionTransformer nct) {
        RelationalDescriptor desc = new RelationalDescriptor();
        desc.addTableName(tableName);
        String tableAlias = getGeneratedAlias(tableName);
        desc.setAlias(tableAlias);
        desc.setJavaClassName(getGeneratedJavaClassName(tableName, projectName));
        desc.useWeakIdentityMap();
        // keep track of which tables require CRUD operations
        if (requireCRUDOperations != null) {
            requireCRUDOperations.add(tableAlias);
        }
        return desc;
    }

    /**
     * Build an XMLDescriptor for a given table.
     */
    public static XMLDescriptor buildOXDescriptor(String tableName, String projectName, String targetNamespace, NamingConventionTransformer nct) {
        return buildOXDescriptor(getGeneratedAlias(tableName), nct.generateSchemaAlias(tableName), getGeneratedJavaClassName(tableName, projectName), targetNamespace);
    }

    /**
     * Build an XMLDescriptor for a given table.
     */
    public static XMLDescriptor buildOXDescriptor(String tableAlias, String schemaAlias, String generatedJavaClassName, String targetNamespace) {
        XMLDescriptor xdesc = new XMLDescriptor();
        xdesc.setAlias(tableAlias);
        xdesc.setJavaClassName(generatedJavaClassName);

        NamespaceResolver nr = new NamespaceResolver();
        nr.setDefaultNamespaceURI(targetNamespace);
        xdesc.setNamespaceResolver(nr);
        xdesc.setDefaultRootElement(schemaAlias);

        XMLSchemaURLReference schemaReference = new XMLSchemaURLReference(EMPTY_STRING);
        schemaReference.setSchemaContext(SLASH + schemaAlias);
        schemaReference.setType(org.eclipse.persistence.platform.xml.XMLSchemaReference.COMPLEX_TYPE);
        xdesc.setSchemaReference(schemaReference);
        return xdesc;
    }

    public static QName buildCustomQName(String typeString, DBWSBuilder builder) {
        // for %TYPE and %ROWTYPE we'll need to replace the '%' with '_'
        if (typeString.contains(PERCENT)) {
            typeString = typeString.replace(PERCENT, UNDERSCORE);
        }

        QName qName = null;
        String nsURI = null;
        String prefix = null;
        String localPart = null;
        int colonIdx = typeString.indexOf(COLON);
        if (colonIdx > 0) {
            prefix = typeString.substring(0, colonIdx);
            nsURI = builder.schema.getNamespaceResolver().resolveNamespacePrefix(prefix);
            if (prefix.equalsIgnoreCase(SCHEMA_PREFIX)) {
                nsURI = W3C_XML_SCHEMA_NS_URI;
            } else {
                nsURI = DEFAULT_NS_PREFIX;
            }
            localPart = typeString.substring(colonIdx+1);
            if (W3C_XML_SCHEMA_NS_URI.equals(nsURI)) {
                qName = SCHEMA_QNAMES.get(localPart);
                if (qName == null) { // unknown W3C_XML_SCHEMA_NS_URI type ?
                    qName = new QName(W3C_XML_SCHEMA_NS_URI, localPart,
                        prefix == null ? DEFAULT_NS_PREFIX : prefix);
                }
            } else {
                qName = new QName(nsURI, localPart, prefix);
            }
        } else {
            qName = qNameFromString(OPEN_PAREN + builder.getTargetNamespace() +
                CLOSE_PAREN + typeString, builder.schema);
        }
        return qName;
    }

    public static boolean requiresSimpleXMLFormat(XRServiceModel serviceModel) {
        boolean requiresSimpleXMLFormat = false;
        for (Operation operation : serviceModel.getOperationsList()) {
            if (operation instanceof QueryOperation qo) {
                if (qo.getResult().isSimpleXMLFormat()) {
                    requiresSimpleXMLFormat = true;
                    break;
                }
            }
        }
        return requiresSimpleXMLFormat;
    }

    public static boolean sqlMatch(String pattern, String input) {
        if (pattern != null && !pattern.isEmpty()) {
            //add support for positive 'empty' pattern matching
            String tmp = "\\A\\Z|" + pattern.replace('_', '.').replace("%", ".*");
            Pattern p = Pattern.compile(tmp, Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE);
            return p.matcher(input == null ? "" : input).matches();
        }
        return false;
    }

    /**
     * Indicates if a given DatabaseType is considered 'complex', i.e.
     * is one of PLSQLRecordType, PLSQLCollectionType, VArrayType,
     * ObjectType, or NestedTableType
     */
    public static boolean isTypeComplex(DatabaseType dbType) {
        return dbType.isPLSQLType()
                || (dbType.isPLSQLCursorType() && !((PLSQLCursorType)dbType).isWeaklyTyped())
                || dbType.isVArrayType()
                || dbType.isObjectType()
                || dbType.isBlobType()
                || dbType.isObjectTableType();
    }

    /**
     * Indicates if a given ArgumentType is considered 'complex', i.e. it has
     * a data type that is one of PLSQLRecordType, PLSQLCollectionType,
     * VArrayType, ObjectType, or NestedTableType
     */
    public static boolean isArgComplex(ArgumentType argument) {
        return isTypeComplex(argument.getEnclosedType());
    }

    /**
     * Indicates if a given ArgumentType is considered a PL/SQL argument,
     * i.e. it has a data type that is one of PLSQLRecordType,
     * PLSQLCollectionType, BOOLEAN_TYPE, BINARY_INTEGER_TYPE,
     * PLS_INTEGER_TYPE, etc.
     */
    public static boolean isArgPLSQL(ArgumentType argument) {
        DatabaseType argType = argument.getEnclosedType();
        return argType.isPLSQLType() || isArgPLSQLScalar(argument);
    }

    /**
     * Indicates if a given ArgumentType is considered a PL/SQL scalar
     * argument, i.e. it has a data type that is one of BOOLEAN_TYPE,
     * BINARY_INTEGER_TYPE, PLS_INTEGER_TYPE, etc.
     */
    public static boolean isArgPLSQLScalar(ArgumentType argument) {
        DatabaseType argType = argument.getEnclosedType();
        return argType == ScalarDatabaseTypeEnum.BINARY_INTEGER_TYPE
            || argType == ScalarDatabaseTypeEnum.BOOLEAN_TYPE
            || argType == ScalarDatabaseTypeEnum.NATURAL_TYPE
            || argType == ScalarDatabaseTypeEnum.PLS_INTEGER_TYPE
            || argType == ScalarDatabaseTypeEnum.POSITIVE_TYPE
            || argType == ScalarDatabaseTypeEnum.SIGN_TYPE;
    }

    /**
     * Indicates if a given argument type name is considered a PL/SQL scalar
     * argument, i.e. is one of BOOLEAN, BINARY_INTEGER, PLS_INTEGER, etc.
     */
    public static boolean isArgPLSQLScalar(String argTypeName) {
        return argTypeName.equals("BOOLEAN")
            || argTypeName.equals("PLS_INTEGER")
            || argTypeName.equals("BINARY_INTEGER")
            || argTypeName.equals("NATURAL")
            || argTypeName.equals("POSITIVE")
            || argTypeName.equals("SIGNTYPE");
    }

    /**
     * Return the Oracle PL/SQL name for a given PL/SQL scalar type.
     */
    public static String getOraclePLSQLTypeForName(String typeName) {
        if (typeName.equals(BINARY_INTEGER_STR))
            return BINARY_INTEGER_TYPE_STR;
        if (typeName.equals(BOOLEAN_STR))
            return PLS_BOOLEAN_TYPE_STR;
        if (typeName.equals(PLS_INTEGER_STR))
            return PLS_INTEGER_TYPE_STR;
        if (typeName.equals(NATURAL_STR))
            return NATURAL_TYPE_STR;
        if (typeName.equals(POSITIVE_STR))
            return POSITIVE_TYPE_STR;
        if (typeName.equals(SIGNTYPE_STR))
            return SIGNTYPE_TYPE_STR;
        return null;
    }

    /**
     * Indicates if a given ProcedureType contains one or more arguments that
     * are considered 'complex', i.e. PLSQLRecordType, PLSQLCollectionType,
     * VArrayType, ObjectType, or NestedTableType.
     *
     * Note that for FunctionType the return argument is tested as well.
     */
    public static boolean hasComplexArgs(ProcedureType storedProcedure) {
        for (ArgumentType arg : storedProcedure.getArguments()) {
            if (isArgComplex(arg)) {
                return true;
            }
        }
        if (storedProcedure.isFunctionType()) {
            if (isArgComplex(((FunctionType)storedProcedure).getReturnArgument())) {
                return true;
            }
        }
        return false;
    }

    /**
     * Indicates if a given ProcedureType contains  one or more  PL/SQL
     * arguments, i.e. PLSQLRecordType, PLSQLCollectionType, or scalars
     * BOOLEAN_TYPE, BINARY_INTEGER_TYPE, PLS_INTEGER_TYPE, etc.
     *
     * Note that for FunctionType the return argument is tested as well.
     */
    public static boolean hasPLSQLArgs(ProcedureType storedProcedure) {
        for (ArgumentType arg : storedProcedure.getArguments()) {
            if (isArgPLSQL(arg)) {
                return true;
            }
        }
        if (storedProcedure.isFunctionType()) {
            if (isArgPLSQL(((FunctionType)storedProcedure).getReturnArgument())) {
                return true;
            }
        }
        return false;
    }

    /**
     * Indicates if a given list  of ArgumentTypes contains  one or more
     * PL/SQL arguments, i.e.  PLSQLRecordType, PLSQLCollectionType,  or
     * scalars BOOLEAN_TYPE, BINARY_INTEGER_TYPE, PLS_INTEGER_TYPE, etc.
     *
     * In addition, an optional argument must be treated as PL/SQL as
     * default/optional parameter handling is done via
     * PLSQLStoredProcedureCall
     */
    public static boolean hasPLSQLArgs(List arguments) {
        for (ArgumentType arg : arguments) {
            if (isArgPLSQL(arg) || arg.optional()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Indicates if a given List<ArgumentType> contains one or more arguments that
     * are considered 'complex', i.e. PLSQLRecordType, PLSQLCollectionType,
     * VArrayType, ObjectType, or NestedTableType
     */
    public static boolean hasComplexArgs(List arguments) {
        for (ArgumentType arg : arguments) {
            if (isArgComplex(arg)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Indicates if a given List<ArgumentType> contains one or more arguments
     * that are considered PL/SQL scalars, i.e. PLSQLBoolean, PLSQLInteger,
     * BinaryInteger, etc.
     */
    public static boolean hasPLSQLScalarArgs(List arguments) {
        for (ArgumentType arg : arguments) {
            if (isArgPLSQLScalar(arg)) {
                return true;
            }
        }
        return false;
    }

    /**
     * Indicates if a given List<ArgumentType> contains a PL/SQL Cursor
     * type.
     */
    public static boolean hasPLSQLCursorArg(List arguments) {
        for (ArgumentType arg : arguments) {
            if (arg.isPLSQLCursorType()) {
                return true;
            }
        }
        return false;
    }

    /**
     * Convenience method used to determine if the java class and/or java type name
     * should be set on a given procedure argument.  This will typically be used
     * when calling addNamedInOutputArgument on a stored procedure call.
     *
     */
    public static boolean shouldSetJavaType(String typeName) {
        if (typeName.equals(ClassConstants.STRING.getName())) {
            return false;
        }
        return true;
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy