Juan Hernandez has uploaded a new change for review.

Change subject: restapi: Support multiple RSDL metadata files
......................................................................

restapi: Support multiple RSDL metadata files

Currently the RSDL metadata is stored into one large YAML file. This
complicates the reviews, as gerrit is slow when handling large files.
This patch adds support for multiple metadata files. This support will
be used in later patches to split the metadata file into several smaller
files.

Change-Id: I217e15ba34ea617a618c72c2b152214717dbf0d2
Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com>
---
M backend/manager/dependencies/pom.xml
M backend/manager/modules/restapi/interface/definition/pom.xml
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlManager.java
R 
backend/manager/modules/restapi/interface/definition/src/main/metadata/all.yaml
M pom.xml
5 files changed, 56 insertions(+), 17 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/77/33777/1

diff --git a/backend/manager/dependencies/pom.xml 
b/backend/manager/dependencies/pom.xml
index 4d39aa4..a81a70e 100644
--- a/backend/manager/dependencies/pom.xml
+++ b/backend/manager/dependencies/pom.xml
@@ -264,7 +264,6 @@
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
-      <version>${commons-io.version}</version>
     </dependency>
 
     <dependency>
diff --git a/backend/manager/modules/restapi/interface/definition/pom.xml 
b/backend/manager/modules/restapi/interface/definition/pom.xml
index 517ea60..83441a9 100644
--- a/backend/manager/modules/restapi/interface/definition/pom.xml
+++ b/backend/manager/modules/restapi/interface/definition/pom.xml
@@ -51,6 +51,11 @@
     </dependency>
 
     <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </dependency>
+
+    <dependency>
       <groupId>commons-lang</groupId>
       <artifactId>commons-lang</artifactId>
     </dependency>
@@ -173,6 +178,7 @@
                   <mainClass>org.ovirt.engine.api.rsdl.RsdlManager</mainClass>
                   <arguments>
                     <argument>${application.baseuri}</argument>
+                    <argumetn>${project.basedir}/src/main/metadata</argumetn>
                     
<argument>${project.build.outputDirectory}/rsdl.xml</argument>
                     
<argument>${project.build.outputDirectory}/rsdl_gluster.xml</argument>
                   </arguments>
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlManager.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlManager.java
index 06715b4..9421e2d 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlManager.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/rsdl/RsdlManager.java
@@ -1,9 +1,11 @@
 package org.ovirt.engine.api.rsdl;
 
 import java.io.File;
+import java.io.FileInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 
 import javax.xml.bind.JAXB;
@@ -14,6 +16,7 @@
 import javax.xml.xpath.XPathConstants;
 import javax.xml.xpath.XPathFactory;
 
+import org.apache.commons.io.FileUtils;
 import org.apache.commons.lang.StringUtils;
 import org.ovirt.engine.api.model.ObjectFactory;
 import org.ovirt.engine.api.model.RSDL;
@@ -42,21 +45,16 @@
     private static final String GENERAL_METADATA_DESCRIPTION = "These options 
are valid for entire application.";
     private static final String ILLEGAL_ACTION_LINK_SUFFIX = "/";
 
-    private static final String METADATA_FILE_NAME = "/rsdl_metadata.yaml";
-
     public static void main(String[] args) throws ClassNotFoundException, 
IOException {
-        System.out.println("Generating RSDL files...");
         String baseUri = args[0];
-        String outputFileName = args[1];
-        String outputFileNameGluster = args[2];
+        String metaDataPath = args[1];
+        String outputFileName = args[2];
+        String outputFileNameGluster = args[3];
 
-        MetaData metadata = loadMetaData();
+        MetaData metadata = loadMetaData(metaDataPath);
         validateActionLinksFormat(metadata);
         generateRsdlFile(metadata, outputFileName, 
ApiRootLinksCreator.getAllRels(baseUri));
         generateRsdlFile(metadata, outputFileNameGluster, 
ApiRootLinksCreator.getGlusterRels(baseUri));
-
-        System.out.println("The following files have been generated: \n" + 
outputFileName + "\n"
-                + outputFileNameGluster);
     }
 
     private static void validateActionLinksFormat(MetaData metadata) {
@@ -121,9 +119,11 @@
     }
 
     private static void serializeRsdl(RSDL rsdl, String rsdlLocation) {
+        File rsdlFile = new File(rsdlLocation);
+        System.out.println("Generating RSDL file \"" + 
rsdlFile.getAbsolutePath() + "\"");
         ObjectFactory factory = new ObjectFactory();
         JAXBElement<RSDL> element = factory.createRsdl(rsdl);
-        JAXB.marshal(element, new File(rsdlLocation));
+        JAXB.marshal(element, rsdlFile);
     }
 
     private static RSDL buildRsdl(MetaData metadata, List<String> rels) throws 
IOException,
@@ -148,12 +148,41 @@
         return rsdl;
     }
 
-    private static MetaData loadMetaData() throws IOException {
-        // Load the metadata file:
-        InputStream stream = 
RsdlManager.class.getResourceAsStream(METADATA_FILE_NAME);
-        Constructor constructor = new 
CustomClassLoaderConstructor(Thread.currentThread().getContextClassLoader());
-        MetaData metaData = (MetaData) new Yaml(constructor).load(stream);
-        stream.close();
+    private static MetaData loadMetaData(String metaDataPath) throws 
IOException {
+        // Find the metadata directory:
+        File metaDataDirectory = new File(metaDataPath);
+        if (!metaDataDirectory.exists()) {
+            throw new IOException(
+                "The metadata directory \"" + 
metaDataDirectory.getAbsoluteFile() + "\" doesn't exist"
+            );
+        }
+
+        // Find all the metadata files:
+        Collection<File> metaDataFiles = 
FileUtils.listFiles(metaDataDirectory, new String[] { "yaml" }, true);
+
+        // Load the metadata files:
+        MetaData metaData = new MetaData();
+        Constructor metaDataConstructor =
+                new 
CustomClassLoaderConstructor(Thread.currentThread().getContextClassLoader());
+        Yaml metaDataLoader = new Yaml(metaDataConstructor);
+        for (File metaDataFile : metaDataFiles) {
+            System.out.println("Loading metadata file \"" + 
metaDataFile.getAbsolutePath() + "\"");
+            try (InputStream metaDataInput = new 
FileInputStream(metaDataFile)) {
+                Object metaDataObject = metaDataLoader.load(metaDataInput);
+                if (metaDataObject instanceof Action) {
+                    metaData.getActions().add((Action) metaDataObject);
+                }
+                else if (metaDataObject instanceof MetaData) {
+                    metaData.getActions().addAll(((MetaData) 
metaDataObject).getActions());
+                }
+                else {
+                    throw new IOException(
+                        "The metadata file \"" + 
metaDataFile.getAbsolutePath() + "\" contains an unknown type of " +
+                        "metadata \"" + metaDataObject.getClass().getName() + 
"\""
+                    );
+                }
+            }
+        }
 
         // Remove leading slashes from all the action names:
         for (Action action : metaData.getActions()) {
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/metadata/all.yaml
similarity index 100%
rename from 
backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
rename to 
backend/manager/modules/restapi/interface/definition/src/main/metadata/all.yaml
diff --git a/pom.xml b/pom.xml
index cb65696..039d4f5 100644
--- a/pom.xml
+++ b/pom.xml
@@ -228,6 +228,11 @@
         <version>${postgres.jdbc.version}</version>
       </dependency>
       <dependency>
+        <groupId>commons-io</groupId>
+        <artifactId>commons-io</artifactId>
+        <version>${commons-io.version}</version>
+      </dependency>
+      <dependency>
         <groupId>commons-lang</groupId>
         <artifactId>commons-lang</artifactId>
         <version>${commons-lang.version}</version>


-- 
To view, visit http://gerrit.ovirt.org/33777
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I217e15ba34ea617a618c72c2b152214717dbf0d2
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Juan Hernandez <juan.hernan...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to