/* * DBeaver - Universal Database Manager * Copyright (C) 2010-2017 Serge Rider (serge@jkiss.org) * * 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. */ package org.jkiss.dbeaver.ext.oracle.model; import org.jkiss.dbeaver.DBException; import org.jkiss.dbeaver.Log; import org.jkiss.dbeaver.model.DBIcon; import org.jkiss.dbeaver.model.DBPImage; import org.jkiss.dbeaver.model.runtime.DBRProgressMonitor; import org.jkiss.dbeaver.model.struct.DBSObject; import org.jkiss.dbeaver.model.struct.DBSObjectType; import java.util.HashMap; import java.util.Map; /** * Object type */ public enum OracleObjectType implements DBSObjectType { CLUSTER("CLUSTER", null, DBSObject.class, null), CONSTRAINT ("CONSTRAINT", DBIcon.TREE_CONSTRAINT, OracleTableConstraint.class, null), // fake object CONSUMER_GROUP("CONSUMER GROUP", null, DBSObject.class, null), CONTEXT("CONTEXT", null, DBSObject.class, null), DIRECTORY("DIRECTORY", null, DBSObject.class, null), EVALUATION_CONTEXT("EVALUATION CONTEXT", null, DBSObject.class, null), FOREIGN_KEY ("FOREIGN KEY", DBIcon.TREE_FOREIGN_KEY, OracleTableForeignKey.class, null), // fake object FUNCTION("FUNCTION", DBIcon.TREE_PROCEDURE, OracleProcedureStandalone.class, new ObjectFinder() { @Override public OracleProcedureStandalone findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.proceduresCache.getObject(monitor, schema, objectName); } }), INDEX("INDEX", DBIcon.TREE_INDEX, OracleTableIndex.class, new ObjectFinder() { @Override public OracleTableIndex findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.indexCache.getObject(monitor, schema, objectName); } }), INDEX_PARTITION("INDEX PARTITION", null, DBSObject.class, null), INDEXTYPE("INDEXTYPE", null, DBSObject.class, null), JAVA_CLASS("JAVA CLASS", DBIcon.TREE_JAVA_CLASS, OracleJavaClass.class, new ObjectFinder() { @Override public OracleJavaClass findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.javaCache.getObject(monitor, schema, objectName); } }), JAVA_DATA("JAVA DATA", null, DBSObject.class, null), JAVA_RESOURCE("JAVA RESOURCE", null, DBSObject.class, null), JOB("JOB", null, DBSObject.class, null), JOB_CLASS("JOB CLASS", null, DBSObject.class, null), LIBRARY("LIBRARY", null, DBSObject.class, null), LOB("CONTENT", null, DBSObject.class, null), MATERIALIZED_VIEW("MATERIALIZED VIEW", null, DBSObject.class, null), OPERATOR("OPERATOR", null, DBSObject.class, null), PACKAGE("PACKAGE", DBIcon.TREE_PACKAGE, OraclePackage.class, new ObjectFinder() { @Override public OraclePackage findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.packageCache.getObject(monitor, schema, objectName); } }), PACKAGE_BODY("PACKAGE BODY", DBIcon.TREE_PACKAGE, OraclePackage.class, new ObjectFinder() { @Override public OraclePackage findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.packageCache.getObject(monitor, schema, objectName); } }), PROCEDURE("PROCEDURE", DBIcon.TREE_PROCEDURE, OracleProcedureStandalone.class, new ObjectFinder() { @Override public OracleProcedureStandalone findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.proceduresCache.getObject(monitor, schema, objectName); } }), PROGRAM("PROGRAM", null, DBSObject.class, null), QUEUE("QUEUE", null, DBSObject.class, null), RULE("RULE", null, DBSObject.class, null), RULE_SET("RULE SET", null, DBSObject.class, null), SCHEDULE("SCHEDULE", null, DBSObject.class, null), SEQUENCE("SEQUENCE", DBIcon.TREE_SEQUENCE, OracleSequence.class, new ObjectFinder() { @Override public OracleSequence findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.sequenceCache.getObject(monitor, schema, objectName); } }), SYNONYM("SYNONYM", DBIcon.TREE_SYNONYM, OracleSynonym.class, new ObjectFinder() { @Override public OracleSynonym findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.synonymCache.getObject(monitor, schema, objectName); } }), TABLE("TABLE", DBIcon.TREE_TABLE, OracleTable.class, new ObjectFinder() { @Override public OracleTableBase findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.tableCache.getObject(monitor, schema, objectName); } }), TABLE_PARTITION("TABLE PARTITION", null, DBSObject.class, null), TRIGGER("TRIGGER", DBIcon.TREE_TRIGGER, OracleTrigger.class, new ObjectFinder() { @Override public OracleTrigger findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.triggerCache.getObject(monitor, schema, objectName); } }), TYPE("TYPE", DBIcon.TREE_DATA_TYPE, OracleDataType.class, new ObjectFinder() { @Override public OracleDataType findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.dataTypeCache.getObject(monitor, schema, objectName); } }), TYPE_BODY("TYPE BODY", DBIcon.TREE_DATA_TYPE, OracleDataType.class, new ObjectFinder() { @Override public OracleDataType findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.dataTypeCache.getObject(monitor, schema, objectName); } }), VIEW("VIEW", DBIcon.TREE_VIEW, OracleView.class, new ObjectFinder() { @Override public OracleView findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { return schema.tableCache.getObject(monitor, schema, objectName, OracleView.class); } }), WINDOW("WINDOW", null, DBSObject.class, null), WINDOW_GROUP("WINDOW GROUP", null, DBSObject.class, null), XML_SCHEMA("XML SCHEMA", null, DBSObject.class, null); private static final Log log = Log.getLog(OracleObjectType.class); private static Map<String, OracleObjectType> typeMap = new HashMap<>(); static { for (OracleObjectType type : values()) { typeMap.put(type.getTypeName(), type); } } public static OracleObjectType getByType(String typeName) { return typeMap.get(typeName); } private static interface ObjectFinder { DBSObject findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException; } private final String objectType; private final DBPImage image; private final Class<? extends DBSObject> typeClass; private final ObjectFinder finder; <OBJECT_TYPE extends DBSObject> OracleObjectType(String objectType, DBPImage image, Class<OBJECT_TYPE> typeClass, ObjectFinder finder) { this.objectType = objectType; this.image = image; this.typeClass = typeClass; this.finder = finder; } public boolean isBrowsable() { return finder != null; } @Override public String getTypeName() { return objectType; } @Override public String getDescription() { return null; } @Override public DBPImage getImage() { return image; } @Override public Class<? extends DBSObject> getTypeClass() { return typeClass; } public DBSObject findObject(DBRProgressMonitor monitor, OracleSchema schema, String objectName) throws DBException { if (finder != null) { return finder.findObject(monitor, schema, objectName); } else { return null; } } public static Object resolveObject( DBRProgressMonitor monitor, OracleDataSource dataSource, String dbLink, String objectTypeName, String objectOwner, String objectName) throws DBException { if (dbLink != null) { return objectName; } OracleObjectType objectType = OracleObjectType.getByType(objectTypeName); if (objectType == null) { log.debug("Unrecognized Oracle object type: " + objectTypeName); return objectName; } if (!objectType.isBrowsable()) { log.debug("Unsupported Oracle object type: " + objectTypeName); return objectName; } final OracleSchema schema = dataSource.getSchema(monitor, objectOwner); if (schema == null) { log.debug("Schema '" + objectOwner + "' not found"); return objectName; } final DBSObject object = objectType.findObject(monitor, schema, objectName); if (object == null) { log.debug(objectTypeName + " '" + objectName + "' not found in '" + schema.getName() + "'"); return objectName; } return object; } @Override public String toString() { return objectType; } }