Skip to content
Snippets Groups Projects
Commit 85b02819 authored by Jan Zickermann's avatar Jan Zickermann
Browse files

OZG-5120 Add mongock workaround (not yet working)

parent e5976dc0
No related branches found
No related tags found
No related merge requests found
...@@ -84,6 +84,13 @@ ...@@ -84,6 +84,13 @@
<version>${mapstruct-processor.version}</version> <version>${mapstruct-processor.version}</version>
</dependency> </dependency>
<!-- native image -->
<dependency>
<groupId>org.graalvm.sdk</groupId>
<artifactId>graal-sdk</artifactId>
<version>24.0.0</version>
</dependency>
<!-- mongock --> <!-- mongock -->
<dependency> <dependency>
<groupId>io.mongock</groupId> <groupId>io.mongock</groupId>
......
/*
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur
* Zentrales IT-Management
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin;
import org.graalvm.nativeimage.hosted.Feature;
import org.graalvm.nativeimage.hosted.RuntimeReflection;
import de.ozgcloud.admin.migration.MigrationUnitList;
public class MigrationUnitRegistrationFeature implements Feature {
@Override
public void beforeAnalysis(BeforeAnalysisAccess access) {
MigrationUnitList.units.forEach(MigrationUnitRegistrationFeature::registerClass);
}
private static void registerClass(Class<?> clazz) {
RuntimeReflection.register(clazz);
RuntimeReflection.register(clazz.getDeclaredConstructors());
RuntimeReflection.register(clazz.getDeclaredMethods());
}
}
/*
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur
* Zentrales IT-Management
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.migration;
import java.util.List;
public final class MigrationUnitList {
public static final List<Class<?>> units = List.of(
M001_CreateEmptyPostfachIfMissing.class
);
private MigrationUnitList() {
}
}
...@@ -23,17 +23,18 @@ ...@@ -23,17 +23,18 @@
*/ */
package de.ozgcloud.admin.migration; package de.ozgcloud.admin.migration;
import io.mongock.runner.spring.base.events.SpringMigrationSuccessEvent;
import lombok.extern.log4j.Log4j2;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import io.mongock.runner.spring.base.events.SpringMigrationSuccessEvent;
import lombok.extern.log4j.Log4j2;
@Log4j2 @Log4j2
@Component @Component
public class MongockSuccessEventListener implements ApplicationListener<SpringMigrationSuccessEvent> { public class MongockSuccessEventListener implements ApplicationListener<SpringMigrationSuccessEvent> {
@Override @Override
public void onApplicationEvent(SpringMigrationSuccessEvent event) { public void onApplicationEvent(SpringMigrationSuccessEvent event) {
log.info("Mongock migration successfull", event.getMigrationResult()); log.info("Mongock migration successful {}", event.getMigrationResult());
} }
} }
/*
* Copyright (c) 2024. Das Land Schleswig-Holstein vertreten durch das Ministerium für Energiewende, Klimaschutz, Umwelt und Natur
* Zentrales IT-Management
*
* Lizenziert unter der EUPL, Version 1.2 oder - sobald
* diese von der Europäischen Kommission genehmigt wurden -
* Folgeversionen der EUPL ("Lizenz");
* Sie dürfen dieses Werk ausschließlich gemäß
* dieser Lizenz nutzen.
* Eine Kopie der Lizenz finden Sie hier:
*
* https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
*
* Sofern nicht durch anwendbare Rechtsvorschriften
* gefordert oder in schriftlicher Form vereinbart, wird
* die unter der Lizenz verbreitete Software "so wie sie
* ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
* ausdrücklich oder stillschweigend - verbreitet.
* Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen.
*/
package de.ozgcloud.admin.nativeimage;
import static org.springframework.aot.hint.MemberCategory.*;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import org.springframework.aot.generate.GenerationContext;
import org.springframework.aot.hint.ReflectionHints;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotContribution;
import org.springframework.beans.factory.aot.BeanFactoryInitializationAotProcessor;
import org.springframework.beans.factory.aot.BeanFactoryInitializationCode;
import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
import org.springframework.boot.autoconfigure.AutoConfigurationPackages;
import org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.util.ClassUtils;
import io.mongock.api.annotations.ChangeUnit;
import io.mongock.runner.springboot.MongockSpringboot;
import io.mongock.utils.StringUtils;
public class MigrationUnitAotProcessor implements BeanFactoryInitializationAotProcessor {
@Override
public BeanFactoryInitializationAotContribution processAheadOfTime(ConfigurableListableBeanFactory beanFactory) {
if (AutoConfigurationPackages.has(beanFactory)) {
var scanner = createScanner();
Set<Class<?>> unitSet = AutoConfigurationPackages.get(beanFactory)
.stream()
.filter(StringUtils::hasText)
.flatMap(packageToScan -> scanner.findCandidateComponents(packageToScan).stream())
.map(beanDefinition -> {
try {
return ClassUtils.forName(Objects.requireNonNull(beanDefinition.getBeanClassName()),
beanFactory.getBeanClassLoader());
} catch (ClassNotFoundException e) {
throw new RuntimeException(e);
}
}).collect(Collectors.toSet());
return (GenerationContext generationContext, BeanFactoryInitializationCode beanFactoryInitializationCode) ->
registerReflectiveHints(generationContext.getRuntimeHints().reflection(), unitSet);
}
return null;
}
private ClassPathScanningCandidateComponentProvider createScanner() {
var scanner = new ClassPathScanningCandidateComponentProvider(false);
scanner.addIncludeFilter(new AnnotationTypeFilter(ChangeUnit.class));
return scanner;
}
private void registerReflectiveHints(ReflectionHints hints, Set<Class<?>> migrationUnits) {
for (var unit : migrationUnits) {
hints.registerType(unit, hint ->
hint.withMembers(INVOKE_DECLARED_METHODS, INVOKE_DECLARED_CONSTRUCTORS)
);
}
hints.registerType(MongockSpringboot.RunnerSpringbootBuilderImpl.class, hint ->
hint.withMembers(INVOKE_DECLARED_METHODS, INVOKE_DECLARED_CONSTRUCTORS)
);
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment