package com.thinkbiganalytics.feedmgr.service.datasource;
/*-
* #%L
* thinkbig-feed-manager-controller
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* 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.
* #L%
*/
import com.google.common.collect.Collections2;
import com.thinkbiganalytics.app.ServicesApplicationStartup;
import com.thinkbiganalytics.feedmgr.rest.Model;
import com.thinkbiganalytics.json.ObjectMapperSerializer;
import com.thinkbiganalytics.metadata.api.MetadataAccess;
import com.thinkbiganalytics.metadata.api.PostMetadataConfigAction;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinitionProvider;
import com.thinkbiganalytics.metadata.rest.model.data.DatasourceDefinition;
import com.thinkbiganalytics.metadata.rest.model.feed.FeedLineageStyle;
import com.thinkbiganalytics.spring.FileResourceService;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
/**
* Provides access to the {@link DatasourceDefinition} and {@link com.thinkbiganalytics.metadata.rest.model.feed.FeedLineage}
*/
public class DatasourceService implements PostMetadataConfigAction {
private static final Logger log = LoggerFactory.getLogger(DatasourceService.class);
@Inject
ServicesApplicationStartup startup;
@Inject
FileResourceService fileResourceService;
@Inject
MetadataAccess metadataAccess;
@Inject
private DatasourceDefinitionProvider datasourceDefinitionProvider;
private Map<String, FeedLineageStyle> feedLineageStyleMap;
@PostConstruct
private void init() {
loadFeedLineageStylesFromFile();
}
/**
* Loads the styles from the json file
*/
public void loadFeedLineageStylesFromFile() {
String json = fileResourceService.getResourceAsString("classpath:/datasource-styles.json");
Map<String, FeedLineageStyle> styles = null;
try {
if (StringUtils.isNotBlank(json)) {
styles = (Map<String, FeedLineageStyle>) ObjectMapperSerializer.deserialize(json, Map.class);
feedLineageStyleMap = styles;
}
} catch (Exception e) {
log.error("Unable to parse JSON for datasource-styles.json file. Error: {}",
e.getMessage());
}
}
/**
* Refresh the styles
*/
public void refreshFeedLineageStyles(Map<String, FeedLineageStyle> styles) {
if (styles != null && !styles.isEmpty()) {
feedLineageStyleMap = styles;
}
}
public Map<String, FeedLineageStyle> getFeedLineageStyleMap() {
if (feedLineageStyleMap == null) {
feedLineageStyleMap = new HashMap<>();
}
return feedLineageStyleMap;
}
/**
* Load the 'datasource-definitions.json' datasource definitions file
* this is called on startup of Kylo
*/
public void loadDefinitionsFromFile() {
String json = fileResourceService.getResourceAsString("classpath:/datasource-definitions.json");
List<DatasourceDefinition> definitions = null;
if (StringUtils.isNotBlank(json)) {
definitions = Arrays.asList(ObjectMapperSerializer.deserialize(json, DatasourceDefinition[].class));
}
updateDatasourceDefinitions(definitions);
}
/**
* Update any definitions
*/
public Set<DatasourceDefinition> updateDatasourceDefinitions(List<DatasourceDefinition> definitions) {
if (definitions != null) {
final List<DatasourceDefinition> datasourceDefinitions = definitions;
metadataAccess.commit(() -> {
datasourceDefinitions.stream().forEach(def ->
{
com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinition
domainDef =
datasourceDefinitionProvider.ensureDatasourceDefinition(def.getProcessorType());
domainDef.setDatasourcePropertyKeys(def.getDatasourcePropertyKeys());
domainDef.setIdentityString(def.getIdentityString());
domainDef.setConnectionType(
com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinition.ConnectionType.valueOf(def.getConnectionType().name()));
domainDef.setProcessorType(def.getProcessorType());
domainDef.setDatasourceType(def.getDatasourceType());
domainDef.setDescription(def.getDescription());
domainDef.setTile(def.getTitle());
datasourceDefinitionProvider.update(domainDef);
});
return null;
}, MetadataAccess.SERVICE);
}
return getDatasourceDefinitions();
}
/**
* Return the saved datasource definitions
*
* @return a list of the configured datasource definitions
*/
public Set<DatasourceDefinition> getDatasourceDefinitions() {
return metadataAccess.read(() -> {
Set<com.thinkbiganalytics.metadata.api.datasource.DatasourceDefinition> datasourceDefinitions = datasourceDefinitionProvider.getDatasourceDefinitions();
if (datasourceDefinitions != null) {
return new HashSet<>(Collections2.transform(datasourceDefinitions, Model.DOMAIN_TO_DS_DEFINITION));
}
return null;
}, MetadataAccess.SERVICE);
}
/* (non-Javadoc)
* @see java.lang.Runnable#run()
*/
@Override
public void run() {
loadDefinitionsFromFile();
}
}