Move the aai-schema, annotations and
[aai/schema-service.git] / aai-schema-gen / src / main / java / org / onap / aai / schemagen / GenerateXsd.java
diff --git a/aai-schema-gen/src/main/java/org/onap/aai/schemagen/GenerateXsd.java b/aai-schema-gen/src/main/java/org/onap/aai/schemagen/GenerateXsd.java
new file mode 100644 (file)
index 0000000..227df63
--- /dev/null
@@ -0,0 +1,318 @@
+/**
+ * ============LICENSE_START=======================================================
+ * org.onap.aai
+ * ================================================================================
+ * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved.
+ * ================================================================================
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ * ============LICENSE_END=========================================================
+ */
+package org.onap.aai.schemagen;
+
+
+import org.onap.aai.setup.SchemaVersion;
+import org.onap.aai.setup.SchemaVersions;
+import org.onap.aai.schemagen.genxsd.HTMLfromOXM;
+import org.onap.aai.schemagen.genxsd.NodesYAMLfromOXM;
+import org.onap.aai.schemagen.genxsd.YAMLfromOXM;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.context.annotation.AnnotationConfigApplicationContext;
+import org.w3c.dom.NodeList;
+
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.*;
+
+public class GenerateXsd {
+
+       private static final Logger logger = LoggerFactory.getLogger("GenerateXsd.class");
+       protected static String apiVersion = null;
+       public static AnnotationConfigApplicationContext ctx = null;
+       static String apiVersionFmt = null;
+       static boolean useAnnotationsInXsd = false;
+       static String responsesUrl = null;
+       static String responsesLabel = null;
+       static String jsonEdges = null;
+       static Map<String, String> generatedJavaType;
+       static Map<String, String> appliedPaths;
+       static String RELEASE = System.getProperty("aai.release", "onap");
+
+
+       static NodeList javaTypeNodes;
+       static Map<String,String> javaTypeDefinitions = createJavaTypeDefinitions();
+    private static Map<String, String> createJavaTypeDefinitions()
+    {
+       StringBuffer aaiInternal = new StringBuffer();
+       Map<String,String> javaTypeDefinitions = new HashMap<String, String>();
+       aaiInternal.append("  aai-internal:\n");
+       aaiInternal.append("    properties:\n");
+       aaiInternal.append("      property-name:\n");
+       aaiInternal.append("        type: string\n");
+       aaiInternal.append("      property-value:\n");
+       aaiInternal.append("        type: string\n");
+//     javaTypeDefinitions.put("aai-internal", aaiInternal.toString());
+       return javaTypeDefinitions;
+    }
+
+       public static final int VALUE_NONE = 0;
+       public static final int VALUE_DESCRIPTION = 1;
+       public static final int VALUE_INDEXED_PROPS = 2;
+       public static final int VALUE_CONTAINER = 3;
+
+       private static final String generateTypeXSD = "xsd";
+       private static final String generateTypeYAML = "yaml";
+
+       private final static String nodeDir = System.getProperty("nodes.configuration.location");
+       private final static String edgeDir = System.getProperty("edges.configuration.location");
+       private static final String baseRoot = "aai-schema/";
+       private static final String baseAutoGenRoot = "aai-schema/";
+
+       private static final String root = baseRoot + "src/main/resources";
+       private static final String autoGenRoot = baseAutoGenRoot + "src/main/resources";
+
+       private static final String normalStartDir = "aai-schema-gen";
+       private static final String xsd_dir = root + "/" + RELEASE +"/aai_schema";
+
+       private static final String yaml_dir = (((System.getProperty("user.dir") != null) && (!System.getProperty("user.dir").contains(normalStartDir))) ? autoGenRoot : root) + "/" + RELEASE + "/aai_swagger_yaml";
+
+       /* These three strings are for yaml auto-generation from aai-common class*/
+
+       private static int swaggerSupportStartsVersion = 1; // minimum version to support swagger documentation
+
+
+       private static boolean validVersion(String versionToGen) {
+
+               if ("ALL".equalsIgnoreCase(versionToGen)) {
+                       return true;
+               }
+
+               SchemaVersions schemaVersions = SpringContextAware.getBean(SchemaVersions.class);
+               for (SchemaVersion v : schemaVersions.getVersions()) {
+               if (v.equals(versionToGen)) {
+                   return true;
+               }
+           }
+
+           return false;
+       }
+
+       private static boolean versionSupportsSwagger( String version) {
+               if (new Integer(version.substring(1)).intValue() >= swaggerSupportStartsVersion ) {
+                       return true;
+               }
+               return false;
+       }
+
+       public static String getAPIVersion() {
+               return apiVersion;
+       }
+
+       public static String getYamlDir() {
+               return yaml_dir;
+       }
+
+       public static String getResponsesUrl() {
+               return responsesUrl;
+       }
+       public static void main(String[] args) throws IOException {
+               String versionToGen = System.getProperty("gen_version").toLowerCase();
+               String fileTypeToGen = System.getProperty("gen_type").toLowerCase();
+
+               AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(
+                               "org.onap.aai.setup",
+            "org.onap.aai.schemagen"
+               );
+
+               SchemaVersions schemaVersions = ctx.getBean(SchemaVersions.class);
+
+               if ( fileTypeToGen == null ) {
+                       fileTypeToGen = generateTypeXSD;
+               }
+
+               if ( !fileTypeToGen.equals( generateTypeXSD ) && !fileTypeToGen.equals( generateTypeYAML )) {
+                       System.err.println("Invalid gen_type passed. " + fileTypeToGen);
+                       System.exit(1);
+               }
+
+               String responsesLabel = System.getProperty("yamlresponses_url");
+               responsesUrl = responsesLabel;
+
+               List<SchemaVersion> versionsToGen = new ArrayList<>();
+               if ( versionToGen == null ) {
+                       System.err.println("Version is required, ie v<n> or ALL.");
+                       System.exit(1);
+               }
+               else if (!"ALL".equalsIgnoreCase(versionToGen) && !versionToGen.matches("v\\d+") && !validVersion(versionToGen)) {
+                       System.err.println("Invalid version passed. " + versionToGen);
+                       System.exit(1);
+               }
+               else if ("ALL".equalsIgnoreCase(versionToGen)) {
+                       versionsToGen = schemaVersions.getVersions();
+                       Collections.sort(versionsToGen);
+                       Collections.reverse(versionsToGen);
+               } else {
+                       versionsToGen.add(new SchemaVersion(versionToGen));
+               }
+
+               //process file type System property
+               fileTypeToGen = (fileTypeToGen == null ? generateTypeXSD : fileTypeToGen.toLowerCase());
+               if ( !fileTypeToGen.equals( generateTypeXSD ) && !fileTypeToGen.equals( generateTypeYAML )) {
+                       System.err.println("Invalid gen_type passed. " + fileTypeToGen);
+                       System.exit(1);
+               } else if ( fileTypeToGen.equals(generateTypeYAML) ) {
+                       if ( responsesUrl == null || responsesUrl.length() < 1
+                                       || responsesLabel == null || responsesLabel.length() < 1 ) {
+                               System.err.println("generating swagger yaml file requires yamlresponses_url and yamlresponses_label properties" );
+                               System.exit(1);
+                       } else {
+                               responsesUrl = "description: "+ "Response codes found in [response codes]("+responsesLabel+ ").\n";
+                       }
+               }
+               /*
+                * TODO: Oxm Path is config driveb
+                */
+               String oxmPath;
+               if(System.getProperty("user.dir") != null && !System.getProperty("user.dir").contains(normalStartDir)) {
+                       oxmPath = baseAutoGenRoot + nodeDir;
+               }
+               else {
+                       oxmPath = baseRoot + nodeDir;
+               }
+
+               String outfileName = null;
+               File outfile;
+               String nodesfileName = null;
+               File nodesfile;
+               String fileContent = null;
+               String nodesContent = null;
+
+
+               for (SchemaVersion v : versionsToGen) {
+                       apiVersion = v.toString();
+                       logger.debug("YAMLdir = "+yaml_dir);
+                       logger.debug("Generating " + apiVersion + " " + fileTypeToGen);
+                       apiVersionFmt = "." + apiVersion + ".";
+                       generatedJavaType = new HashMap<String, String>();
+                       appliedPaths = new HashMap<String, String>();
+                       File edgeRuleFile = null;
+                       String fileName = edgeDir + "DbEdgeRules_" + apiVersion + ".json";
+                       logger.debug("user.dir = "+System.getProperty("user.dir"));
+                       if(System.getProperty("user.dir") != null && !System.getProperty("user.dir").contains(normalStartDir)) {
+                               fileName = baseAutoGenRoot + fileName;
+
+                       }
+                       else {
+                               fileName = baseRoot + fileName;
+
+                       }
+                       edgeRuleFile = new File( fileName);
+//                     Document doc = ni.getSchema(translateVersion(v));
+
+                       if ( fileTypeToGen.equals(generateTypeXSD) ) {
+                               outfileName = xsd_dir + "/aai_schema_" + apiVersion + "." + generateTypeXSD;
+                               try {
+                                       HTMLfromOXM swagger = ctx.getBean(HTMLfromOXM.class);
+                                       swagger.setVersion(v);
+                                       fileContent = swagger.process();
+                                       if ( fileContent.startsWith("Schema format issue")) {
+                                               throw new Exception(fileContent);
+                                       }
+                               } catch(Exception e) {
+                               logger.error( "Exception creating output file " + outfileName);
+                               logger.error( e.getMessage());
+                               e.printStackTrace();
+                               System.exit(-1);
+                               }
+                       } else if ( versionSupportsSwagger(apiVersion )) {
+                               outfileName = yaml_dir + "/aai_swagger_" + apiVersion + "." + generateTypeYAML;
+                               nodesfileName = yaml_dir + "/aai_swagger_" + apiVersion + "." + "nodes"+"."+generateTypeYAML;
+                               try {
+                                       YAMLfromOXM swagger = (YAMLfromOXM) ctx.getBean(YAMLfromOXM.class);
+                                       swagger.setVersion(v);
+                                       fileContent = swagger.process();
+                                       Map combinedJavaTypes = swagger.getCombinedJavaTypes();
+                                       NodesYAMLfromOXM nodesSwagger = ctx.getBean(NodesYAMLfromOXM.class);
+                                       nodesSwagger.setVersion(v);
+                                       nodesSwagger.setCombinedJavaTypes(combinedJavaTypes);
+                                       nodesContent = nodesSwagger.process();
+                               } catch(Exception e) {
+                               logger.error( "Exception creating output file " + outfileName);
+                               e.printStackTrace();
+                               }
+                       } else {
+                               continue;
+                       }
+                       outfile = new File(outfileName);
+                       File parentDir = outfile.getParentFile();
+                       if(! parentDir.exists())
+                             parentDir.mkdirs();
+                       if(nodesfileName != null) {
+                               BufferedWriter nodesBW = null;
+                               nodesfile = new File(nodesfileName);
+                               parentDir = nodesfile.getParentFile();
+                               if(! parentDir.exists())
+                                     parentDir.mkdirs();
+                           try {
+                               nodesfile.createNewFile();
+                           } catch (IOException e) {
+                               logger.error( "Exception creating output file " + nodesfileName);
+                               e.printStackTrace();
+                           }
+                       try {
+                               Charset charset = Charset.forName("UTF-8");
+                               Path path = Paths.get(nodesfileName);
+                               nodesBW = Files.newBufferedWriter(path, charset);
+                               nodesBW.write(nodesContent);
+                       } catch ( IOException e) {
+                               logger.error( "Exception writing output file " + outfileName);
+                               e.printStackTrace();
+                       } finally {
+                               if ( nodesBW != null ) {
+                                       nodesBW.close();
+                               }
+                       }
+                       }
+
+                   try {
+                       outfile.createNewFile();
+                   } catch (IOException e) {
+                       logger.error( "Exception creating output file " + outfileName);
+                       e.printStackTrace();
+                   }
+                   BufferedWriter bw = null;
+               try {
+                       Charset charset = Charset.forName("UTF-8");
+                       Path path = Paths.get(outfileName);
+                       bw = Files.newBufferedWriter(path, charset);
+                       bw.write(fileContent);
+               } catch ( IOException e) {
+                       logger.error( "Exception writing output file " + outfileName);
+                       e.printStackTrace();
+               } finally {
+                       if ( bw != null ) {
+                               bw.close();
+                       }
+               }
+                       logger.debug( "GeneratedXSD successful, saved in " + outfileName);
+               }
+
+       }
+
+}
+