/*
* Copyright 2016 Red Hat, Inc. and/or its affiliates.
*
* Licensed 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.kie.workbench.common.screens.datasource.management.backend.core.impl;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import org.kie.workbench.common.screens.datasource.management.backend.core.DataSource;
import org.kie.workbench.common.screens.datasource.management.backend.core.DataSourceProvider;
import org.kie.workbench.common.screens.datasource.management.backend.core.DataSourceProviderFactory;
import org.kie.workbench.common.screens.datasource.management.backend.core.DataSourceRuntimeManager;
import org.kie.workbench.common.screens.datasource.management.backend.core.DeploymentOptions;
import org.kie.workbench.common.screens.datasource.management.backend.core.DriverDeploymentCache;
import org.kie.workbench.common.screens.datasource.management.backend.core.DriverDeploymentCacheEntry;
import org.kie.workbench.common.screens.datasource.management.backend.core.DriverProvider;
import org.kie.workbench.common.screens.datasource.management.backend.core.UnDeploymentOptions;
import org.kie.workbench.common.screens.datasource.management.model.DataSourceDef;
import org.kie.workbench.common.screens.datasource.management.model.DataSourceDeploymentInfo;
import org.kie.workbench.common.screens.datasource.management.model.DriverDef;
import org.kie.workbench.common.screens.datasource.management.model.DriverDeploymentInfo;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@ApplicationScoped
public class DataSourceRuntimeManagerImpl
implements DataSourceRuntimeManager {
private static final Logger logger = LoggerFactory.getLogger(DataSourceRuntimeManagerImpl.class);
private DataSourceProvider dataSourceProvider;
private DriverProvider driverProvider;
private DriverDeploymentCache driverDeploymentCache = new DriverDeploymentCacheImpl();
private DataSourceProviderFactory providerFactory;
public DataSourceRuntimeManagerImpl() {
}
@Inject
public DataSourceRuntimeManagerImpl(DataSourceProviderFactory providerFactory) {
this.providerFactory = providerFactory;
}
@PostConstruct
protected void init() {
dataSourceProvider = providerFactory.getDataSourceProvider();
driverProvider = providerFactory.getDriverProvider();
}
@Override
public synchronized DataSourceDeploymentInfo deployDataSource(DataSourceDef dataSourceDef,
DeploymentOptions options) throws Exception {
try {
DataSourceDeploymentInfo dataSourceDeploymentInfo = dataSourceProvider.getDeploymentInfo(dataSourceDef.getUuid());
DriverDeploymentInfo driverDeploymentInfo = driverProvider.getDeploymentInfo(dataSourceDef.getDriverUuid());
if (dataSourceDeploymentInfo != null) {
if (options.isCreateOrResyncDeployment()) {
dataSourceDeploymentInfo = dataSourceProvider.resync(dataSourceDef,
dataSourceDeploymentInfo);
} else {
throw new Exception("Data source: " + dataSourceDef + " is already deployed");
}
} else if (driverDeploymentInfo != null) {
dataSourceDeploymentInfo = dataSourceProvider.deploy(dataSourceDef);
} else {
throw new Exception("Required driver: " + dataSourceDef.getDriverUuid() + " is not deployed.");
}
if (driverDeploymentInfo != null && driverDeploymentCache.get(driverDeploymentInfo) != null) {
driverDeploymentCache.get(driverDeploymentInfo).addDependant(dataSourceDeploymentInfo);
}
return dataSourceDeploymentInfo;
} catch (Exception e) {
logger.error("Data source deployment failed for dataSourceDef: " + dataSourceDef,
e);
throw e;
}
}
@Override
public synchronized DataSourceDeploymentInfo getDataSourceDeploymentInfo(String uuid) throws Exception {
try {
return dataSourceProvider.getDeploymentInfo(uuid);
} catch (Exception e) {
logger.error("It was not possible to read the deploymentInfo for data source: " + uuid);
throw e;
}
}
@Override
public synchronized void unDeployDataSource(DataSourceDeploymentInfo deploymentInfo,
UnDeploymentOptions options)
throws Exception {
try {
dataSourceProvider.undeploy(deploymentInfo);
deReferFromDrivers(deploymentInfo);
} catch (Exception e) {
logger.error("Data source un-deployment failed for deploymentInfo: " + deploymentInfo,
e);
throw e;
}
}
@Override
public synchronized DriverDeploymentInfo deployDriver(DriverDef driverDef,
DeploymentOptions options) throws Exception {
try {
DriverDeploymentInfo deploymentInfo = driverProvider.getDeploymentInfo(driverDef.getUuid());
if (deploymentInfo != null) {
if (options.isCreateOrResyncDeployment()) {
deploymentInfo = driverProvider.resync(driverDef,
deploymentInfo);
} else {
throw new Exception("Driver: " + driverDef + " is already deployed.");
}
} else {
deploymentInfo = driverProvider.deploy(driverDef);
}
driverDeploymentCache.put(deploymentInfo,
driverDef);
return deploymentInfo;
} catch (Exception e) {
logger.error("Driver deployment failed for driverDef: " + driverDef,
e);
throw e;
}
}
@Override
public synchronized DriverDeploymentInfo getDriverDeploymentInfo(String uuid) throws Exception {
try {
DriverDeploymentInfo deploymentInfo = driverProvider.getDeploymentInfo(uuid);
if (deploymentInfo != null && driverDeploymentCache.get(deploymentInfo) != null) {
DriverDeploymentInfo updatedInfo = new DriverDeploymentInfo(deploymentInfo.getDeploymentId(),
deploymentInfo.getDriverDeploymentId(),
deploymentInfo.isManaged(),
deploymentInfo.getUuid(),
deploymentInfo.getDriverClass());
updatedInfo.getDependants().addAll(driverDeploymentCache.get(deploymentInfo).getDependants());
deploymentInfo = updatedInfo;
}
return deploymentInfo;
} catch (Exception e) {
logger.error("It was not possible to read the deploymentInfo for driver: " + uuid);
throw e;
}
}
@Override
public synchronized void unDeployDriver(DriverDeploymentInfo deploymentInfo,
UnDeploymentOptions options) throws Exception {
try {
DriverDeploymentCacheEntry cacheEntry = driverDeploymentCache.get(deploymentInfo);
if (cacheEntry != null && cacheEntry.hasDependants() && options.isSoftUnDeployment()) {
throw new Exception("Driver: " + deploymentInfo + " can't be un-deployed. " +
"It's currently referenced by : " + cacheEntry.getDependants().size() + " data sources");
}
driverDeploymentCache.remove(deploymentInfo);
driverProvider.undeploy(deploymentInfo);
} catch (Exception e) {
logger.error("Driver un-deployment failed for deploymentInfo: " + deploymentInfo,
e);
throw e;
}
}
@Override
public synchronized DataSource lookupDataSource(String uuid) throws Exception {
DataSourceDeploymentInfo deploymentInfo = dataSourceProvider.getDeploymentInfo(uuid);
if (deploymentInfo != null) {
return dataSourceProvider.lookupDataSource(deploymentInfo);
} else {
throw new Exception("Data source: " + uuid + " is not deployed in current system.");
}
}
@Override
public void hasStarted() throws Exception {
driverProvider.hasStarted();
dataSourceProvider.hasStarted();
}
private void deReferFromDrivers(DataSourceDeploymentInfo deploymentInfo) {
for (DriverDeploymentCacheEntry entry : driverDeploymentCache.findReferencedEntries(deploymentInfo)) {
entry.removeDependant(deploymentInfo);
}
}
}