
com.sap.cds.feature.mt.RoutingDataSourceProvider Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of cds-feature-mt Show documentation
Show all versions of cds-feature-mt Show documentation
Multi tenancy feature for CDS Services Java
/**************************************************************************
* (C) 2019-2020 SAP SE or an SAP affiliate company. All rights reserved. *
**************************************************************************/
package com.sap.cds.feature.mt;
import javax.sql.DataSource;
import com.sap.cds.feature.config.Properties;
import com.sap.cds.feature.config.pojo.CdsProperties.MultiTenancy;
import com.sap.cds.feature.services.db.DataSourceDescriptor;
import com.sap.cds.feature.services.db.DataSourceProvider;
import com.sap.cds.services.impl.request.RequestContextImpl;
import com.sap.cds.services.utils.CdsErrorStatuses;
import com.sap.cds.services.utils.ErrorStatusException;
import com.sap.cloud.mt.runtime.DataPoolSettings;
import com.sap.cloud.mt.runtime.EnvironmentAccess;
import com.sap.cloud.mt.runtime.IdentityZoneDeterminer;
import com.sap.cloud.mt.runtime.MtLibDataSourceLookup;
import com.sap.cloud.mt.runtime.TenantAwareDataSource;
import com.sap.cloud.mt.runtime.TenantProvider;
import com.sap.cloud.mt.subscription.InstanceLifecycleManager;
import com.sap.cloud.mt.subscription.InstanceLifecycleManagerImpl;
import com.sap.xsa.core.instancemanager.client.InstanceManagerClient;
import com.sap.xsa.core.instancemanager.client.impl.InstanceManagerClientFactory;
/**
* Provider of a tenant dependent data source.
*/
public class RoutingDataSourceProvider implements DataSourceProvider {
@Override
public DataSource create(DataSourceDescriptor descriptor) {
if (!accept(descriptor)) {
throw new RuntimeException("Routing data source provider does not support descriptor of type " + descriptor.getClass().getName());
}
try {
MultiTenancy multiTenancy = Properties.getCds().getMultiTenancy();
InstanceManagerClient client = InstanceManagerClientFactory.getInstance(descriptor.getUrl()
, descriptor.getUsername(), descriptor.getPassword());
InstanceLifecycleManager lifeCycleManager = new InstanceLifecycleManagerImpl(client, multiTenancy.getInstanceManager().getTimeout());
String dataSourceSection = "cds.multitenancy.datasource";
MtLibDataSourceLookup lookup = new MtLibDataSourceLookup(lifeCycleManager, multiTenancy.getDataSource().getPool(), new EnvironmentAccess() {
@Override
public T getProperty(String key, Class clazz) {
return Properties.getProvider().getProperty(key, clazz);
}
}, new DataPoolSettings(dataSourceSection + ".hikari", dataSourceSection + ".tomcat", dataSourceSection + ".atomikos"));
TenantProvider provider = new TenantProvider(new IdentityZoneDeterminer() {
@Override
public String getIdentityZone() throws InternalError {
String tenant = RequestContextImpl.getCurrent().getUserInfo().getTenant();
if (tenant == null) {
throw new ErrorStatusException(CdsErrorStatuses.TENANT_CONTEXT_MISSING);
}
return tenant;
}
});
return new TenantAwareDataSource(provider, lookup);
} catch (Exception e) {
throw new ErrorStatusException(CdsErrorStatuses.INSTANCE_MANAGER_CLIENT_FAILED, e);
}
}
@Override
public boolean accept(DataSourceDescriptor descriptor) {
return descriptor instanceof ManagedHanaDescriptor;
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy