package org.identityconnectors.oracle;
import static org.identityconnectors.oracle.OracleMessages.MSG_CANNOT_LOAD_DRIVER;
import static org.identityconnectors.oracle.OracleMessages.MSG_CS_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_DATABASE_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_DATASOURCE_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_DRIVER_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_HOST_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_PASSWORD_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_PORT_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_SET_DRIVER_OR_URL;
import static org.identityconnectors.oracle.OracleMessages.MSG_URL_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_USER_AND_PASSWORD_MUST_BE_SET_BOTH_OR_NONE;
import static org.identityconnectors.oracle.OracleMessages.MSG_USER_DISPLAY;
import static org.identityconnectors.oracle.OracleMessages.MSG_USE_DRIVER_FOR_AUTHENTICATION_IS_JUST_FOR_DATASOURCE;
import org.identityconnectors.common.StringUtil;
import org.identityconnectors.dbcommon.LocalizedAssert;
import org.identityconnectors.oracle.OracleConfiguration.ConnectionType;
/** Helper class that validated {@link OracleConfiguration}. */
final class OracleConfigurationValidator {
private final OracleConfiguration cfg;
OracleConfigurationValidator(OracleConfiguration cfg) {
this.cfg = cfg;
}
void validate() {
if (StringUtil.isNotBlank(cfg.getSourceType())) {
validateExplicit();
} else {
validateImplicit();
}
if (cfg.isUseDriverForAuthentication()) {
if (!ConnectionType.DATASOURCE.equals(cfg.getConnType())) {
throw new IllegalArgumentException(cfg.getConnectorMessages().format(
MSG_USE_DRIVER_FOR_AUTHENTICATION_IS_JUST_FOR_DATASOURCE, null));
}
}
}
private void validateExplicit() {
LocalizedAssert la = new LocalizedAssert(cfg.getConnectorMessages(), true);
la.assertNotBlank(cfg.getCaseSensitivityString(), MSG_CS_DISPLAY);
cfg.setCSSetup(new OracleCaseSensitivityBuilder(cfg.getConnectorMessages()).parseMap(
cfg.getCaseSensitivityString()).build());
cfg.setExtraAttributesPolicySetup(new ExtraAttributesPolicySetupBuilder(cfg
.getConnectorMessages()).parseMap(cfg.getExtraAttributesPolicyString()).build());
cfg.setNormalizerName(OracleNormalizerName.valueOf(cfg.getNormalizerString()));
// Now we map source type directly to connectionType
cfg.setConnType(ConnectionType.resolveType(cfg.getSourceType(), cfg.getConnectorMessages()));
switch (cfg.getConnType()) {
case DATASOURCE: {
la.assertNotBlank(cfg.getDataSource(), MSG_DATASOURCE_DISPLAY);
cfg.setDriverClassName(null);
break;
}
case THIN: {
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertNotBlank(cfg.getHost(), MSG_HOST_DISPLAY);
la.assertNotBlank(cfg.getPort(), MSG_PORT_DISPLAY);
la.assertNotBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
break;
}
case OCI: {
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertNotBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
break;
}
case FULL_URL: {
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertNotBlank(cfg.getDriver(), MSG_DRIVER_DISPLAY);
la.assertNotBlank(cfg.getUrl(), MSG_URL_DISPLAY);
if (OracleSpecifics.THIN_DRIVER.equals(cfg.getDriver())) {
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
} else if (OracleSpecifics.OCI_DRIVER.equals(cfg.getDriver())) {
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
} else {
cfg.setDriverClassName(cfg.getDriver());
}
break;
}
}
if (cfg.getDriverClassName() != null) {
try {
Class.forName(cfg.getDriverClassName());
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException(cfg.getConnectorMessages().format(
MSG_CANNOT_LOAD_DRIVER, null, cfg.getDriverClassName()), e);
}
}
// Here we reset UseDriverForAuthentication, probably better would be if
// application would do this instead of us
if (cfg.isUseDriverForAuthentication()
&& !ConnectionType.DATASOURCE.equals(cfg.getConnType())) {
cfg.resetUseDriverForAuthentication();
}
}
private void validateImplicit() {
LocalizedAssert la = new LocalizedAssert(cfg.getConnectorMessages(), true);
la.assertNotBlank(cfg.getCaseSensitivityString(), MSG_CS_DISPLAY);
cfg.setCSSetup(new OracleCaseSensitivityBuilder(cfg.getConnectorMessages()).parseMap(
cfg.getCaseSensitivityString()).build());
cfg.setExtraAttributesPolicySetup(new ExtraAttributesPolicySetupBuilder(cfg
.getConnectorMessages()).parseMap(cfg.getExtraAttributesPolicyString()).build());
cfg.setNormalizerName(OracleNormalizerName.valueOf(cfg.getNormalizerString()));
if (StringUtil.isNotBlank(cfg.getDataSource())) {
la.assertBlank(cfg.getHost(), MSG_HOST_DISPLAY);
la.assertBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
la.assertBlank(cfg.getDriver(), MSG_DRIVER_DISPLAY);
la.assertBlank(cfg.getPort(), MSG_PORT_DISPLAY);
// If user is not blank, then also password must not be blank
// Most of datasource configuration will not allow to pass user and
// password when retrieving connection from ds,
// But for some configuration it is valid to specify user/password
// and override configuration at application server level
if ((StringUtil.isNotBlank(cfg.getUser()) && cfg.getPassword() == null)
|| (StringUtil.isBlank(cfg.getUser()) && cfg.getPassword() != null)) {
throw new IllegalArgumentException(cfg.getConnectorMessages().format(
MSG_USER_AND_PASSWORD_MUST_BE_SET_BOTH_OR_NONE, null));
}
cfg.setConnType(ConnectionType.DATASOURCE);
} else {
la.assertNotBlank(cfg.getDriver(), MSG_DRIVER_DISPLAY);
if (StringUtil.isNotBlank(cfg.getUrl())) {
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertBlank(cfg.getHost(), "MSG_HOST_DISPLAY");
la.assertBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
la.assertBlank(cfg.getPort(), MSG_PORT_DISPLAY);
if (OracleSpecifics.THIN_DRIVER.equals(cfg.getDriver())) {
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
} else if (OracleSpecifics.OCI_DRIVER.equals(cfg.getDriver())) {
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
} else {
cfg.setDriverClassName(cfg.getDriver());
}
cfg.setConnType(ConnectionType.FULL_URL);
} else if (OracleSpecifics.THIN_DRIVER.equals(cfg.getDriver())
|| OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME.equals(cfg.getDriver())) {
la.assertNotBlank(cfg.getHost(), MSG_HOST_DISPLAY);
la.assertNotBlank(cfg.getPort(), MSG_PORT_DISPLAY);
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertNotBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
cfg.setConnType(ConnectionType.THIN);
} else if (OracleSpecifics.OCI_DRIVER.equals(cfg.getDriver())) {
la.assertNotBlank(cfg.getUser(), MSG_USER_DISPLAY);
la.assertNotNull(cfg.getPassword(), MSG_PASSWORD_DISPLAY);
la.assertNotBlank(cfg.getDatabase(), MSG_DATABASE_DISPLAY);
cfg.setDriverClassName(OracleSpecifics.THIN_AND_OCI_DRIVER_CLASSNAME);
cfg.setConnType(ConnectionType.OCI);
} else {
throw new IllegalArgumentException(cfg.getConnectorMessages().format(
MSG_SET_DRIVER_OR_URL, null));
}
if (cfg.getDriverClassName() != null) {
try {
Class.forName(cfg.getDriverClassName());
} catch (ClassNotFoundException e) {
throw new IllegalArgumentException(cfg.getConnectorMessages().format(
MSG_CANNOT_LOAD_DRIVER, null, cfg.getDriverClassName()), e);
}
}
}
}
}