/*
* Copyright (c) 2014, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
*
* WSO2 Inc. licenses this file to you 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.wso2.carbon.identity.provisioning;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.wso2.carbon.context.CarbonContext;
import org.wso2.carbon.context.PrivilegedCarbonContext;
import org.wso2.carbon.identity.application.common.model.Property;
import org.wso2.carbon.identity.provisioning.cache.ProvisioningConnectorCache;
import org.wso2.carbon.identity.provisioning.cache.ProvisioningConnectorCacheEntry;
import org.wso2.carbon.identity.provisioning.cache.ProvisioningConnectorCacheKey;
import org.wso2.carbon.utils.multitenancy.MultitenantConstants;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public abstract class AbstractProvisioningConnectorFactory {
private static final Log log = LogFactory.getLog(AbstractProvisioningConnectorFactory.class);
/**
* @param identityProviderName
* @param provisoningProperties
* @param tenantDomain
* @return
* @throws IdentityProvisioningException
*/
public AbstractOutboundProvisioningConnector getConnector(String identityProviderName,
Property[] provisoningProperties, String tenantDomain)
throws IdentityProvisioningException {
String tenantDomainName = null;
int tenantId = -1234;
if (CarbonContext.getThreadLocalCarbonContext() != null) {
tenantDomainName = CarbonContext.getThreadLocalCarbonContext().getTenantDomain();
tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
}
try {
// maintain the provisioning connector cache in the super tenant.
// at the time of provisioning there may not be an authenticated user in the system -
// specially in the case of in-bound provisioning.
PrivilegedCarbonContext.startTenantFlow();
PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext
.getThreadLocalCarbonContext();
carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
ProvisioningConnectorCacheKey cacheKey = new ProvisioningConnectorCacheKey(identityProviderName, tenantDomain);
ProvisioningConnectorCacheEntry entry = ProvisioningConnectorCache.getInstance().getValueFromCache(cacheKey);
if (entry != null) {
if (log.isDebugEnabled()) {
log.debug("Provisioning cache HIT for " + identityProviderName + " of "
+ tenantDomain);
}
return entry.getProvisioningConnector();
}
AbstractOutboundProvisioningConnector connector;
Property idpName = new Property();
idpName.setName("identityProviderName");
idpName.setValue(identityProviderName);
List<Property> provisioningPropertiesList = new ArrayList<>(Arrays.asList(provisoningProperties));
provisioningPropertiesList.add(idpName);
Property[] provisioningProperties = new Property[provisioningPropertiesList.size()];
provisioningProperties = provisioningPropertiesList.toArray(provisioningProperties);
connector = buildConnector(provisioningProperties);
entry = new ProvisioningConnectorCacheEntry();
entry.setProvisioningConnector(connector);
ProvisioningConnectorCache.getInstance().addToCache(cacheKey, entry);
return connector;
} finally {
PrivilegedCarbonContext.endTenantFlow();
if (tenantDomain != null) {
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(
tenantDomainName);
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId);
}
}
}
/**
*
* @param provisoningProperties
* @return
* @throws IdentityProvisioningException
*/
protected abstract AbstractOutboundProvisioningConnector buildConnector(
Property[] provisoningProperties) throws IdentityProvisioningException;
/**
* @param identityProviderName
* @param tenantDomain
* @throws IdentityProvisioningException
*/
public void destroyConnector(String identityProviderName, String tenantDomain)
throws IdentityProvisioningException {
String tenantDomainName = null;
int tenantId = -1234;
if (CarbonContext.getThreadLocalCarbonContext() != null) {
tenantDomainName = CarbonContext.getThreadLocalCarbonContext().getTenantDomain();
tenantId = CarbonContext.getThreadLocalCarbonContext().getTenantId();
}
try {
PrivilegedCarbonContext.startTenantFlow();
PrivilegedCarbonContext carbonContext = PrivilegedCarbonContext
.getThreadLocalCarbonContext();
carbonContext.setTenantId(MultitenantConstants.SUPER_TENANT_ID);
carbonContext.setTenantDomain(MultitenantConstants.SUPER_TENANT_DOMAIN_NAME);
ProvisioningConnectorCacheKey cacheKey = new ProvisioningConnectorCacheKey(identityProviderName, tenantDomain);
ProvisioningConnectorCacheEntry entry = ProvisioningConnectorCache.getInstance().getValueFromCache(cacheKey);
if (entry != null) {
ProvisioningConnectorCache.getInstance().clearCacheEntry(cacheKey);
if (log.isDebugEnabled()) {
log.debug("Provisioning cached entry removed for idp " + identityProviderName
+ " from the connector " + getConnectorType());
}
} else {
if (log.isDebugEnabled()) {
log.debug("Provisioning cached entry not found for idp " + identityProviderName
+ " from the connector " + getConnectorType());
}
}
} finally {
PrivilegedCarbonContext.endTenantFlow();
if (tenantDomain != null) {
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantDomain(
tenantDomainName);
PrivilegedCarbonContext.getThreadLocalCarbonContext().setTenantId(tenantId);
}
}
}
/**
* @return
*/
public List<Property> getConfigurationProperties() {
return new ArrayList<>();
}
/**
* @return
*/
public abstract String getConnectorType();
}