package com.thinkbiganalytics.feedmgr.config;
/*-
* #%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.thinkbiganalytics.es.ElasticSearch;
import com.thinkbiganalytics.es.ElasticSearchClientConfig;
import com.thinkbiganalytics.feedmgr.nifi.cache.NifiFlowCache;
import com.thinkbiganalytics.feedmgr.nifi.cache.NifiFlowCacheClusterManager;
import com.thinkbiganalytics.feedmgr.nifi.PropertyExpressionResolver;
import com.thinkbiganalytics.feedmgr.nifi.SpringCloudContextEnvironmentChangedListener;
import com.thinkbiganalytics.feedmgr.nifi.SpringEnvironmentProperties;
import com.thinkbiganalytics.feedmgr.rest.Model;
import com.thinkbiganalytics.feedmgr.service.AccessControlledEntityTransform;
import com.thinkbiganalytics.feedmgr.service.DefaultJobService;
import com.thinkbiganalytics.feedmgr.service.EncryptionService;
import com.thinkbiganalytics.feedmgr.service.FeedManagerMetadataService;
import com.thinkbiganalytics.feedmgr.service.MetadataService;
import com.thinkbiganalytics.feedmgr.service.UploadProgressService;
import com.thinkbiganalytics.feedmgr.service.category.CategoryModelTransform;
import com.thinkbiganalytics.feedmgr.service.category.DefaultFeedManagerCategoryService;
import com.thinkbiganalytics.feedmgr.service.category.FeedManagerCategoryService;
import com.thinkbiganalytics.feedmgr.service.datasource.DatasourceModelTransform;
import com.thinkbiganalytics.feedmgr.service.datasource.DatasourceService;
import com.thinkbiganalytics.feedmgr.service.feed.DefaultFeedManagerFeedService;
import com.thinkbiganalytics.feedmgr.service.feed.ExportImportFeedService;
import com.thinkbiganalytics.feedmgr.service.feed.FeedManagerFeedService;
import com.thinkbiganalytics.feedmgr.service.feed.FeedManagerPreconditionService;
import com.thinkbiganalytics.feedmgr.service.feed.FeedModelTransform;
import com.thinkbiganalytics.feedmgr.service.feed.datasource.DerivedDatasourceFactory;
import com.thinkbiganalytics.feedmgr.service.security.DefaultSecurityService;
import com.thinkbiganalytics.feedmgr.service.security.SecurityService;
import com.thinkbiganalytics.feedmgr.service.template.DefaultFeedManagerTemplateService;
import com.thinkbiganalytics.feedmgr.service.template.ExportImportTemplateService;
import com.thinkbiganalytics.feedmgr.service.template.FeedManagerTemplateService;
import com.thinkbiganalytics.feedmgr.service.template.RegisteredTemplateService;
import com.thinkbiganalytics.feedmgr.service.template.RegisteredTemplateUtil;
import com.thinkbiganalytics.feedmgr.service.template.TemplateModelTransform;
import com.thinkbiganalytics.feedmgr.sla.ServiceLevelAgreementModelTransform;
import com.thinkbiganalytics.feedmgr.sla.ServiceLevelAgreementService;
import com.thinkbiganalytics.jobrepo.service.JobService;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceProvider;
import com.thinkbiganalytics.metadata.core.feed.FeedPreconditionService;
import com.thinkbiganalytics.nifi.rest.client.NiFiRestClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.core.env.Environment;
import org.springframework.security.crypto.encrypt.TextEncryptor;
import org.springframework.util.Assert;
import javax.annotation.Nonnull;
import javax.inject.Inject;
/**
* Spring Bean configuration for feed manager
*/
@Configuration
@PropertySource("classpath:application.properties")
@ComponentScan(basePackages = {"com.thinkbiganalytics"})
public class FeedManagerConfiguration {
@Inject
private Environment env;
public FeedManagerConfiguration() {
}
@Bean
public FeedManagerFeedService feedManagerFeedService() {
return new DefaultFeedManagerFeedService();
}
@Bean
public FeedManagerCategoryService feedManagerCategoryService() {
return new DefaultFeedManagerCategoryService();
}
@Bean
public FeedManagerTemplateService feedManagerTemplateService() {
return new DefaultFeedManagerTemplateService();
}
@Bean
public FeedModelTransform feedModelTransformer() {
return new FeedModelTransform();
}
@Bean
public TemplateModelTransform templateModelTransform() {
return new TemplateModelTransform();
}
@Bean
public CategoryModelTransform categoryModelTransform() {
return new CategoryModelTransform();
}
@Bean
public FeedManagerPreconditionService feedManagerPreconditionService() {
return new FeedManagerPreconditionService();
}
@Bean
public SpringEnvironmentProperties springEnvironmentProperties() {
return new SpringEnvironmentProperties();
}
@Bean
public SpringCloudContextEnvironmentChangedListener springEnvironmentChangedListener() {
return new SpringCloudContextEnvironmentChangedListener();
}
@Bean
public MetadataService metadataService() {
return new FeedManagerMetadataService();
}
@Bean
public SecurityService securityService() {
return new DefaultSecurityService();
}
@Bean
public ExportImportTemplateService exportImportTemplateService() {
return new ExportImportTemplateService();
}
@Bean
public ExportImportFeedService exportImportFeedService() {
return new ExportImportFeedService();
}
@Bean
public PropertyExpressionResolver propertyExpressionResolver() {
return new PropertyExpressionResolver();
}
@Bean
public NifiFlowCache nifiFlowCache() {
return new NifiFlowCache();
}
@Bean
public ServiceLevelAgreementService serviceLevelAgreementService() {
return new ServiceLevelAgreementService();
}
@Bean(name = "elasticSearchClientConfig")
public ElasticSearchClientConfig elasticSearchClientConfig() {
String host = env.getProperty("elasticsearch.host");
String configPort = env.getProperty("elasticsearch.port");
String clusterName = env.getProperty("elasticsearch.clustername");
Integer port = null;
try {
port = Integer.parseInt(configPort);
} catch (NumberFormatException e) {
Assert.notNull(port,
"The Elastic Search Port property 'elasticsearch.port' must be configured and must be a valid number in the application.properties file. ");
}
Assert.notNull(host,
"The Elastic Search Host property: 'elasticsearch.host' must be configured in the application.properties file. ");
Assert.notNull(clusterName,
"The Elastic Search cluster property: 'elasticsearch.clustername' must be configured in the application.properties file. ");
ElasticSearchClientConfig config = new ElasticSearchClientConfig();
config.setHost(host);
config.setPort(port);
config.setClusterName(clusterName);
return config;
}
@Bean
public ElasticSearch elasticSearch() {
return new ElasticSearch(elasticSearchClientConfig());
}
@Bean
public FeedPreconditionService feedPreconditionService() {
return new FeedPreconditionService();
}
@Bean
public DatasourceService datasourceService() {
return new DatasourceService();
}
@Bean
public DerivedDatasourceFactory derivedDatasourceFactory() {
return new DerivedDatasourceFactory();
}
@Bean
public JobService jobService() {
return new DefaultJobService();
}
@Bean
public EncryptionService encryptionService() {
return new EncryptionService();
}
@Bean
public RegisteredTemplateService registeredTemplateService() {
return new RegisteredTemplateService();
}
@Bean
public RegisteredTemplateUtil registeredTemplateUtil() {
return new RegisteredTemplateUtil();
}
@Bean
public UploadProgressService uploadProgressService() {
return new UploadProgressService();
}
/**
* Transforms objects between {@link com.thinkbiganalytics.metadata.rest.model.data.Datasource} and {@link com.thinkbiganalytics.metadata.api.datasource.Datasource}.
*
* @param datasourceProvider the {@link com.thinkbiganalytics.metadata.api.datasource.Datasource} provider
* @param textEncryptor the encryption provider
* @param niFiRestClient the NiFi REST client
* @param securityService the security service
* @return the model transformer
*/
@Bean
@Nonnull
public DatasourceModelTransform datasourceModelTransform(@Nonnull final DatasourceProvider datasourceProvider, @Nonnull final TextEncryptor textEncryptor,
@Nonnull final NiFiRestClient niFiRestClient, @Nonnull final SecurityService securityService) {
return new DatasourceModelTransform(datasourceProvider, textEncryptor, niFiRestClient, securityService);
}
/**
* Transforms objects between different feed models and domain objects.
*
* @param datasourceTransform the {@code Datasource} object transformer
* @return the model transformer
*/
@Bean
@Nonnull
public Model model(@Nonnull final DatasourceModelTransform datasourceTransform) {
return new Model(datasourceTransform);
}
/**
* Transforms SLA objects between the REST model and the domain object.
*
* @param model the model transformer
* @return the SLA transformer
*/
@Bean
@Nonnull
public ServiceLevelAgreementModelTransform serviceLevelAgreementModelTransform(@Nonnull final Model model) {
return new ServiceLevelAgreementModelTransform(model);
}
@Bean
AccessControlledEntityTransform accessControlledEntityTransform() {
return new AccessControlledEntityTransform();
}
@Bean
public NifiFlowCacheClusterManager nifiFlowCacheClusterManager(){
return new NifiFlowCacheClusterManager();
}
}