Api docs: unify handling of writers and subtree writers 68/7768/1
authorMarek Gradzki <[email protected]>
Tue, 25 Jul 2017 12:30:45 +0000 (14:30 +0200)
committerMarek Gradzki <[email protected]>
Tue, 25 Jul 2017 13:13:15 +0000 (15:13 +0200)
Change-Id: Ib0bd217c92f39052cc24f6324b5d33aa0443d002
Signed-off-by: Marek Gradzki <[email protected]>
vpp-integration/api-docs/core/src/main/java/io/fd/hc2vpp/docs/core/CollectingWriterBuilder.java
vpp-integration/api-docs/core/src/main/java/io/fd/hc2vpp/docs/core/CoverageGenerator.java
vpp-integration/api-docs/core/src/main/java/io/fd/hc2vpp/docs/core/VppApiUtils.java

index b8fcc8b..6abb6a8 100644 (file)
@@ -36,39 +36,46 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
  */
 public class CollectingWriterBuilder implements ModifiableWriterRegistryBuilder {
 
-    private final List<Writer<? extends DataObject>> singleNodeHandlers;
-    private final List<MultiNodeWriteHandler> multiNodeWriteHandlers;
+    private final List<WriteHandler> writeHandlers;
 
     public CollectingWriterBuilder() {
-        singleNodeHandlers = new LinkedList<>();
-        multiNodeWriteHandlers = new LinkedList<>();
+        writeHandlers = new LinkedList<>();
+    }
+
+    private void addHandler(final Writer<? extends DataObject> handler) {
+        writeHandlers.add(new WriteHandler(handler));
+    }
+
+    private void addHandler(final Writer<? extends DataObject> handler,
+                            final Set<InstanceIdentifier<?>> handledChildren) {
+        writeHandlers.add(new WriteHandler(handler, handledChildren));
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> add(
             @Nonnull Writer<? extends DataObject> handler) {
-        singleNodeHandlers.add(handler);
+        addHandler(handler);
         return this;
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> subtreeAdd(
             @Nonnull Set<InstanceIdentifier<?>> handledChildren, @Nonnull Writer<? extends DataObject> handler) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, handledChildren));
+        addHandler(handler, handledChildren);
         return this;
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> addBefore(
             @Nonnull Writer<? extends DataObject> handler, @Nonnull InstanceIdentifier<?> relatedType) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, Collections.singleton(relatedType)));
+        addHandler(handler, Collections.singleton(relatedType));
         return this;
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> addBefore(
             @Nonnull Writer<? extends DataObject> handler, @Nonnull Collection<InstanceIdentifier<?>> relatedTypes) {
-        singleNodeHandlers.add(handler);
+        addHandler(handler);
         return this;
     }
 
@@ -76,7 +83,7 @@ public class CollectingWriterBuilder implements ModifiableWriterRegistryBuilder
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> subtreeAddBefore(
             @Nonnull Set<InstanceIdentifier<?>> handledChildren, @Nonnull Writer<? extends DataObject> handler,
             @Nonnull InstanceIdentifier<?> relatedType) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, handledChildren));
+        addHandler(handler, handledChildren);
         return null;
     }
 
@@ -84,21 +91,21 @@ public class CollectingWriterBuilder implements ModifiableWriterRegistryBuilder
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> subtreeAddBefore(
             @Nonnull Set<InstanceIdentifier<?>> handledChildren, @Nonnull Writer<? extends DataObject> handler,
             @Nonnull Collection<InstanceIdentifier<?>> relatedTypes) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, handledChildren));
+        addHandler(handler, handledChildren);
         return this;
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> addAfter(
             @Nonnull Writer<? extends DataObject> handler, @Nonnull InstanceIdentifier<?> relatedType) {
-        singleNodeHandlers.add(handler);
+        addHandler(handler);
         return this;
     }
 
     @Override
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> addAfter(
             @Nonnull Writer<? extends DataObject> handler, @Nonnull Collection<InstanceIdentifier<?>> relatedTypes) {
-        singleNodeHandlers.add(handler);
+        addHandler(handler);
         return this;
     }
 
@@ -106,7 +113,7 @@ public class CollectingWriterBuilder implements ModifiableWriterRegistryBuilder
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> subtreeAddAfter(
             @Nonnull Set<InstanceIdentifier<?>> handledChildren, @Nonnull Writer<? extends DataObject> handler,
             @Nonnull InstanceIdentifier<?> relatedType) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, Collections.singleton(relatedType)));
+        addHandler(handler, handledChildren);
         return this;
     }
 
@@ -114,40 +121,41 @@ public class CollectingWriterBuilder implements ModifiableWriterRegistryBuilder
     public ModifiableSubtreeManagerRegistryBuilder<Writer<? extends DataObject>> subtreeAddAfter(
             @Nonnull Set<InstanceIdentifier<?>> handledChildren, @Nonnull Writer<? extends DataObject> handler,
             @Nonnull Collection<InstanceIdentifier<?>> relatedTypes) {
-        multiNodeWriteHandlers.add(new MultiNodeWriteHandler(handler, handledChildren));
+        addHandler(handler, handledChildren);
         return this;
     }
 
-    public List<Writer<? extends DataObject>> getSingleNodeHandlers() {
-        return singleNodeHandlers;
+    public List<WriteHandler> getWriteHandlers() {
+        return writeHandlers;
     }
 
-    public List<MultiNodeWriteHandler> getMultiNodeWriteHandlers() {
-        return multiNodeWriteHandlers;
-    }
-
-    public static class MultiNodeWriteHandler {
+    public static class WriteHandler {
         private final Writer<? extends DataObject> writer;
-        private final Set<String> handledChildren;
-
+        private final Set<String> handledNodes;
 
-        public MultiNodeWriteHandler(Writer<? extends DataObject> writer, Set<InstanceIdentifier<?>> handledChildren) {
+        public WriteHandler(Writer<? extends DataObject> writer, Set<InstanceIdentifier<?>> handledChildren) {
             this.writer = writer;
-            this.handledChildren = ImmutableSet.<String>builder()
-                    .add(writer.getManagedDataObjectType().getTargetType().getName())
-                    .addAll(handledChildren.stream()
-                            .map(InstanceIdentifier::getTargetType)
-                            .map(Class::getName)
-                            .collect(Collectors.toSet()))
-                    .build();
+            this.handledNodes = ImmutableSet.<String>builder()
+                // add node managed by writer
+                .add(writer.getManagedDataObjectType().getTargetType().getName())
+                // and set of handled children (may be empty in case of non subtree writers)
+                .addAll(handledChildren.stream()
+                    .map(InstanceIdentifier::getTargetType)
+                    .map(Class::getName)
+                    .collect(Collectors.toSet()))
+                .build();
+        }
+
+        public WriteHandler(final Writer<? extends DataObject> writer) {
+            this(writer, Collections.emptySet());
         }
 
         public Writer<? extends DataObject> getWriter() {
             return writer;
         }
 
-        public Set<String> getHandledChildren() {
-            return handledChildren;
+        public Set<String> getHandledNodes() {
+            return handledNodes;
         }
     }
 }
index 4b6ab77..4a8a778 100644 (file)
@@ -34,7 +34,6 @@ import io.fd.hc2vpp.docs.api.PluginCoverage;
 import io.fd.hc2vpp.docs.api.YangType;
 import io.fd.honeycomb.translate.write.WriterFactory;
 import java.lang.reflect.Field;
-import java.util.Collections;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Set;
@@ -59,14 +58,13 @@ public class CoverageGenerator implements VppApiUtils {
                                                  final List<Module> scannedModules,
                                                  final YangTypeLinkIndex yangTypeIndex,
                                                  final ClassPathTypeIndex classPathIndex) {
-        LOG.info("Generating config coverage for plugin {}", pluginClass);
+        LOG.info("Generating config VPP API to Yang mapping for plugin {}", pluginClass);
         getInjectedWriterFactories(scannedModules).forEach(writerFactory -> writerFactory.init(writerBuilder));
 
-        LOG.info("Processing single node handlers");
-        final Set<CoverageUnit> singleNodeCoverageUnits = writerBuilder.getSingleNodeHandlers().stream()
-                .flatMap(writer -> {
+        final Set<CoverageUnit> coverageUnits = writerBuilder.getWriteHandlers().stream()
+                .flatMap(handler -> {
                     // extracts customizer class from handler
-                    final Class<?> customizerClass = getCustomizerClass(writer);
+                    final Class<?> customizerClass = getCustomizerClass(handler.getWriter());
 
                     // scans within write method
                     final Set<PluginMethodReference> writeReferences =
@@ -81,62 +79,19 @@ public class CoverageGenerator implements VppApiUtils {
                             new CoverageScanner(customizerClass, DELETE, pluginClass).scan();
 
                     return Stream.of(writeReferences.stream(), updateReferences.stream(), deleteReferences.stream())
-                            .flatMap(pluginMethodReferences -> pluginMethodReferences)
+                            .flatMap(pluginMethodReferenceStream -> pluginMethodReferenceStream)
                             .map(reference -> {
                                 final CoverageUnit.CoverageUnitBuilder builder = new CoverageUnit.CoverageUnitBuilder();
 
                                 // binds vpp api name and generateLink bind with version
-                                builder.setVppApi(fromJvppApi(version, reference));
+                                builder.setVppApi(fromJvppApi(version, reference.getName()));
 
                                 //binds java api reference
                                 builder.setJavaApi(new JavaApiMessage(reference.getName()));
 
-                                //binds Yang types with links from pre-build index
-                                // TODO - use deserialized yii
-                                final String typeName = writer.getManagedDataObjectType().getTargetType().getTypeName();
-                                builder.setYangTypes(Collections.singletonList(new YangType(
-                                        typeName,
-                                        yangTypeIndex.getLinkForType(typeName))));
-
-                                final List<Operation> supportedOperations = new LinkedList<>();
-
-                                final String callerClassLink = classPathIndex.linkForClass(reference.getCaller());
-                                if (writeReferences.contains(reference)) {
-                                    supportedOperations.add(new Operation(callerClassLink, WRITE));
-                                }
-
-                                if (updateReferences.contains(reference)) {
-                                    supportedOperations.add(new Operation(callerClassLink, UPDATE));
-                                }
-
-                                if (deleteReferences.contains(reference)) {
-                                    supportedOperations.add(new Operation(callerClassLink, DELETE));
-                                }
-                                return builder.setSupportedOperations(supportedOperations).build();
-                            });
-                }).collect(Collectors.toSet());
-
-        LOG.info("Processing multi node handlers");
-        final Set<CoverageUnit> multiNodeCoverageUnits = writerBuilder.getMultiNodeWriteHandlers().stream()
-                .flatMap(handler -> {
-                    final Class<?> customizerClass = getCustomizerClass(handler.getWriter());
-                    final Set<PluginMethodReference> writeReferences =
-                            new CoverageScanner(customizerClass, WRITE, pluginClass).scan();
-
-                    final Set<PluginMethodReference> updateReferences =
-                            new CoverageScanner(customizerClass, UPDATE, pluginClass).scan();
-
-                    final Set<PluginMethodReference> deleteReferences =
-                            new CoverageScanner(customizerClass, DELETE, pluginClass).scan();
-
-                    return Stream.of(writeReferences.stream(), updateReferences.stream(), deleteReferences.stream())
-                            .flatMap(pluginMethodReferenceStream -> pluginMethodReferenceStream)
-                            .map(reference -> {
-                                final CoverageUnit.CoverageUnitBuilder builder = new CoverageUnit.CoverageUnitBuilder();
-                                builder.setVppApi(fromJvppApi(version, reference));
-                                builder.setJavaApi(new JavaApiMessage(reference.getName()));
-
-                                builder.setYangTypes(handler.getHandledChildren().stream()
+                                // binds Yang types with links from pre-build index
+                                // TODO - use deserialized yii e.g. /module:parent-node/child-node
+                                builder.setYangTypes(handler.getHandledNodes().stream()
                                         .map(type -> new YangType(type, yangTypeIndex.getLinkForType(type)))
                                         .collect(Collectors.toList()));
 
@@ -157,10 +112,7 @@ public class CoverageGenerator implements VppApiUtils {
                             });
                 }).collect(Collectors.toSet());
 
-        return new PluginCoverage(pluginClass.getSimpleName(),
-                Stream.of(singleNodeCoverageUnits.stream(), multiNodeCoverageUnits.stream())
-                        .flatMap(coverageUnitStream -> coverageUnitStream)
-                        .collect(Collectors.toSet()), true);
+        return new PluginCoverage(pluginClass.getSimpleName(), coverageUnits, true);
     }
 
     private static Class<?> getCustomizerClass(final Object handler) {
index f21cc26..c978aba 100644 (file)
@@ -22,11 +22,7 @@ import io.fd.hc2vpp.docs.api.VppApiMessage;
 
 public interface VppApiUtils {
 
-    static String vppApiFromJavaApi(final String jvppApi) {
-        return CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, jvppApi);
-    }
-
-    static String generateVppApiDocLink(final String version, final String vppApi) {
+    static String generateVppApiDocLink(final String version, final String vppMessageName) {
         //https://docs.fd.io/vpp/17.07/d9/d1d/structvl__api__create__subif__t.html
         // links are using double underscore
         //final String doubleUnderscoreApiName = vppApi.replace("_", "__");
@@ -36,8 +32,8 @@ public interface VppApiUtils {
         return "https://docs.fd.io/vpp/17.07/annotated.html";
     }
 
-    default VppApiMessage fromJvppApi(final String version, final PluginMethodReference jvppApi) {
-        final String vppApi = vppApiFromJavaApi(jvppApi.getName());
-        return new VppApiMessage(vppApi, generateVppApiDocLink(version, vppApi));
+    default VppApiMessage fromJvppApi(final String version, final String jvppMethodName) {
+        final String vppMessageName = CaseFormat.LOWER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, jvppMethodName);
+        return new VppApiMessage(vppMessageName, generateVppApiDocLink(version, vppMessageName));
     }
 }