Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -90,7 +90,7 @@ void happyPath() {
CouchbaseTargetSystem couchbaseTargetSystem = new CouchbaseTargetSystem("couchbase", cluster, BUCKET_NAME);

try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(io.flamingock.store.couchbase.changes.happyPath._001__create_index.class, Collections.singletonList(Collection.class)),
new Trio<>(io.flamingock.store.couchbase.changes.happyPath._002__insert_document.class, Collections.singletonList(Collection.class)),
new Trio<>(_003__insert_another_document.class, Collections.singletonList(Collection.class)))
Expand Down Expand Up @@ -143,7 +143,7 @@ void failedWithRollback() {
CouchbaseTargetSystem couchbaseTargetSystem = new CouchbaseTargetSystem("couchbase", cluster, BUCKET_NAME);

try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(io.flamingock.store.couchbase.changes.failedWithRollback._001__create_index.class, Collections.singletonList(Collection.class)),
new Trio<>(io.flamingock.store.couchbase.changes.failedWithRollback._002__insert_document.class, Collections.singletonList(Collection.class)),
new Trio<>(io.flamingock.store.couchbase.changes.failedWithRollback._003__execution_with_exception.class, Collections.singletonList(Collection.class), Collections.singletonList(Collection.class)))
Expand Down Expand Up @@ -197,7 +197,7 @@ void failedWithoutRollback() {
CouchbaseTargetSystem couchbaseTargetSystem = new CouchbaseTargetSystem("couchbase", cluster, BUCKET_NAME);

try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(_001__create_index.class, Collections.singletonList(Collection.class)),
new Trio<>(_002__insert_document.class, Collections.singletonList(Collection.class)),
new Trio<>(_003__execution_with_exception.class, Collections.singletonList(Collection.class)))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

import io.flamingock.api.StageType;
import io.flamingock.api.annotations.TargetSystem;
import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.common.core.preview.PreviewConstructor;
import io.flamingock.internal.common.core.task.RecoveryDescriptor;
import io.flamingock.internal.common.core.task.TargetSystemDescriptor;
Expand Down Expand Up @@ -70,7 +71,7 @@ private static List<String> getParameterTypes(List<Class<?>> second) {
* @return a {@link PreviewPipeline} ready for preview or testing
*/
@SafeVarargs
public static PreviewPipeline getPreviewPipeline(String stageName, Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
public static FlamingockMetadata getPreviewPipeline(String stageName, Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {

List<CodePreviewChange> tasks = Arrays.stream(changeDefinitions)
.map(trio -> {
Expand Down Expand Up @@ -110,11 +111,12 @@ public static PreviewPipeline getPreviewPipeline(String stageName, Trio<Class<?>
tasks
);

return new PreviewPipeline(Collections.singletonList(stage));
PreviewPipeline previewPipeline = new PreviewPipeline(Collections.singletonList(stage));
return new FlamingockMetadata(previewPipeline, null, null);
}

@SafeVarargs
public static PreviewPipeline getPreviewPipeline(Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
public static FlamingockMetadata getPreviewPipeline(Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
return getPreviewPipeline("default-stage-name", changeDefinitions);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import io.flamingock.api.StageType;
import io.flamingock.api.annotations.Change;
import io.flamingock.api.annotations.TargetSystem;
import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.common.core.preview.CodePreviewChange;
import io.flamingock.internal.common.core.preview.PreviewConstructor;
import io.flamingock.internal.common.core.preview.PreviewMethod;
Expand Down Expand Up @@ -70,7 +71,7 @@ private static List<String> getParameterTypes(List<Class<?>> second) {
* @return a {@link PreviewPipeline} ready for preview or testing
*/
@SafeVarargs
public static PreviewPipeline getPreviewPipeline(String stageName, Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
public static FlamingockMetadata getPreviewPipeline(String stageName, Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {

List<CodePreviewChange> tasks = Arrays.stream(changeDefinitions)
.map(trio -> {
Expand Down Expand Up @@ -110,11 +111,12 @@ public static PreviewPipeline getPreviewPipeline(String stageName, Trio<Class<?>
tasks
);

return new PreviewPipeline(Collections.singletonList(stage));
PreviewPipeline previewPipeline = new PreviewPipeline(Collections.singletonList(stage));
return new FlamingockMetadata(previewPipeline, null, null);
}

@SafeVarargs
public static PreviewPipeline getPreviewPipeline(Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
public static FlamingockMetadata getPreviewPipeline(Trio<Class<?>, List<Class<?>>, List<Class<?>>>... changeDefinitions) {
return getPreviewPipeline("default-stage-name", changeDefinitions);
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -286,7 +286,7 @@ void happyPathWithMockedPipeline(SqlDialect sqlDialect, String dialectName) thro
try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
Class<?>[] changeClasses = getChangeClasses(dialectName, "happyPath");

mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(changeClasses[0], Collections.singletonList(Connection.class), null),
new Trio<>(changeClasses[1], Collections.singletonList(Connection.class), null),
new Trio<>(changeClasses[2], Collections.singletonList(Connection.class), null)
Expand Down Expand Up @@ -360,7 +360,7 @@ void failedWithRollback(SqlDialect sqlDialect, String dialectName) throws Except
try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
Class<?>[] changeClasses = getChangeClasses(dialectName, "failedWithRollback");

mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(changeClasses[0], Collections.singletonList(Connection.class), null),
new Trio<>(changeClasses[1], Collections.singletonList(Connection.class), Collections.singletonList(Connection.class)),
new Trio<>(changeClasses[2], Collections.singletonList(Connection.class), Collections.singletonList(Connection.class))
Expand Down Expand Up @@ -447,7 +447,7 @@ void failedWithoutRollback(SqlDialect sqlDialect, String dialectName) throws Exc
try (MockedStatic<Deserializer> mocked = Mockito.mockStatic(Deserializer.class)) {
Class<?>[] changeClasses = getChangeClasses(dialectName, "failedWithoutRollback");

mocked.when(Deserializer::readPreviewPipelineFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
mocked.when(Deserializer::readMetadataFromFile).thenReturn(PipelineTestHelper.getPreviewPipeline(
new Trio<>(changeClasses[0], Collections.singletonList(Connection.class), null),
new Trio<>(changeClasses[1], Collections.singletonList(Connection.class), null),
new Trio<>(changeClasses[2], Collections.singletonList(Connection.class), null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,10 @@

import javax.annotation.processing.RoundEnvironment;
import java.util.Collection;
import java.util.Map;

public interface ChangeDiscoverer {

Collection<CodePreviewChange> findAnnotatedChanges(RoundEnvironment roundEnv, LoggerPreProcessor logger);
//TODO: move configuration properties to another interface
Collection<CodePreviewChange> findAnnotatedChanges(RoundEnvironment roundEnv, LoggerPreProcessor logger, Map<String, String> properties);
}
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,9 @@ public final class Constants {

public static final String DEFAULT_MONGOCK_ORIGIN = "mongockChangeLog";

public static final String MONGOCK_IMPORT_ORIGIN_PROPERTY_KEY = "internal.mongock.import.origin";
public static final String MONGOCK_EMPTY_ORIGIN_ALLOWED_PROPERTY_KEY = "internal.mongock.import.emptyOriginAllowed";

private Constants() {}

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,18 +17,22 @@

import io.flamingock.internal.common.core.preview.PreviewPipeline;

import java.util.Map;

public class FlamingockMetadata {

private PreviewPipeline pipeline;
private String configFile;
private Map<String, String> properties;
private BuilderProviderInfo builderProvider;

public FlamingockMetadata() {
}

public FlamingockMetadata(PreviewPipeline pipeline, String configFile) {
public FlamingockMetadata(PreviewPipeline pipeline, String configFile, Map<String, String> properties) {
this.pipeline = pipeline;
this.configFile = configFile;
this.properties = properties;
}

public PreviewPipeline getPipeline() {
Expand All @@ -47,6 +51,14 @@ public void setPipelineFile(String configFile) {
this.configFile = configFile;
}

public Map<String, String> getProperties() {
return properties;
}

public void setProperties(Map<String, String> properties) {
this.properties = properties;
}

public BuilderProviderInfo getBuilderProvider() {
return builderProvider;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@

import io.flamingock.internal.util.JsonObjectMapper;
import io.flamingock.internal.common.core.metadata.Constants;
import io.flamingock.internal.common.core.preview.PreviewPipeline;
import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.util.log.FlamingockLoggerFactory;
import org.slf4j.Logger;
Expand All @@ -30,7 +29,7 @@ public final class Deserializer {

private static final Logger logger = FlamingockLoggerFactory.getLogger("Deserializer");

private static final ClassLoader CLASS_LOADER = PreviewPipeline.class.getClassLoader();
private static final ClassLoader CLASS_LOADER = FlamingockMetadata.class.getClassLoader();


private Deserializer() {
Expand All @@ -42,22 +41,9 @@ public static FlamingockMetadata readMetadataFromFile() {
}

/**
* Reads the preview pipeline from file. It first tries to load the full pipeline,
* and if not found, falls back to the templated pipeline.
* Attempts to read a file and deserialize it into a FlamingockMetadata.
*
* @return PreviewPipeline object if found
* @throws RuntimeException if neither file is found
*/
public static PreviewPipeline readPreviewPipelineFromFile() {
return readMetadataOptional()
.map(FlamingockMetadata::getPipeline)
.orElseThrow(() -> new RuntimeException("Flamingock metadata file not found"));
}

/**
* Attempts to read a file and deserialize it into a PreviewPipeline.
*
* @return An Optional containing the deserialized PreviewPipeline if successful, otherwise empty
* @return An Optional containing the deserialized FlamingockMetadata if successful, otherwise empty
*/
private static Optional<FlamingockMetadata> readMetadataOptional() {
try (InputStream inputStream = CLASS_LOADER.getResourceAsStream(Constants.FULL_PIPELINE_FILE_PATH)) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
import io.flamingock.internal.common.core.context.ContextInjectable;
import io.flamingock.internal.common.core.context.ContextResolver;
import io.flamingock.internal.common.core.context.Dependency;
import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.common.core.template.ChangeTemplateManager;
import io.flamingock.internal.core.configuration.EventLifecycleConfigurator;
import io.flamingock.internal.core.configuration.core.CoreConfiguration;
Expand Down Expand Up @@ -179,7 +180,7 @@ public HOLDER setApplicationArguments(String[] args) {
* </ul>
*
* @return A fully configured Runner ready for execution
* @see #buildContext() for context merging details
* @see #buildContext(FlamingockMetadata) for context merging details
* @see AuditStore#initialize(ContextResolver) for AuditStore initialization requirements
* @see LoadedPipeline#contributeToContext(ContextInjectable) for pipeline contributions
*/
Expand All @@ -193,7 +194,9 @@ public final Runner build() {

RunnerId runnerId = generateRunnerId();

PriorityContext hierarchicalContext = buildContext();
FlamingockMetadata flamingockMetadata = coreConfiguration.getFlamingockMetadata();

PriorityContext hierarchicalContext = buildContext(flamingockMetadata);

configureStoreAndTargetSystem(hierarchicalContext);

Expand All @@ -202,7 +205,7 @@ public final Runner build() {

//Loads the pipeline
//This contribution to the context is fine after components initialization as it's only used
LoadedPipeline pipeline = loadPipeline();
LoadedPipeline pipeline = loadPipeline(flamingockMetadata);
pipeline.contributeToContext(hierarchicalContext);

FlamingockArguments flamingockArgs = FlamingockArguments.parse(applicationArgs);
Expand All @@ -227,7 +230,7 @@ public final Runner build() {
}


private LoadedPipeline loadPipeline() {
private LoadedPipeline loadPipeline(FlamingockMetadata flamingockMetadata) {
List<TaskFilter> taskFiltersFromPlugins = pluginManager.getPlugins()
.stream()
.map(Plugin::getTaskFilters)
Expand All @@ -236,14 +239,17 @@ private LoadedPipeline loadPipeline() {

return LoadedPipeline.builder()
.addFilters(taskFiltersFromPlugins)
.addPreviewPipeline(coreConfiguration.getPreviewPipeline())
.addPreviewPipeline(flamingockMetadata.getPipeline())
.build();
}

private PriorityContext buildContext() {
private PriorityContext buildContext(FlamingockMetadata flamingockMetadata) {
logger.trace("injecting internal configuration");
addDependency(coreConfiguration);
addDependency(targetSystemManager);
if (flamingockMetadata != null && flamingockMetadata.getProperties() != null) {
flamingockMetadata.getProperties().forEach(this::setProperty);
}
updateContextSpecific();
List<ContextResolver> dependencyContextsFromPlugins = pluginManager.getPlugins()
.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,14 @@
*/
package io.flamingock.internal.core.configuration.core;

import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.common.core.preview.PreviewPipeline;

import java.util.Map;

public interface CoreConfigurable {

PreviewPipeline getPreviewPipeline();
FlamingockMetadata getFlamingockMetadata();

void setLockAcquiredForMillis(long lockAcquiredForMillis);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@
*/
package io.flamingock.internal.core.configuration.core;

import io.flamingock.internal.common.core.metadata.FlamingockMetadata;
import io.flamingock.internal.common.core.util.Deserializer;
import io.flamingock.internal.common.core.preview.PreviewPipeline;

import java.util.HashMap;
import java.util.Map;
Expand Down Expand Up @@ -50,8 +50,8 @@ public LockConfiguration getLockConfiguration() {
}

@Override
public PreviewPipeline getPreviewPipeline() {
return Deserializer.readPreviewPipelineFromFile();
public FlamingockMetadata getFlamingockMetadata() {
return Deserializer.readMetadataFromFile();
}


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -207,7 +207,9 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment
AnnotationFinder annotationFinder = new AnnotationFinder(roundEnv, logger, processingEnv);
EnableFlamingock flamingockAnnotation = annotationFinder.getPipelineAnnotation()
.orElseThrow(() -> new RuntimeException("@EnableFlamingock annotation is mandatory. Please annotate a class with @EnableFlamingock to configure the pipeline."));
Collection<CodePreviewChange> allChanges = annotationFinder.findAnnotatedChanges();
//TODO: get configuration properties from another interface
Map<String, String> properties = new HashMap<>();
Collection<CodePreviewChange> allChanges = annotationFinder.findAnnotatedChanges(properties);

// Find @FlamingockCliBuilder annotated method
Optional<BuilderProviderInfo> builderProvider = annotationFinder.findBuilderProvider();
Expand All @@ -228,7 +230,7 @@ public boolean process(Set<? extends TypeElement> annotations, RoundEnvironment

Serializer serializer = new Serializer(processingEnv, logger);
String configFile = flamingockAnnotation.configFile();
FlamingockMetadata flamingockMetadata = new FlamingockMetadata(pipeline, configFile);
FlamingockMetadata flamingockMetadata = new FlamingockMetadata(pipeline, configFile, properties);
builderProvider.ifPresent(flamingockMetadata::setBuilderProvider);
serializer.serializeFullPipeline(flamingockMetadata);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,14 +25,15 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.TypeElement;
import java.util.Collection;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors;

public class FlamingockChangeDiscoverer implements ChangeDiscoverer {

@Override
public Collection<CodePreviewChange> findAnnotatedChanges(RoundEnvironment roundEnv, LoggerPreProcessor logger) {
public Collection<CodePreviewChange> findAnnotatedChanges(RoundEnvironment roundEnv, LoggerPreProcessor logger, Map<String, String> properties) {
logger.info("Searching for code-based changes (Java classes annotated with @Change annotation)");
return roundEnv.getElementsAnnotatedWith(Change.class)
.stream()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,12 +60,12 @@ public Optional<EnableFlamingock> getPipelineAnnotation() {
.findFirst();
}

public Collection<CodePreviewChange> findAnnotatedChanges() {
public Collection<CodePreviewChange> findAnnotatedChanges(Map<String, String> properties) {
logger.info("Searching for code-based changes");
return getAllChangeDiscoverers()
.stream()
.peek(cd -> logger.info(String.format("Using %s for discover changes", cd.getClass().getName())))
.map(cd -> cd.findAnnotatedChanges(roundEnv, logger))
.map(cd -> cd.findAnnotatedChanges(roundEnv, logger, properties))
.flatMap(Collection::stream)
.collect(Collectors.toList());
}
Expand Down
Loading
Loading