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 @@ -50,7 +50,5 @@
String name() default "";

String description() default "";

StageType type() default StageType.DEFAULT;

}
Original file line number Diff line number Diff line change
Expand Up @@ -17,23 +17,4 @@

public interface ChangeCategoryAware {

boolean hasCategory(ChangeCategory property);

default boolean hasAnyCategory(ChangeCategory... properties) {
for (ChangeCategory property : properties) {
if (hasCategory(property)) {
return true;
}
}
return false;
}

default boolean hasAllCategories(ChangeCategory... properties) {
for (ChangeCategory property : properties) {
if (!hasCategory(property)) {
return false;
}
}
return true;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ public final class Constants {

public static final String FULL_GRAALVM_REFLECT_CLASSES_PATH = "META-INF/flamingock/reflection-classes.txt";

public static final String DEFAULT_MONGOCK_ORIGIN = "mongockChangeLog";

private Constants() {}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,9 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package io.flamingock.importer.util;
package io.flamingock.internal.common.core.pipeline;

import io.flamingock.internal.common.core.audit.AuditEntry;
import io.flamingock.internal.common.core.pipeline.PipelineDescriptor;
import org.jetbrains.annotations.NotNull;

public class PipelineHelper {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,9 @@
import javax.lang.model.element.ElementKind;
import javax.lang.model.element.ExecutableElement;
import javax.lang.model.element.TypeElement;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import java.lang.annotation.Annotation;
import java.lang.reflect.Constructor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;
import java.util.stream.Stream;


public class CodePreviewTaskBuilder implements PreviewTaskBuilder<CodePreviewChange> {
Expand All @@ -65,12 +58,12 @@ public class CodePreviewTaskBuilder implements PreviewTaskBuilder<CodePreviewCha
private CodePreviewTaskBuilder() {
}

public static CodePreviewTaskBuilder builder() {
public static CodePreviewTaskBuilder instance() {
return new CodePreviewTaskBuilder();
}

public static CodePreviewTaskBuilder builder(TypeElement typeElement) {
return builder().setTypeElement(typeElement);
public static CodePreviewTaskBuilder instance(TypeElement typeElement) {
return instance().setTypeElement(typeElement);
}

public CodePreviewTaskBuilder setId(String id) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ public interface TaskDescriptor extends Comparable<TaskDescriptor> {

boolean isLegacy();

default boolean isStandard() {
return !(isLegacy() || isSystem());
}

default String pretty() {
if (getOrder().isPresent()) {
return String.format("%s) id: %s ", getOrder().get(), getId());
Expand Down
1 change: 0 additions & 1 deletion core/flamingock-core/build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ val jacksonVersion = "2.16.0"

dependencies {
api(project(":core:flamingock-core-commons"))
api(project(":core:importer:flamingock-importer"))
api(project(":utils:general-util"))

api("javax.inject:javax.inject:1")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
package io.flamingock.internal.core.pipeline.loaded.stage;


import io.flamingock.api.task.ChangeCategory;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.api.StageType;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.internal.core.pipeline.loaded.PipelineValidationContext;
import io.flamingock.internal.core.task.loaded.AbstractLoadedChange;
import io.flamingock.internal.core.task.loaded.AbstractLoadedTask;
Expand All @@ -33,6 +32,8 @@
*/
public class DefaultLoadedStage extends AbstractLoadedStage {

private final static String INVALID_CHANGE_TYPE_MSG = "Invalid change detected: a non-standard change was found while processing a standard stage";

private static final StageValidationContext validationContext = StageValidationContext.builder()
.setSorted(SEQUENTIAL_FORMATTED)
.build();
Expand All @@ -46,15 +47,12 @@ public DefaultLoadedStage(String name,
@Override
public List<ValidationError> getValidationErrors(PipelineValidationContext context) {
List<ValidationError> errors = super.getValidationErrors(context);
String changeCategoryErrorMsg = String.format(
"Change[{}] in default stage cannot have categories %s or %s",
ChangeCategory.SYSTEM, ChangeCategory.IMPORT);

for(AbstractLoadedTask task : getTasks()) {
if(task instanceof AbstractLoadedChange) {
for (AbstractLoadedTask task : getTasks()) {
if (task instanceof AbstractLoadedChange) {
AbstractLoadedChange change = (AbstractLoadedChange) task;
if(change.hasAnyCategory(ChangeCategory.SYSTEM, ChangeCategory.IMPORT)) {
errors.add(new ValidationError(changeCategoryErrorMsg, task.getId(), "change"));
if (!change.isStandard()) {
errors.add(new ValidationError(INVALID_CHANGE_TYPE_MSG, task.getId(), "change"));
}
} else {
errors.add(new ValidationError("Task in default stage must be a Change", task.getId(), "change"));
Expand All @@ -66,6 +64,4 @@ public List<ValidationError> getValidationErrors(PipelineValidationContext conte
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
package io.flamingock.internal.core.pipeline.loaded.stage;


import io.flamingock.api.task.ChangeCategory;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.api.StageType;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.internal.core.pipeline.loaded.PipelineValidationContext;
import io.flamingock.internal.core.task.loaded.AbstractLoadedChange;
import io.flamingock.internal.core.task.loaded.AbstractLoadedTask;
Expand All @@ -32,6 +31,9 @@
* It's the result of adding the loaded task to the ProcessDefinition
*/
public class LegacyLoadedStage extends AbstractLoadedStage {

private final static String INVALID_CHANGE_TYPE_MSG = "Invalid change detected: a non-legacy change was found while processing a legacy stage";

private static final StageValidationContext validationContext = StageValidationContext.builder()
.setSorted(SEQUENTIAL_SIMPLE)
.build();
Expand All @@ -46,15 +48,12 @@ public LegacyLoadedStage(String name,
@Override
public List<ValidationError> getValidationErrors(PipelineValidationContext context) {
List<ValidationError> errors = super.getValidationErrors(context);
String changeCategoryErrorMsg = String.format(
"ChangeUnit[{}] in legacy stage cannot have categories %s or %s",
ChangeCategory.SYSTEM, ChangeCategory.IMPORT);

for(AbstractLoadedTask task : getTasks()) {
if(task instanceof AbstractLoadedChange) {
for (AbstractLoadedTask task : getTasks()) {
if (task instanceof AbstractLoadedChange) {
AbstractLoadedChange change = (AbstractLoadedChange) task;
if(change.hasAnyCategory(ChangeCategory.SYSTEM, ChangeCategory.IMPORT)) {
errors.add(new ValidationError(changeCategoryErrorMsg, task.getId(), "change"));
if (!change.isLegacy()) {
errors.add(new ValidationError(INVALID_CHANGE_TYPE_MSG, task.getId(), "change"));
}
} else {
errors.add(new ValidationError("Task in legacy stage must be a ChangeUnit", task.getId(), "change"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,8 @@
package io.flamingock.internal.core.pipeline.loaded.stage;


import io.flamingock.api.task.ChangeCategory;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.api.StageType;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.internal.core.pipeline.loaded.PipelineValidationContext;
import io.flamingock.internal.core.task.loaded.AbstractLoadedChange;
import io.flamingock.internal.core.task.loaded.AbstractLoadedTask;
Expand All @@ -33,6 +32,9 @@
*/
public class SystemLoadedStage extends AbstractLoadedStage {

private static final String INVALID_CHANGE_TYPE_MSG = "Invalid change detected: a non-system change was found while processing a system stage";


private static final StageValidationContext validationContext = StageValidationContext.builder()
.setSorted(UNSORTED)
.build();
Expand All @@ -48,15 +50,12 @@ public SystemLoadedStage(String name,
@Override
public List<ValidationError> getValidationErrors(PipelineValidationContext context) {
List<ValidationError> errors = super.getValidationErrors(context);
String changeCategoryErrorMsg = String.format(
"Change in a system stage must have category %s or %s ",
ChangeCategory.SYSTEM, ChangeCategory.IMPORT);

for(AbstractLoadedTask task : getTasks()) {
if(task instanceof AbstractLoadedChange) {
for (AbstractLoadedTask task : getTasks()) {
if (task instanceof AbstractLoadedChange) {
AbstractLoadedChange change = (AbstractLoadedChange) task;
if(!change.hasCategory(ChangeCategory.IMPORT)) {
errors.add(new ValidationError(changeCategoryErrorMsg, task.getId(), "change"));
if (!change.isSystem()) {
errors.add(new ValidationError(INVALID_CHANGE_TYPE_MSG, task.getId(), "change"));
}
} else {
errors.add(new ValidationError("Task in a system stage must of type Change", task.getId(), "change"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,10 +96,9 @@ public TargetSystemOps getTargetSystem(String id) {
if (id == null || !targetSystemMap.containsKey(id)) {
String availableTargetSystems = String.join(", ", targetSystemMap.keySet());
String message = String.format(
"Change requires a valid targetSystem. Found: [%s]. Available target systems: [%s]",
"Not found targetSystem [%s] among available target systems: [ %s ]",
id, availableTargetSystems
);
logger.debug(message);
throw new FlamingockException(message);
} else {
AbstractTargetSystem<?> targetSystem = targetSystemMap.get(id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -124,10 +124,10 @@ public TargetSystemAuditMarker getOnGoingTaskStatusRepository() {
* or {@link Optional#empty()} if this target system does not support audit reading for the specified type
* @see AuditHistoryReader
* @see AuditReaderType
* @see io.flamingock.importer.ImporterAdapter
*/
public Optional<AuditHistoryReader> getAuditAuditReader(AuditReaderType type) {
return Optional.empty();
}


}
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,12 @@
*/
package io.flamingock.internal.core.targets.operations;

import io.flamingock.internal.common.core.audit.AuditHistoryReader;
import io.flamingock.internal.common.core.audit.AuditReaderType;
import io.flamingock.internal.core.runtime.ExecutionRuntime;
import io.flamingock.internal.core.targets.mark.TargetSystemAuditMarker;

import java.util.Optional;
import java.util.function.Function;

/**
Expand Down Expand Up @@ -51,4 +54,30 @@ public interface TransactionalTargetSystemOps extends TargetSystemOps, TargetSys
*/
<T> T applyChangeTransactional(Function<ExecutionRuntime, T> changeApplier, ExecutionRuntime executionRuntime);

/**
* Returns an audit history reader for importing audit entries from external migration sources.
* <p>
* This method enables Flamingock to import audit history from legacy migration tools or other
* Flamingock installations, preventing re-execution of already-applied changes. The returned
* reader provides access to historical audit entries that can be written to Flamingock's audit store.
* <p>
* Common use cases include:
* <ul>
* <li><strong>Mongock migration</strong>: Import Mongock change history when migrating from Mongock to Flamingock</li>
* <li><strong>Community to Cloud migration</strong>: Import audit history from local database to Flamingock Cloud backend</li>
* <li><strong>Future extensibility</strong>: Support for other migration tools (Liquibase, Flyway, etc.)</li>
* </ul>
* <p>
* The default implementation returns {@code Optional.empty()}, indicating no audit reader is available.
* Target system implementations should override this method to provide database-specific readers when
* migration support is needed.
*
* @param type the type of audit reader to retrieve (e.g., {@link AuditReaderType#MONGOCK})
* @return an {@link Optional} containing the audit history reader if supported for the given type,
* or {@link Optional#empty()} if this target system does not support audit reading for the specified type
* @see AuditHistoryReader
* @see AuditReaderType
*/
Optional<AuditHistoryReader> getAuditAuditReader(AuditReaderType type);

}
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,15 @@
*/
package io.flamingock.internal.core.targets.operations;

import io.flamingock.internal.common.core.audit.AuditHistoryReader;
import io.flamingock.internal.common.core.audit.AuditReaderType;
import io.flamingock.internal.common.core.targets.OperationType;
import io.flamingock.internal.core.runtime.ExecutionRuntime;
import io.flamingock.internal.core.targets.AbstractTargetSystem;
import io.flamingock.internal.core.targets.TransactionalTargetSystem;
import io.flamingock.internal.core.targets.mark.TargetSystemAuditMark;

import java.util.Optional;
import java.util.Set;
import java.util.function.Function;

Expand Down Expand Up @@ -49,6 +52,11 @@ public final <T> T applyChangeTransactional(Function<ExecutionRuntime, T> change
return targetSystem.applyChangeTransactional(changeApplier, executionRuntime);
}

@Override
public Optional<AuditHistoryReader> getAuditAuditReader(AuditReaderType type) {
return targetSystem.getAuditAuditReader(type);
}

@Override
public String getId() {
return targetSystem.getId();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,11 +16,8 @@
package io.flamingock.internal.core.task.loaded;

import io.flamingock.api.annotations.Categories;
import io.flamingock.api.annotations.FlamingockConstructor;
import io.flamingock.api.task.ChangeCategory;
import io.flamingock.internal.common.core.error.FlamingockException;
import io.flamingock.internal.common.core.error.validation.ValidationError;
import io.flamingock.internal.common.core.preview.PreviewConstructor;
import io.flamingock.internal.core.pipeline.loaded.stage.StageValidationContext;
import io.flamingock.internal.util.ReflectionUtil;
import io.flamingock.internal.common.core.task.RecoveryDescriptor;
Expand Down Expand Up @@ -51,7 +48,6 @@ public abstract class AbstractLoadedChange extends AbstractReflectionLoadedTask
private final static String ORDER_REG_EXP = "^(?=(?:[^a-zA-Z0-9]*[a-zA-Z0-9]){3}).+$";
private final static Pattern ORDER_PATTERN = Pattern.compile(ORDER_REG_EXP);
private final Constructor<?> constructor;
private final Set<ChangeCategory> categories;


protected AbstractLoadedChange(String fileName,
Expand All @@ -69,24 +65,13 @@ protected AbstractLoadedChange(String fileName,
super(fileName, id, order, author, implementationClass, runAlways, transactional, system, targetSystem, recovery, legacy);

this.constructor = constructor;

this.categories = ReflectionUtil.findAllAnnotations(implementationClass, Categories.class).stream()
.map(Categories::value)
.map(Arrays::asList)
.flatMap(List::stream)
.collect(Collectors.toSet());
}

@Override
public Constructor<?> getConstructor() {
return constructor;
}

@Override
public boolean hasCategory(ChangeCategory property) {
return categories.contains(property);
}

@Override
public List<ValidationError> getValidationErrors(StageValidationContext context) {
List<ValidationError> errors = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@

import java.util.Optional;

public abstract class AbstractLoadedTask extends AbstractTaskDescriptor implements Validatable<StageValidationContext>, ChangeCategoryAware {
public abstract class AbstractLoadedTask extends AbstractTaskDescriptor implements Validatable<StageValidationContext> {

public AbstractLoadedTask(String id,
String order,
Expand All @@ -50,8 +50,6 @@ public AbstractLoadedTask(String id,

public abstract Optional<Method> getRollbackMethod();

@Override
public abstract boolean hasCategory(ChangeCategory property);


}
Loading
Loading