All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.sap.cds.feature.mt.RoutingDataSourceProvider Maven / Gradle / Ivy

There is a newer version: 3.8.0
Show newest version
/**************************************************************************
 * (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