diff --git a/.github/workflows/pull-request-check.yml b/.github/workflows/pull-request-check.yml index 68be751b7..59f6d651c 100644 --- a/.github/workflows/pull-request-check.yml +++ b/.github/workflows/pull-request-check.yml @@ -67,23 +67,21 @@ jobs: java --version export MAVEN_OPTS="-Xmx4096m" export JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8" - mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 - cd tools/samm-cli - unset JAVA_TOOL_OPTIONS - mvn -B clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 shell: bash - name: Build native image if: matrix.os != 'macos-13' run: | export MAVEN_OPTS="-Xmx4096m" - cd tools/samm-cli - mvn -B package -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl tools/samm-cli clean verify -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 shell: bash - name: Build native image (Mac) if: matrix.os == 'macos-13' run: | + export MAVEN_OPTS="-Xmx4096m" + mvn -B -pl tools/samm-cli clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 bundle="samm-bundle-DEV-SNAPSHOT-$(date +%s)" mkdir ${bundle} curl -Lo jre.tar.gz https://github.com/adoptium/temurin21-binaries/releases/download/jdk-21.0.3%2B9/OpenJDK21U-jre_x64_mac_hotspot_21.0.3_9.tar.gz diff --git a/.github/workflows/release-workflow.yml b/.github/workflows/release-workflow.yml index f929b50a7..15e35fc18 100644 --- a/.github/workflows/release-workflow.yml +++ b/.github/workflows/release-workflow.yml @@ -66,7 +66,7 @@ jobs: - name: Setup JDK uses: graalvm/setup-graalvm@2f25c0caae5b220866f732832d5e3e29ff493338 # v1.2.1 with: - java-version: '17.0.8' + java-version: '17.0.10' distribution: 'graalvm' components: 'native-image,js' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -99,13 +99,10 @@ jobs: release_version=${{ github.event.inputs.release_version }} # Actual build of core SDK - mvn -B -pl '!org.eclipse.esmf:samm-cli' clean deploy -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 -DaltDeploymentRepository=local::default::file://nexus-staging -Psign + mvn -B -pl '!org.eclipse.esmf:samm-cli' clean deploy -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 -DaltDeploymentRepository=local::default::file://nexus-staging -Psign # Build of CLI - pushd tools/samm-cli unset JAVA_TOOL_OPTIONS - mvn -B clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 - mvn -B verify -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 - popd + mvn -B -pl tools/samm-cli clean verify -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 # Create .tar.gz of samm-cli pushd tools/samm-cli/target @@ -152,7 +149,7 @@ jobs: - name: Setup JDK uses: graalvm/setup-graalvm@2f25c0caae5b220866f732832d5e3e29ff493338 # v1.2.1 with: - java-version: '17.0.8' + java-version: '17.0.10' distribution: 'graalvm' components: 'native-image,js' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -174,11 +171,10 @@ jobs: mvn versions:set -DnewVersion=${{ github.event.inputs.release_version }} mvn versions:commit # Actual build of core SDK - mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 # Build of CLI - cd tools/samm-cli unset JAVA_TOOL_OPTIONS - mvn -B clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl tools/samm-cli clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 shell: bash - name: Build native executable @@ -226,7 +222,7 @@ jobs: - name: Setup JDK uses: graalvm/setup-graalvm@2f25c0caae5b220866f732832d5e3e29ff493338 # v1.2.1 with: - java-version: '17.0.8' + java-version: '17.0.10' distribution: 'graalvm' components: 'native-image,js' github-token: ${{ secrets.GITHUB_TOKEN }} @@ -261,12 +257,10 @@ jobs: mvn versions:commit # Actual build of core SDK - mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl '!org.eclipse.esmf:samm-cli' clean install -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 # Build of CLI - cd tools/samm-cli unset JAVA_TOOL_OPTIONS - mvn -B clean verify -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 - mvn -B verify -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 + mvn -B -pl tools/samm-cli clean verify -Pnative -Dmaven.wagon.httpconnectionManager.ttlSeconds=60 shell: bash - name: Upload Windows binary diff --git a/core/esmf-aspect-meta-model-java/pom.xml b/core/esmf-aspect-meta-model-java/pom.xml index 94deff6a7..0a92a620d 100644 --- a/core/esmf-aspect-meta-model-java/pom.xml +++ b/core/esmf-aspect-meta-model-java/pom.xml @@ -28,11 +28,6 @@ ESMF Aspect Meta Model Java jar - - ${project.basedir}/src-gen - ${project.basedir}/src-buildtime - - org.eclipse.esmf diff --git a/core/esmf-native-support/pom.xml b/core/esmf-native-support/pom.xml new file mode 100644 index 000000000..37591c628 --- /dev/null +++ b/core/esmf-native-support/pom.xml @@ -0,0 +1,172 @@ + + + + + 4.0.0 + + + org.eclipse.esmf + esmf-sdk-parent + DEV-SNAPSHOT + ../../pom.xml + + + esmf-native-support + ESMF Native Support + + + false + + + + + org.eclipse.esmf + esmf-aspect-model-starter + + + ch.qos.logback + logback-classic + + + org.graalvm.nativeimage + svm + provided + + + + org.junit.jupiter + junit-jupiter + test + + + org.assertj + assertj-core + test + + + + + + + maven-resources-plugin + + + copy-resources + + prepare-package + + copy-resources + + + ${project.build.outputDirectory}/META-INF + + + ${generated-sources}/main/resources/META-INF + false + + + + + + + + + org.apache.maven.plugins + maven-compiler-plugin + + + -Aproject=${project.groupId}/${project.artifactId} + --add-exports + java.desktop/sun.awt=ALL-UNNAMED + --add-exports + java.desktop/sun.font=ALL-UNNAMED + --add-exports + org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED + + false + false + + + + + org.apache.maven.plugins + maven-javadoc-plugin + + org.eclipse.esmf.substitution,org.eclipse.esmf.buildtime + + + + + org.apache.maven.plugins + maven-surefire-plugin + + 1 + false + --add-exports org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED + + + + + + org.codehaus.mojo + exec-maven-plugin + + + + generate-admin-shell-reflection-config + process-classes + + java + + + + org.eclipse.esmf.buildtime.Aas4jClassSetup + + ${project.build.outputDirectory} + false + + + + + customize-resource-config + process-classes + + java + + + + org.eclipse.esmf.buildtime.CustomizeGraalVmConfigs + + ${native-config-path} + false + + + + + + + org.apache.maven.plugins + maven-jar-plugin + + + + org/eclipse/esmf/buildtime/** + + + + + + diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java similarity index 89% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java index 7e61845e9..4cf4da11f 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/Aas4jClassSetup.java @@ -20,17 +20,17 @@ import static org.eclipse.digitaltwin.aas4j.v3.dataformat.core.internal.util.ReflectionHelper.MODEL_PACKAGE_NAME; import static org.eclipse.digitaltwin.aas4j.v3.dataformat.core.internal.util.ReflectionHelper.MODEL_TYPE_SUPERCLASSES; import static org.eclipse.digitaltwin.aas4j.v3.dataformat.core.internal.util.ReflectionHelper.XML_MIXINS_PACKAGE_NAME; +import static org.eclipse.esmf.nativefeatures.AssetAdministrationShellFeature.ADMINSHELL_PROPERTIES; -import java.io.File; import java.io.FileOutputStream; import java.io.IOException; +import java.nio.file.Path; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; -import java.util.Properties; import java.util.Set; import java.util.stream.Collectors; @@ -70,14 +70,22 @@ public Aas4jClassSetup() { config.interfaces = scanAasInterfaces(); config.enums = modelScan.getAllEnums().loadClasses( Enum.class ); config.interfacesWithoutDefaultImplementation = getInterfacesWithoutDefaultImplementation( modelScan ); + config.classesInModelPackage = classesInPackage( MODEL_PACKAGE_NAME ); + config.classesInDefaultImplementationPackage = classesInPackage( DEFAULT_IMPLEMENTATION_PACKAGE_NAME ); + config.classesInJsonMixinsPackage = classesInPackage( JSON_MIXINS_PACKAGE_NAME ); + config.classesInXmlMixinsPackage = classesInPackage( XML_MIXINS_PACKAGE_NAME ); } public static void main( final String[] args ) throws IOException { - final AdminShellConfig config = new Aas4jClassSetup().config; - final Properties p = config.toProperties(); - final File out = new File( args[0] ); - final FileOutputStream outputStream = new FileOutputStream( out ); - p.store( outputStream, null ); + try ( final FileOutputStream outputStream = new FileOutputStream( Path.of( args[0] ).resolve( ADMINSHELL_PROPERTIES ).toFile() ) ) { + new Aas4jClassSetup().config.toProperties().store( outputStream, null ); + } + } + + private Set> classesInPackage( final String packageName ) { + try ( final ScanResult scanResult = new ClassGraph().enableAllInfo().acceptPackages( packageName ).scan() ) { + return new HashSet<>( scanResult.getAllClasses().loadClasses() ); + } } /** diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java similarity index 52% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java index ac91f1744..a53f7e6ad 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/CustomizeGraalVmConfigs.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2023 Robert Bosch Manufacturing Solutions GmbH + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH * * See the AUTHORS file(s) distributed with this work for additional * information regarding authorship. @@ -24,10 +24,11 @@ import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import com.google.common.collect.Streams; /** - * This class runs at build time, after the executable jar for samm-cli has been executed with the GraalVM native image agent, - * but before the native image compiler is started. It will adjust the configs that were created by the native image agent, + * This class runs at build time. It will adjust the configs that were created by the native image agent, * which sometimes create configurations which lead to failures during either compilation or runtime. */ public class CustomizeGraalVmConfigs { @@ -36,7 +37,7 @@ public static void main( final String[] args ) throws IOException { final File configsDirectory = new File( args[0] ); if ( !configsDirectory.exists() || !configsDirectory.isDirectory() ) { System.err.println( "Warning: Native resource config directory " + configsDirectory + " not found, skipping customizing" ); - System.exit( 0 ); + return; } final Path configsPath = configsDirectory.toPath(); adjustResourceConfig( configsPath.resolve( "resource-config.json" ).toFile() ); @@ -75,28 +76,94 @@ private static void adjustResourceConfig( final File resourceConfig ) throws IOE } } + private static Class instantiateParameterType( final String typeName ) { + for ( final Class simpleType : List.of( + boolean.class, byte.class, int.class, long.class, float.class, double.class, + boolean[].class, byte[].class, int[].class, long[].class, float[].class, double[].class + ) ) { + if ( typeName.equals( simpleType.getSimpleName() ) ) { + return simpleType; + } + } + + try { + return Class.forName( typeName, false, CustomizeGraalVmConfigs.class.getClassLoader() ); + } catch ( final ClassNotFoundException e ) { + return null; + } + } + + private static void removeNonExistingtMethods( final JsonNode entry, final Class clazz ) { + final JsonNode methods = entry.get( "methods" ); + if ( methods == null ) { + return; + } + for ( final Iterator it = methods.elements(); it.hasNext(); ) { + final JsonNode method = it.next(); + try { + final String methodName = method.get( "name" ).asText(); + final Class[] parameterTypes = Streams.stream( method.get( "parameterTypes" ).elements() ) + .map( param -> instantiateParameterType( param.asText() ) ) + .toArray( Class[]::new ); + if ( !methodName.equals( "" ) ) { + clazz.getMethod( methodName, parameterTypes ); + } + } catch ( final Throwable t ) { + // The method can not be found via reflection, so it can be considered a spurious entry. Remove it. + it.remove(); + } + } + if ( !methods.elements().hasNext() ) { + ( (ObjectNode) entry ).remove( "methods" ); + } + } + + private static boolean shouldEntryBeRemovedFromReflectConfig( final JsonNode entry ) { + final String className = entry.get( "name" ).asText(); + for ( final String nonReflectionClass : List.of( + // These three reflection entries are added by the native image agent, but cause the native compilation to fail + "jdk.internal.loader.BuiltinClassLoader", + "jdk.internal.loader.ClassLoaders$AppClassLoader", + "jdk.internal.loader.ClassLoaders$PlatformClassLoader", + // The remaining exludes are generated by the native-image agent during test runs and are explicitly not + // needed at native-image compile time + "org.eclipse.esmf.test.", + "test.test.test", + "org.junit.", + "com.sun.tools.javac" + ) ) { + if ( className.contains( nonReflectionClass ) ) { + return true; + } + } + + if ( className.matches( "org\\.eclipse\\.esmf\\.*Test" ) ) { + return true; + } + + try { + final Class clazz = Class.forName( className, false, CustomizeGraalVmConfigs.class.getClassLoader() ); + removeNonExistingtMethods( entry, clazz ); + return false; + } catch ( final ClassNotFoundException e ) { + // If the class can not be instantiated, it's also a spurious entry added by the native-image agent; remove it. + return true; + } + } + private static void adjustReflectConfig( final File reflectConfig ) throws IOException { if ( !reflectConfig.exists() ) { System.err.println( "Warning: Native resource config " + reflectConfig + " not found, skipping customizing" ); return; } - final List> reflectEntriesToDelete = List.of( - // These three reflection entries are added by the native image agent, but cause the native compilation to fail - includeNode -> includeNode.asText().contains( "jdk.internal.loader.BuiltinClassLoader" ), - includeNode -> includeNode.asText().contains( "jdk.internal.loader.ClassLoaders$AppClassLoader" ), - includeNode -> includeNode.asText().contains( "jdk.internal.loader.ClassLoaders$PlatformClassLoader" ) - ); final String content = Files.readString( reflectConfig.toPath() ); final ObjectMapper mapper = new ObjectMapper(); final JsonNode root = mapper.readTree( content ); - for ( final Iterator i = root.elements(); i.hasNext(); ) { - final JsonNode include = i.next(); - for ( final Predicate decideIfNodeShouldBeDeleted : reflectEntriesToDelete ) { - final JsonNode name = include.get( "name" ); - if ( name != null && decideIfNodeShouldBeDeleted.test( include.get( "name" ) ) ) { - i.remove(); - } + for ( final Iterator it = root.elements(); it.hasNext(); ) { + final JsonNode entry = it.next(); + if ( shouldEntryBeRemovedFromReflectConfig( entry ) ) { + it.remove(); } } diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/package-info.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/package-info.java new file mode 100644 index 000000000..c361aefe5 --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/buildtime/package-info.java @@ -0,0 +1,20 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +/** + * The org.eclipse.esmf.buildtime package contains classes that are exclusively used (compiled & executed) during the build. + * Classes in the package are self-contained programs (with a main() method) that create or modify files, e.g., resources. + * The classes from this package are explicitly excluded from the jar of the module. Execution of the classes and configuration of command + * line arguments is done in pom.xml. + */ +package org.eclipse.esmf.buildtime; \ No newline at end of file diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/AssetAdministrationShellFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/AssetAdministrationShellFeature.java new file mode 100644 index 000000000..b3b0df7ae --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/AssetAdministrationShellFeature.java @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import java.io.IOException; +import java.io.InputStream; +import java.util.Properties; + +import org.eclipse.esmf.buildtime.Aas4jClassSetup; +import org.eclipse.esmf.substitution.AdminShellConfig; + +import org.eclipse.digitaltwin.aas4j.v3.model.LangStringTextType; +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms; +import org.graalvm.nativeimage.hosted.Feature; + +/** + * Registers all classes in the AAS model and default implementation packages for reflection in native image builds. + */ +@Platforms( Platform.HOSTED_ONLY.class ) +public class AssetAdministrationShellFeature implements Feature { + /** + * The properties file that provides information about AAS features that can otherwise only be retrieved using reflection. + * See {@link AdminShellConfig} for more information. + */ + public static final String ADMINSHELL_PROPERTIES = "adminshell.properties"; + + @Override + public void beforeAnalysis( final BeforeAnalysisAccess access ) { + final Properties adminShellProperties = new Properties(); + final InputStream propertiesResource = AssetAdministrationShellFeature.class.getClassLoader() + .getResourceAsStream( ADMINSHELL_PROPERTIES ); + try { + adminShellProperties.load( propertiesResource ); + } catch ( final IOException exception ) { + throw new RuntimeException( "Failed to load " + ADMINSHELL_PROPERTIES ); + } + final AdminShellConfig adminShellConfig = AdminShellConfig.fromProperties( adminShellProperties ); + + /* + * The following commands register AAS4J model classes for reflection. Note that this is done using the pre-calculated + * list of classes that we load from adminshell.properties: This prevents the dependency on the classgraph-library at + * native image compile time. + */ + adminShellConfig.classesInModelPackage.forEach( cls -> Native.forClass( cls ).registerEverythingForReflection() ); + adminShellConfig.classesInDefaultImplementationPackage.forEach( cls -> Native.forClass( cls ).registerEverythingForReflection() ); + adminShellConfig.classesInJsonMixinsPackage.forEach( cls -> Native.forClass( cls ).registerEverythingForReflection() ); + adminShellConfig.classesInXmlMixinsPackage.forEach( cls -> Native.forClass( cls ).registerEverythingForReflection() ); + + Native.forClass( LangStringTextType[].class ) + .registerEverythingForReflection(); + } +} diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/DiagramFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/DiagramFeature.java new file mode 100644 index 000000000..75ca407cd --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/DiagramFeature.java @@ -0,0 +1,407 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import static org.eclipse.esmf.nativefeatures.Native.clazz; +import static org.eclipse.esmf.nativefeatures.Native.isLinux; +import static org.eclipse.esmf.nativefeatures.Native.isWindows; + +import org.eclipse.esmf.aspectmodel.generator.diagram.AspectModelDiagramGenerator; + +import org.graalvm.nativeimage.Platform; +import org.graalvm.nativeimage.Platforms; +import org.graalvm.nativeimage.hosted.Feature; + +/** + * This feature configures AWT, JDK font classes etc. for reflection and JNI access, as is required by the + * {@link AspectModelDiagramGenerator}. + */ +@Platforms( Platform.HOSTED_ONLY.class ) +public class DiagramFeature implements Feature { + @Override + public void beforeAnalysis( final Feature.BeforeAnalysisAccess access ) { + setupAwt(); + setupFontConfiguration(); + setupJava2d(); + setupBatikConfiguration(); + setupGraphSupportConfiguration(); + } + + private void setupJava2d() { + if ( isWindows() ) { + Native.forClass( "sun.java2d.d3d.D3DGraphicsDevice" ) + .registerEverythingForReflection() + .registerEverythingForJni(); + Native.forClass( "sun.java2d.d3d.D3DGraphicsDevice$1" ) + .registerMethodForJni( "run" ); + Native.forClass( "sun.java2d.d3d.D3DRenderQueue$1" ) + .registerMethodForJni( "run" ); + Native.forClass( "sun.java2d.windows.WindowsFlags" ) + .registerFieldsForJni( "d3dEnabled", "d3dSet", "offscreenSharingEnabled", "setHighDPIAware" ); + } else if ( isLinux() ) { + Native.forClass( "sun.java2d.xr.XRSurfaceData" ) + .registerEverythingForReflection() + .registerFieldsForJni( "picture", "xid" ); + } + + Native.forClass( "sun.java2d.marlin.DMarlinRenderingEngine" ) + .registerConstructorForReflection(); + + Native.forClass( "sun.java2d.loops.GraphicsPrimitive" ) + .initializeAtBuildTime() + .registerFieldsForJni( "pNativePrim" ); + Native.forArrayClass( "sun.java2d.loops.GraphicsPrimitive" ) + .registerEverythingForJni(); + Native.forClass( "sun.java2d.Disposer" ) + .registerMethodForJni( "addRecord", java.lang.Object.class, long.class, long.class ); + Native.forClass( "sun.java2d.InvalidPipeException" ) + .registerEverythingForJni(); + Native.forClass( "sun.java2d.NullSurfaceData" ) + .registerEverythingForJni(); + Native.forClass( "sun.java2d.SunGraphics2D" ) + .registerFieldsForJni( "clipRegion", "composite", "eargb", "lcdTextContrast", "pixel", "strokeHint" ); + Native.forClass( "sun.java2d.SunGraphicsEnvironment" ) + .registerMethodForJni( "isDisplayLocal" ); + Native.forClass( "sun.java2d.SurfaceData" ) + .registerFieldsForJni( "pData", "valid" ); + Native.forClass( "sun.java2d.loops.SurfaceType" ) + .initializeAtBuildTime(); + Native.forClass( "sun.java2d.loops.CompositeType" ) + .initializeAtBuildTime(); + Native.forClass( "sun.java2d.loops.Blit" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.BlitBg" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.CompositeType" ) + .registerFieldsForJni( "AnyAlpha", "Src", "SrcNoEa", "SrcOver", "SrcOverNoEa", "Xor" ); + Native.forClass( "sun.java2d.loops.DrawGlyphList" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawGlyphListAA" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawGlyphListLCD" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawLine" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawParallelogram" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawPath" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawPolygons" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.DrawRect" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.FillParallelogram" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.FillPath" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.FillRect" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.FillSpans" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.GraphicsPrimitiveMgr" ) + .registerMethodForJni( "register", clazz( "sun.java2d.loops.GraphicsPrimitive" ).arrayType() ); + Native.forClass( "sun.java2d.loops.MaskBlit" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.MaskFill" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.ScaledBlit" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.SurfaceType" ) + .registerFieldsForJni( "Any3Byte", "Any4Byte", "AnyByte", "AnyColor", "AnyInt", "AnyShort", "ByteBinary1Bit", "ByteBinary2Bit", + "ByteBinary4Bit", "ByteGray", "ByteIndexed", "ByteIndexedBm", "FourByteAbgr", "FourByteAbgrPre", "Index12Gray", + "Index8Gray", "IntArgb", "IntArgbBm", "IntArgbPre", "IntBgr", "IntRgb", "IntRgbx", "OpaqueColor", "ThreeByteBgr", + "Ushort4444Argb", "Ushort555Rgb", "Ushort555Rgbx", "Ushort565Rgb", "UshortGray", "UshortIndexed" ); + Native.forClass( "sun.java2d.loops.TransformHelper" ) + .registerConstructorForJni( long.class, clazz( "sun.java2d.loops.SurfaceType" ), + clazz( "sun.java2d.loops.CompositeType" ), clazz( "sun.java2d.loops.SurfaceType" ) ); + Native.forClass( "sun.java2d.loops.XORComposite" ) + .registerFieldsForJni( "alphaMask", "xorColor", "xorPixel" ); + Native.forClass( "sun.java2d.pipe.Region" ) + .registerFieldsForJni( "bands", "endIndex", "hix", "hiy", "lox", "loy" ); + Native.forClass( "sun.java2d.pipe.RegionIterator" ) + .registerFieldsForJni( "curIndex", "numXbands", "region" ); + Native.forClass( "sun.java2d.pipe.ShapeSpanIterator" ) + .registerFieldsForJni( "pData" ); + } + + private void setupAwt() { + if ( isLinux() ) { + Native.forClass( "sun.awt.X11.XToolkit" ) + .registerEverythingForReflection() + .registerEverythingForJni(); + Native.forClass( "sun.awt.X11.XErrorHandlerUtil" ) + .registerMethodForJni( "init", long.class ); + Native.forClass( "sun.awt.X11GraphicsConfig" ) + .registerFieldsForJni( "aData", "bitsPerPixel" ); + Native.forClass( "sun.awt.X11GraphicsDevice" ) + .registerMethodForJni( "addDoubleBufferVisual", int.class ); + } else if ( isWindows() ) { + Native.forClass( "sun.awt.Win32GraphicsDevice" ) + .registerEverythingForReflection(); + Native.forClass( "sun.awt.Win32FontManager" ) + .registerAllConstructorsForReflection(); + Native.forClass( "sun.awt.Win32GraphicsDevice" ) + .registerEverythingForJni(); + Native.forClass( "sun.awt.Win32GraphicsConfig" ) + .registerFieldsForJni( "visual" ); + Native.forClass( "sun.awt.Win32GraphicsEnvironment" ) + .registerMethodForJni( "dwmCompositionChanged", boolean.class ); + Native.forClass( "sun.awt.windows.WComponentPeer" ) + .registerFieldsForJni( "hwnd", "winGraphicsConfig" ) + .registerMethodForJni( "disposeLater" ) + .registerMethodForJni( "replaceSurfaceData" ) + .registerMethodForJni( "replaceSurfaceDataLater" ); + Native.forClass( "sun.awt.windows.WDesktopPeer" ) + .registerMethodForJni( "systemSleepCallback", boolean.class ) + .registerMethodForJni( "userSessionCallback", boolean.class, java.awt.desktop.UserSessionEvent.Reason.class ); + Native.forClass( "sun.awt.windows.WObjectPeer" ) + .registerFieldsForJni( "createError", "destroyed", "pData", "target" ) + .registerMethodForJni( "getPeerForTarget", java.lang.Object.class ); + Native.forClass( "sun.awt.windows.WToolkit" ) + .registerMethodForJni( "displayChanged" ) + .registerMethodForJni( "paletteChanged" ) + .registerMethodForJni( "windowsSettingChange" ); + } + + Native.forClass( java.awt.Color.class ) + .registerAllFieldsForReflection() + .registerAllMethodsForReflection(); + Native.forClass( java.awt.Insets.class ) + .registerAllFieldsForReflection() + .registerAllMethodsForReflection(); + Native.forClass( java.awt.event.InputEvent.class ) + .registerEverythingForReflection(); + Native.forClass( java.awt.AWTEvent.class ) + .registerEverythingForReflection(); + Native.forClass( java.awt.Component.class ) + .registerEverythingForReflection(); + Native.forClass( java.awt.Font.class ) + .registerConstructorForReflection( String.class, int.class, int.class ); + Native.forClass( java.awt.Canvas.class ) + .registerConstructorForReflection(); + Native.forClass( java.awt.FontMetrics.class ) + .registerMethodForReflection( "getHeight" ) + .registerMethodForReflection( "stringWidth", String.class ); + + Native.forClass( java.awt.Cursor.class ) + .registerFieldsForJni( "pData", "type" ) + .registerMethodForJni( "setPData", long.class ); + Native.forClass( java.awt.Dimension.class ) + .registerFieldsForJni( "height", "width" ); + Native.forClass( java.awt.Font.class ) + .registerFieldsForJni( "name", "pData", "size", "style" ) + .registerMethodForJni( "getFont", String.class ) + .registerMethodForJni( "getFontPeer" ); + Native.forClass( java.awt.Point.class ) + .registerFieldsForJni( "x", "y" ); + Native.forClass( java.awt.Toolkit.class ) + .registerMethodForJni( "getDefaultToolkit" ) + .registerMethodForJni( "getFontMetrics", java.awt.Font.class ); + Native.forClass( java.awt.desktop.UserSessionEvent.Reason.class ) + .registerFieldsForJni( "CONSOLE", "LOCK", "REMOTE", "UNSPECIFIED" ); + Native.forClass( java.awt.Color.class ) + .registerAllFieldsForJni() + .registerAllMethodsForJni(); + Native.forClass( java.awt.Insets.class ) + .registerAllFieldsForJni() + .registerAllMethodsForJni(); + Native.forClass( java.awt.event.InputEvent.class ) + .registerEverythingForJni(); + Native.forClass( java.awt.image.BufferedImage.class ) + .registerFieldsForJni( "colorModel", "imageType", "raster" ) + .registerMethodForJni( "getRGB", int.class, int.class, int.class, int.class, int[].class, int.class, int.class ) + .registerMethodForJni( "setRGB", int.class, int.class, int.class, int.class, int[].class, int.class, int.class ); + Native.forClass( java.awt.image.Raster.class ) + .registerFieldsForJni( "dataBuffer", "height", "minX", "minY", "numBands", "numDataElements", "sampleModel", + "sampleModelTranslateX", "sampleModelTranslateY", "width" ); + Native.forClass( java.awt.image.SampleModel.class ) + .registerFieldsForJni( "height", "width" ) + .registerMethodForJni( "getPixels", int.class, int.class, int.class, int.class, int[].class, java.awt.image.DataBuffer.class ) + .registerMethodForJni( "setPixels", int.class, int.class, int.class, int.class, int[].class, java.awt.image.DataBuffer.class ); + Native.forClass( java.awt.image.SinglePixelPackedSampleModel.class ) + .registerFieldsForJni( "bitMasks", "bitOffsets", "bitSizes", "maxBitSize" ); + Native.forClass( java.awt.AWTEvent.class ) + .registerEverythingForJni(); + Native.forClass( java.awt.AlphaComposite.class ) + .registerFieldsForJni( "extraAlpha", "rule" ); + Native.forClass( java.awt.Component.class ) + .registerEverythingForJni(); + Native.forClass( java.awt.GraphicsEnvironment.class ) + .registerMethodForJni( "getLocalGraphicsEnvironment" ) + .registerMethodForJni( "isHeadless" ); + Native.forClass( java.awt.event.KeyEvent.class ) + .registerFieldsForJni( "isProxyActive" ); + Native.forClass( java.awt.geom.AffineTransform.class ) + .registerFieldsForJni( "m00", "m01", "m02", "m10", "m11", "m12" ); + Native.forClass( java.awt.geom.GeneralPath.class ) + .registerConstructorForJni() + .registerConstructorForJni( int.class, byte[].class, int.class, float[].class, int.class ); + Native.forClass( java.awt.geom.Path2D.class ) + .registerFieldsForJni( "numTypes", "pointTypes", "windingRule" ); + Native.forClass( java.awt.geom.Path2D.Float.class ) + .registerFieldsForJni( "floatCoords" ); + Native.forClass( java.awt.geom.Point2D.Float.class ) + .registerFieldsForJni( "x", "y" ) + .registerConstructorForJni( float.class, float.class ); + Native.forClass( java.awt.geom.Rectangle2D.Float.class ) + .registerFieldsForJni( "height", "width", "x", "y" ) + .registerConstructorForJni() + .registerConstructorForJni( float.class, float.class, float.class, float.class ); + Native.forClass( java.awt.image.ColorModel.class ) + .registerFieldsForJni( "colorSpace", "colorSpaceType", "isAlphaPremultiplied", "is_sRGB", "nBits", "numComponents", "pData", + "supportsAlpha", "transparency" ) + .registerMethodForJni( "getRGBdefault" ); + Native.forClass( java.awt.image.IndexColorModel.class ) + .registerFieldsForJni( "allgrayopaque", "map_size", "rgb", "transparent_index", "colorData" ); + Native.forClass( "sun.awt.AWTAutoShutdown" ) + .registerMethodForJni( "notifyToolkitThreadBusy" ) + .registerMethodForJni( "notifyToolkitThreadFree" ); + Native.forClass( "sun.awt.SunHints" ) + .registerFieldsForJni( "INTVAL_STROKE_PURE" ); + Native.forClass( "sun.awt.SunToolkit" ) + .registerMethodForJni( "awtLock" ) + .registerMethodForJni( "awtLockNotify" ) + .registerMethodForJni( "awtLockNotifyAll" ) + .registerMethodForJni( "awtLockWait", long.class ) + .registerMethodForJni( "awtUnlock" ) + .registerMethodForJni( "isTouchKeyboardAutoShowEnabled" ); + Native.forClass( "sun.awt.image.ByteComponentRaster" ) + .registerFieldsForJni( "data", "dataOffsets", "pixelStride", "scanlineStride", "type" ); + Native.forClass( "sun.awt.image.GifImageDecoder" ) + .registerFieldsForJni( "outCode", "prefix", "suffix" ) + .registerMethodForJni( "readBytes", byte[].class, int.class, int.class ) + .registerMethodForJni( "sendPixels", int.class, int.class, int.class, int.class, byte[].class, + java.awt.image.ColorModel.class ); + Native.forClass( "sun.awt.image.BufImgSurfaceData$ICMColorData" ) + .registerFieldsForJni( "pData" ) + .registerConstructorForJni( long.class ); + Native.forClass( "sun.awt.image.ImageRepresentation" ) + .registerFieldsForJni( "numSrcLUT", "srcLUTtransIndex" ); + Native.forClass( "sun.awt.image.IntegerComponentRaster" ) + .registerFieldsForJni( "data", "dataOffsets", "pixelStride", "scanlineStride", "type" ); + Native.forClass( "sun.awt.image.SunVolatileImage" ) + .registerFieldsForJni( "volSurfaceManager" ); + Native.forClass( "sun.awt.image.VolatileSurfaceManager" ) + .registerFieldsForJni( "sdCurrent" ); + + Native.addClassBasedResourceBundle( "sun.awt.resources.awt", "sun.awt.resources.awt" ); + } + + private void setupBatikConfiguration() { + Native.forClass( "com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl" ) + .registerConstructorForReflection(); + Native.forClass( "org.apache.batik.bridge.RhinoInterpreterFactory" ) + .registerConstructorForReflection(); + Native.forClass( "org.apache.batik.css.parser.Parser" ) + .registerEverythingForReflection(); + Native.forClass( "org.apache.batik.ext.awt.image.codec.png.PNGTranscoderInternalCodecWriteAdapter" ) + .registerEverythingForReflection(); + + Native.addResource( "org/apache/batik/anim/dom/resources/UserAgentStyleSheet.css" ); + Native.addResource( "org/apache/batik/bridge/resources/help.gif" ); + Native.addResourcesPattern( "org/apache/batik.*\\.properties" ); + } + + private void setupGraphSupportConfiguration() { + Native.forArrayClass( "org.graphper.layout.dot.DNode" ) + .registerClassForReflection(); + Native.forClass( "org.graphper.api.LineAttrs" ) + .registerAllFieldsForReflection(); + Native.forClass( "org.graphper.api.NodeAttrs" ) + .registerAllFieldsForReflection(); + + Native.addResource( "META-INF/services/org.graphper.draw.CustomizeShapeRender" ); + Native.addResource( "META-INF/services/org.graphper.layout.MeasureText" ); + } + + private void setupFontConfiguration() { + if ( isLinux() ) { + Native.forClass( "sun.font.FontConfigManager" ) + .registerAllFieldsForReflection() + .registerAllFieldsForJni() + .registerAllMethodsForJni(); + Native.forClass( "sun.font.FontConfigManager$FontConfigInfo" ) + .registerAllFieldsForReflection() + .registerAllFieldsForJni() + .registerAllMethodsForJni(); + Native.forClass( "sun.font.FontConfigManager$FcCompFont" ) + .registerAllFieldsForReflection() + .registerAllFieldsForJni() + .registerAllMethodsForJni(); + Native.forClass( "sun.font.FontConfigManager$FontConfigFont" ) + .registerEverythingForReflection() + .registerEverythingForJni(); + } + Native.forClass( "sun.font.CompositeFontDescriptor" ) + .registerEverythingForReflection(); + Native.forClass( "sun.font.FontDesignMetrics" ) + .registerEverythingForReflection() + .registerEverythingForJni(); + Native.forClass( java.awt.FontMetrics.class ) + .registerFieldsForJni( "font" ) + .registerMethodForJni( "getHeight" ); + Native.forClass( "sun.font.CharToGlyphMapper" ) + .registerMethodForJni( "charToGlyph", int.class ); + Native.forClass( "sun.font.Font2D" ) + .registerMethodForJni( "canDisplay", char.class ) + .registerMethodForJni( "charToGlyph", int.class ) + .registerMethodForJni( "charToVariationGlyph", int.class, int.class ) + .registerMethodForJni( "getMapper" ) + .registerMethodForJni( "getTableBytes", int.class ); + Native.forClass( "sun.font.FontStrike" ) + .registerMethodForJni( "getGlyphMetrics", int.class ); + Native.forClass( "sun.font.FreetypeFontScaler" ) + .registerMethodForJni( "invalidateScaler" ); + Native.forClass( "sun.font.GlyphList" ) + .registerFieldsForJni( "gposx", "gposy", "images", "lcdRGBOrder", "lcdSubPixPos", "len", "positions", "usePositions" ); + Native.forClass( "sun.font.GlyphLayout$GVData" ) + .registerFieldsForJni( "_count", "_flags", "_glyphs", "_indices", "_positions" ) + .registerMethodForJni( "grow" ); + Native.forClass( "sun.font.PhysicalStrike" ) + .registerFieldsForJni( "pScalerContext" ) + .registerMethodForJni( "adjustPoint", java.awt.geom.Point2D.Float.class ) + .registerMethodForJni( "getGlyphPoint", int.class, int.class ); + Native.forClass( "sun.font.StrikeMetrics" ) + .registerConstructorForJni( float.class, float.class, float.class, float.class, float.class, float.class, float.class, + float.class, float.class, float.class ); + Native.forClass( "sun.font.TrueTypeFont" ) + .registerMethodForJni( "readBlock", java.nio.ByteBuffer.class, int.class, int.class ) + .registerMethodForJni( "readBytes", int.class, int.class ); + Native.forClass( "sun.font.Type1Font" ) + .registerMethodForJni( "readFile", java.nio.ByteBuffer.class ); + + if ( isWindows() ) { + Native.forClass( "sun.awt.FontConfiguration" ) + .registerEverythingForReflection(); + Native.addResource( "fontconfig.bfc" ); + } + } +} diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/EsmfFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/EsmfFeature.java new file mode 100644 index 000000000..3d8d85937 --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/EsmfFeature.java @@ -0,0 +1,108 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import java.util.List; + +import org.eclipse.esmf.aspectmodel.java.JavaCodeGenerationConfig; + +import org.graalvm.nativeimage.hosted.Feature; + +/** + * Build time initialization for esmf-sdk in native-image context + */ +public class EsmfFeature implements Feature { + @Override + public void beforeAnalysis( final BeforeAnalysisAccess access ) { + Native.forClass( com.google.common.collect.Range.class ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.tools.javac.file.BaseFileManager" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.tools.javac.file.JavacFileManager" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.tools.javac.file.Locations" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.tools.javac.util.Context" ) + .initializeAtBuildTime(); + Native.forClass( "jdk.internal.net.http.HttpClientImpl" ) + .initializeAtBuildTime(); + Native.forClass( "jdk.internal.net.http.HttpClientImpl$SelectorManager" ) + .initializeAtBuildTime(); + Native.forClass( "jdk.internal.net.http.common.Utils" ) + .initializeAtBuildTime(); + + Native.addResourceBundle( "com.sun.tools.javac.resources.compiler" ); + Native.addResourceBundle( "com.sun.tools.javac.resources.javac" ); + + Native.forClass( "sun.util.resources.LocaleData$LocaleDataStrategy" ) + .registerEverythingForReflection(); + Native.forClass( "sun.util.resources.LocaleData" ) + .registerEverythingForReflection(); + + Native.forClass( java.util.concurrent.atomic.AtomicBoolean.class ) + .registerFieldsForReflection( "value" ); + Native.forClass( org.eclipse.esmf.metamodel.impl.DefaultScalarValue.class ) + .registerEverythingForReflection(); + Native.forClass( org.eclipse.esmf.metamodel.impl.DefaultProperty.class ) + .registerEverythingForReflection(); + Native.forClass( org.eclipse.esmf.aspectmodel.loader.DefaultPropertyWrapper.class ) + .registerEverythingForReflection(); + Native.forClass( JavaCodeGenerationConfig.class ) + .registerEverythingForReflection(); + + Native.forClass( java.lang.Thread.class ) + .registerEverythingForReflection() + .registerEverythingForJni(); + Native.forClass( java.lang.Boolean.class ) + .registerMethodForReflection( "getBoolean", String.class ); + Native.forClass( java.lang.System.class ) + .registerMethodForReflection( "load", String.class ) + .registerMethodForReflection( "setProperty", String.class, String.class ); + Native.forClass( java.lang.String.class ) + .registerMethodForReflection( "toLowerCase", java.util.Locale.class ); + Native.forClass( java.util.ArrayList.class ) + .registerConstructorForReflection( int.class ) + .registerMethodForReflection( "add", Object.class ); + Native.forClass( java.util.HashMap.class ) + .registerMethodForReflection( "containsKey", Object.class ) + .registerMethodForReflection( "put", Object.class, Object.class ); + + // JDK and GraalVM config + Native.addResourcesPattern( "java.base:\\Qjdk/internal/icu/impl/data/icudt67b/ubidi.icu\\E" ); + Native.addResource( "META-INF/services/com.oracle.truffle.api.TruffleLanguage$Provider" ); + Native.addResource( "META-INF/services/com.oracle.truffle.api.instrumentation.TruffleInstrument$Provider" ); + Native.addResource( "META-INF/services/javax.script.ScriptEngineFactory" ); + Native.addResource( "com/oracle/truffle/nfi/impl/NFILanguageImpl.class" ); + + // ESMF artifacts generation config + Native.addResource( "openapi/*.json" ); + Native.addResource( "docu/static/*.*" ); + Native.addResource( "docu/styles/*.*" ); + Native.addResource( "docu/aspect-model.properties" ); + + // SAMM artifacts + Native.addResourcesPattern( "samm/[^/]*/([^/]*/)?[a-zA-Z0-9-]+\\.(ttl|js)" ); + } + + @Override + public List> getRequiredFeatures() { + return List.of( + AssetAdministrationShellFeature.class, + LogbackFeature.class, + ShaclJsFeature.class, + JenaFeature.class, + DiagramFeature.class + ); + } +} diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java new file mode 100644 index 000000000..381efddae --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java @@ -0,0 +1,102 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import org.graalvm.nativeimage.hosted.Feature; + +/** + * Configuration of eagerly initialized Jena classes + */ +public class JenaFeature implements Feature { + @Override + public void beforeAnalysis( final Feature.BeforeAnalysisAccess access ) { + Native.forClass( "com.sun.org.apache.xerces.internal.impl.Constants" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityManager" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityManager$EncodingInfo" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityScanner" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLScanner" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.XMLVersionDetector" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLNSDTDValidator" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.impl.dv.dtd.DTDDVFactoryImpl" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.util.FeatureState" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.util.PropertyState" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.util.XMLChar" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.util.XMLSymbols" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.org.apache.xerces.internal.xni.NamespaceContext" ) + .initializeAtBuildTime(); + Native.forClass( "com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator" ) + .initializeAtBuildTime(); + Native.forClass( "javax.xml.parsers.FactoryFinder" ) + .initializeAtBuildTime(); + Native.forClass( "jdk.xml.internal.JdkXmlUtils" ) + .initializeAtBuildTime(); + Native.forClass( "jdk.xml.internal.SecuritySupport" ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.AnyURIDV.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.BaseSchemaDVFactory.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.QNameDV.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.SchemaDVFactoryImpl.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class ) + .initializeAtBuildTime(); + Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$CharToken" ) + .initializeAtBuildTime(); + Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ClosureToken" ) + .initializeAtBuildTime(); + Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ParenToken" ) + .initializeAtBuildTime(); + Native.forClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$UnionToken" ) + .initializeAtBuildTime(); + Native.forClass( org.apache.jena.ext.xerces.util.XercesXMLChar.class ) + .initializeAtBuildTime(); + + Native.addResource( "META-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle" ); + Native.addResource( "org/apache/jena/arq/arq-properties.xml" ); + Native.addResource( "org/apache/jena/jena-properties.xml" ); + + Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.xpath.regex.message" ); + Native.addResourceBundle( "org.apache.jena.ext.xerces.impl.msg.XMLSchemaMessages" ); + } +} diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java new file mode 100644 index 000000000..b10936713 --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java @@ -0,0 +1,179 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import org.graalvm.nativeimage.hosted.Feature; + +/** + * Configuration of eagerly initialized SLF4J and Logback classes for native image builds + */ +public class LogbackFeature implements Feature { + @Override + public void beforeAnalysis( final Feature.BeforeAnalysisAccess access ) { + Native.forClass( ch.qos.logback.classic.Level.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.Logger.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.PatternLayout.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.CoreConstants.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.parser.Parser.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.spi.AppenderAttachableImpl.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.status.InfoStatus.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.status.StatusBase.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.util.Loader.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.util.StatusPrinter.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.util.StatusPrinter2.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + + Native.forClass( org.apache.logging.log4j.spi.Provider.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.ProviderUtil.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.Strings.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.Constants.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.spi.AbstractLogger.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.message.ReusableMessageFactory.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.OsgiServiceLocator.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.status.StatusLogger.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.Level.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.PropertiesUtil.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.LoaderUtil.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.util.PropertySource.Util.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.spi.StandardLevel.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.spi.LoggerRegistry.class ) + .initializeAtBuildTime(); + Native.forClass( org.apache.logging.log4j.simple.SimpleLogger.class ) + .initializeAtBuildTime(); + + Native.forClass( org.slf4j.LoggerFactory.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + Native.forClass( org.slf4j.helpers.Reporter.class ) + .initializeAtBuildTime() + .registerEverythingForReflection(); + + Native.forClass( ch.qos.logback.classic.pattern.ClassOfCallerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ClassOfCallerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ContextNameConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.DateConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.FileOfCallerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.LevelConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.LineOfCallerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.LineSeparatorConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.LocalSequenceNumberConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.LoggerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.MDCConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.MarkerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.MessageConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.MethodOfCallerConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.NopThrowableInformationConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.PropertyConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.RelativeTimeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.RootCauseFirstThrowableProxyConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ThreadConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.ThrowableProxyConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.IdentityCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.ReplacingCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BlackCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldBlueCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldCyanCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldGreenCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldMagentaCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldRedCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldWhiteCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.BoldYellowCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.CyanCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.GrayCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.GreenCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.MagentaCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.RedCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.WhiteCompositeConverter.class ) + .registerEverythingForReflection(); + Native.forClass( ch.qos.logback.core.pattern.color.YellowCompositeConverter.class ) + .registerEverythingForReflection(); + + Native.addResource( "org/slf4j/impl/StaticLoggerBinder.class" ); + } +} diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/Native.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/Native.java new file mode 100644 index 000000000..0b7299225 --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/Native.java @@ -0,0 +1,446 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import static org.graalvm.nativeimage.impl.ConfigurationCondition.alwaysTrue; + +import java.lang.reflect.Constructor; +import java.lang.reflect.Executable; +import java.lang.reflect.Field; +import java.lang.reflect.Method; +import java.util.Arrays; +import java.util.Collection; +import java.util.Locale; +import java.util.function.Supplier; +import java.util.stream.Collectors; +import javax.annotation.Nonnull; + +import org.eclipse.esmf.substitution.IsLinux; +import org.eclipse.esmf.substitution.IsWindows; + +import com.oracle.svm.core.configure.ResourcesRegistry; +import org.graalvm.nativeimage.ImageInfo; +import org.graalvm.nativeimage.ImageSingletons; +import org.graalvm.nativeimage.impl.ConfigurationCondition; +import org.graalvm.nativeimage.impl.RuntimeClassInitializationSupport; +import org.graalvm.nativeimage.impl.RuntimeJNIAccessSupport; +import org.graalvm.nativeimage.impl.RuntimeReflectionSupport; + +/** + * Helper class for registration of resources, classes etc. for GraalVM native image compilation. + */ +public class Native { + private final Class clazz; + private static final Supplier RESOURCES_REGISTRY; + private static final Supplier RUNTIME_CLASS_INITIALIZATION_SUPPORT; + private static final Supplier RUNTIME_REFLECTION_SUPPORT; + private static final Supplier RUNTIME_JNI_ACCESS_SUPPORT; + + static { + /* + If the class runs in regular Java context (i.e., outside native-image compilation) the native runtime access + is replaced with dummy implementations. This turns all native setup calls into NOP calls instead of throwing + exceptions, which allows testing class instantiation from the Feature classes. + */ + if ( ImageInfo.inImageBuildtimeCode() ) { + RESOURCES_REGISTRY = () -> ImageSingletons.lookup( ResourcesRegistry.class ); + RUNTIME_CLASS_INITIALIZATION_SUPPORT = () -> ImageSingletons.lookup( RuntimeClassInitializationSupport.class ); + RUNTIME_REFLECTION_SUPPORT = () -> ImageSingletons.lookup( RuntimeReflectionSupport.class ); + RUNTIME_JNI_ACCESS_SUPPORT = () -> ImageSingletons.lookup( RuntimeJNIAccessSupport.class ); + } else { + RESOURCES_REGISTRY = DummyResourcesRegistry::new; + RUNTIME_CLASS_INITIALIZATION_SUPPORT = DummyRuntimeClassInitializationSupport::new; + RUNTIME_REFLECTION_SUPPORT = DummyRuntimeReflectionSupport::new; + RUNTIME_JNI_ACCESS_SUPPORT = DummyRuntimeJniAccessSupport::new; + } + } + + private Native( final Class clazz ) { + this.clazz = clazz; + } + + public static Native forClass( final Class clazz ) { + return new Native( clazz ); + } + + public static Native forArrayClass( final String fullyQualifiedJavaClass ) { + return forClass( "[L" + fullyQualifiedJavaClass + ";" ); + } + + public static Native forClass( final String fullyQualifiedJavaClass ) { + final Class clazz; + try { + clazz = Class.forName( fullyQualifiedJavaClass, false, Native.class.getClassLoader() ); + } catch ( final ClassNotFoundException exception ) { + throw new RuntimeException( exception ); + } + return forClass( clazz ); + } + + public Native initializeAtBuildTime() { + final StackTraceElement[] stacktrace = Thread.currentThread().getStackTrace(); + final String unqualifiedName = clazz.getTypeName().substring( clazz.getTypeName().lastIndexOf( '.' ) + 1 ); + final String caller = stacktrace[1].getClassName() + "." + stacktrace[1].getMethodName(); + final String reason = "from feature %s with '%s.class'".formatted( caller, unqualifiedName ); + RUNTIME_CLASS_INITIALIZATION_SUPPORT.get().initializeAtBuildTime( clazz, reason ); + return this; + } + + public Native registerEverythingForReflection() { + return registerClassForReflection() + .registerAllFieldsForReflection() + .registerAllConstructorsForReflection() + .registerAllMethodsForReflection(); + } + + public Native registerClassForReflection() { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), clazz ); + return this; + } + + public Native registerAllFieldsForReflection() { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredFields() ); + return this; + } + + public Native registerFieldsForReflection( @Nonnull final String... fieldNames ) { + for ( final Field field : clazz.getDeclaredFields() ) { + for ( final String targetField : fieldNames ) { + if ( field.getName().equals( targetField ) ) { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, field ); + } + } + } + return this; + } + + public Native registerAllConstructorsForReflection() { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredConstructors() ); + return this; + } + + public Native registerConstructorForReflection( @Nonnull final Class... args ) { + try { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredConstructor( args ) ); + } catch ( final NoSuchMethodException exception ) { + throw new RuntimeException( "Could not find constructor in " + clazz + " with args " + + Arrays.stream( args ).map( Class::toString ).collect( Collectors.joining( ",", "[", "]" ) ) ); + } + return this; + } + + public Native registerAllMethodsForReflection() { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredMethods() ); + return this; + } + + public Native registerMethodForReflection( final String name, @Nonnull final Class... args ) { + try { + RUNTIME_REFLECTION_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredMethod( name, args ) ); + } catch ( final NoSuchMethodException exception ) { + throw new RuntimeException( "Could not find method " + name + " in " + clazz + " with args " + + Arrays.stream( args ).map( Class::toString ).collect( Collectors.joining( ",", "[", "]" ) ) ); + } + return this; + } + + public Native registerEverythingForJni() { + return registerClassForJni() + .registerAllFieldsForJni() + .registerAllConstructorsForJni() + .registerAllMethodsForJni(); + } + + public Native registerClassForJni() { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), clazz ); + return this; + } + + public Native registerAllFieldsForJni() { + for ( final Field field : clazz.getDeclaredFields() ) { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, field ); + } + return this; + } + + public Native registerFieldsForJni( @Nonnull final String... fieldNames ) { + for ( final Field field : clazz.getDeclaredFields() ) { + for ( final String targetField : fieldNames ) { + if ( field.getName().equals( targetField ) ) { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, field ); + } + } + } + return this; + } + + public Native registerAllConstructorsForJni() { + for ( final Constructor constructor : clazz.getDeclaredConstructors() ) { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, constructor ); + } + return this; + } + + public Native registerConstructorForJni( @Nonnull final Class... args ) { + try { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredConstructor( args ) ); + } catch ( final NoSuchMethodException exception ) { + throw new RuntimeException( "Could not find constructor in " + clazz + " with args " + + Arrays.stream( args ).map( Class::toString ).collect( Collectors.joining( ",", "[", "]" ) ) ); + } + return this; + } + + public Native registerAllMethodsForJni() { + for ( final Method method : clazz.getDeclaredMethods() ) { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, method ); + } + return this; + } + + public Native registerMethodForJni( final String name, @Nonnull final Class... args ) { + try { + RUNTIME_JNI_ACCESS_SUPPORT.get().register( alwaysTrue(), false, clazz.getDeclaredMethod( name, args ) ); + } catch ( final NoSuchMethodException exception ) { + throw new RuntimeException( "Could not find method " + name + " in " + clazz + " with args " + + Arrays.stream( args ).map( Class::toString ).collect( Collectors.joining( ",", "[", "]" ) ) ); + } + return this; + } + + public static void addResource( final String resource ) { + RESOURCES_REGISTRY.get().addResources( alwaysTrue(), "\\Q" + resource + "\\E" ); + } + + public static void addResourcesPattern( final String pattern ) { + RESOURCES_REGISTRY.get().addResources( alwaysTrue(), pattern ); + } + + public static void addResourceBundle( final String name ) { + RESOURCES_REGISTRY.get().addResourceBundles( alwaysTrue(), name ); + } + + public static void addClassBasedResourceBundle( final String name, final String className ) { + RESOURCES_REGISTRY.get().addClassBasedResourceBundle( alwaysTrue(), name, className ); + } + + /** + * Returns the class for the given class name. + * + * @param className the class name + * @return the class + */ + public static Class clazz( final String className ) { + try { + return Class.forName( className ); + } catch ( final ClassNotFoundException exception ) { + throw new RuntimeException( "Could not access for reflection registry", exception ); + } + } + + protected static boolean isLinux() { + return new IsLinux().getAsBoolean(); + } + + protected static boolean isWindows() { + return new IsWindows().getAsBoolean(); + } + + private static class DummyResourcesRegistry implements ResourcesRegistry { + @Override + public void addClassBasedResourceBundle( final ConfigurationCondition condition, final String basename, final String className ) { + // nothing + } + + @Override + public void addResources( final ConfigurationCondition condition, final String pattern ) { + // nothing + } + + @Override + public void injectResource( final Module module, final String resourcePath, final byte[] resourceContent ) { + // nothing + } + + @Override + public void ignoreResources( final ConfigurationCondition condition, final String pattern ) { + // nothing + } + + @Override + public void addResourceBundles( final ConfigurationCondition condition, final String name ) { + // nothing + } + + @Override + public void addResourceBundles( final ConfigurationCondition condition, final String basename, final Collection locales ) { + // nothing + } + } + + private static class DummyRuntimeClassInitializationSupport implements RuntimeClassInitializationSupport { + @Override + public void initializeAtRunTime( final String name, final String reason ) { + // nothing + } + + @Override + public void initializeAtBuildTime( final String name, final String reason ) { + // nothing + } + + @Override + public void rerunInitialization( final String name, final String reason ) { + // nothing + } + + @Override + public void initializeAtRunTime( final Class clazz, final String reason ) { + // nothing + } + + @Override + public void rerunInitialization( final Class clazz, final String reason ) { + // nothing + } + + @Override + public void initializeAtBuildTime( final Class clazz, final String reason ) { + // nothing + } + } + + private static class DummyRuntimeJniAccessSupport implements RuntimeJNIAccessSupport { + @Override + public void register( final ConfigurationCondition condition, final boolean unsafeAllocated, final Class clazz ) { + // nothing + } + + @Override + public void register( final ConfigurationCondition condition, final boolean queriedOnly, final Executable... methods ) { + // nothing + } + + @Override + public void register( final ConfigurationCondition condition, final boolean finalIsWritable, final Field... fields ) { + // nothing + } + } + + private static class DummyRuntimeReflectionSupport implements RuntimeReflectionSupport { + @Override + public void registerAllMethodsQuery( final ConfigurationCondition condition, final boolean queriedOnly, final Class clazz ) { + // nothing + } + + @Override + public void registerAllDeclaredMethodsQuery( final ConfigurationCondition condition, final boolean queriedOnly, + final Class clazz ) { + // nothing + } + + @Override + public void registerAllFieldsQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllDeclaredFieldsQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllConstructorsQuery( final ConfigurationCondition condition, final boolean queriedOnly, final Class clazz ) { + //nothing + } + + @Override + public void registerAllDeclaredConstructorsQuery( final ConfigurationCondition condition, final boolean queriedOnly, + final Class clazz ) { + //nothing + } + + @Override + public void registerAllClassesQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllDeclaredClassesQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllRecordComponentsQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllPermittedSubclassesQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllNestMembersQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerAllSignersQuery( final ConfigurationCondition condition, final Class clazz ) { + //nothing + } + + @Override + public void registerClassLookupException( final ConfigurationCondition condition, final String typeName, final Throwable t ) { + //nothing + } + + @Override + public void registerClassLookup( final ConfigurationCondition condition, final String typeName ) { + //nothing + } + + @Override + public void registerFieldLookup( final ConfigurationCondition condition, final Class declaringClass, final String fieldName ) { + //nothing + } + + @Override + public void registerMethodLookup( final ConfigurationCondition condition, final Class declaringClass, final String methodName, + final Class... parameterTypes ) { + //nothing + } + + @Override + public void registerConstructorLookup( final ConfigurationCondition condition, final Class declaringClass, + final Class... parameterTypes ) { + //nothing + } + + @Override + public void register( final ConfigurationCondition condition, final boolean unsafeAllocated, final Class clazz ) { + //nothing + } + + @Override + public void register( final ConfigurationCondition condition, final boolean queriedOnly, final Executable... methods ) { + //nothing + } + + @Override + public void register( final ConfigurationCondition condition, final boolean finalIsWritable, final Field... fields ) { + //nothing + } + } +} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java similarity index 50% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java index cf7ffa506..fef0af92c 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/nativefeatures/ShaclJsFeature.java @@ -22,17 +22,31 @@ import org.eclipse.esmf.aspectmodel.shacl.constraint.js.JsTriple; import org.eclipse.esmf.aspectmodel.shacl.constraint.js.TermFactory; -public class ShaclJsFeature extends AbstractSammCliFeature { +import org.graalvm.nativeimage.hosted.Feature; + +/** + * Sets up classes for native image compilation that are required for evaluation of SHACL JS Constraints in the Aspect Model Validator. + */ +public class ShaclJsFeature implements Feature { @Override public void beforeAnalysis( final BeforeAnalysisAccess access ) { - register( JsBlankNode.class ); - register( JsFactory.class ); - register( JsGraph.class ); - register( JsGraph.JsTripleIterator.class ); - register( JsLiteral.class ); - register( JsNamedNode.class ); - register( JsTerm.class ); - register( JsTriple.class ); - register( TermFactory.class ); + Native.forClass( JsBlankNode.class ) + .registerEverythingForReflection(); + Native.forClass( JsFactory.class ) + .registerEverythingForReflection(); + Native.forClass( JsGraph.class ) + .registerEverythingForReflection(); + Native.forClass( JsGraph.JsTripleIterator.class ) + .registerEverythingForReflection(); + Native.forClass( JsLiteral.class ) + .registerEverythingForReflection(); + Native.forClass( JsNamedNode.class ) + .registerEverythingForReflection(); + Native.forClass( JsTerm.class ) + .registerEverythingForReflection(); + Native.forClass( JsTriple.class ) + .registerEverythingForReflection(); + Native.forClass( TermFactory.class ) + .registerEverythingForReflection(); } } diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java similarity index 80% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java index 1ef4ff01f..ff10267c0 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/AdminShellConfig.java @@ -42,6 +42,10 @@ public class AdminShellConfig { public Set interfaces; public List> enums; public Set> interfacesWithoutDefaultImplementation; + public Set> classesInModelPackage; + public Set> classesInDefaultImplementationPackage; + public Set> classesInJsonMixinsPackage; + public Set> classesInXmlMixinsPackage; private static final String PREFIX = AdminShellConfig.class.getPackageName() + ".adminshell."; private static final String TYPES_WITH_MODEL_TYPE = PREFIX + "typesWithModelTypes"; @@ -52,13 +56,17 @@ public class AdminShellConfig { private static final String INTERFACES = PREFIX + "interfaces"; private static final String ENUMS = PREFIX + "enums"; private static final String INTERFACES_WITHOUT_DEFAULT_IMPLEMENTATION = PREFIX + "interfacesWithoutDefaultImplementation"; + private static final String CLASSES_IN_MODEL_PACKAGE = PREFIX + "classesInModelPackage"; + private static final String CLASSES_IN_DEFAULT_IMPLEMENTATIONP_PACKAGE = PREFIX + "classesInDefaultImplementationPackage"; + private static final String CLASSES_IN_JSON_MIXINS_PACKAGE = PREFIX + "classesInJsonMixinsPackage"; + private static final String CLASSES_IN_XML_MIXINS_PACKAGE = PREFIX + "classesInXmlMixinsPackage"; private String serialize( final Class clazz ) { return clazz.getName(); } private > String serialize( final C collection, final Function mapper ) { - return collection.stream().map( mapper::apply ).collect( Collectors.joining( "," ) ); + return collection.stream().map( mapper ).collect( Collectors.joining( "," ) ); } private String serialize( final Map map, final Function keyMapper, final Function valueMapper ) { @@ -82,6 +90,11 @@ public Properties toProperties() { properties.setProperty( ENUMS, serialize( enums, this::serialize ) ); properties.setProperty( INTERFACES_WITHOUT_DEFAULT_IMPLEMENTATION, serialize( interfacesWithoutDefaultImplementation, this::serialize ) ); + properties.setProperty( CLASSES_IN_MODEL_PACKAGE, serialize( classesInModelPackage, this::serialize ) ); + properties.setProperty( CLASSES_IN_DEFAULT_IMPLEMENTATIONP_PACKAGE, + serialize( classesInDefaultImplementationPackage, this::serialize ) ); + properties.setProperty( CLASSES_IN_JSON_MIXINS_PACKAGE, serialize( classesInJsonMixinsPackage, this::serialize ) ); + properties.setProperty( CLASSES_IN_XML_MIXINS_PACKAGE, serialize( classesInXmlMixinsPackage, this::serialize ) ); return properties; } @@ -138,6 +151,14 @@ public static AdminShellConfig fromProperties( final Properties properties ) { config.interfacesWithoutDefaultImplementation = deserializeCollection( properties.getProperty( INTERFACES_WITHOUT_DEFAULT_IMPLEMENTATION ), AdminShellConfig::deserializeClass, Collectors.toSet() ); + config.classesInModelPackage = deserializeCollection( properties.getProperty( CLASSES_IN_MODEL_PACKAGE ), + AdminShellConfig::deserializeClass, Collectors.toSet() ); + config.classesInDefaultImplementationPackage = deserializeCollection( + properties.getProperty( CLASSES_IN_DEFAULT_IMPLEMENTATIONP_PACKAGE ), AdminShellConfig::deserializeClass, Collectors.toSet() ); + config.classesInJsonMixinsPackage = deserializeCollection( + properties.getProperty( CLASSES_IN_JSON_MIXINS_PACKAGE ), AdminShellConfig::deserializeClass, Collectors.toSet() ); + config.classesInXmlMixinsPackage = deserializeCollection( + properties.getProperty( CLASSES_IN_XML_MIXINS_PACKAGE ), AdminShellConfig::deserializeClass, Collectors.toSet() ); return config; } diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/DummyLogger.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/DummyLogger.java new file mode 100644 index 000000000..40e993d0a --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/DummyLogger.java @@ -0,0 +1,2010 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.substitution; + +import org.apache.logging.log4j.Level; +import org.apache.logging.log4j.Logger; +import org.apache.logging.log4j.Marker; +import org.apache.logging.log4j.message.EntryMessage; +import org.apache.logging.log4j.message.FlowMessageFactory; +import org.apache.logging.log4j.message.Message; +import org.apache.logging.log4j.message.MessageFactory; +import org.apache.logging.log4j.util.MessageSupplier; +import org.apache.logging.log4j.util.Supplier; + +public class DummyLogger implements Logger { + @Override + public void catching( final Level level, final Throwable throwable ) { + + } + + @Override + public void catching( final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final Message message ) { + + } + + @Override + public void debug( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void debug( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final CharSequence message ) { + + } + + @Override + public void debug( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final Object message ) { + + } + + @Override + public void debug( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final String message ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void debug( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void debug( final Message message ) { + + } + + @Override + public void debug( final Message message, final Throwable throwable ) { + + } + + @Override + public void debug( final MessageSupplier messageSupplier ) { + + } + + @Override + public void debug( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void debug( final CharSequence message ) { + + } + + @Override + public void debug( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void debug( final Object message ) { + + } + + @Override + public void debug( final Object message, final Throwable throwable ) { + + } + + @Override + public void debug( final String message ) { + + } + + @Override + public void debug( final String message, final Object... params ) { + + } + + @Override + public void debug( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void debug( final String message, final Throwable throwable ) { + + } + + @Override + public void debug( final Supplier messageSupplier ) { + + } + + @Override + public void debug( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void debug( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void debug( final String message, final Object p0 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void debug( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } + + @Override + public void entry() { + + } + + @Override + public void entry( final Object... params ) { + + } + + @Override + public void error( final Marker marker, final Message message ) { + + } + + @Override + public void error( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void error( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final CharSequence message ) { + + } + + @Override + public void error( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final Object message ) { + + } + + @Override + public void error( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final String message ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void error( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void error( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void error( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void error( final Message message ) { + + } + + @Override + public void error( final Message message, final Throwable throwable ) { + + } + + @Override + public void error( final MessageSupplier messageSupplier ) { + + } + + @Override + public void error( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void error( final CharSequence message ) { + + } + + @Override + public void error( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void error( final Object message ) { + + } + + @Override + public void error( final Object message, final Throwable throwable ) { + + } + + @Override + public void error( final String message ) { + + } + + @Override + public void error( final String message, final Object... params ) { + + } + + @Override + public void error( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void error( final String message, final Throwable throwable ) { + + } + + @Override + public void error( final Supplier messageSupplier ) { + + } + + @Override + public void error( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void error( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void error( final String message, final Object p0 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void error( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } + + @Override + public void exit() { + + } + + @Override + public R exit( final R result ) { + return null; + } + + @Override + public void fatal( final Marker marker, final Message message ) { + + } + + @Override + public void fatal( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void fatal( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final CharSequence message ) { + + } + + @Override + public void fatal( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final Object message ) { + + } + + @Override + public void fatal( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final String message ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void fatal( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void fatal( final Message message ) { + + } + + @Override + public void fatal( final Message message, final Throwable throwable ) { + + } + + @Override + public void fatal( final MessageSupplier messageSupplier ) { + + } + + @Override + public void fatal( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void fatal( final CharSequence message ) { + + } + + @Override + public void fatal( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Object message ) { + + } + + @Override + public void fatal( final Object message, final Throwable throwable ) { + + } + + @Override + public void fatal( final String message ) { + + } + + @Override + public void fatal( final String message, final Object... params ) { + + } + + @Override + public void fatal( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void fatal( final String message, final Throwable throwable ) { + + } + + @Override + public void fatal( final Supplier messageSupplier ) { + + } + + @Override + public void fatal( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void fatal( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void fatal( final String message, final Object p0 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void fatal( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } + + @Override + public Level getLevel() { + return null; + } + + @Override + public M getMessageFactory() { + return null; + } + + @Override + public FlowMessageFactory getFlowMessageFactory() { + return null; + } + + @Override + public String getName() { + return ""; + } + + @Override + public void info( final Marker marker, final Message message ) { + + } + + @Override + public void info( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void info( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final CharSequence message ) { + + } + + @Override + public void info( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final Object message ) { + + } + + @Override + public void info( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final String message ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void info( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void info( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void info( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void info( final Message message ) { + + } + + @Override + public void info( final Message message, final Throwable throwable ) { + + } + + @Override + public void info( final MessageSupplier messageSupplier ) { + + } + + @Override + public void info( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void info( final CharSequence message ) { + + } + + @Override + public void info( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void info( final Object message ) { + + } + + @Override + public void info( final Object message, final Throwable throwable ) { + + } + + @Override + public void info( final String message ) { + + } + + @Override + public void info( final String message, final Object... params ) { + + } + + @Override + public void info( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void info( final String message, final Throwable throwable ) { + + } + + @Override + public void info( final Supplier messageSupplier ) { + + } + + @Override + public void info( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void info( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void info( final String message, final Object p0 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void info( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } + + @Override + public boolean isDebugEnabled() { + return false; + } + + @Override + public boolean isDebugEnabled( final Marker marker ) { + return false; + } + + @Override + public boolean isEnabled( final Level level ) { + return false; + } + + @Override + public boolean isEnabled( final Level level, final Marker marker ) { + return false; + } + + @Override + public boolean isErrorEnabled() { + return false; + } + + @Override + public boolean isErrorEnabled( final Marker marker ) { + return false; + } + + @Override + public boolean isFatalEnabled() { + return false; + } + + @Override + public boolean isFatalEnabled( final Marker marker ) { + return false; + } + + @Override + public boolean isInfoEnabled() { + return false; + } + + @Override + public boolean isInfoEnabled( final Marker marker ) { + return false; + } + + @Override + public boolean isTraceEnabled() { + return false; + } + + @Override + public boolean isTraceEnabled( final Marker marker ) { + return false; + } + + @Override + public boolean isWarnEnabled() { + return false; + } + + @Override + public boolean isWarnEnabled( final Marker marker ) { + return false; + } + + @Override + public void log( final Level level, final Marker marker, final Message message ) { + + } + + @Override + public void log( final Level level, final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void log( final Level level, final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final CharSequence message ) { + + } + + @Override + public void log( final Level level, final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final Object message ) { + + } + + @Override + public void log( final Level level, final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void log( final Level level, final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Message message ) { + + } + + @Override + public void log( final Level level, final Message message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final MessageSupplier messageSupplier ) { + + } + + @Override + public void log( final Level level, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final CharSequence message ) { + + } + + @Override + public void log( final Level level, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Object message ) { + + } + + @Override + public void log( final Level level, final Object message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final String message ) { + + } + + @Override + public void log( final Level level, final String message, final Object... params ) { + + } + + @Override + public void log( final Level level, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void log( final Level level, final String message, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Supplier messageSupplier ) { + + } + + @Override + public void log( final Level level, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4, final Object p5 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4, final Object p5, + final Object p6 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4, final Object p5, final Object p6, + final Object p7, final Object p8 ) { + + } + + @Override + public void log( final Level level, final Marker marker, final String message, final Object p0, final Object p1, final Object p2, + final Object p3, final Object p4, final Object p5, final Object p6, + final Object p7, final Object p8, final Object p9 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void log( final Level level, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void printf( final Level level, final Marker marker, final String format, final Object... params ) { + + } + + @Override + public void printf( final Level level, final String format, final Object... params ) { + + } + + @Override + public T throwing( final Level level, final T throwable ) { + return null; + } + + @Override + public T throwing( final T throwable ) { + return null; + } + + @Override + public void trace( final Marker marker, final Message message ) { + + } + + @Override + public void trace( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void trace( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final CharSequence message ) { + + } + + @Override + public void trace( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final Object message ) { + + } + + @Override + public void trace( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final String message ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void trace( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void trace( final Message message ) { + + } + + @Override + public void trace( final Message message, final Throwable throwable ) { + + } + + @Override + public void trace( final MessageSupplier messageSupplier ) { + + } + + @Override + public void trace( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void trace( final CharSequence message ) { + + } + + @Override + public void trace( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void trace( final Object message ) { + + } + + @Override + public void trace( final Object message, final Throwable throwable ) { + + } + + @Override + public void trace( final String message ) { + + } + + @Override + public void trace( final String message, final Object... params ) { + + } + + @Override + public void trace( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void trace( final String message, final Throwable throwable ) { + + } + + @Override + public void trace( final Supplier messageSupplier ) { + + } + + @Override + public void trace( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void trace( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void trace( final String message, final Object p0 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void trace( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } + + @Override + public EntryMessage traceEntry() { + return null; + } + + @Override + public EntryMessage traceEntry( final String format, final Object... params ) { + return null; + } + + @Override + public EntryMessage traceEntry( final Supplier... paramSuppliers ) { + return null; + } + + @Override + public EntryMessage traceEntry( final String format, final Supplier... paramSuppliers ) { + return null; + } + + @Override + public EntryMessage traceEntry( final Message message ) { + return null; + } + + @Override + public void traceExit() { + + } + + @Override + public R traceExit( final R result ) { + return null; + } + + @Override + public R traceExit( final String format, final R result ) { + return null; + } + + @Override + public void traceExit( final EntryMessage message ) { + + } + + @Override + public R traceExit( final EntryMessage message, final R result ) { + return null; + } + + @Override + public R traceExit( final Message message, final R result ) { + return null; + } + + @Override + public void warn( final Marker marker, final Message message ) { + + } + + @Override + public void warn( final Marker marker, final Message message, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final MessageSupplier messageSupplier ) { + + } + + @Override + public void warn( final Marker marker, final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final CharSequence message ) { + + } + + @Override + public void warn( final Marker marker, final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final Object message ) { + + } + + @Override + public void warn( final Marker marker, final Object message, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final String message ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object... params ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final Supplier messageSupplier ) { + + } + + @Override + public void warn( final Marker marker, final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void warn( final Message message ) { + + } + + @Override + public void warn( final Message message, final Throwable throwable ) { + + } + + @Override + public void warn( final MessageSupplier messageSupplier ) { + + } + + @Override + public void warn( final MessageSupplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void warn( final CharSequence message ) { + + } + + @Override + public void warn( final CharSequence message, final Throwable throwable ) { + + } + + @Override + public void warn( final Object message ) { + + } + + @Override + public void warn( final Object message, final Throwable throwable ) { + + } + + @Override + public void warn( final String message ) { + + } + + @Override + public void warn( final String message, final Object... params ) { + + } + + @Override + public void warn( final String message, final Supplier... paramSuppliers ) { + + } + + @Override + public void warn( final String message, final Throwable throwable ) { + + } + + @Override + public void warn( final Supplier messageSupplier ) { + + } + + @Override + public void warn( final Supplier messageSupplier, final Throwable throwable ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, + final Object p7 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8 ) { + + } + + @Override + public void warn( final Marker marker, final String message, final Object p0, final Object p1, final Object p2, final Object p3, + final Object p4, final Object p5, final Object p6, final Object p7, + final Object p8, final Object p9 ) { + + } + + @Override + public void warn( final String message, final Object p0 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8 ) { + + } + + @Override + public void warn( final String message, final Object p0, final Object p1, final Object p2, final Object p3, final Object p4, + final Object p5, final Object p6, final Object p7, final Object p8, + final Object p9 ) { + + } +} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/DummyLoggerContextFactory.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/DummyLoggerContextFactory.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/DummyLoggerContextFactory.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/DummyLoggerContextFactory.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/ImplementationInfo.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/ImplementationInfo.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/ImplementationInfo.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/ImplementationInfo.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/IsLinux.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/IsLinux.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/IsLinux.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/IsLinux.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/IsWindows.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/IsWindows.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/IsWindows.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/IsWindows.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java similarity index 77% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java index 9acf7e3e9..2ae970ae5 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_LogManager.java @@ -17,7 +17,9 @@ import com.oracle.svm.core.annotate.RecomputeFieldValue; import com.oracle.svm.core.annotate.TargetClass; import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.spi.LoggerContextFactory; +import org.graalvm.nativeimage.hosted.FieldValueTransformer; /** * This is a GraalVM substitution class @@ -36,4 +38,15 @@ public final class Target_org_apache_logging_log4j_LogManager { @Alias @RecomputeFieldValue( kind = RecomputeFieldValue.Kind.FromAlias ) private static LoggerContextFactory factory = new DummyLoggerContextFactory(); + + @Alias + @RecomputeFieldValue( kind = RecomputeFieldValue.Kind.Custom, declClass = StatusLoggerInjector.class ) + private static Logger LOGGER; + + public static final class StatusLoggerInjector implements FieldValueTransformer { + @Override + public Object transform( final Object receiver, final Object originalValue ) { + return new DummyLogger(); + } + } } diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_util_ServiceLoaderUtil.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_util_ServiceLoaderUtil.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_util_ServiceLoaderUtil.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_logging_log4j_util_ServiceLoaderUtil.java diff --git a/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_poi_openxml4j_opc_OPCPackage.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_poi_openxml4j_opc_OPCPackage.java new file mode 100644 index 000000000..b0e511318 --- /dev/null +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_poi_openxml4j_opc_OPCPackage.java @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.substitution; + +import com.oracle.svm.core.annotate.Alias; +import com.oracle.svm.core.annotate.RecomputeFieldValue; +import com.oracle.svm.core.annotate.TargetClass; +import org.apache.logging.log4j.Logger; +import org.apache.poi.openxml4j.opc.OPCPackage; + +/** + * This is a GraalVM substitution class + * for {@link OPCPackage}. + * Reason: The hard reference to a Log4J logger is not resolveable/instantiatable at runtime, so it is replaced with + * a dummy logger. + */ +@TargetClass( OPCPackage.class ) +@SuppressWarnings( { + "unused", + "squid:S00101", // Class name uses GraalVM substitution class naming schema, see + // https://github.com/oracle/graal/tree/master/substratevm/src/com.oracle.svm.core/src/com/oracle/svm/core/jdk + "checkstyle:TypeName", + "checkstyle:AbbreviationAsWordInName", + "NewClassNamingConvention" } ) +public final class Target_org_apache_poi_openxml4j_opc_OPCPackage { + @SuppressWarnings( { "NonConstantLogger", "NonConstantFieldWithUpperCaseName" } ) + @Alias + @RecomputeFieldValue( kind = RecomputeFieldValue.Kind.FromAlias ) + private static Logger LOG = new DummyLogger(); +} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_velocity_runtime_parser_node_ASTMethod.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_velocity_runtime_parser_node_ASTMethod.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_velocity_runtime_parser_node_ASTMethod.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_apache_velocity_runtime_parser_node_ASTMethod.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java similarity index 98% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java index 6cd1020be..14b26962d 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.java @@ -13,6 +13,8 @@ package org.eclipse.esmf.substitution; +import static org.eclipse.esmf.nativefeatures.AssetAdministrationShellFeature.ADMINSHELL_PROPERTIES; + import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; @@ -138,7 +140,7 @@ public final class Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_inter static { try ( final InputStream input = Target_org_eclipse_digitaltwin_aas4j_v3_dataformat_core_internal_util_ReflectionHelper.class.getResourceAsStream( - "/adminshell.properties" ) ) { + "/" + ADMINSHELL_PROPERTIES ) ) { final Properties properties = new Properties(); properties.load( input ); final AdminShellConfig config = AdminShellConfig.fromProperties( properties ); diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_slf4j_LoggerFactory.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_slf4j_LoggerFactory.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_org_slf4j_LoggerFactory.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_org_slf4j_LoggerFactory.java diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java similarity index 89% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java index 09e2670c8..e8c804723 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java +++ b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_FontConfiguration.java @@ -17,7 +17,7 @@ import java.io.IOException; import java.io.InputStream; -import org.eclipse.esmf.SammCli; +import org.eclipse.esmf.nativefeatures.Native; import com.oracle.svm.core.annotate.Alias; import com.oracle.svm.core.annotate.Substitute; @@ -42,10 +42,10 @@ public final class Target_sun_awt_FontConfiguration { @Substitute private void readFontConfigFile( final File f ) { - try ( final InputStream inputStream = SammCli.class.getResourceAsStream( "/fontconfig.bfc" ) ) { + try ( final InputStream inputStream = Native.class.getResourceAsStream( "/fontconfig.bfc" ) ) { loadBinary( inputStream ); - } catch ( final IOException e ) { - throw new RuntimeException( e ); + } catch ( final IOException exception ) { + throw new RuntimeException( exception ); } } diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_X11FontManager.java b/core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_X11FontManager.java similarity index 100% rename from tools/samm-cli/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_X11FontManager.java rename to core/esmf-native-support/src/main/java/org/eclipse/esmf/substitution/Target_sun_awt_X11FontManager.java diff --git a/core/esmf-native-support/src/test/java/org/eclipse/esmf/nativefeatures/EsmfFeatureTest.java b/core/esmf-native-support/src/test/java/org/eclipse/esmf/nativefeatures/EsmfFeatureTest.java new file mode 100644 index 000000000..aea443ca7 --- /dev/null +++ b/core/esmf-native-support/src/test/java/org/eclipse/esmf/nativefeatures/EsmfFeatureTest.java @@ -0,0 +1,34 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import java.lang.reflect.InvocationTargetException; + +import org.graalvm.nativeimage.hosted.Feature; +import org.junit.jupiter.api.Test; + +public class EsmfFeatureTest { + /** + * This method can not test if registration of classes/methods/resources succeeds at native compilation time, but it can make sure + * that all classes that are instantiated from features at runtime using Class.forName, as well as fields, do in fact exist. + */ + @Test + void testClassInstantiation() throws NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException { + final Feature esmf = new EsmfFeature(); + esmf.beforeAnalysis( null ); + for ( final Class feature : esmf.getRequiredFeatures() ) { + feature.getDeclaredConstructor().newInstance().beforeAnalysis( null ); + } + } +} diff --git a/documentation/developer-guide/modules/ROOT/partials/esmf-native-support-artifact.adoc b/documentation/developer-guide/modules/ROOT/partials/esmf-native-support-artifact.adoc new file mode 100644 index 000000000..06152c3ef --- /dev/null +++ b/documentation/developer-guide/modules/ROOT/partials/esmf-native-support-artifact.adoc @@ -0,0 +1,31 @@ +[tabs] +==== +Maven:: ++ +-- +[source,maven,subs=attributes+] +---- + + org.eclipse.esmf + esmf-native-support + {esmf-sdk-version} + +---- +-- +Gradle Groovy DSL:: ++ +-- +[source,gradle,subs=attributes+] +---- +implementation 'org.eclipse.esmf:esmf-native-support:{esmf-sdk-version}' +---- +-- +Gradle Kotlin DSL:: ++ +-- +[source,gradle,subs=attributes+] +---- +implementation("org.eclipse.esmf:esmf-native-support:{esmf-sdk-version}") +---- +-- +==== diff --git a/documentation/developer-guide/modules/tooling-guide/pages/java-aspect-tooling.adoc b/documentation/developer-guide/modules/tooling-guide/pages/java-aspect-tooling.adoc index 8855e032c..47cb7a134 100644 --- a/documentation/developer-guide/modules/tooling-guide/pages/java-aspect-tooling.adoc +++ b/documentation/developer-guide/modules/tooling-guide/pages/java-aspect-tooling.adoc @@ -51,6 +51,15 @@ Aspect Model validation component require embedded JavaScript execution: building the native image; for more information see https://www.graalvm.org/22.3/reference-manual/polyglot-programming/[polyglot programming]. +[TIP] +===== +When using esmf-sdk with a GraalVM JDK and you target `native-image` compilation, add a +dependency to the `esmf-native-support` module. This will add the necessary configuration for +esmf-sdk resources, reflection and initialization that is required by the compiler: + +include::esmf-developer-guide:ROOT:partial$esmf-aspect-model-starter-artifact.adoc[] +===== + [[parsing-aspect-model-urns]] == Parsing Aspect Model URNs diff --git a/documentation/developer-guide/modules/tooling-guide/pages/samm-cli.adoc b/documentation/developer-guide/modules/tooling-guide/pages/samm-cli.adoc index 16dafe3b9..bb1eaf760 100644 --- a/documentation/developer-guide/modules/tooling-guide/pages/samm-cli.adoc +++ b/documentation/developer-guide/modules/tooling-guide/pages/samm-cli.adoc @@ -105,7 +105,7 @@ of model resolution] for more information. | _--language, -l_ : the language from the model for which the diagram should be generated (default: en) | | _--custom-resolver_ : use an external resolver for the resolution of the model elements | `samm aspect AspectModel.ttl to svg --custom-resolver "java -jar resolver.jar"` -.10+| [[asepct-to-java]] aspect to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java` +.10+| [[aspect-to-java]] aspect to java | Generate Java classes from an Aspect Model | `samm aspect AspectModel.ttl to java` | _--output-directory, -d_ : output directory to write files to (default: current directory) | | _--package-name, -pn_ : package to use for generated Java classes | `samm aspect AspectModel.ttl to java -pn org.company.product` diff --git a/pom.xml b/pom.xml index 372c29a3b..50a85624a 100644 --- a/pom.xml +++ b/pom.xml @@ -63,6 +63,7 @@ core/esmf-aspect-model-urn core/esmf-aspect-model-validator core/esmf-aspect-static-meta-model-java + core/esmf-native-support core/esmf-test-aspect-models core/esmf-test-resources tools/esmf-aspect-model-maven-plugin @@ -73,9 +74,15 @@ true + ${project.basedir}/src-buildtime + ${project.basedir}/src-gen + core/esmf-native-support/src-gen/main/resources/META-INF/native-image/${project.groupId}/esmf-native-support + + ${project.basedir}/../../${relative-native-config-path} 2.22.1 + 1.0 @@ -151,6 +158,11 @@ esmf-aspect-static-meta-model-java ${project.version} + + org.eclipse.esmf + esmf-native-support + ${project.version} + org.eclipse.esmf esmf-test-aspect-models @@ -252,6 +264,59 @@ + + + org.apache.maven.plugins + maven-surefire-plugin + + false + -agentlib:native-image-agent=config-merge-dir=${native-config-path} + + + + + org.apache.maven.plugins + maven-clean-plugin + false + + + + ${relative-native-config-path} + + + + + + + + native + + + + org.apache.maven.plugins + maven-surefire-plugin + + false + -agentlib:native-image-agent=config-merge-dir=${native-config-path} + + + + + org.apache.maven.plugins + maven-clean-plugin + false + + + + ${relative-native-config-path} + + + + + + + + diff --git a/tools/esmf-aspect-model-maven-plugin/pom.xml b/tools/esmf-aspect-model-maven-plugin/pom.xml index 69d880115..5f8c33def 100644 --- a/tools/esmf-aspect-model-maven-plugin/pom.xml +++ b/tools/esmf-aspect-model-maven-plugin/pom.xml @@ -100,6 +100,16 @@ true + + + org.apache.maven.plugins + maven-surefire-plugin + + false + + + + diff --git a/tools/samm-cli/pom.xml b/tools/samm-cli/pom.xml index 9470b5150..1db0763e8 100644 --- a/tools/samm-cli/pom.xml +++ b/tools/samm-cli/pom.xml @@ -31,11 +31,11 @@ jar org.eclipse.esmf.SammCli samm - ${project.build.directory}/classes/META-INF/native-image/${project.groupId}/${project.artifactId} ${project.artifactId}-${project.version}-for-native false + true false false @@ -53,6 +53,10 @@ org.eclipse.esmf esmf-aspect-model-github-resolver + + org.eclipse.esmf + esmf-native-support + com.fasterxml.jackson.core jackson-databind @@ -85,12 +89,6 @@ org.fusesource.jansi jansi - - - org.graalvm.nativeimage - svm - provided - org.graalvm.sdk graal-sdk @@ -144,10 +142,6 @@ true **/*.properties - **/*.html - **/*.js - **/*.txt - **/*.xml **/*.json @@ -164,8 +158,7 @@ ${main-class} --no-fallback - -cp ${project.build.directory}/${project.artifactId}-${project.version}.jar - + -cp ${project.build.directory}/${project.artifactId}-${project.version}.jar -Djava.awt.headless=true @@ -182,10 +175,8 @@ ${packaging-type} - ${project.build.directory}/${project.artifactId}-${project.version}.jar - + ${project.build.directory}/${project.artifactId}-${project.version}.jar ${project.build.directory}/${binary-name} - ${graalvm-config-path} 1 false @@ -223,44 +214,6 @@ - - - org.codehaus.mojo - exec-maven-plugin - - - - generate-admin-shell-reflection-config - process-classes - - java - - - - org.eclipse.esmf.buildtime.Aas4jClassSetup - - ${project.build.outputDirectory}/adminshell.properties - false - - - - - customize-resource-config - prepare-package - - java - - - - org.eclipse.esmf.buildtime.CustomizeGraalVmConfigs - - ${project.build.outputDirectory}/META-INF/native-image/${project.groupId}/${project.artifactId} - false - - - - - org.apache.maven.plugins @@ -495,9 +448,7 @@ esmf-test-aspect-models jar true - - ${project.build.outputDirectory} - + ${project.build.outputDirectory} **/*.ttl @@ -517,16 +468,8 @@ ${picocli-version} - - -Aproject=${project.groupId}/${project.artifactId} - --add-exports - java.desktop/sun.awt=ALL-UNNAMED - --add-exports - java.desktop/sun.font=ALL-UNNAMED - --add-exports - org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED - - true + true + false @@ -544,12 +487,12 @@ + ${skip.maven.failsafe} ${packaging-type} ${project.build.directory}/${project.artifactId}-${project.version}.jar ${project.build.directory}/${binary-name} - ${graalvm-config-path} 1 true -Xmx4096m @@ -583,14 +526,6 @@ - - - org.apache.maven.plugins - maven-javadoc-plugin - - org.eclipse.esmf.substitution - - @@ -608,7 +543,7 @@ org.codehaus.mojo wagon-maven-plugin - 1.0 + ${wagon-maven-plugin-version} copy-fontconfig-bfc @@ -633,6 +568,7 @@ native true + false true true @@ -662,12 +598,8 @@ --enable-https --no-fallback --report-unsupported-elements-at-runtime - --features=org.eclipse.esmf.nativefeatures.SammCliFeatures + --features=org.eclipse.esmf.nativefeatures.SammCliFeature --language:js - -H:JNIConfigurationFiles=src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}/jni-config.json - -H:DynamicProxyConfigurationFiles=src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}/proxy-config.json - -H:ReflectionConfigurationFiles=src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}/reflect-config.json - -H:ResourceConfigurationFiles=src/main/resources/META-INF/native-image/${project.groupId}/${project.artifactId}/resource-config.json -H:-DeadlockWatchdogExitOnTimeout -H:DeadlockWatchdogInterval=0 -H:+AddAllCharsets @@ -679,6 +611,8 @@ -J--add-exports=java.desktop/sun.font=ALL-UNNAMED -J--add-exports=org.graalvm.sdk/org.graalvm.nativeimage.impl=ALL-UNNAMED -J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.configure=ALL-UNNAMED + -J--add-exports=org.graalvm.nativeimage.builder/com.oracle.svm.core.jni=ALL-UNNAMED + --initialize-at-build-time=org.eclipse.esmf.nativefeatures.Native true diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/FileInputHandler.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/FileInputHandler.java index 1fd3196a1..b0e7668d6 100644 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/FileInputHandler.java +++ b/tools/samm-cli/src/main/java/org/eclipse/esmf/FileInputHandler.java @@ -76,7 +76,7 @@ public static boolean appliesToInput( final String input ) { try { return absoluteFile( new File( input ) ).exists(); } catch ( final Exception exception ) { - // This could file with e.g. a InvalidPathException or with platform-specific exceptions when the input is indeed not a valid file + // This could fail with e.g. a InvalidPathException or with platform-specific exceptions when the input is indeed not a valid file return false; } } diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AasReflection.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AasReflection.java deleted file mode 100644 index 2d2a16f9e..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AasReflection.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import static org.graalvm.nativeimage.hosted.RuntimeClassInitialization.initializeAtBuildTime; - -import java.util.List; - -import org.eclipse.digitaltwin.aas4j.v3.dataformat.core.internal.util.ReflectionHelper; -import org.eclipse.digitaltwin.aas4j.v3.model.LangStringTextType; -import org.graalvm.nativeimage.Platform; -import org.graalvm.nativeimage.Platforms; -import org.graalvm.nativeimage.hosted.Feature; - -/** - * Registers all classes in the AAS model and default implementation packages for reflection in native image builds. - */ -@Platforms( Platform.HOSTED_ONLY.class ) -public class AasReflection extends AbstractSammCliFeature { - @Override - public void beforeAnalysis( final BeforeAnalysisAccess access ) { - initializeAtBuildTime( org.eclipse.esmf.substitution.AdminShellConfig.class ); - - registerClassesInPackage( ReflectionHelper.MODEL_PACKAGE_NAME ); - registerClassesInPackage( ReflectionHelper.DEFAULT_IMPLEMENTATION_PACKAGE_NAME ); - registerClassesInPackage( ReflectionHelper.JSON_MIXINS_PACKAGE_NAME ); - registerClassesInPackage( ReflectionHelper.XML_MIXINS_PACKAGE_NAME ); - - register( LangStringTextType[].class ); - } - - @Override - public List> getRequiredFeatures() { - return List.of( ClassGraphFeature.class ); - } -} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AbstractSammCliFeature.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AbstractSammCliFeature.java deleted file mode 100644 index 90766eaf7..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/AbstractSammCliFeature.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import io.github.classgraph.ClassGraph; -import io.github.classgraph.ScanResult; -import org.graalvm.nativeimage.hosted.Feature; -import org.graalvm.nativeimage.hosted.RuntimeReflection; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Base class for native compilation features - */ -public abstract class AbstractSammCliFeature implements Feature { - private static final Logger LOG = LoggerFactory.getLogger( AbstractSammCliFeature.class ); - - /** - * Registers all classes in the given package for reflection. - * - * @param packageName the package name - */ - protected void registerClassesInPackage( final String packageName ) { - try ( final ScanResult scanResult = new ClassGraph().enableAllInfo().acceptPackages( packageName ).scan() ) { - scanResult.getAllClasses().loadClasses().forEach( this::register ); - } - } - - /** - * Registers the given class for reflection. - * - * @param cls the class - */ - protected void register( final Class cls ) { - LOG.debug( "Registering {} for reflection", cls ); - RuntimeReflection.register( cls ); - RuntimeReflection.register( cls.getDeclaredConstructors() ); - RuntimeReflection.register( cls.getDeclaredMethods() ); - RuntimeReflection.register( cls.getDeclaredFields() ); - } - - /** - * Returns the class for the given class name. - * - * @param className the class name - * @return the class - */ - protected Class getClass( final String className ) { - try { - return Class.forName( className ); - } catch ( final ClassNotFoundException exception ) { - throw new RuntimeException( "Could not access class for reflection registry", exception ); - } - } -} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ClassGraphFeature.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ClassGraphFeature.java deleted file mode 100644 index d0b90f366..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/ClassGraphFeature.java +++ /dev/null @@ -1,44 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import static org.graalvm.nativeimage.hosted.RuntimeClassInitialization.initializeAtBuildTime; - -/** - * Makes ClassGraph available at build time - */ -public class ClassGraphFeature extends AbstractSammCliFeature { - @Override - public void beforeAnalysis( final BeforeAnalysisAccess access ) { - initializeAtBuildTime( io.github.classgraph.AnnotationInfoList.class ); - initializeAtBuildTime( io.github.classgraph.AnnotationParameterValueList.class ); - initializeAtBuildTime( io.github.classgraph.ClassGraph.class ); - initializeAtBuildTime( io.github.classgraph.ClassInfo.class ); - initializeAtBuildTime( getClass( "io.github.classgraph.ClassInfo$2" ) ); - initializeAtBuildTime( io.github.classgraph.ClassInfoList.class ); - initializeAtBuildTime( io.github.classgraph.FieldInfoList.class ); - initializeAtBuildTime( io.github.classgraph.MethodInfoList.class ); - initializeAtBuildTime( io.github.classgraph.ModulePathInfo.class ); - initializeAtBuildTime( io.github.classgraph.ScanResult.class ); - initializeAtBuildTime( nonapi.io.github.classgraph.classloaderhandler.ClassLoaderHandlerRegistry.class ); - initializeAtBuildTime( nonapi.io.github.classgraph.classpath.ClasspathOrder.class ); - initializeAtBuildTime( nonapi.io.github.classgraph.classpath.SystemJarFinder.class ); - initializeAtBuildTime( getClass( "nonapi.io.github.classgraph.classpath.SystemJarFinder$1" ) ); - initializeAtBuildTime( nonapi.io.github.classgraph.fastzipfilereader.LogicalZipFile.class ); - initializeAtBuildTime( getClass( "nonapi.io.github.classgraph.reflection.StandardReflectionDriver" ) ); - initializeAtBuildTime( nonapi.io.github.classgraph.utils.FastPathResolver.class ); - initializeAtBuildTime( nonapi.io.github.classgraph.utils.JarUtils.class ); - initializeAtBuildTime( nonapi.io.github.classgraph.utils.VersionFinder.class ); - } -} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java deleted file mode 100644 index 41d21e0a6..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/JenaFeature.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import static org.graalvm.nativeimage.hosted.RuntimeClassInitialization.initializeAtBuildTime; - -/** - * Configuration of eagerly initialized Jena classes - */ -public class JenaFeature extends AbstractSammCliFeature { - @Override - public void beforeAnalysis( final BeforeAnalysisAccess access ) { - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.Constants" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLDTDScannerImpl" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLDocumentFragmentScannerImpl" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLDocumentScannerImpl" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityManager" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityManager$EncodingInfo" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLEntityScanner" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLScanner" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.XMLVersionDetector" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDProcessor" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLDTDValidator" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.dtd.XMLNSDTDValidator" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.impl.dv.dtd.DTDDVFactoryImpl" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.util.FeatureState" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.util.PropertyState" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.util.XMLChar" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.util.XMLSymbols" ) ); - initializeAtBuildTime( getClass( "com.sun.org.apache.xerces.internal.xni.NamespaceContext" ) ); - initializeAtBuildTime( getClass( "com.sun.xml.internal.stream.util.ThreadLocalBufferAllocator" ) ); - initializeAtBuildTime( getClass( "javax.xml.parsers.FactoryFinder" ) ); - initializeAtBuildTime( getClass( "jdk.xml.internal.JdkXmlUtils" ) ); - initializeAtBuildTime( getClass( "jdk.xml.internal.SecuritySupport" ) ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.AnyURIDV.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.BaseSchemaDVFactory.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.ExtendedSchemaDVFactoryImpl.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.QNameDV.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.SchemaDVFactoryImpl.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class ); - initializeAtBuildTime( org.apache.jena.ext.xerces.impl.dv.xs.XSSimpleTypeDecl.class ); - initializeAtBuildTime( getClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$CharToken" ) ); - initializeAtBuildTime( getClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ClosureToken" ) ); - initializeAtBuildTime( getClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$ParenToken" ) ); - initializeAtBuildTime( getClass( "org.apache.jena.ext.xerces.impl.xpath.regex.Token$UnionToken" ) ); - initializeAtBuildTime( org.apache.jena.ext.xerces.util.XercesXMLChar.class ); - } -} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java deleted file mode 100644 index bfac76952..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/LogbackFeature.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import static org.graalvm.nativeimage.hosted.RuntimeClassInitialization.initializeAtBuildTime; - -/** - * Configuration of eagerly initialized SLF4J and Logback classes for native image builds - */ -public class LogbackFeature extends AbstractSammCliFeature { - @Override - public void beforeAnalysis( final BeforeAnalysisAccess access ) { - initializeAtBuildTime( ch.qos.logback.classic.Level.class ); - initializeAtBuildTime( ch.qos.logback.classic.Logger.class ); - initializeAtBuildTime( ch.qos.logback.classic.PatternLayout.class ); - initializeAtBuildTime( ch.qos.logback.core.CoreConstants.class ); - initializeAtBuildTime( ch.qos.logback.core.pattern.parser.Parser.class ); - initializeAtBuildTime( ch.qos.logback.core.spi.AppenderAttachableImpl.class ); - initializeAtBuildTime( ch.qos.logback.core.status.InfoStatus.class ); - initializeAtBuildTime( ch.qos.logback.core.status.StatusBase.class ); - initializeAtBuildTime( ch.qos.logback.core.util.Loader.class ); - initializeAtBuildTime( ch.qos.logback.core.util.StatusPrinter.class ); - initializeAtBuildTime( ch.qos.logback.core.util.StatusPrinter2.class ); - - initializeAtBuildTime( org.slf4j.LoggerFactory.class ); - initializeAtBuildTime( org.slf4j.helpers.Reporter.class ); - } -} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeature.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeature.java new file mode 100644 index 000000000..fc7c4bed1 --- /dev/null +++ b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeature.java @@ -0,0 +1,98 @@ +/* + * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH + * + * See the AUTHORS file(s) distributed with this work for additional + * information regarding authorship. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at https://mozilla.org/MPL/2.0/. + * + * SPDX-License-Identifier: MPL-2.0 + */ + +package org.eclipse.esmf.nativefeatures; + +import static org.eclipse.esmf.nativefeatures.AssetAdministrationShellFeature.ADMINSHELL_PROPERTIES; + +import java.util.List; + +import org.eclipse.esmf.SammCli; +import org.eclipse.esmf.aas.AasCommand; +import org.eclipse.esmf.aas.AasListSubmodelsCommand; +import org.eclipse.esmf.aas.AasToCommand; +import org.eclipse.esmf.aas.to.AasToAspectCommand; +import org.eclipse.esmf.aspect.AspectCommand; +import org.eclipse.esmf.aspect.AspectEditCommand; +import org.eclipse.esmf.aspect.AspectPrettyPrintCommand; +import org.eclipse.esmf.aspect.AspectToCommand; +import org.eclipse.esmf.aspect.AspectUsageCommand; +import org.eclipse.esmf.aspect.AspectValidateCommand; +import org.eclipse.esmf.aspect.edit.AspectEditNewVersionCommand; +import org.eclipse.esmf.aspect.to.AspectToAasCommand; +import org.eclipse.esmf.aspect.to.AspectToAsyncapiCommand; +import org.eclipse.esmf.aspect.to.AspectToHtmlCommand; +import org.eclipse.esmf.aspect.to.AspectToJavaCommand; +import org.eclipse.esmf.aspect.to.AspectToJsonCommand; +import org.eclipse.esmf.aspect.to.AspectToJsonLdCommand; +import org.eclipse.esmf.aspect.to.AspectToJsonSchemaCommand; +import org.eclipse.esmf.aspect.to.AspectToOpenapiCommand; +import org.eclipse.esmf.aspect.to.AspectToPngCommand; +import org.eclipse.esmf.aspect.to.AspectToSqlCommand; +import org.eclipse.esmf.aspect.to.AspectToSvgCommand; +import org.eclipse.esmf.exception.CommandException; +import org.eclipse.esmf.exception.SubCommandException; +import org.eclipse.esmf.substitution.AdminShellConfig; + +import org.graalvm.nativeimage.hosted.Feature; + +public class SammCliFeature implements Feature { + @Override + public void beforeAnalysis( final BeforeAnalysisAccess access ) { + Native.forClass( AdminShellConfig.class ).initializeAtBuildTime(); + + Native.forClass( SammCli.class ).registerEverythingForReflection(); + + Native.forClass( AasCommand.class ).registerEverythingForReflection(); + Native.forClass( AasListSubmodelsCommand.class ).registerEverythingForReflection(); + Native.forClass( AasToCommand.class ).registerEverythingForReflection(); + + Native.forClass( AasToAspectCommand.class ).registerEverythingForReflection(); + + Native.forClass( AspectCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectEditCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectPrettyPrintCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectUsageCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectValidateCommand.class ).registerEverythingForReflection(); + + Native.forClass( AspectEditCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectEditNewVersionCommand.class ).registerEverythingForReflection(); + + Native.forClass( AspectToAasCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToAsyncapiCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToHtmlCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToJavaCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToJsonCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToJsonLdCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToJsonSchemaCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToOpenapiCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToPngCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToSqlCommand.class ).registerEverythingForReflection(); + Native.forClass( AspectToSvgCommand.class ).registerEverythingForReflection(); + + Native.forClass( CommandException.class ).registerEverythingForReflection(); + Native.forClass( SubCommandException.class ).registerEverythingForReflection(); + + Native.addResource( "application.properties" ); + Native.addResource( "git.properties" ); + Native.addResource( "pom.properties" ); + Native.addResource( "logback.xml" ); + Native.addResource( ADMINSHELL_PROPERTIES ); + } + + @Override + public List> getRequiredFeatures() { + return List.of( EsmfFeature.class ); + } +} diff --git a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeatures.java b/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeatures.java deleted file mode 100644 index ab2c540b9..000000000 --- a/tools/samm-cli/src/main/java/org/eclipse/esmf/nativefeatures/SammCliFeatures.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (c) 2024 Robert Bosch Manufacturing Solutions GmbH - * - * See the AUTHORS file(s) distributed with this work for additional - * information regarding authorship. - * - * This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at https://mozilla.org/MPL/2.0/. - * - * SPDX-License-Identifier: MPL-2.0 - */ - -package org.eclipse.esmf.nativefeatures; - -import static org.graalvm.nativeimage.hosted.RuntimeClassInitialization.initializeAtBuildTime; -import static org.graalvm.nativeimage.impl.ConfigurationCondition.alwaysTrue; - -import java.util.List; - -import com.oracle.svm.core.configure.ResourcesRegistry; -import org.graalvm.nativeimage.ImageSingletons; -import org.graalvm.nativeimage.hosted.Feature; - -/** - * Build time initialization for samm-cli - */ -public class SammCliFeatures extends AbstractSammCliFeature { - @Override - public void beforeAnalysis( final BeforeAnalysisAccess access ) { - initializeAtBuildTime( com.google.common.collect.Range.class ); - initializeAtBuildTime( getClass( "com.sun.tools.javac.file.BaseFileManager" ) ); - initializeAtBuildTime( getClass( "com.sun.tools.javac.file.JavacFileManager" ) ); - initializeAtBuildTime( getClass( "com.sun.tools.javac.file.Locations" ) ); - initializeAtBuildTime( getClass( "com.sun.tools.javac.util.Context" ) ); - initializeAtBuildTime( getClass( "jdk.internal.net.http.HttpClientImpl" ) ); - initializeAtBuildTime( getClass( "jdk.internal.net.http.HttpClientImpl$SelectorManager" ) ); - initializeAtBuildTime( getClass( "jdk.internal.net.http.common.Utils" ) ); - - final ResourcesRegistry resourcesRegistry = ImageSingletons.lookup( ResourcesRegistry.class ); - resourcesRegistry.addResourceBundles( alwaysTrue(), "com.sun.tools.javac.resources.compiler" ); - resourcesRegistry.addResourceBundles( alwaysTrue(), "com.sun.tools.javac.resources.javac" ); - } - - @Override - public List> getRequiredFeatures() { - return List.of( - AasReflection.class, - LogbackFeature.class, - ShaclJsFeature.class, - ClassGraphFeature.class, - JenaFeature.class - ); - } -} diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/jni-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/jni-config.json deleted file mode 100644 index 496416a7f..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/jni-config.json +++ /dev/null @@ -1,467 +0,0 @@ -[ -{ - "name":"sun.awt.X11.XToolkit", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.awt.Win32GraphicsDevice", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.java2d.d3d.D3DGraphicsDevice", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.font.FontConfigManager", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name":"sun.font.FontConfigManager$FontConfigInfo", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name":"sun.font.FontConfigManager$FcCompFont", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name":"sun.font.FontConfigManager$FontConfigFont", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"java.awt.Cursor", - "fields":[{"name":"pData"}, {"name":"type"}], - "methods":[{"name":"setPData","parameterTypes":["long"] }] -}, -{ - "name":"java.awt.Dimension", - "fields":[{"name":"height"}, {"name":"width"}] -}, -{ - "name":"java.awt.Font", - "fields":[{"name":"name"}, {"name":"pData"}, {"name":"size"}, {"name":"style"}], - "methods":[{"name":"getFont","parameterTypes":["java.lang.String"] }, {"name":"getFontPeer","parameterTypes":[] }] -}, -{ - "name":"java.awt.FontMetrics", - "fields":[{"name":"font"}], - "methods":[{"name":"getHeight","parameterTypes":[] }] -}, -{ - "name":"java.awt.Point", - "fields":[{"name":"x"}, {"name":"y"}] -}, -{ - "name":"java.awt.Toolkit", - "methods":[{"name":"getDefaultToolkit","parameterTypes":[] }, {"name":"getFontMetrics","parameterTypes":["java.awt.Font"] }] -}, -{ - "name":"java.awt.desktop.UserSessionEvent$Reason", - "fields":[{"name":"CONSOLE"}, {"name":"LOCK"}, {"name":"REMOTE"}, {"name":"UNSPECIFIED"}] -}, -{ - "name":"java.lang.Thread", - "methods":[{"name":"yield","parameterTypes":[] }] -}, -{ - "name":"java.awt.Color", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name": "java.awt.Insets", - "allDeclaredFields": true, - "allDeclaredMethods": true -}, -{ - "name": "java.awt.event.InputEvent", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"java.awt.image.BufferedImage", - "fields":[{"name":"colorModel"}, {"name":"imageType"}, {"name":"raster"}], - "methods":[{"name":"getRGB","parameterTypes":["int","int","int","int","int[]","int","int"] }, {"name":"setRGB","parameterTypes":["int","int","int","int","int[]","int","int"] }] -}, -{ - "name":"java.awt.image.Raster", - "fields":[{"name":"dataBuffer"}, {"name":"height"}, {"name":"minX"}, {"name":"minY"}, {"name":"numBands"}, {"name":"numDataElements"}, {"name":"sampleModel"}, {"name":"sampleModelTranslateX"}, {"name":"sampleModelTranslateY"}, {"name":"width"}] -}, -{ - "name":"java.awt.image.SampleModel", - "fields":[{"name":"height"}, {"name":"width"}], - "methods":[{"name":"getPixels","parameterTypes":["int","int","int","int","int[]","java.awt.image.DataBuffer"] }, {"name":"setPixels","parameterTypes":["int","int","int","int","int[]","java.awt.image.DataBuffer"] }] -}, -{ - "name":"java.awt.image.SinglePixelPackedSampleModel", - "fields":[{"name":"bitMasks"}, {"name":"bitOffsets"}, {"name":"bitSizes"}, {"name":"maxBitSize"}] -}, -{ - "name": "java.awt.AWTEvent", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"[Lsun.java2d.loops.GraphicsPrimitive;" -}, -{ - "name":"java.awt.AlphaComposite", - "fields":[{"name":"extraAlpha"}, {"name":"rule"}] -}, -{ - "name":"java.awt.Component", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.font.FontDesignMetrics", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"java.awt.GraphicsEnvironment", - "methods":[{"name":"getLocalGraphicsEnvironment","parameterTypes":[] }, {"name":"isHeadless","parameterTypes":[] }] -}, -{ - "name":"java.awt.event.KeyEvent", - "fields":[{"name":"isProxyActive"}] -}, -{ - "name":"java.awt.geom.AffineTransform", - "fields":[{"name":"m00"}, {"name":"m01"}, {"name":"m02"}, {"name":"m10"}, {"name":"m11"}, {"name":"m12"}] -}, -{ - "name":"java.awt.geom.GeneralPath", - "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["int","byte[]","int","float[]","int"] }] -}, -{ - "name":"java.awt.geom.Path2D", - "fields":[{"name":"numTypes"}, {"name":"pointTypes"}, {"name":"windingRule"}] -}, -{ - "name":"java.awt.geom.Path2D$Float", - "fields":[{"name":"floatCoords"}] -}, -{ - "name":"java.awt.geom.Point2D$Float", - "fields":[{"name":"x"}, {"name":"y"}], - "methods":[{"name":"","parameterTypes":["float","float"] }] -}, -{ - "name":"java.awt.geom.Rectangle2D$Float", - "fields":[{"name":"height"}, {"name":"width"}, {"name":"x"}, {"name":"y"}], - "methods":[{"name":"","parameterTypes":[] }, {"name":"","parameterTypes":["float","float","float","float"] }] -}, -{ - "name":"java.awt.image.ColorModel", - "fields":[{"name":"colorSpace"}, {"name":"colorSpaceType"}, {"name":"isAlphaPremultiplied"}, {"name":"is_sRGB"}, {"name":"nBits"}, {"name":"numComponents"}, {"name":"pData"}, {"name":"supportsAlpha"}, {"name":"transparency"}], - "methods":[{"name":"getRGBdefault","parameterTypes":[] }] -}, -{ - "name":"java.awt.image.IndexColorModel", - "fields":[{"name":"allgrayopaque"}, {"name":"map_size"}, {"name":"rgb"}, {"name":"transparent_index"}] -}, -{ - "name":"java.lang.Boolean", - "methods":[{"name":"getBoolean","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"java.lang.System", - "methods":[{"name":"load","parameterTypes":["java.lang.String"] }, {"name":"setProperty","parameterTypes":["java.lang.String","java.lang.String"] }] -}, -{ - "name":"java.lang.String", - "methods":[{"name":"toLowerCase","parameterTypes":["java.util.Locale"] }] -}, -{ - "name":"java.util.ArrayList", - "methods":[{"name":"","parameterTypes":["int"] }, {"name":"add","parameterTypes":["java.lang.Object"] }] -}, -{ - "name":"java.util.HashMap", - "methods":[{"name":"containsKey","parameterTypes":["java.lang.Object"] }, {"name":"put","parameterTypes":["java.lang.Object","java.lang.Object"] }] -}, -{ - "name":"sun.awt.AWTAutoShutdown", - "methods":[{"name":"notifyToolkitThreadBusy","parameterTypes":[] }, {"name":"notifyToolkitThreadFree","parameterTypes":[] }] -}, -{ - "name":"sun.awt.SunHints", - "fields":[{"name":"INTVAL_STROKE_PURE"}] -}, -{ - "name":"sun.awt.SunToolkit", - "methods":[{"name":"awtLock","parameterTypes":[] }, {"name":"awtLockNotify","parameterTypes":[] }, {"name":"awtLockNotifyAll","parameterTypes":[] }, {"name":"awtLockWait","parameterTypes":["long"] }, {"name":"awtUnlock","parameterTypes":[] },{"name":"isTouchKeyboardAutoShowEnabled","parameterTypes":[] }] -}, -{ - "name":"sun.awt.Win32GraphicsConfig", - "fields":[{"name":"visual"}] -}, -{ - "name":"sun.awt.Win32GraphicsDevice", - "fields":[{"name":"dynamicColorModel"}] -}, -{ - "name":"sun.awt.Win32GraphicsEnvironment", - "methods":[{"name":"dwmCompositionChanged","parameterTypes":["boolean"] }] -}, -{ - "name":"sun.awt.image.ByteComponentRaster", - "fields":[{"name":"data"}, {"name":"dataOffsets"}, {"name":"pixelStride"}, {"name":"scanlineStride"}, {"name":"type"}] -}, -{ - "name":"sun.awt.image.GifImageDecoder", - "fields":[{"name":"outCode"}, {"name":"prefix"}, {"name":"suffix"}], - "methods":[{"name":"readBytes","parameterTypes":["byte[]","int","int"] }, {"name":"sendPixels","parameterTypes":["int","int","int","int","byte[]","java.awt.image.ColorModel"] }] -}, -{ - "name":"sun.awt.image.BufImgSurfaceData$ICMColorData", - "fields":[{"name":"pData"}], - "methods":[{"name":"","parameterTypes":["long"] }] -}, -{ - "name":"sun.awt.image.ImageRepresentation", - "fields":[{"name":"numSrcLUT"}, {"name":"srcLUTtransIndex"}] -}, -{ - "name":"sun.awt.image.IntegerComponentRaster", - "fields":[{"name":"data"}, {"name":"dataOffsets"}, {"name":"pixelStride"}, {"name":"scanlineStride"}, {"name":"type"}] -}, -{ - "name":"sun.awt.image.SunVolatileImage", - "fields":[{"name":"volSurfaceManager"}] -}, -{ - "name":"sun.awt.image.VolatileSurfaceManager", - "fields":[{"name":"sdCurrent"}] -}, -{ - "name":"sun.awt.windows.WComponentPeer", - "fields":[{"name":"hwnd"}, {"name":"winGraphicsConfig"}], - "methods":[{"name":"disposeLater","parameterTypes":[] }, {"name":"replaceSurfaceData","parameterTypes":[] }, {"name":"replaceSurfaceDataLater","parameterTypes":[] }] -}, -{ - "name":"sun.awt.windows.WDesktopPeer", - "methods":[{"name":"systemSleepCallback","parameterTypes":["boolean"] }, {"name":"userSessionCallback","parameterTypes":["boolean","java.awt.desktop.UserSessionEvent$Reason"] }] -}, -{ - "name":"sun.awt.windows.WObjectPeer", - "fields":[{"name":"createError"}, {"name":"destroyed"}, {"name":"pData"}, {"name":"target"}], - "methods":[{"name":"getPeerForTarget","parameterTypes":["java.lang.Object"] }] -}, -{ - "name":"sun.awt.windows.WToolkit", - "methods":[{"name":"displayChanged","parameterTypes":[] }, {"name":"paletteChanged","parameterTypes":[] }, {"name":"windowsSettingChange","parameterTypes":[] }] -}, -{ - "name":"sun.awt.X11.XErrorHandlerUtil", - "methods":[{"name":"init","parameterTypes":["long"] }] -}, -{ - "name":"sun.awt.X11GraphicsConfig", - "fields":[{"name":"aData"}, {"name":"bitsPerPixel"}] -}, -{ - "name":"sun.awt.X11GraphicsDevice", - "methods":[{"name":"addDoubleBufferVisual","parameterTypes":["int"] }] -}, -{ - "name":"sun.font.CharToGlyphMapper", - "methods":[{"name":"charToGlyph","parameterTypes":["int"] }] -}, -{ - "name":"sun.font.Font2D", - "methods":[{"name":"canDisplay","parameterTypes":["char"] }, {"name":"charToGlyph","parameterTypes":["int"] }, {"name":"charToVariationGlyph","parameterTypes":["int","int"] }, {"name":"getMapper","parameterTypes":[] }, {"name":"getTableBytes","parameterTypes":["int"] }] -}, -{ - "name":"sun.font.FontStrike", - "methods":[{"name":"getGlyphMetrics","parameterTypes":["int"] }] -}, -{ - "name":"sun.font.FreetypeFontScaler", - "methods":[{"name":"invalidateScaler","parameterTypes":[] }] -}, -{ - "name":"sun.font.GlyphList", - "fields":[{"name":"gposx"}, {"name":"gposy"}, {"name":"images"}, {"name":"lcdRGBOrder"}, {"name":"lcdSubPixPos"}, {"name":"len"}, {"name":"positions"}, {"name":"usePositions"}] -}, -{ - "name":"sun.font.GlyphLayout$GVData", - "fields":[{"name":"_count"}, {"name":"_flags"}, {"name":"_glyphs"}, {"name":"_indices"}, {"name":"_positions"}], - "methods":[{"name":"grow","parameterTypes":[] }] -}, -{ - "name":"sun.font.PhysicalStrike", - "fields":[{"name":"pScalerContext"}], - "methods":[{"name":"adjustPoint","parameterTypes":["java.awt.geom.Point2D$Float"] }, {"name":"getGlyphPoint","parameterTypes":["int","int"] }] -}, -{ - "name":"sun.font.StrikeMetrics", - "methods":[{"name":"","parameterTypes":["float","float","float","float","float","float","float","float","float","float"] }] -}, -{ - "name":"sun.font.TrueTypeFont", - "methods":[{"name":"readBlock","parameterTypes":["java.nio.ByteBuffer","int","int"] }, {"name":"readBytes","parameterTypes":["int","int"] }] -}, -{ - "name":"sun.font.Type1Font", - "methods":[{"name":"readFile","parameterTypes":["java.nio.ByteBuffer"] }] -}, -{ - "name":"sun.java2d.Disposer", - "methods":[{"name":"addRecord","parameterTypes":["java.lang.Object","long","long"] }] -}, -{ - "name":"sun.java2d.InvalidPipeException" -}, -{ - "name":"sun.java2d.NullSurfaceData" -}, -{ - "name":"sun.java2d.SunGraphics2D", - "fields":[{"name":"clipRegion"}, {"name":"composite"}, {"name":"eargb"}, {"name":"lcdTextContrast"}, {"name":"pixel"}, {"name":"strokeHint"}] -}, -{ - "name":"sun.java2d.SunGraphicsEnvironment", - "methods":[{"name":"isDisplayLocal","parameterTypes":[] }] -}, -{ - "name":"sun.java2d.SurfaceData", - "fields":[{"name":"pData"}, {"name":"valid"}] -}, -{ - "name":"sun.java2d.d3d.D3DGraphicsDevice$1", - "methods":[{"name":"run","parameterTypes":[] }] -}, -{ - "name":"sun.java2d.d3d.D3DRenderQueue$1", - "methods":[{"name":"run","parameterTypes":[] }] -}, -{ - "name":"sun.java2d.loops.Blit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.BlitBg", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.CompositeType", - "fields":[{"name":"AnyAlpha"}, {"name":"Src"}, {"name":"SrcNoEa"}, {"name":"SrcOver"}, {"name":"SrcOverNoEa"}, {"name":"Xor"}] -}, -{ - "name":"sun.java2d.loops.DrawGlyphList", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawGlyphListAA", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawGlyphListLCD", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawLine", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawParallelogram", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawPath", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawPolygons", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.DrawRect", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillParallelogram", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillPath", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillRect", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.FillSpans", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.GraphicsPrimitive", - "fields":[{"name":"pNativePrim"}] -}, -{ - "name":"sun.java2d.loops.GraphicsPrimitiveMgr", - "methods":[{"name":"register","parameterTypes":["sun.java2d.loops.GraphicsPrimitive[]"] }] -}, -{ - "name":"sun.java2d.loops.MaskBlit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.MaskFill", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.ScaledBlit", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.SurfaceType", - "fields":[{"name":"Any3Byte"}, {"name":"Any4Byte"}, {"name":"AnyByte"}, {"name":"AnyColor"}, {"name":"AnyInt"}, {"name":"AnyShort"}, {"name":"ByteBinary1Bit"}, {"name":"ByteBinary2Bit"}, {"name":"ByteBinary4Bit"}, {"name":"ByteGray"}, {"name":"ByteIndexed"}, {"name":"ByteIndexedBm"}, {"name":"FourByteAbgr"}, {"name":"FourByteAbgrPre"}, {"name":"Index12Gray"}, {"name":"Index8Gray"}, {"name":"IntArgb"}, {"name":"IntArgbBm"}, {"name":"IntArgbPre"}, {"name":"IntBgr"}, {"name":"IntRgb"}, {"name":"IntRgbx"}, {"name":"OpaqueColor"}, {"name":"ThreeByteBgr"}, {"name":"Ushort4444Argb"}, {"name":"Ushort555Rgb"}, {"name":"Ushort555Rgbx"}, {"name":"Ushort565Rgb"}, {"name":"UshortGray"}, {"name":"UshortIndexed"}] -}, -{ - "name":"sun.java2d.loops.TransformHelper", - "methods":[{"name":"","parameterTypes":["long","sun.java2d.loops.SurfaceType","sun.java2d.loops.CompositeType","sun.java2d.loops.SurfaceType"] }] -}, -{ - "name":"sun.java2d.loops.XORComposite", - "fields":[{"name":"alphaMask"}, {"name":"xorColor"}, {"name":"xorPixel"}] -}, -{ - "name":"sun.java2d.pipe.Region", - "fields":[{"name":"bands"}, {"name":"endIndex"}, {"name":"hix"}, {"name":"hiy"}, {"name":"lox"}, {"name":"loy"}] -}, -{ - "name":"sun.java2d.pipe.RegionIterator", - "fields":[{"name":"curIndex"}, {"name":"numXbands"}, {"name":"region"}] -}, -{ - "name":"sun.java2d.pipe.ShapeSpanIterator", - "fields":[{"name":"pData"}] -}, -{ - "name":"sun.java2d.xr.XRSurfaceData", - "fields":[{"name":"picture"}, {"name":"xid"}] -}, -{ - "name":"sun.java2d.windows.WindowsFlags", - "fields":[{"name":"d3dEnabled"}, {"name":"d3dSet"}, {"name":"offscreenSharingEnabled"}, {"name":"setHighDPIAware"}] -} - -] diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/predefined-classes-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/predefined-classes-config.json deleted file mode 100644 index fe51488c7..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/predefined-classes-config.json +++ /dev/null @@ -1 +0,0 @@ -[] diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/proxy-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/proxy-config.json deleted file mode 100644 index 0d4f101c7..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/proxy-config.json +++ /dev/null @@ -1,2 +0,0 @@ -[ -] diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/reflect-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/reflect-config.json deleted file mode 100644 index 57356acca..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/reflect-config.json +++ /dev/null @@ -1,329 +0,0 @@ -[ -{ - "name": "org.eclipse.esmf.metamodel.impl.DefaultScalarValue", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name": "org.eclipse.esmf.metamodel.impl.DefaultProperty", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"org.eclipse.esmf.metamodel.loader.DefaultPropertyWrapper", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.awt.X11.XToolkit", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.awt.Win32GraphicsDevice", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.java2d.d3d.D3DGraphicsDevice", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"org.eclipse.esmf.SammCli", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.util.resources.LocaleData$LocaleDataStrategy", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.util.resources.LocaleData", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"sun.font.FontConfigManager$FontConfigInfo", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name":"sun.font.FontConfigManager$FcCompFont", - "allDeclaredFields":true, - "allDeclaredMethods":true -}, -{ - "name":"sun.font.FontConfigManager$FontConfigFont", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name":"[Lorg.graphper.layout.dot.DNode;" -}, -{ - "name":"com.sun.org.apache.xerces.internal.jaxp.SAXParserFactoryImpl", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"java.awt.Canvas", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name": "java.awt.Color", - "allDeclaredFields": true, - "allDeclaredMethods": true -}, -{ - "name": "java.awt.Insets", - "allDeclaredFields": true, - "allDeclaredMethods": true -}, -{ - "name": "java.awt.event.InputEvent", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name": "java.awt.AWTEvent", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"java.awt.Component", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"java.awt.Font", - "methods":[{"name":"","parameterTypes":["java.lang.String","int","int"] }] -}, -{ - "name":"java.awt.FontMetrics", - "methods":[{"name":"getHeight","parameterTypes":[] }, {"name":"stringWidth","parameterTypes":["java.lang.String"] }] -}, -{ - "name":"sun.font.FontDesignMetrics", - "allDeclaredFields": true, - "allDeclaredMethods": true, - "allDeclaredConstructors":true -}, -{ - "name":"java.util.concurrent.atomic.AtomicBoolean", - "fields":[{"name":"value"}] -}, -{ - "name":"org.apache.batik.bridge.RhinoInterpreterFactory", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"org.apache.batik.css.parser.Parser", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"org.apache.batik.ext.awt.image.codec.png.PNGTranscoderInternalCodecWriteAdapter", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"org.graphper.api.LineAttrs", - "allDeclaredFields":true -}, -{ - "name":"org.graphper.api.NodeAttrs", - "allDeclaredFields":true -}, -{ - "name":"sun.awt.Win32FontManager", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.java2d.marlin.DMarlinRenderingEngine", - "methods":[{"name":"","parameterTypes":[] }] -}, -{ - "name":"sun.font.CompositeFontDescriptor", - "allDeclaredFields":true, - "allDeclaredMethods":true, - "allDeclaredConstructors":true -}, -{ - "name": "ch.qos.logback.classic.pattern.DateConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.MessageConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ThrowableProxyConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.NopThrowableInformationConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ContextNameConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldYellowCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.LoggerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.ReplacingCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldBlueCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.CyanCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.RedCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.WhiteCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.PropertyConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.RootCauseFirstThrowableProxyConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.MethodOfCallerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.LevelConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.IdentityCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldWhiteCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.MarkerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldCyanCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldMagentaCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.RelativeTimeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.MagentaCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.LineOfCallerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.FileOfCallerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldGreenCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.LocalSequenceNumberConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.YellowCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ExtendedThrowableProxyConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.color.HighlightingCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.GrayCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.MDCConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ClassOfCallerConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BoldRedCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.GreenCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.core.pattern.color.BlackCompositeConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.ThreadConverter", - "allDeclaredConstructors": true -}, -{ - "name": "ch.qos.logback.classic.pattern.LineSeparatorConverter", - "allDeclaredConstructors": true -}, -{ - "name":"org.eclipse.esmf.aspectmodel.java.JavaCodeGenerationConfig", - "allDeclaredConstructors": true, - "allDeclaredFields":true, - "allDeclaredMethods": true -} -] diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/resource-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/resource-config.json deleted file mode 100644 index 41b329c48..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/resource-config.json +++ /dev/null @@ -1,34 +0,0 @@ -{ - "resources":[ - {"pattern":"java.base:\\Qjdk/internal/icu/impl/data/icudt67b/ubidi.icu\\E"}, - {"pattern":"\\Qapplication.properties\\E"}, - {"pattern":"\\Qgit.properties\\E"}, - {"pattern":"\\Qadminshell.properties\\E"}, - {"pattern":"\\Qpom.properties\\E"}, - {"pattern":"\\QMETA-INF/services/com.oracle.truffle.api.TruffleLanguage$Provider\\E"}, - {"pattern":"\\QMETA-INF/services/com.oracle.truffle.api.instrumentation.TruffleInstrument$Provider\\E"}, - {"pattern":"\\QMETA-INF/services/javax.script.ScriptEngineFactory\\E"}, - {"pattern":"\\QMETA-INF/services/org.apache.jena.sys.JenaSubsystemLifecycle\\E"}, - {"pattern":"\\QMETA-INF/services/org.graphper.draw.CustomizeShapeRender\\E"}, - {"pattern":"\\QMETA-INF/services/org.graphper.layout.MeasureText\\E"}, - {"pattern":"samm/[^/]*/([^/]*/)?[a-zA-Z0-9-]+\\.(ttl|js)"}, - {"pattern":"\\Qlogback.xml\\E"}, - {"pattern":"\\Qcom/oracle/truffle/nfi/impl/NFILanguageImpl.class\\E"}, - {"pattern":"\\Qorg/apache/jena/arq/arq-properties.xml\\E"}, - {"pattern":"\\Qorg/apache/jena/jena-properties.xml\\E"}, - {"pattern":"\\Qorg/apache/batik/anim/dom/resources/UserAgentStyleSheet.css\\E"}, - {"pattern":"\\Qorg/apache/batik/bridge/resources/help.gif\\E"}, - {"pattern":"\\Qorg/apache/batik/util/resources/XMLResourceDescriptor.properties\\E"}, - {"pattern":"\\Qorg/slf4j/impl/StaticLoggerBinder.class\\E"}, - {"pattern":"\\Qfontconfig.bfc\\E"}, - {"pattern":"\\Qopenapi/*.json\\E"}, - {"pattern":"\\Qdocu/static/*.*\\E"}, - {"pattern":"\\Qdocu/styles/*.*\\E"}, - {"pattern":"\\Qdocu/aspect-model.properties\\E"} - ], - "bundles":[ - {"name":"org.apache.jena.ext.xerces.impl.xpath.regex.message"}, - {"name":"org.apache.jena.ext.xerces.impl.msg.XMLSchemaMessages"}, - {"name":"sun.awt.resources.awt","classNames":["sun.awt.resources.awt"]} - ] -} diff --git a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/serialization-config.json b/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/serialization-config.json deleted file mode 100644 index f3d7e06e3..000000000 --- a/tools/samm-cli/src/main/resources/META-INF/native-image/org.eclipse.esmf/samm-cli/serialization-config.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "types":[ - ], - "lambdaCapturingTypes":[ - ], - "proxies":[ - ] -} diff --git a/tools/samm-cli/src/test/java/org/eclipse/esmf/ExecutableJarLauncher.java b/tools/samm-cli/src/test/java/org/eclipse/esmf/ExecutableJarLauncher.java index 035acf4bb..733c73038 100644 --- a/tools/samm-cli/src/test/java/org/eclipse/esmf/ExecutableJarLauncher.java +++ b/tools/samm-cli/src/test/java/org/eclipse/esmf/ExecutableJarLauncher.java @@ -27,10 +27,7 @@ /** * A {@link ProcessLauncher} that executes an executable jar. The absolute path of the jar must be set using the system property - * "executableJar". Additionally, if GraalVM's native-binary tool is found on the PATH and the system property "graalVmConfigPath" is set, - * the execution of the executable jar will use GraalVM's Tracing Agent - * and write corresponding config files to the directory given in graalVmConfigPath. + * "executableJar". */ public class ExecutableJarLauncher extends OsProcessLauncher { public ExecutableJarLauncher() { @@ -45,22 +42,9 @@ private static List buildCommand() { final List commandWithArguments = new ArrayList<>(); commandWithArguments.add( ProcessHandle.current().info().command().orElse( "java" ) ); - String configPath = System.getProperty( "graalVmConfigPath" ); - if ( isNativeImageBinaryOnPath() && configPath != null ) { - if ( SystemUtils.OS_NAME.startsWith( "Windows" ) ) { - configPath = configPath.replace( "/", "\\" ); - } - commandWithArguments.add( "-agentlib:native-image-agent=config-merge-dir=" + configPath ); - } commandWithArguments.add( "-Djava.awt.headless=true" ); commandWithArguments.add( "-jar" ); commandWithArguments.add( jarFile ); return commandWithArguments; } - - private static boolean isNativeImageBinaryOnPath() { - return Stream.of( System.getenv( "PATH" ).split( Pattern.quote( File.pathSeparator ) ) ) - .map( Paths::get ) - .anyMatch( path -> Files.exists( path.resolve( "native-image" ) ) || Files.exists( path.resolve( "native-image.cmd" ) ) ); - } }