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