/** * */ package org.identityconnectors.oracle; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.SQLException; import java.util.EnumSet; import java.util.HashSet; import java.util.Set; import org.identityconnectors.framework.common.exceptions.ConnectorException; import org.identityconnectors.framework.common.objects.AttributeInfo; import org.identityconnectors.framework.common.objects.AttributeInfo.Flags; import org.identityconnectors.framework.common.objects.AttributeInfoBuilder; import org.identityconnectors.framework.common.objects.Name; import org.identityconnectors.framework.common.objects.ObjectClass; import org.identityconnectors.framework.common.objects.OperationalAttributeInfos; import org.identityconnectors.framework.common.objects.OperationalAttributes; import org.identityconnectors.framework.common.objects.Schema; import org.identityconnectors.framework.common.objects.SchemaBuilder; import org.identityconnectors.framework.spi.operations.SchemaOp; /** * Constructs schema for Oracle connector. Connector uses hardcoded schema , it * just checks the version of oracle and support/does not support global * authentication. * * @author kitko * */ final class OracleOperationSchema extends AbstractOracleOperation implements SchemaOp { // Last veersion for oracle where oracle supports quotas for temporary table // spaces private static final Pair<Integer, Integer> LAST_TMP_TS_QUOTA_VERSION = new Pair<Integer, Integer>(10, 1); OracleOperationSchema(OracleConfiguration cfg, Connection adminConn) { super(cfg, adminConn); } public Schema schema() { String dbProductVersion = null; Pair<Integer, Integer> dbVersion = null; ; try { DatabaseMetaData metaData = adminConn.getMetaData(); dbVersion = new Pair<Integer, Integer>(metaData.getDatabaseMajorVersion(), metaData .getDatabaseMinorVersion()); dbProductVersion = metaData.getDatabaseProductVersion(); } catch (SQLException e) { // This is internal error throw new ConnectorException( "Cannot resolve getMetaData().getDatabaseProductVersion()", e); } boolean express = false; if (dbProductVersion.contains("Express")) { express = true; } Set<AttributeInfo> attrInfoSet = new HashSet<AttributeInfo>(); attrInfoSet.add(AttributeInfoBuilder.build(Name.NAME, String.class, EnumSet.of( Flags.NOT_UPDATEABLE, Flags.REQUIRED))); attrInfoSet.add(OperationalAttributeInfos.PASSWORD); attrInfoSet.add(OperationalAttributeInfos.PASSWORD_EXPIRED); attrInfoSet.add(OperationalAttributeInfos.ENABLE); attrInfoSet.add(OperationalAttributeInfos.LOCK_OUT); // This is // implemented same // like disable attrInfoSet.add(AttributeInfoBuilder.build( OperationalAttributes.PASSWORD_EXPIRATION_DATE_NAME, Long.class, EnumSet.of( Flags.NOT_UPDATEABLE, Flags.NOT_CREATABLE))); attrInfoSet.add(AttributeInfoBuilder.build(OperationalAttributes.DISABLE_DATE_NAME, Long.class, EnumSet.of(Flags.NOT_UPDATEABLE, Flags.NOT_CREATABLE))); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_AUTHENTICATION_ATTR_NAME, String.class)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_GLOBAL_ATTR_NAME, String.class, express ? EnumSet.of(Flags.NOT_CREATABLE, Flags.NOT_UPDATEABLE) : null)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_ROLES_ATTR_NAME, String.class, EnumSet.of(Flags.MULTIVALUED))); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_PRIVS_ATTR_NAME, String.class, EnumSet.of(Flags.MULTIVALUED))); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_PROFILE_ATTR_NAME, String.class)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_DEF_TS_ATTR_NAME, String.class)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_DEF_TS_QUOTA_ATTR_NAME, String.class)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_TEMP_TS_ATTR_NAME, String.class)); attrInfoSet.add(AttributeInfoBuilder.build(OracleConstants.ORACLE_TEMP_TS_QUOTA_ATTR_NAME, String.class, !isTempTsQuotaWriteable(dbVersion) ? EnumSet.of(Flags.NOT_CREATABLE, Flags.NOT_UPDATEABLE) : null)); SchemaBuilder schemaBld = new SchemaBuilder(OracleConnector.class); schemaBld.defineObjectClass(ObjectClass.ACCOUNT_NAME, attrInfoSet); Schema schema = schemaBld.build(); return schema; } /** * If current version of oracle is greater then LAST_TMP_TS_QUOTA_VERSION, * we will not support writeable temporary table space quotas. * * @param dbVersion * @return true resource supports ORACLE_DEF_TS_QUOTA_ATTR_NAME attribute */ private boolean isTempTsQuotaWriteable(Pair<Integer, Integer> dbVersion) { if (dbVersion.getFirst() < LAST_TMP_TS_QUOTA_VERSION.getFirst()) { return true; } else if (dbVersion.getFirst() > LAST_TMP_TS_QUOTA_VERSION.getFirst()) { return false; } else { return dbVersion.getSecond() <= LAST_TMP_TS_QUOTA_VERSION.getSecond(); } } }