package com.thinkbiganalytics.metadata.server;
/*-
* #%L
* thinkbig-metadata-rest-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.metadata.api.MetadataAccess;
import com.thinkbiganalytics.metadata.api.MetadataAction;
import com.thinkbiganalytics.metadata.api.MetadataCommand;
import com.thinkbiganalytics.metadata.api.MetadataExecutionException;
import com.thinkbiganalytics.metadata.api.MetadataRollbackAction;
import com.thinkbiganalytics.metadata.api.MetadataRollbackCommand;
import com.thinkbiganalytics.metadata.api.datasource.DatasourceProvider;
import com.thinkbiganalytics.metadata.api.feed.FeedProvider;
import com.thinkbiganalytics.metadata.core.dataset.InMemoryDatasourceProvider;
import com.thinkbiganalytics.metadata.core.feed.InMemoryFeedProvider;
import com.thinkbiganalytics.metadata.core.sla.TestMetricAssessor;
import com.thinkbiganalytics.metadata.core.sla.WithinScheduleAssessor;
import com.thinkbiganalytics.metadata.core.sla.feed.DatasourceUpdatedSinceAssessor;
import com.thinkbiganalytics.metadata.core.sla.feed.DatasourceUpdatedSinceFeedExecutedAssessor;
import com.thinkbiganalytics.metadata.core.sla.feed.FeedExecutedSinceFeedAssessor;
import com.thinkbiganalytics.metadata.core.sla.feed.FeedExecutedSinceScheduleAssessor;
import com.thinkbiganalytics.metadata.event.jms.JmsChangeEventDispatcher;
import com.thinkbiganalytics.metadata.event.jms.MetadataJmsConfig;
import com.thinkbiganalytics.metadata.event.reactor.ReactorConfiguration;
import com.thinkbiganalytics.metadata.modeshape.ModeShapeEngineConfig;
import com.thinkbiganalytics.metadata.sla.spi.MetricAssessor;
import com.thinkbiganalytics.metadata.sla.spi.ServiceLevelAgreementProvider;
import com.thinkbiganalytics.metadata.sla.spi.ServiceLevelAssessor;
import com.thinkbiganalytics.metadata.sla.spi.core.InMemorySLAProvider;
import com.thinkbiganalytics.metadata.sla.spi.core.SimpleServiceLevelAssessor;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import java.security.Principal;
@Configuration
@EnableAutoConfiguration
@Import({ReactorConfiguration.class, MetadataJmsConfig.class, ModeShapeEngineConfig.class})
public class ServerConfiguration {
@Bean
@Profile("metadata.memory-only")
public FeedProvider feedProvider() {
return new InMemoryFeedProvider();
}
@Bean
@Profile("metadata.memory-only")
public DatasourceProvider datasetProvider() {
return new InMemoryDatasourceProvider();
}
@Bean
@Profile("metadata.memory-only")
public MetadataAccess metadataAccess() {
// Transaction behavior not enforced in memory-only mode;
return new MetadataAccess() {
@Override
public <R> R commit(MetadataCommand<R> cmd, Principal... principals) {
try {
return cmd.execute();
} catch (Exception e) {
throw new MetadataExecutionException(e);
}
}
@Override
public <R> R read(MetadataCommand<R> cmd, Principal... principals) {
try {
return cmd.execute();
} catch (Exception e) {
throw new MetadataExecutionException(e);
}
}
@Override
public void commit(MetadataAction action, Principal... principals) {
try {
action.execute();
} catch (Exception e) {
throw new MetadataExecutionException(e);
}
}
@Override
public <R> R commit(MetadataCommand<R> cmd, MetadataRollbackCommand rollbackCmd, Principal... principals) {
return commit(cmd, principals);
}
@Override
public void commit(MetadataAction action, MetadataRollbackAction rollbackAction, Principal... principals) {
commit(action, principals);
}
@Override
public void read(MetadataAction cmd, Principal... principals) {
try {
cmd.execute();
} catch (Exception e) {
throw new MetadataExecutionException(e);
}
}
};
}
@Bean
public JmsChangeEventDispatcher changeEventDispatcher() {
return new JmsChangeEventDispatcher();
}
@Profile("metadata.memory-only")
public ServiceLevelAgreementProvider slaProvider() {
return new InMemorySLAProvider();
}
@Bean
@Profile("metadata.memory-only")
public ServiceLevelAssessor slaAssessor() {
SimpleServiceLevelAssessor assr = new SimpleServiceLevelAssessor();
assr.registerMetricAssessor(datasetUpdatedSinceMetricAssessor());
assr.registerMetricAssessor(feedExecutedSinceFeedMetricAssessor());
assr.registerMetricAssessor(feedExecutedSinceScheduleMetricAssessor());
assr.registerMetricAssessor(datasourceUpdatedSinceFeedExecutedAssessor());
assr.registerMetricAssessor(withinScheduleAssessor());
return assr;
}
@Bean
public ServerConfigurationInitialization serverConfigurationInitialization() {
return new ServerConfigurationInitialization();
}
@Bean
public MetricAssessor<?, ?> feedExecutedSinceFeedMetricAssessor() {
return new FeedExecutedSinceFeedAssessor();
}
@Bean
public MetricAssessor<?, ?> datasetUpdatedSinceMetricAssessor() {
return new DatasourceUpdatedSinceAssessor();
}
@Bean
public MetricAssessor<?, ?> datasourceUpdatedSinceFeedExecutedAssessor() {
return new DatasourceUpdatedSinceFeedExecutedAssessor();
}
@Bean
public MetricAssessor<?, ?> feedExecutedSinceScheduleMetricAssessor() {
return new FeedExecutedSinceScheduleAssessor();
}
@Bean
public MetricAssessor<?, ?> withinScheduleAssessor() {
return new WithinScheduleAssessor();
}
@Bean
public MetricAssessor<?, ?> testMetricAssessor() {
return new TestMetricAssessor();
}
}