Capture FileGeneratorArg configuration 10/104610/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Feb 2023 18:57:07 +0000 (19:57 +0100)
committerRobert Varga <robert.varga@pantheon.tech>
Sun, 26 Feb 2023 18:57:47 +0000 (19:57 +0100)
Generator configuration constituates a part of parsisted state, make
sure we take it into account.

JIRA: YANGTOOLS-1490
Change-Id: Idaf53af87a1922e9f3ee93712f2c069f21ac8f67
Signed-off-by: Ruslan Kashapov <ruslan.kashapov@pantheon.tech>
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
plugin/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/FileGeneratorArg.java
plugin/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesProcessor.java
plugin/yang-maven-plugin/src/main/java/org/opendaylight/yangtools/yang2sources/plugin/YangToSourcesState.java

index adf4cad35bdac98e4911e60dc9970ecadb1a83d6..ae056b4bbf5ded9f5d8cf6f4913109d39fdc0abc 100644 (file)
@@ -11,14 +11,19 @@ import static com.google.common.base.Verify.verifyNotNull;
 import static java.util.Objects.requireNonNull;
 
 import com.google.common.base.MoreObjects;
+import com.google.common.collect.Maps;
+import java.io.DataInput;
+import java.io.DataOutput;
+import java.io.IOException;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 import org.apache.maven.plugins.annotations.Parameter;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.Identifiable;
+import org.opendaylight.yangtools.concepts.WritableObject;
 
-public final class FileGeneratorArg implements Identifiable<String> {
+public final class FileGeneratorArg implements Identifiable<String>, WritableObject {
     @Parameter
     private final Map<String, String> configuration = new HashMap<>();
 
@@ -26,7 +31,7 @@ public final class FileGeneratorArg implements Identifiable<String> {
     private String identifier;
 
     public FileGeneratorArg() {
-
+        // Default constructor
     }
 
     public FileGeneratorArg(final String identifier) {
@@ -51,4 +56,24 @@ public final class FileGeneratorArg implements Identifiable<String> {
     public String toString() {
         return MoreObjects.toStringHelper(this).add("id", identifier).add("configuration", configuration).toString();
     }
+
+    public static @NonNull FileGeneratorArg readFrom(final DataInput in) throws IOException {
+        final var identifier = in.readUTF();
+        final var size = in.readInt();
+        final var configuration = Maps.<String, String>newHashMapWithExpectedSize(size);
+        for (int i = 0; i < size; ++i) {
+            configuration.put(in.readUTF(), in.readUTF());
+        }
+        return new FileGeneratorArg(identifier, configuration);
+    }
+
+    @Override
+    public void writeTo(final DataOutput out) throws IOException {
+        out.writeUTF(identifier);
+        out.writeInt(configuration.size());
+        for (String key : configuration.keySet().stream().sorted().toList()) {
+            out.writeUTF(key);
+            out.writeUTF(configuration.getOrDefault(key, ""));
+        }
+    }
 }
index ebfcba18265fc10b7b03ce5c575b04c5531a8780..1863cc53965c51118f3f677ea3fec6d6125fe3fd 100644 (file)
@@ -74,7 +74,7 @@ class YangToSourcesProcessor {
     private final YangParserFactory parserFactory;
     private final File yangFilesRootDir;
     private final Set<File> excludedFiles;
-    private final Map<String, FileGeneratorArg> fileGeneratorArgs;
+    private final ImmutableMap<String, FileGeneratorArg> fileGeneratorArgs;
     private final @NonNull MavenProject project;
     private final boolean inspectDependencies;
     private final BuildContext buildContext;
@@ -245,7 +245,8 @@ class YangToSourcesProcessor {
         }
 
         // FIXME: store these files into state, so that we can verify/clean up
-        final var outputState = new YangToSourcesState(new FileStateSet(ImmutableMap.copyOf(uniqueOutputFiles)));
+        final var outputState = new YangToSourcesState(fileGeneratorArgs,
+            new FileStateSet(ImmutableMap.copyOf(uniqueOutputFiles)));
         buildContext.setValue(BUILD_CONTEXT_STATE_NAME, outputState);
         if (buildContext.getValue(BUILD_CONTEXT_STATE_NAME) == null) {
             LOG.debug("{} BuildContext did not retain state, persisting", LOG_PREFIX);
index 99cb35dc3f1b6515bf3c070af148be07b7ef1ada..2beebec6f666411e47dad085b2e2150bf55da56e 100644 (file)
@@ -9,9 +9,11 @@ package org.opendaylight.yangtools.yang2sources.plugin;
 
 import static java.util.Objects.requireNonNull;
 
+import com.google.common.collect.ImmutableMap;
 import java.io.DataInput;
 import java.io.DataOutput;
 import java.io.IOException;
+import java.util.Collection;
 import org.eclipse.jdt.annotation.NonNull;
 import org.opendaylight.yangtools.concepts.WritableObject;
 
@@ -20,18 +22,43 @@ import org.opendaylight.yangtools.concepts.WritableObject;
  */
 // FIXME: expand to capture:
 //        - input YANG files
-//        - code generators and their config
-record YangToSourcesState(@NonNull FileStateSet outputFiles) implements WritableObject {
+record YangToSourcesState(
+        @NonNull ImmutableMap<String, FileGeneratorArg> fileGeneratorArgs,
+        @NonNull FileStateSet outputFiles) implements WritableObject {
     YangToSourcesState {
+        requireNonNull(fileGeneratorArgs);
         requireNonNull(outputFiles);
     }
 
     static @NonNull YangToSourcesState readFrom(final DataInput in) throws IOException {
-        return new YangToSourcesState(FileStateSet.readFrom(in));
+        return new YangToSourcesState(readConfigurations(in), FileStateSet.readFrom(in));
     }
 
     @Override
     public void writeTo(final DataOutput out) throws IOException {
+        writeConfigurations(out, fileGeneratorArgs.values());
         outputFiles.writeTo(out);
     }
+
+    private static void writeConfigurations(final DataOutput out, final Collection<FileGeneratorArg> configurations)
+            throws IOException {
+        out.writeInt(configurations.size());
+        for (var arg : configurations) {
+            arg.writeTo(out);
+        }
+    }
+
+    private static @NonNull ImmutableMap<String, FileGeneratorArg> readConfigurations(final DataInput in)
+            throws IOException {
+        final int size = in.readInt();
+        if (size == 0) {
+            return ImmutableMap.of();
+        }
+        final var configurations = ImmutableMap.<String, FileGeneratorArg>builderWithExpectedSize(size);
+        for (int i = 0; i < size; ++i) {
+            final var arg = FileGeneratorArg.readFrom(in);
+            configurations.put(arg.getIdentifier(), arg);
+        }
+        return configurations.build();
+    }
 }