diff options
author | Kajur, Harish (vk250x) <vk250x@att.com> | 2019-04-10 15:24:11 -0400 |
---|---|---|
committer | Kajur, Harish (vk250x) <vk250x@att.com> | 2019-04-10 15:25:55 -0400 |
commit | 3b3bfd2cb38628532970c56b52b08d31bec35a18 (patch) | |
tree | 2a3ef8b969fe5fab4a400a31e377b8a2775c7382 | |
parent | b2b5c9cc0fade491f85cba743ec66459bb7342f8 (diff) |
Remove the generation code for swagger and xsd
The following code has been moved to schema service
Issue-ID: AAI-2313
Change-Id: I58911dffef70ab2c32a73de79ac971c3650106e6
Signed-off-by: Kajur, Harish (vk250x) <vk250x@att.com>
44 files changed, 14 insertions, 9697 deletions
diff --git a/aai-annotations/pom.xml b/aai-annotations/pom.xml index 39b7c434..3f5529e7 100644 --- a/aai-annotations/pom.xml +++ b/aai-annotations/pom.xml @@ -27,12 +27,12 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-annotations</artifactId> <name>aai-annotations</name> <packaging>jar</packaging> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <properties> <onap.nexus.url>https://nexus.onap.org</onap.nexus.url> </properties> diff --git a/aai-auth/pom.xml b/aai-auth/pom.xml index 3f46cbb4..06d9410e 100644 --- a/aai-auth/pom.xml +++ b/aai-auth/pom.xml @@ -26,11 +26,11 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-auth</artifactId> <name>aai-auth</name> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <properties> <onap.nexus.url>https://nexus.onap.org</onap.nexus.url> diff --git a/aai-core/pom.xml b/aai-core/pom.xml index 7c80dfed..dfc9ca52 100644 --- a/aai-core/pom.xml +++ b/aai-core/pom.xml @@ -27,11 +27,11 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-core</artifactId> <name>aai-core</name> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <packaging>jar</packaging> <properties> <sonar.language>java</sonar.language> diff --git a/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java b/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java deleted file mode 100644 index dea284c8..00000000 --- a/aai-core/src/main/java/org/onap/aai/config/SwaggerGenerationConfiguration.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright © 2018 IBM. - * ================================================================================ - * 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.config; - - -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.util.genxsd.HTMLfromOXM; -import org.onap.aai.util.genxsd.NodesYAMLfromOXM; -import org.onap.aai.util.genxsd.YAMLfromOXM; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.beans.factory.config.ConfigurableBeanFactory; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Scope; - -@Configuration -public class SwaggerGenerationConfiguration { - - @Value("${schema.uri.base.path}") - private String basePath; - - @Value("${schema.xsd.maxoccurs:5000}") - private String maxOccurs; - - @Bean - @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public NodesYAMLfromOXM nodesYamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) { - return new NodesYAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor); - } - - @Bean - @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public HTMLfromOXM htmlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) { - return new HTMLfromOXM(maxOccurs, schemaVersions, nodeIngestor, edgeIngestor); - } - - @Bean - @Scope(scopeName = ConfigurableBeanFactory.SCOPE_PROTOTYPE) - public YAMLfromOXM yamlFromOXM(SchemaVersions schemaVersions, NodeIngestor nodeIngestor, EdgeIngestor edgeIngestor) { - return new YAMLfromOXM(basePath, schemaVersions, nodeIngestor, edgeIngestor); - } - -} diff --git a/aai-core/src/main/java/org/onap/aai/util/AutoGenerateHtml.java b/aai-core/src/main/java/org/onap/aai/util/AutoGenerateHtml.java deleted file mode 100644 index 1745bb04..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/AutoGenerateHtml.java +++ /dev/null @@ -1,80 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright © 2018 IBM. - * ================================================================================ - * 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.util; - -import java.io.File; -import java.io.IOException; -import java.util.Collections; -import java.util.List; -import java.util.ListIterator; - -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.util.swagger.GenerateSwagger; - -import freemarker.template.TemplateException; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; - -public class AutoGenerateHtml { - - private static final String AAI_GENERATE_VERSION = "aai.generate.version"; - public static final String DEFAULT_SCHEMA_DIR = "../aai-schema"; - //if the program is run from aai-common, use this directory as default" - public static final String ALT_SCHEMA_DIR = "aai-schema"; - //used to check to see if program is run from aai-core - public static final String DEFAULT_RUN_DIR = "aai-core"; - - public static void main(String[] args) throws IOException, TemplateException { - String savedProperty = System.getProperty(AAI_GENERATE_VERSION); - - AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext( - "org.onap.aai.config", - "org.onap.aai.setup" - ); - - - SchemaVersions schemaVersions = ctx.getBean(SchemaVersions.class); - - List<SchemaVersion> versionsToGen = schemaVersions.getVersions(); - Collections.sort(versionsToGen); - Collections.reverse(versionsToGen); - ListIterator<SchemaVersion> versionIterator = versionsToGen.listIterator(); - String schemaDir; - if(System.getProperty("user.dir") != null && !System.getProperty("user.dir").contains(DEFAULT_RUN_DIR)) { - schemaDir = ALT_SCHEMA_DIR; - } - else { - schemaDir = DEFAULT_SCHEMA_DIR; - } - String release = System.getProperty("aai.release", "onap"); - while (versionIterator.hasNext()) { - System.setProperty(AAI_GENERATE_VERSION, versionIterator.next().toString()); - String yamlFile = schemaDir + "/src/main/resources/" + release + "/aai_swagger_yaml/aai_swagger_" + System.getProperty(AAI_GENERATE_VERSION)+ ".yaml"; - File swaggerYamlFile = new File(yamlFile); - if(swaggerYamlFile.exists()) { - GenerateSwagger.schemaVersions = schemaVersions; - GenerateSwagger.main(args); - } - } - System.setProperty(AAI_GENERATE_VERSION, savedProperty); - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/GenerateXsd.java b/aai-core/src/main/java/org/onap/aai/util/GenerateXsd.java deleted file mode 100644 index f44663e0..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/GenerateXsd.java +++ /dev/null @@ -1,320 +0,0 @@ -/** - * ============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.util; - - -import org.onap.aai.config.SpringContextAware; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.util.genxsd.HTMLfromOXM; -import org.onap.aai.util.genxsd.NodesYAMLfromOXM; - -import org.onap.aai.util.genxsd.YAMLfromOXM; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.w3c.dom.*; - - -import java.io.*; -import java.nio.charset.Charset; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.*; - -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -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-core"; - 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 = (SchemaVersions) SpringContextAware.getBean("schemaVersions"); - 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.config", - "org.onap.aai.setup" - ); - - 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); - } - - } - -} - diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/ConfigTranslatorForDocs.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/ConfigTranslatorForDocs.java deleted file mode 100644 index 3a42e437..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/ConfigTranslatorForDocs.java +++ /dev/null @@ -1,84 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.File; -import java.io.FilenameFilter; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.TreeMap; -import org.onap.aai.setup.ConfigTranslator; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaConfigVersions; - -public class ConfigTranslatorForDocs extends ConfigTranslator { - - public ConfigTranslatorForDocs(SchemaLocationsBean bean, SchemaConfigVersions schemaVersions) { - super(bean, schemaVersions); - } - - @Override - public Map<SchemaVersion, List<String>> getNodeFiles() { - List<SchemaVersion> versionsToGen = new ArrayList<>(); - versionsToGen = schemaVersions.getVersions(); - Collections.sort(versionsToGen); - Collections.reverse(versionsToGen); - Map<SchemaVersion, List<String>> mp = new TreeMap<>(); - for (SchemaVersion v : versionsToGen) { - File dir = new File(bean.getNodeDirectory() + File.separator + v.toString().toLowerCase()); - File [] fileSet = dir.listFiles(); - List<String> files = new ArrayList<>(); - for(File f: fileSet ) { - files.add(f.getAbsolutePath()); - } - - mp.put(v, files); - } - return mp; - } - - @Override - public Map<SchemaVersion, List<String>> getEdgeFiles() { - List<SchemaVersion> versionsToGen = new ArrayList<>(); - versionsToGen = schemaVersions.getVersions(); - Collections.sort(versionsToGen); - Collections.reverse(versionsToGen); - Map<SchemaVersion, List<String>> mp = new TreeMap<>(); - for (SchemaVersion v : versionsToGen) { - File dir = new File(bean.getEdgeDirectory()); - File [] fileSet = dir.listFiles(new FilenameFilter() { - @Override - public boolean accept(File dir, String name) { - return name.contains("_"+v.toString().toLowerCase()); - } - }); - List<String> files = new ArrayList<>(); - for(File f: fileSet ) { - files.add(f.getAbsolutePath()); - } - mp.put(v, files); - } - return mp; - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteFootnoteSet.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteFootnoteSet.java deleted file mode 100644 index dca5b7ce..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteFootnoteSet.java +++ /dev/null @@ -1,57 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.Set; -import java.util.TreeSet; - -public class DeleteFootnoteSet { - protected Set<String> footnotes = new TreeSet<>(); - protected String targetNode = "<NodeType>"; - public DeleteFootnoteSet(String targetNode) { - super(); - this.targetNode = targetNode == null ? "" : targetNode; - } - - public void add(String s ) { - String fullnote=null; - if("(1)".equals(s)) { - fullnote = s+" IF this "+targetNode.toUpperCase()+" node is deleted, this FROM node is DELETED also"; - } else if("(2)".equals(s)) { - fullnote = s+" IF this "+targetNode.toUpperCase()+" node is deleted, this TO node is DELETED also"; - } else if("(3)".equals(s)) { - fullnote = s+" IF this FROM node is deleted, this "+targetNode.toUpperCase()+" is DELETED also"; - } else if("(4)".equals(s)) { - fullnote = s+" IF this TO node is deleted, this "+targetNode.toUpperCase()+" is DELETED also"; - } else if(s.contains(targetNode.toUpperCase())) { - fullnote = s; - } else { - return; - } - footnotes.add(fullnote); - } - - public String toString() { - StringBuilder sb = new StringBuilder(); - if(footnotes.size() > 0) sb.append("\n -"); - sb.append(String.join("\n -", footnotes)+"\n"); - return sb.toString(); - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteOperation.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteOperation.java deleted file mode 100644 index 6ee4194d..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/DeleteOperation.java +++ /dev/null @@ -1,106 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.HashMap; -import java.util.StringTokenizer; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.util.GenerateXsd; - -public class DeleteOperation { - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - - public static HashMap<String, String> deletePaths = new HashMap<String, String>(); - public DeleteOperation(String useOpId, String xmlRootElementName, String tag, String path, String pathParams) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams = pathParams; - } - @Override - public String toString() { - StringTokenizer st; - st = new StringTokenizer(path, "/"); - //a valid tag is necessary - if ( StringUtils.isEmpty(tag) ) { - return ""; - } - if ( path.contains("/relationship/") ) { // filter paths with relationship-list - return ""; - } - if ( path.endsWith("/relationship-list")) { - return ""; - } - if ( path.startsWith("/search")) { - return ""; - } - //All Delete operation paths end with "relationship" - //or there is a parameter at the end of the path - //and there is a parameter in the path - - if ( !path.endsWith("/relationship") && !path.endsWith("}") ) { - return ""; - } - StringBuffer pathSb = new StringBuffer(); - pathSb.append(" delete:\n"); - pathSb.append(" tags:\n"); - pathSb.append(" - " + tag + "\n"); - pathSb.append(" summary: delete an existing " + xmlRootElementName + "\n"); - - pathSb.append(" description: delete an existing " + xmlRootElementName + "\n"); - - pathSb.append(" operationId: delete" + useOpId + "\n"); - pathSb.append(" consumes:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - pathSb.append(" produces:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - pathSb.append(" responses:\n"); - pathSb.append(" \"default\":\n"); - pathSb.append(" " + GenerateXsd.getResponsesUrl()); - pathSb.append(" parameters:\n"); - - pathSb.append(pathParams); // for nesting - if ( !path.endsWith("/relationship") ) { - pathSb.append(" - name: resource-version\n"); - - pathSb.append(" in: query\n"); - pathSb.append(" description: resource-version for concurrency\n"); - pathSb.append(" required: true\n"); - pathSb.append(" type: string\n"); - } - this.objectPathMapEntry(); - return pathSb.toString(); - } - public String objectPathMapEntry() { - if (! path.endsWith("/relationship") ) { - deletePaths.put(path, xmlRootElementName); - } - return (xmlRootElementName+":"+path); - } - }
\ No newline at end of file diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/EdgeDescription.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/EdgeDescription.java deleted file mode 100644 index ae6b8803..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/EdgeDescription.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * ============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.util.genxsd; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.enums.AAIDirection; -import org.onap.aai.edges.enums.DirectionNotation; -import org.onap.aai.edges.enums.EdgeField; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class EdgeDescription { - - private static final Logger logger = LoggerFactory.getLogger("EdgeDescription.class"); - EdgeRule ed; - public static enum LineageType { - PARENT, CHILD, UNRELATED; - } - private String ruleKey; -// private String to; -// private String from; - private LineageType lineageType = LineageType.UNRELATED; -// private String direction; -// private String multiplicity; -// private String preventDelete; -// private String deleteOtherV; -// private String label; -// private String description; - - public EdgeDescription(EdgeRule ed) { - super(); - if ( ed.getDirection().toString().equals(ed.getContains()) && - AAIDirection.getValue("OUT").equals(AAIDirection.getValue(ed.getDirection()))) { - this.lineageType=LineageType.PARENT; - } else if ( AAIDirection.getValue("IN").equals(AAIDirection.getValue(ed.getContains())) && - ed.getDirection().toString().equals(ed.getContains())) { - this.lineageType=LineageType.CHILD; - } else if ( AAIDirection.getValue("OUT").equals(AAIDirection.getValue(ed.getContains())) && - AAIDirection.getValue("IN").equals(AAIDirection.getValue(ed.getDirection()))) { - this.lineageType=LineageType.PARENT; - } else if ( AAIDirection.getValue("IN").equals(AAIDirection.getValue(ed.getContains())) && - AAIDirection.getValue("OUT").equals(AAIDirection.getValue(ed.getDirection()))) { - this.lineageType=LineageType.PARENT; - } else { - this.lineageType=LineageType.UNRELATED; - } - this.ruleKey = ed.getFrom()+"|"+ed.getTo(); - this.ed=ed; - } - /** - * @return the deleteOtherV - */ - public String getDeleteOtherV() { - return ed.getDeleteOtherV(); - } - /** - * @return the preventDelete - */ - public String getPreventDelete() { - return ed.getPreventDelete(); - } - public String getAlsoDeleteFootnote(String targetNode) { - String returnVal = ""; - if(ed.getDeleteOtherV().equals("IN") && ed.getTo().equals(targetNode) ) { - logger.debug("Edge: "+this.ruleKey); - logger.debug("IF this "+targetNode+" node is deleted, this FROM node is DELETED also"); - returnVal = "(1)"; - } - if(ed.getDeleteOtherV().equals("OUT") && ed.getFrom().equals(targetNode) ) { - logger.debug("Edge: "+this.ruleKey); - logger.debug("IF this "+targetNode+" is deleted, this TO node is DELETED also"); - returnVal = "(2)"; - } - if(ed.getDeleteOtherV().equals("OUT") && ed.getTo().equals(targetNode) ) { - logger.debug("Edge: "+this.ruleKey); - logger.debug("IF this FROM node is deleted, this "+targetNode+" is DELETED also"); - returnVal = "(3)"; - } - if(ed.getDeleteOtherV().equals("IN") && ed.getFrom().equals(targetNode) ) { - logger.debug("Edge: "+this.ruleKey); - logger.debug("IF this TO node is deleted, this "+targetNode+" node is DELETED also"); - returnVal = "(4)"; - } - return returnVal; - } - /** - * @return the to - */ - public String getTo() { - return ed.getTo(); - } - /** - * @return the from - */ - public String getFrom() { - return ed.getFrom(); - } - public String getRuleKey() { - return ruleKey; - } - public String getMultiplicity() { - return ed.getMultiplicityRule().toString(); - } - public AAIDirection getDirection() { - return AAIDirection.getValue(ed.getDirection()); - } - public String getDescription() { - return ed.getDescription(); - } - public String getRelationshipDescription(String fromTo, String otherNodeName) { - - String result = ""; - - if ("FROM".equals(fromTo)) { - if (AAIDirection.getValue("OUT").equals(AAIDirection.getValue(ed.getDirection()))) { - if (LineageType.PARENT == lineageType) { - result = " (PARENT of "+otherNodeName; - result = String.join(" ", result+",", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - } - else { - if (LineageType.CHILD == lineageType) { - result = " (CHILD of "+otherNodeName; - result = String.join(" ", result+",", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - else if (LineageType.PARENT == lineageType) { - result = " (PARENT of "+otherNodeName; - result = String.join(" ", result+",", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - } - if (result.length() == 0) result = String.join(" ", "(", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } else { - //if ("TO".equals(fromTo) - if (AAIDirection.getValue("OUT").equals(AAIDirection.getValue(ed.getDirection()))) { - if (LineageType.PARENT == lineageType) { - result = " (PARENT of "+otherNodeName; - result = String.join(" ", result+",", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - } else { - if (LineageType.PARENT == lineageType) { - result = " (PARENT of "+otherNodeName; - result = String.join(" ", result+",", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - } - if (result.length() == 0) result = String.join(" ", "(", ed.getFrom(), this.getShortLabel(), ed.getTo()+",", this.getMultiplicity()); - } - - if (result.length() > 0) result = result + ")"; - - if (ed.getDescription() != null && ed.getDescription().length() > 0) result = result + "\n "+ ed.getDescription(); // 6 spaces is important for yaml - - return result; - } - - /** - * @return the hasDelTarget - */ - - public boolean hasDelTarget() { - return StringUtils.isNotEmpty(ed.getDeleteOtherV()) && (! "NONE".equalsIgnoreCase(ed.getDeleteOtherV())); - } - - /** - * @return the type - */ - public LineageType getType() { - - return lineageType; - } - /** - * @return the label - */ - public String getLabel() { - return ed.getLabel(); - } - public String getShortLabel() { - String[] pieces = this.getLabel().split("[.]"); - return pieces[pieces.length-1]; - } -}
\ No newline at end of file diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/GetOperation.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/GetOperation.java deleted file mode 100644 index ad1e2dc7..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/GetOperation.java +++ /dev/null @@ -1,121 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.HashMap; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.util.GenerateXsd; - -public class GetOperation { - static Map<String, Vector<String>> containers = new HashMap<String, Vector<String>>(); - public static void addContainerProps(String container, Vector<String> containerProps) { - containers.put(container, containerProps);; - } - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String queryParams; - - public GetOperation(String useOpId, String xmlRootElementName, String tag, String path, String pathParams) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams = pathParams; -// StringBuilder p = new StringBuilder(); - - if(containers.get(xmlRootElementName) == null) { - this.queryParams = ""; - } else { - this.queryParams= String.join("", containers.get(xmlRootElementName)); -// for(String param : containers.get(xmlRootElementName)) { -// p.append(param); -// } -// this.queryParams = p.toString(); - } - } - @Override - public String toString() { - StringTokenizer st; - st = new StringTokenizer(path, "/"); - //Path has to be longer than one element - /* - if ( st.countTokens() <= 1) { - return ""; - } - */ - //a valid tag is necessary - if ( StringUtils.isEmpty(tag) ) { - return ""; - } - if ( path.endsWith("/relationship") ) { - return ""; - } - if ( path.contains("/relationship/") ) { // filter paths with relationship-list - return ""; - } - if ( path.endsWith("/relationship-list")) { - return ""; - } - if ( path.startsWith("/search")) { - return ""; - } - StringBuffer pathSb = new StringBuffer(); - pathSb.append(" " + path + ":\n" ); - pathSb.append(" get:\n"); - pathSb.append(" tags:\n"); - pathSb.append(" - " + tag + "\n"); - pathSb.append(" summary: returns " + xmlRootElementName + "\n"); - - pathSb.append(" description: returns " + xmlRootElementName + "\n"); - pathSb.append(" operationId: get" + useOpId + "\n"); - pathSb.append(" produces:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - - pathSb.append(" responses:\n"); - pathSb.append(" \"200\":\n"); - pathSb.append(" description: successful operation\n"); - pathSb.append(" schema:\n"); - pathSb.append(" $ref: \"#/getDefinitions/" + xmlRootElementName + "\"\n"); - pathSb.append(" \"default\":\n"); - pathSb.append(" " + GenerateXsd.getResponsesUrl()); - if ( StringUtils.isNotEmpty(pathParams) || StringUtils.isNotEmpty(queryParams)) { - pathSb.append(" parameters:\n"); - } - if ( StringUtils.isNotEmpty(pathParams)) { - pathSb.append(pathParams); - } -// if ( StringUtils.isNotEmpty(pathParams) && StringUtils.isNotEmpty(queryParams)) { -// pathSb.append("\n"); -// } - if ( StringUtils.isNotEmpty(queryParams)) { - pathSb.append(queryParams); - } - return pathSb.toString(); - } - } diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/HTMLfromOXM.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/HTMLfromOXM.java deleted file mode 100644 index 7d3b37d1..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/HTMLfromOXM.java +++ /dev/null @@ -1,288 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; - -import javax.xml.parsers.ParserConfigurationException; - - -import org.onap.aai.config.SpringContextAware; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import org.w3c.dom.Attr; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -public class HTMLfromOXM extends OxmFileProcessor { - - private static final Logger logger = LoggerFactory.getLogger("HTMLfromOXM.class"); - - private String maxOccurs; - - public HTMLfromOXM(String maxOccurs, SchemaVersions schemaVersions, NodeIngestor ni, EdgeIngestor ei ){ - super(schemaVersions, ni,ei); - this.maxOccurs = maxOccurs; - } - public void setOxmVersion(File oxmFile, SchemaVersion v) { - super.setOxmVersion(oxmFile, v); - this.v = v; - } - public void setXmlVersion(String xml, SchemaVersion v) { - super.setXmlVersion(xml, v); - this.v = v; - } - public void setVersion(SchemaVersion v) { - super.setVersion(v); - this.v = v; - } - - - @Override - public String getDocumentHeader() { - StringBuffer sb = new StringBuffer(); - logger.trace("processing starts"); - sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + LINE_SEPARATOR); - String namespace = "org.onap"; - if (v.compareTo(getSchemaVersions().getNamespaceChangeVersion()) < 0 ) { - namespace = "org.openecomp"; - } - if ( versionUsesAnnotations(v.toString()) ) { - sb.append("<xs:schema elementFormDefault=\"qualified\" version=\"1.0\" targetNamespace=\"http://" + namespace + ".aai.inventory/" - + v.toString() + "\" xmlns:tns=\"http://" + namespace + ".aai.inventory/" + v.toString() + "\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" - + LINE_SEPARATOR - + "xmlns:jaxb=\"http://java.sun.com/xml/ns/jaxb\"" + LINE_SEPARATOR + - " jaxb:version=\"2.1\"" + LINE_SEPARATOR + - " xmlns:annox=\"http://annox.dev.java.net\"" + LINE_SEPARATOR + - " jaxb:extensionBindingPrefixes=\"annox\">" + DOUBLE_LINE_SEPARATOR); - } else { - sb.append("<xs:schema elementFormDefault=\"qualified\" version=\"1.0\" targetNamespace=\"http://" + namespace + ".aai.inventory/" - + v.toString() + "\" xmlns:tns=\"http://" + namespace + ".aai.inventory/" + v.toString() + "\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\">" + DOUBLE_LINE_SEPARATOR); - } - return sb.toString(); - } - - @Override - public String process() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException { - StringBuilder sb = new StringBuilder(); - - try { - init(); - } catch(Exception e) { - logger.error( "Error initializing " + this.getClass()); - throw e; - } - sb.append(getDocumentHeader()); - StringBuilder sbInventory = new StringBuilder(); - Element elem; - String javaTypeName; - combinedJavaTypes = new HashMap(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - elem = (Element)javaTypeNodes.item(i); - javaTypeName = elem.getAttribute("name"); - if ( !"Inventory".equals(javaTypeName ) ) { - if ( generatedJavaType.containsKey(javaTypeName) ) { - continue; - } - // will combine all matching java-types - elem = getJavaTypeElement(javaTypeName,false ); - } - XSDElement javaTypeElement = new XSDElement(elem, maxOccurs); - //javaTypeName = javaTypeElement.name(); - if ( javaTypeName == null ) { - String msg = "Invalid OXM file: <java-type> has no name attribute in " + oxmFile; - logger.error(msg); - throw new AAIException(msg); - } - if ("Nodes".equals(javaTypeName)) { - logger.debug("skipping Nodes entry (temporary feature)"); - continue; - } - logger.debug(getXmlRootElementName(javaTypeName)+" vs "+ javaTypeName+":"+generatedJavaType.containsKey(getXmlRootElementName(javaTypeName))); - - if ( !"Inventory".equals(javaTypeName)) { - generatedJavaType.put(javaTypeName, null); - } - sb.append(processJavaTypeElement( javaTypeName, javaTypeElement, sbInventory )); - } - sb.append(sbInventory); - sb.append(" </xs:sequence>" + LINE_SEPARATOR); - sb.append(" </xs:complexType>" + LINE_SEPARATOR); - sb.append(" </xs:element>" + LINE_SEPARATOR); - sb.append("</xs:schema>" + LINE_SEPARATOR); - return sb.toString(); - } - - protected boolean isValidName( String name ) { - if ( name == null || name.length() == 0 ) { - return false; - } - String pattern = "^[a-z0-9-]*$"; - return name.matches(pattern); - } - - protected boolean skipCheck( String javaAttribute ) { - if ( javaAttribute.equals("model") - || javaAttribute.equals("eventHeader") ) { - return true; - } - return false; - } - - public String processJavaTypeElement( String javaTypeName, Element javaType_Element, StringBuilder sbInventory) { - String xmlRootElementName = getXMLRootElementName(javaType_Element); - - NodeList parentNodes = javaType_Element.getElementsByTagName("java-attributes"); - StringBuffer sb = new StringBuffer(); - if ( parentNodes.getLength() == 0 ) { - logger.trace( "no java-attributes for java-type " + javaTypeName); - return ""; - } - - Element parentElement = (Element)parentNodes.item(0); - NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - // support for multiple inventory elements across oxm files - boolean processingInventory = false; - boolean hasPreviousInventory = false; - if ( "inventory".equals(xmlRootElementName) && sbInventory != null ) { - processingInventory = true; - if ( sbInventory.toString().contains("xs:complexType") ) { - hasPreviousInventory = true; - } - } - - StringBuffer sb1 = new StringBuffer(); - if ( xmlElementNodes.getLength() > 0 ) { - - if ( !processingInventory || !hasPreviousInventory ) { - sb1.append(" <xs:element name=\"" + xmlRootElementName + "\">" + LINE_SEPARATOR); - sb1.append(" <xs:complexType>" + LINE_SEPARATOR); - - XSDElement javaTypeElement = new XSDElement(javaType_Element, maxOccurs); - logger.debug("XSDElement name: "+javaTypeElement.name()); - if(versionUsesAnnotations(v.toString())) { - sb1.append(javaTypeElement.getHTMLAnnotation("class", " ")); - } - sb1.append(" <xs:sequence>" + LINE_SEPARATOR); - } - Element javatypeElement; - for ( int i = 0; i < xmlElementNodes.getLength(); ++i ) { - - XSDElement xmlElementElement = new XSDElement((Element)xmlElementNodes.item(i), maxOccurs); - -// String elementName = xmlElementElement.getAttribute("name"); - String elementType = xmlElementElement.getAttribute("type"); - //No simple types; only AAI custom types - String addType = elementType.contains("." + v.toString() + ".") ? elementType.substring(elementType.lastIndexOf('.')+1) : null; - if ( elementType.contains("." + v.toString() + ".") && !generatedJavaType.containsKey(addType) ) { - generatedJavaType.put(addType, elementType); - javatypeElement = getJavaTypeElement(addType, processingInventory); - sb.append(processJavaTypeElement( addType, javatypeElement, null )); - } - if ("Nodes".equals(addType)) { - logger.trace("Skipping nodes, temporary testing"); - continue; - } - //assembles the basic <element> - sb1.append(xmlElementElement.getHTMLElement(v, versionUsesAnnotations(v.toString()), this)); - } - if ( !processingInventory ) { - sb1.append(" </xs:sequence>" + LINE_SEPARATOR); - sb1.append(" </xs:complexType>" + LINE_SEPARATOR); - sb1.append(" </xs:element>" + LINE_SEPARATOR); - } - } - - if ( xmlElementNodes.getLength() < 1 ) { - sb.append(" <xs:element name=\"" + xmlRootElementName + "\">" + LINE_SEPARATOR); - sb.append(" <xs:complexType>" + LINE_SEPARATOR); - sb.append(" <xs:sequence/>" + LINE_SEPARATOR); - sb.append(" </xs:complexType>" + LINE_SEPARATOR); - sb.append(" </xs:element>" + LINE_SEPARATOR); - generatedJavaType.put(javaTypeName, null); - return sb.toString(); - } - if ( processingInventory && sbInventory != null ) { - sbInventory.append(sb1); - } else { - sb.append( sb1 ); - } - return sb.toString(); - } - - private Element getJavaTypeElement( String javaTypeName, boolean processingInventory ) - { - String attrName, attrValue; - Attr attr; - Element javaTypeElement; - - List<Element> combineElementList = new ArrayList<Element>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - javaTypeElement = (Element) javaTypeNodes.item(i); - NamedNodeMap attributes = javaTypeElement.getAttributes(); - for ( int j = 0; j < attributes.getLength(); ++j ) { - attr = (Attr) attributes.item(j); - attrName = attr.getNodeName(); - attrValue = attr.getNodeValue(); - if ( attrName.equals("name") && attrValue.equals(javaTypeName)) { - if ( processingInventory ) { - return javaTypeElement; - } else { - combineElementList.add(javaTypeElement); - } - } - } - } - if ( combineElementList.size() == 0 ) { - logger.error( "oxm file format error, missing java-type " + javaTypeName); - return (Element) null; - } else if ( combineElementList.size() > 1 ) { - // need to combine java-attributes - return combineElements( javaTypeName, combineElementList); - } - return combineElementList.get(0); - - } - - private boolean versionUsesAnnotations( String version) { - int ver = new Integer(version.substring(1)).intValue(); - if ( ver >= HTMLfromOXM.annotationsStartVersion ) { - return true; - } - if ( ver <= HTMLfromOXM.annotationsMinVersion ) { - return true; - } - return false; - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/NodeGetOperation.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/NodeGetOperation.java deleted file mode 100644 index 7ffdf407..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/NodeGetOperation.java +++ /dev/null @@ -1,168 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.util.GenerateXsd; - -public class NodeGetOperation { - static Map<String, Vector<String>> containers = new HashMap<String, Vector<String>>(); - static ArrayList<String> checklist = createChecklist(); - private static ArrayList<String> createChecklist() - { - ArrayList<String> list = new ArrayList<String>(); - return list; - } - public static void addContainerProps(String container, Vector<String> containerProps) { - containers.put(container, containerProps); - } - public static void resetContainers() { - containers = new HashMap<String, Vector<String>>(); - checklist = createChecklist(); - } - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String CRUDpath; - private String pathParams; - private String queryParams; - - public NodeGetOperation(String useOpId, String xmlRootElementName, String tag, String path, String pathParams) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.CRUDpath = path; - this.path = nodePath(); - this.pathParams = pathParams; - StringBuilder p = new StringBuilder(); - - if(containers.get(xmlRootElementName) == null) { - this.queryParams = ""; - } else { - this.queryParams= String.join("", containers.get(xmlRootElementName)); - for(String param : containers.get(xmlRootElementName)) { - p.append(param); - } - this.queryParams = p.toString(); - } - } - String nodePath() { - String path = null; - int loc = CRUDpath.indexOf(xmlRootElementName); - if(loc > 0) { - path = "/nodes/"+CRUDpath.substring(loc); - } - return path; - } - @Override - public String toString() { - StringTokenizer st; - st = new StringTokenizer(CRUDpath, "/"); - //Path has to be longer than one element - /* - if ( st.countTokens() <= 1) { - return ""; - } - */ - //a valid tag is necessary - if ( StringUtils.isEmpty(tag) ) { - return ""; - } - if ( CRUDpath.endsWith("/relationship") ) { - return ""; - } - if ( CRUDpath.contains("/relationship/") ) { // filter paths with relationship-list - return ""; - } - if ( CRUDpath.endsWith("/relationship-list")) { - return ""; - } - if ( CRUDpath.startsWith("/search")) { - return ""; - } - if ( CRUDpath.startsWith("/actions")) { - return ""; - } - if ( CRUDpath.startsWith("/nodes")) { - return ""; - } - if (checklist.contains(xmlRootElementName)) { - return ""; - } - StringBuffer pathSb = new StringBuffer(); - //Drop out the operations with multiple path parameters - if(CRUDpath.lastIndexOf('{') > CRUDpath.indexOf('{') && StringUtils.isNotEmpty(pathParams)) { - return ""; - } - if(path.lastIndexOf('{') > path.indexOf('{') ) { - return ""; - } - //trim leading path elements before the current node type -// int loc = path.indexOf(xmlRootElementName); -// if(loc > 0) { -// path = "/nodes/"+path.substring(loc); -// } - //append generic parameter syntax to all plural queries - if(path.indexOf('{') == -1) { - path += "?parameter=value[¶meter2=value2]"; - } - pathSb.append(" " + path + ":\n" ); - pathSb.append(" get:\n"); - pathSb.append(" tags:\n"); - pathSb.append(" - Operations" + "\n"); - pathSb.append(" summary: returns " + xmlRootElementName + "\n"); - - pathSb.append(" description: returns " + xmlRootElementName + "\n"); - pathSb.append(" operationId: get" + useOpId + "\n"); - pathSb.append(" produces:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - - pathSb.append(" responses:\n"); - pathSb.append(" \"200\":\n"); - pathSb.append(" description: successful operation\n"); - pathSb.append(" schema:\n"); - pathSb.append(" $ref: \"#/definitions/" + xmlRootElementName + "\"\n"); - pathSb.append(" \"default\":\n"); - pathSb.append(" " + GenerateXsd.getResponsesUrl()); - if ( StringUtils.isNotEmpty(pathParams) || StringUtils.isNotEmpty(queryParams)) { - pathSb.append("\n parameters:\n"); - } - if ( StringUtils.isNotEmpty(pathParams)) { - pathSb.append(pathParams); - } - if ( StringUtils.isNotEmpty(pathParams) && StringUtils.isNotEmpty(queryParams)) { - pathSb.append("\n"); - } - if ( StringUtils.isNotEmpty(queryParams)) { - pathSb.append(queryParams); - } - checklist.add(xmlRootElementName); - return pathSb.toString(); - } - } diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/NodesYAMLfromOXM.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/NodesYAMLfromOXM.java deleted file mode 100644 index 5abd8f48..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/NodesYAMLfromOXM.java +++ /dev/null @@ -1,542 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -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.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.Vector; - -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.EdgeRuleQuery; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.nodes.NodeIngestor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import com.google.common.collect.Multimap; - -public class NodesYAMLfromOXM extends OxmFileProcessor { - private static final Logger logger = LoggerFactory.getLogger("GenerateXsd.class"); - private static final String root = "../aai-schema/src/main/resources"; - private static final String autoGenRoot = "aai-schema/src/main/resources"; - private static final String generateTypeYAML = "yaml"; - private static final String normalStartDir = "aai-core"; - private static final String yaml_dir = (((System.getProperty("user.dir") != null) && (!System.getProperty("user.dir").contains(normalStartDir))) ? autoGenRoot : root) + "/aai_swagger_yaml"; - private StringBuilder inventoryDefSb = null; - private Map<String,String> operationDefinitions = new HashMap<>(); - - private String basePath; - - public NodesYAMLfromOXM(String basePath, SchemaVersions schemaVersions, NodeIngestor ni, EdgeIngestor ei){ - super(schemaVersions, ni,ei); - this.basePath = basePath; - } - public void setOxmVersion(File oxmFile, SchemaVersion v) { - super.setOxmVersion(oxmFile, v); - } - public void setXmlVersion(String xml, SchemaVersion v){ - super.setXmlVersion(xml, v); - } - - public void setVersion(SchemaVersion v) { - super.setVersion(v); - } - - @Override - public String getDocumentHeader() { - StringBuffer sb = new StringBuffer(); - sb.append("swagger: \"2.0\"\ninfo:\n "); - sb.append("description: |"); - if ( versionSupportsSwaggerDiff(v.toString())) { - sb.append("\n\n [Differences versus the previous schema version]("+"apidocs/aai_swagger_" + v.toString() + ".diff)"); - } - sb.append("\n\n Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.\n\n Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except in compliance with the License.\n\n You may obtain a copy of the License at\n\n (https://creativecommons.org/licenses/by/4.0/)\n\n 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.\n\n This document is best viewed with Firefox or Chrome. Nodes can be found by appending /#/definitions/node-type-to-find to the path to this document. Edge definitions can be found with the node definitions.\n version: \"" + v.toString() +"\"\n"); - sb.append(" title: Active and Available Inventory REST API\n"); - sb.append(" license:\n name: Apache 2.0\n url: http://www.apache.org/licenses/LICENSE-2.0.html\n"); - sb.append(" contact:\n name:\n url:\n email:\n"); - sb.append("host:\nbasePath: " + basePath + "/" + v.toString() + "\n"); - sb.append("schemes:\n - https\npaths:\n"); - return sb.toString(); - } - - protected void init() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException { - super.init(); - } - - @Override - public String process() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException { - StringBuffer sb = new StringBuffer(); - StringBuffer pathSb = new StringBuffer(); - NodeGetOperation.resetContainers(); - try { - init(); - } catch(Exception e) { - logger.error( "Error initializing " + this.getClass()); - throw e; - } - pathSb.append(getDocumentHeader()); - StringBuffer definitionsSb = new StringBuffer(); - Element elem; - String javaTypeName; - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - elem = (Element)javaTypeNodes.item(i); - javaTypeName = elem.getAttribute("name"); - if ( !"Inventory".equals(javaTypeName ) ) { - if ( generatedJavaType.containsKey(javaTypeName) ) { - continue; - } - // will combine all matching java-types - elem = getJavaTypeElementSwagger(javaTypeName ); - } - - XSDElement javaTypeElement = new XSDElement(elem); - - logger.debug("External: "+javaTypeElement.getAttribute("name")+"/"+getXmlRootElementName(javaTypeName)); - if ( javaTypeName == null ) { - String msg = "Invalid OXM file: <java-type> has no name attribute in " + oxmFile; - logger.error(msg); - throw new AAIException(msg); - } - namespaceFilter.add(getXmlRootElementName(javaTypeName)); - processJavaTypeElementSwagger( javaTypeName, javaTypeElement, pathSb, - definitionsSb, null, null, null, null, null, null); - } - sb.append(pathSb); -// sb.append(getDocumentHeader()); -// sb.append(totalPathSbAccumulator); - sb.append(appendOperations()); - sb.append(appendDefinitions()); - PutRelationPathSet prp = new PutRelationPathSet(v); - prp.generateRelations(ei); - return sb.toString(); - } - - public String appendDefinitions() { - return appendDefinitions(null); - } - - public String appendDefinitions(Set<String> namespaceFilter) { - if ( inventoryDefSb != null ) { - javaTypeDefinitions.put("inventory", inventoryDefSb.toString()); - } - StringBuffer sb = new StringBuffer("definitions:\n"); - Map<String, String> sortedJavaTypeDefinitions = new TreeMap<>(javaTypeDefinitions); - - for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) { - if(namespaceFilter != null && (! namespaceFilter.contains(entry.getKey()))) { - continue; - } - sb.append(entry.getValue()); - } - return sb.toString(); - } - - private String processJavaTypeElementSwagger( String javaTypeName, Element javaTypeElement, - StringBuffer pathSb, StringBuffer definitionsSb, String path, String tag, String opId, - String getItemName, StringBuffer pathParams, String validEdges) { - - String xmlRootElementName = getXMLRootElementName(javaTypeElement); - StringBuilder definitionsLocalSb = new StringBuilder(256); - - String useTag = null; - String useOpId = null; - logger.debug("tag="+tag); - - if(tag != null && (! validTag(tag))) { - logger.debug("tag="+tag+"; javaTypeName="+javaTypeName); - return null; - } - if ( !javaTypeName.equals("Inventory") ) { - if ( javaTypeName.equals("AaiInternal")) - return null; - if ( opId == null ) - useOpId = javaTypeName; - else - useOpId = opId + javaTypeName; - if ( tag == null ) - useTag = javaTypeName; - } - - path = xmlRootElementName.equals("inventory") ? "" : (path == null) ? "/" + xmlRootElementName : path + "/" + xmlRootElementName; - XSDJavaType javaType = new XSDJavaType(javaTypeElement); - if ( getItemName != null) { - if ( getItemName.equals("array") ) - return javaType.getArrayType(); - else - return javaType.getItemName(); - } - - NodeList parentNodes = javaTypeElement.getElementsByTagName("java-attributes"); - if ( parentNodes.getLength() == 0 ) { - logger.debug( "no java-attributes for java-type " + javaTypeName); - return ""; - } - - String pathDescriptionProperty = javaType.getPathDescriptionProperty(); - String container = javaType.getContainerProperty(); - Vector<String> indexedProps = javaType.getIndexedProps(); - Vector<String> containerProps = new Vector<String>(); - if(container != null) { - logger.debug("javaTypeName " + javaTypeName + " container:" + container +" indexedProps:"+indexedProps); - } - - Element parentElement = (Element)parentNodes.item(0); - NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - - StringBuffer sbParameters = new StringBuffer(); - StringBuffer sbRequired = new StringBuffer(); - int requiredCnt = 0; - int propertyCnt = 0; - StringBuffer sbProperties = new StringBuffer(); - - if ( appliedPaths.containsKey(path)) - return null; - - StringTokenizer st = new StringTokenizer(path, "/"); - logger.debug("path: " + path + " st? " + st.toString()); - if ( st.countTokens() > 1 && getItemName == null ) { - logger.debug("appliedPaths: " + appliedPaths + " containsKey? " + appliedPaths.containsKey(path)); - appliedPaths.put(path, xmlRootElementName); - } - Vector<String> addTypeV = null; - for ( int i = 0; i < xmlElementNodes.getLength(); ++i ) { - XSDElement xmlElementElement = new XSDElement((Element)xmlElementNodes.item(i)); - if ( !xmlElementElement.getParentNode().isSameNode(parentElement)) - continue; - String elementDescription=xmlElementElement.getPathDescriptionProperty(); - if(getItemName == null) { - addTypeV = xmlElementElement.getAddTypes(v.toString()); - } - if ( "true".equals(xmlElementElement.getAttribute("xml-key"))) { - path += "/{" + xmlElementElement.getAttribute("name") + "}"; - } - logger.debug("path: " + path); - logger.debug( "xmlElementElement.getAttribute(required):"+xmlElementElement.getAttribute("required") ); - - if ( ("true").equals(xmlElementElement.getAttribute("required"))) { - if ( requiredCnt == 0 ) - sbRequired.append(" required:\n"); - ++requiredCnt; - if ( addTypeV == null || addTypeV.isEmpty()) { - sbRequired.append(" - " + xmlElementElement.getAttribute("name") + "\n"); - } else { - for ( int k = 0; k < addTypeV.size(); ++k ) { - sbRequired.append(" - " + getXmlRootElementName(addTypeV.elementAt(k)) + ":\n"); - } - } - } - - if ( "true".equals(xmlElementElement.getAttribute("xml-key")) ) { - sbParameters.append(xmlElementElement.getPathParamYAML(elementDescription)); - } - if ( indexedProps != null - && indexedProps.contains(xmlElementElement.getAttribute("name") ) ) { - containerProps.add(xmlElementElement.getQueryParamYAML(elementDescription)); - NodeGetOperation.addContainerProps(container, containerProps); - } else if ( indexedProps == null || indexedProps.isEmpty() && "true".equals(xmlElementElement.getAttribute("required")) ){ - // no indexedProps and element is required, also considered using xml-key in this case - containerProps.add(xmlElementElement.getPathParamYAMLRqd(elementDescription, false)); - NodeGetOperation.addContainerProps(container, containerProps); - } - if ( xmlElementElement.isStandardType()) { - sbProperties.append(xmlElementElement.getTypePropertyYAML()); - ++propertyCnt; - } - -// StringBuffer newPathParams = new StringBuffer((pathParams == null ? "" : pathParams.toString())+sbParameters.toString()); //cp8128 don't append the pathParams to sbParameters so that child nodes don't contain the parameters from parent - StringBuffer newPathParams = new StringBuffer(sbParameters.toString()); - for ( int k = 0; addTypeV != null && k < addTypeV.size(); ++k ) { - String addType = addTypeV.elementAt(k); - namespaceFilter.add(getXmlRootElementName(addType)); - if ( opId == null || !opId.contains(addType)) { - processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null, - newPathParams, validEdges); - } - // need item name of array - String itemName = processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, - "array", null, null); - - if ( itemName != null ) { - if ( addType.equals("AaiInternal") ) { - logger.debug( "addType AaiInternal, skip properties"); - - } else if ( getItemName == null) { - ++propertyCnt; - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: array\n items:\n"); - sbProperties.append(" $ref: \"#/definitions/" + (itemName == "" ? "aai-internal" : itemName) + "\"\n"); - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - } - } else { - if ( ("java.util.ArrayList").equals(xmlElementElement.getAttribute("container-type"))) { - // need properties for getXmlRootElementName(addType) - namespaceFilter.add(getXmlRootElementName(addType)); - if(getXmlRootElementName(addType).equals("service-capabilities")) - { - logger.info("arrays: "+ getXmlRootElementName(addType)); - } -// newPathParams = new StringBuffer((pathParams == null ? "" : pathParams.toString())+sbParameters.toString()); //cp8128 - change this to not append pathParameters. Just use sbParameters - newPathParams = new StringBuffer(sbParameters.toString()); - processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, - null, newPathParams, validEdges); - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: array\n items: \n"); - sbProperties.append(" $ref: \"#/definitions/" + getXmlRootElementName(addType) + "\"\n"); - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - - } else { - //Make sure certain types added to the filter don't appear - if (nodeFilter.contains(getXmlRootElementName(addType))) { - ; - } else { - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: object\n"); - sbProperties.append(" $ref: \"#/definitions/" + getXmlRootElementName(addType) + "\"\n"); - } - } - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - ++propertyCnt; - } - } - } - - if ( sbParameters.toString().length() > 0 ) { - if ( pathParams == null ) - pathParams = new StringBuffer(); - pathParams.append(sbParameters); - } - if (indexedProps.isEmpty() && containerProps.isEmpty()){ - NodeGetOperation get = new NodeGetOperation(useOpId, xmlRootElementName, tag, path, null); - String operation = get.toString(); - if(StringUtils.isNotEmpty(operation)) { - operationDefinitions.put(xmlRootElementName, operation); - } - } else { - NodeGetOperation get = new NodeGetOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString()); - String operation = get.toString(); - if(StringUtils.isNotEmpty(operation)) { - operationDefinitions.put(xmlRootElementName, operation); - } - } - logger.debug("opId vs useOpId:"+opId+" vs "+useOpId+" PathParams="+pathParams); - // add PUT - if ( generatedJavaType.containsKey(xmlRootElementName) ) { - logger.debug("xmlRootElementName(1)="+xmlRootElementName); - return null; - } - boolean processingInventoryDef = false; - if ( xmlRootElementName.equals("inventory")) { - // inventory properties for each oxm to be concatenated - processingInventoryDef = true; - if ( inventoryDefSb == null ) { - inventoryDefSb = new StringBuilder(); - definitionsSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" properties:\n"); - } - - } else { - definitionsSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" " + xmlRootElementName + ":\n"); - } - DeleteFootnoteSet footnotes = new DeleteFootnoteSet(xmlRootElementName); - StringBuffer sbEdge = new StringBuffer(); - LinkedHashSet<String> preventDelete = new LinkedHashSet<String>(); - String prevent=null; - String nodeCaption = new String(" ###### Related Nodes\n"); - try { - EdgeRuleQuery q = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).fromOnly().build(); - Multimap<String, EdgeRule> results = ei.getRules(q); - SortedSet<String> ss=new TreeSet<>(results.keySet()); - sbEdge.append(nodeCaption); - nodeCaption=""; - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ logger.info(new String(new StringBuffer(" - TO ").append(i.getTo()).append(i.getDirection().toString()).append(i.getContains())));} ); - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ sbEdge.append(" - TO "+i.getTo()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName)+footnote+"\n"); if(StringUtils.isNotEmpty(footnote)) footnotes.add(footnote);} ); - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge() && i.getPreventDelete().equals("OUT")))).forEach((i) ->{ preventDelete.add(i.getTo().toUpperCase());} ); - } - } catch(Exception e) { - logger.debug("xmlRootElementName: "+xmlRootElementName+"\n"+e); - } - try { - EdgeRuleQuery q1 = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).toOnly().build(); - Multimap<String, EdgeRule> results = ei.getRules(q1); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - sbEdge.append(nodeCaption); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ sbEdge.append(" - FROM "+i.getFrom()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName)+footnote+"\n"); if(StringUtils.isNotEmpty(footnote)) footnotes.add(footnote);} ); - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ logger.info(new String(new StringBuffer(" - FROM ").append(i.getFrom()).append(i.getDirection().toString()).append(i.getContains())));} ); - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge() && i.getPreventDelete().equals("IN")))).forEach((i) ->{ preventDelete.add(i.getFrom().toUpperCase());} ); - } - } catch(Exception e) { - logger.debug("xmlRootElementName: "+xmlRootElementName+"\n"+e); - } - if(preventDelete.size() > 0) { - prevent = xmlRootElementName.toUpperCase()+" cannot be deleted if related to "+String.join(",",preventDelete); - logger.debug(prevent); - } - - if(StringUtils.isNotEmpty(prevent)) { - footnotes.add(prevent); - } - if(footnotes.footnotes.size() > 0) { - sbEdge.append(footnotes.toString()); - } - validEdges = sbEdge.toString(); - - // Handle description property. Might have a description OR valid edges OR both OR neither. - // Only put a description: tag if there is at least one. - if (StringUtils.isNotEmpty(pathDescriptionProperty) || StringUtils.isNotEmpty(validEdges) ) { - definitionsSb.append(" description: |\n"); - definitionsLocalSb.append(" description: |\n"); - - if ( pathDescriptionProperty != null ) { - definitionsSb.append(" " + pathDescriptionProperty + "\n" ); - definitionsLocalSb.append(" " + pathDescriptionProperty + "\n" ); - } - definitionsSb.append(validEdges); - definitionsLocalSb.append(validEdges); - } - - if ( requiredCnt > 0 ) { - definitionsSb.append(sbRequired); - definitionsLocalSb.append(sbRequired); - } - - if ( propertyCnt > 0 ) { - definitionsSb.append(" properties:\n"); - definitionsSb.append(sbProperties); - if ( !processingInventoryDef) { - definitionsLocalSb.append(" properties:\n"); - } - definitionsLocalSb.append(sbProperties); - } - try { - namespaceFilter.add(xmlRootElementName); - if ( xmlRootElementName.equals("inventory") ) { - //will add to javaTypeDefinitions at end - inventoryDefSb.append(definitionsLocalSb.toString()); - } else { - javaTypeDefinitions.put(xmlRootElementName, definitionsLocalSb.toString()); - } - } catch (Exception e) { - e.printStackTrace(); - } - if ( xmlRootElementName.equals("inventory") ) { - logger.trace("skip xmlRootElementName(2)="+xmlRootElementName); - return null; - } - generatedJavaType.put(xmlRootElementName, null); - //Write operations by Namespace(tagName) -/* - if( validTag(javaTypeName) && javaTypeName == useTag && tag == null) { - writeYAMLfile("nodes_"+javaTypeName, getDocumentHeader()+pathSb.toString()+appendDefinitions(namespaceFilter)); - totalPathSbAccumulator.append(pathSb); - pathSb.delete(0, pathSb.length()); - namespaceFilter.clear(); - } -*/ - logger.debug("xmlRootElementName(2)="+xmlRootElementName); - return null; - } - - private void writeYAMLfile(String outfileName, String fileContent) { - outfileName = (StringUtils.isEmpty(outfileName)) ? "aai_swagger" : outfileName; - outfileName = (outfileName.lastIndexOf(File.separator) == -1) ? yaml_dir + File.separator +outfileName+"_" + v.toString() + "." + generateTypeYAML : outfileName; - File outfile = new File(outfileName); - File parentDir = outfile.getParentFile(); - if(parentDir != null && ! parentDir.exists()) - parentDir.mkdirs(); - try { - outfile.createNewFile(); - } catch (IOException e) { - logger.error( "Exception creating output file " + outfileName); - e.printStackTrace(); - } - Path path = Paths.get(outfileName); - Charset charset = Charset.forName("UTF-8"); - try(BufferedWriter bw = Files.newBufferedWriter(path, charset);) { - bw.write(fileContent); - if ( bw != null ) { - bw.close(); - } - } catch ( IOException e) { - logger.error( "Exception writing output file " + outfileName); - e.printStackTrace(); - } - } - - public boolean validTag(String tag) { - if(tag != null) { - switch ( tag ) { - case "Network": - case "Search": - case "Actions": - case "ServiceDesignAndCreation": - case "Business": - case "LicenseManagement": - case "CloudInfrastructure": - return true; - } - } - return false; - } - - public String appendOperations() { - //append definitions - StringBuffer sb = new StringBuffer(); - Map<String, String> sortedOperationDefinitions = new TreeMap<String, String>(operationDefinitions); - for (Map.Entry<String, String> entry : sortedOperationDefinitions.entrySet()) { - sb.append(entry.getValue()); - } - return sb.toString(); - } -} - diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/OxmFileProcessor.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/OxmFileProcessor.java deleted file mode 100644 index 8edab757..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/OxmFileProcessor.java +++ /dev/null @@ -1,525 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.io.StringReader; -import java.io.StringWriter; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.transform.OutputKeys; -import javax.xml.transform.Transformer; -import javax.xml.transform.TransformerException; -import javax.xml.transform.TransformerFactory; -import javax.xml.transform.dom.DOMSource; -import javax.xml.transform.stream.StreamResult; - -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.exceptions.AAIException; - -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.nodes.NodeIngestor; -import org.w3c.dom.Attr; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -import org.xml.sax.InputSource; - -public abstract class OxmFileProcessor { - - public static final String LINE_SEPARATOR = System.getProperty("line.separator"); - public static final String DOUBLE_LINE_SEPARATOR = System.getProperty("line.separator") + System.getProperty("line.separator"); - - EdgeIngestor ei; - NodeIngestor ni; - protected Set<String> namespaceFilter; - protected File oxmFile; - protected String xml; - protected SchemaVersion v; - protected Document doc = null; - protected String apiVersion = null; - protected SchemaVersions schemaVersions; - - - protected static int annotationsStartVersion = 9; // minimum version to support annotations in xsd - protected static int annotationsMinVersion = 6; // lower versions support annotations in xsd - protected static int swaggerSupportStartsVersion = 1; // minimum version to support swagger documentation - protected static int swaggerDiffStartVersion = 1; // minimum version to support difference - protected static int swaggerMinBasepath = 6; // minimum version to support difference - - protected Map combinedJavaTypes; - - - protected String apiVersionFmt = null; - protected HashMap<String, String> generatedJavaType = new HashMap<String, String>(); - protected HashMap<String, String> appliedPaths = new HashMap<String, String>(); - protected NodeList javaTypeNodes = null; - - protected Map<String,String> javaTypeDefinitions = createJavaTypeDefinitions(); - private Map<String, String> createJavaTypeDefinitions() - { - StringBuffer aaiInternal = new StringBuffer(); - StringBuffer nodes = 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()); - nodes.append(" nodes:\n"); - nodes.append(" properties:\n"); - nodes.append(" inventory-item-data:\n"); - nodes.append(" type: array\n"); - nodes.append(" items:\n"); - nodes.append(" $ref: \"#/definitions/inventory-item-data\"\n"); - javaTypeDefinitions.put("nodes", nodes.toString()); - return javaTypeDefinitions; - } - static List<String> nodeFilter = createNodeFilter(); - private static List<String> createNodeFilter() - { - List<String> list = Arrays.asList("search", "actions", "aai-internal", "nodes"); - return list; - } - - public OxmFileProcessor(SchemaVersions schemaVersions, NodeIngestor ni, EdgeIngestor ei){ - this.schemaVersions = schemaVersions; - this.ni = ni; - this.ei = ei; - } - - - - public void setOxmVersion(File oxmFile, SchemaVersion v) { - this.oxmFile = oxmFile; - this.v = v; - } - - public void setXmlVersion(String xml, SchemaVersion v) { - this.xml = xml; - this.v = v; - } - - public void setVersion(SchemaVersion v) { - this.oxmFile = null; - this.v = v; - } - - public void setNodeIngestor(NodeIngestor ni) { - this.ni = ni; - } - - public void setEdgeIngestor(EdgeIngestor ei) { - this.ei = ei; - } - - public SchemaVersions getSchemaVersions() { - return schemaVersions; - } - - public void setSchemaVersions(SchemaVersions schemaVersions) { - this.schemaVersions = schemaVersions; - } - - protected void init() throws ParserConfigurationException, SAXException, IOException, AAIException, EdgeRuleNotFoundException { - if(this.xml != null || this.oxmFile != null ) { - createDocument(); - } - if(this.doc == null) { - this.doc = ni.getSchema(v); - } - namespaceFilter = new HashSet<>(); - - NodeList bindingsNodes = doc.getElementsByTagName("xml-bindings"); - Element bindingElement; - NodeList javaTypesNodes; - Element javaTypesElement; - - if ( bindingsNodes == null || bindingsNodes.getLength() == 0 ) { - throw new AAIException("OXM file error: missing <binding-nodes> in " + oxmFile); - } - - bindingElement = (Element) bindingsNodes.item(0); - javaTypesNodes = bindingElement.getElementsByTagName("java-types"); - if ( javaTypesNodes.getLength() < 1 ) { - throw new AAIException("OXM file error: missing <binding-nodes><java-types> in " + oxmFile); - } - javaTypesElement = (Element) javaTypesNodes.item(0); - - javaTypeNodes = javaTypesElement.getElementsByTagName("java-type"); - if ( javaTypeNodes.getLength() < 1 ) { - throw new AAIException("OXM file error: missing <binding-nodes><java-types><java-type> in " + oxmFile ); - } - } - - private void createDocument() throws ParserConfigurationException, SAXException, IOException, AAIException { - DocumentBuilder dBuilder = null; - try { - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - dBuilder = dbFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw e; - } - try { - if ( xml == null ) { - doc = dBuilder.parse(oxmFile); - } else { - InputSource isInput = new InputSource(new StringReader(xml)); - doc = dBuilder.parse(isInput); - } - } catch (SAXException e) { - throw e; - } catch (IOException e) { - throw e; - } - return; - } - public abstract String getDocumentHeader(); - public abstract String process() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException ; - - public String getXMLRootElementName(Element javaTypeElement) { - String xmlRootElementName=null; - NamedNodeMap attributes; - - NodeList valNodes = javaTypeElement.getElementsByTagName("xml-root-element"); - Element valElement = (Element) valNodes.item(0); - attributes = valElement.getAttributes(); - for ( int i = 0; i < attributes.getLength(); ++i ) { - Attr attr = (Attr) attributes.item(i); - String attrName = attr.getNodeName(); - - String attrValue = attr.getNodeValue(); - if ( attrName.equals("name")) - xmlRootElementName = attrValue; - } - return xmlRootElementName; - } - - public String getXmlRootElementName( String javaTypeName ) - { - String attrName, attrValue; - Attr attr; - Element javaTypeElement; - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - javaTypeElement = (Element) javaTypeNodes.item(i); - NamedNodeMap attributes = javaTypeElement.getAttributes(); - for ( int j = 0; j < attributes.getLength(); ++j ) { - attr = (Attr) attributes.item(j); - attrName = attr.getNodeName(); - attrValue = attr.getNodeValue(); - if ( attrName.equals("name") && attrValue.equals(javaTypeName)) { - NodeList valNodes = javaTypeElement.getElementsByTagName("xml-root-element"); - Element valElement = (Element) valNodes.item(0); - attributes = valElement.getAttributes(); - for ( int k = 0; k < attributes.getLength(); ++k ) { - attr = (Attr) attributes.item(k); - attrName = attr.getNodeName(); - - attrValue = attr.getNodeValue(); - if ( attrName.equals("name")) - return (attrValue); - } - } - } - } - return null; - } - - public Map getCombinedJavaTypes() { - return combinedJavaTypes; - } - - public void setCombinedJavaTypes(Map combinedJavaTypes) { - this.combinedJavaTypes = combinedJavaTypes; - } - - public Element getJavaTypeElementSwagger( String javaTypeName ) - { - - String attrName, attrValue; - Attr attr; - Element javaTypeElement; - - List<Element> combineElementList = new ArrayList<Element>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - javaTypeElement = (Element) javaTypeNodes.item(i); - NamedNodeMap attributes = javaTypeElement.getAttributes(); - for ( int j = 0; j < attributes.getLength(); ++j ) { - attr = (Attr) attributes.item(j); - attrName = attr.getNodeName(); - attrValue = attr.getNodeValue(); - if ( attrName.equals("name") && attrValue.equals(javaTypeName)) { - combineElementList.add(javaTypeElement); - } - } - } - if ( combineElementList.size() == 0 ) { - return (Element) null; - } else if ( combineElementList.size() > 1 ) { - return combineElements( javaTypeName, combineElementList); - } - return combineElementList.get(0); - } - - public boolean versionSupportsSwaggerDiff( String version) { - int ver = new Integer(version.substring(1)).intValue(); - if ( ver >= HTMLfromOXM.swaggerDiffStartVersion ) { - return true; - } - return false; - } - - public boolean versionSupportsBasePathProperty( String version) { - int ver = new Integer(version.substring(1)).intValue(); - if ( ver <= HTMLfromOXM.swaggerMinBasepath ) { - return true; - } - return false; - } - - protected void updateParentXmlElements(Element parentElement, NodeList moreXmlElementNodes) { - Element xmlElement; - NodeList childNodes; - Node childNode; - - Node refChild = null; - // find childNode with attributes and no children, insert children before that node - childNodes = parentElement.getChildNodes(); - if ( childNodes == null || childNodes.getLength() == 0 ) { - // should not happen since the base parent was chosen if it had children - return; - } - - for ( int i = 0; i < childNodes.getLength(); ++i ) { - refChild = childNodes.item(i); - if ( refChild.hasAttributes() && !refChild.hasChildNodes()) { - break; - } - - } - - for ( int i = 0; i < moreXmlElementNodes.getLength(); ++i ) { - xmlElement = (Element)moreXmlElementNodes.item(i); - childNode = xmlElement.cloneNode(true); - parentElement.insertBefore(childNode, refChild); - } - } - - protected Node getXmlPropertiesNode(Element javaTypeElement ) { - NodeList nl = javaTypeElement.getChildNodes(); - Node child; - for ( int i = 0; i < nl.getLength(); ++i ) { - child = nl.item(i); - if ( "xml-properties".equals(child.getNodeName())) { - return child; - } - } - return null; - } - - protected Node merge( NodeList nl, Node mergeNode ) { - NamedNodeMap nnm = mergeNode.getAttributes(); - Node childNode; - NamedNodeMap childNnm; - - String mergeName = nnm.getNamedItem("name").getNodeValue(); - String mergeValue = nnm.getNamedItem("value").getNodeValue(); - String childName; - String childValue; - for ( int j = 0; j < nl.getLength(); ++j ) { - childNode = nl.item(j); - if ( "xml-property".equals(childNode.getNodeName())) { - childNnm = childNode.getAttributes(); - childName = childNnm.getNamedItem("name").getNodeValue(); - childValue = childNnm.getNamedItem("value").getNodeValue(); - if ( childName.equals(mergeName)) { - // attribute exists - // keep, replace or update - if ( childValue.contains(mergeValue) ) { - return null; - } - if ( mergeValue.contains(childValue) ) { - childNnm.getNamedItem("value").setTextContent(mergeValue); - return null; - } - childNnm.getNamedItem("value").setTextContent(mergeValue + "," + childValue); - return null; - } - } - } - childNode = mergeNode.cloneNode(true); - return childNode; - } - - protected void mergeXmlProperties(Node useChildProperties, NodeList propertiesToMerge ) { - NodeList nl = useChildProperties.getChildNodes(); - Node childNode; - Node newNode; - for ( int i = 0; i < propertiesToMerge.getLength(); ++i ) { - childNode = propertiesToMerge.item(i); - if ( "xml-property".equals(childNode.getNodeName()) ) { - newNode = merge(nl, childNode); - if ( newNode != null ) { - useChildProperties.appendChild(newNode); - } - } - - } - } - - protected void combineXmlProperties(int useElement, List<Element> combineElementList) { - // add or update xml-properties to the referenced element from the combined list - Element javaTypeElement = combineElementList.get(useElement); - NodeList nl = javaTypeElement.getChildNodes(); - Node useChildProperties = getXmlPropertiesNode( javaTypeElement); - int cloneChild = -1; - Node childProperties; - if ( useChildProperties == null ) { - // find xml-properties to clone - for ( int i = 0; i < combineElementList.size(); ++i ) { - if ( i == useElement ) { - continue; - } - childProperties = getXmlPropertiesNode(combineElementList.get(i)); - if ( childProperties != null ) { - useChildProperties = childProperties.cloneNode(true); - javaTypeElement.appendChild(useChildProperties); - cloneChild = i; - } - } - } - NodeList cnl; - // find other xml-properties - for ( int i = 0; i < combineElementList.size(); ++i ) { - if ( i == useElement|| ( cloneChild >= 0 && i <= cloneChild )) { - continue; - } - childProperties = getXmlPropertiesNode(combineElementList.get(i)); - if ( childProperties == null ) { - continue; - } - cnl = childProperties.getChildNodes(); - mergeXmlProperties( useChildProperties, cnl); - } - - } - - protected Element combineElements( String javaTypeName, List<Element> combineElementList ) { - Element javaTypeElement; - NodeList parentNodes; - Element parentElement = null; - NodeList xmlElementNodes; - - int useElement = -1; - if ( combinedJavaTypes.containsKey( javaTypeName) ) { - return combineElementList.get((int)combinedJavaTypes.get(javaTypeName)); - } - for ( int i = 0; i < combineElementList.size(); ++i ) { - javaTypeElement = combineElementList.get(i); - parentNodes = javaTypeElement.getElementsByTagName("java-attributes"); - if ( parentNodes.getLength() == 0 ) { - continue; - } - parentElement = (Element)parentNodes.item(0); - xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - if ( xmlElementNodes.getLength() <= 0 ) { - continue; - } - useElement = i; - break; - } - boolean doCombineElements = true; - if ( useElement < 0 ) { - useElement = 0; - doCombineElements = false; - } else if ( useElement == combineElementList.size() - 1) { - doCombineElements = false; - } - if ( doCombineElements ) { - // get xml-element from other javaTypeElements - Element otherParentElement = null; - for ( int i = 0; i < combineElementList.size(); ++i ) { - if ( i == useElement ) { - continue; - } - javaTypeElement = combineElementList.get(i); - parentNodes = javaTypeElement.getElementsByTagName("java-attributes"); - if ( parentNodes.getLength() == 0 ) { - continue; - } - otherParentElement = (Element)parentNodes.item(0); - xmlElementNodes = otherParentElement.getElementsByTagName("xml-element"); - if ( xmlElementNodes.getLength() <= 0 ) { - continue; - } - // xml-element that are not present - updateParentXmlElements( parentElement, xmlElementNodes); - - } - } - // need to combine xml-properties - combineXmlProperties(useElement, combineElementList ); - combinedJavaTypes.put( javaTypeName, useElement); - return combineElementList.get(useElement); - } - - - private static void prettyPrint(Node node, String tab) - { - // for debugging - try { - // Set up the output transformer - TransformerFactory transfac = TransformerFactory.newInstance(); - Transformer trans = transfac.newTransformer(); - trans.setOutputProperty(OutputKeys.OMIT_XML_DECLARATION, "yes"); - trans.setOutputProperty(OutputKeys.INDENT, "yes"); - StringWriter sw = new StringWriter(); - StreamResult result = new StreamResult(sw); - DOMSource source = new DOMSource(node); - trans.transform(source, result); - String xmlString = sw.toString(); - System.out.println(xmlString); - } - catch (TransformerException e) { - e.printStackTrace(); - } - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/PatchOperation.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/PatchOperation.java deleted file mode 100644 index 37b2d1b1..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/PatchOperation.java +++ /dev/null @@ -1,114 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.StringTokenizer; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.util.GenerateXsd; - -public class PatchOperation { - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - - public PatchOperation(String useOpId, String xmlRootElementName, String tag, String path, String pathParams) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams = pathParams; - } - - public String toString() { - StringTokenizer st; - st = new StringTokenizer(path, "/"); - //a valid tag is necessary - if ( StringUtils.isEmpty(tag) ) { - return ""; - } - if ( path.contains("/relationship/") ) { // filter paths with relationship-list - return ""; - } - if ( path.endsWith("/relationship-list")) { - return ""; - } - if ( path.startsWith("/search")) { - return ""; - } - //No Patch operation paths end with "relationship" - - if (path.endsWith("/relationship") ) { - return ""; - } - if (!path.endsWith("}")) { - return ""; - } - - StringBuffer pathSb = new StringBuffer(); - StringBuffer relationshipExamplesSb = new StringBuffer(); - if ( path.endsWith("/relationship") ) { - pathSb.append(" " + path + ":\n" ); - } - pathSb.append(" patch:\n"); - pathSb.append(" tags:\n"); - pathSb.append(" - " + tag + "\n"); - - if ( path.endsWith("/relationship") ) { - pathSb.append(" summary: see node definition for valid relationships\n"); - relationshipExamplesSb.append("[See Examples](apidocs/relations/"+GenerateXsd.getAPIVersion()+"/"+useOpId+".json)"); - } else { - pathSb.append(" summary: update an existing " + xmlRootElementName + "\n"); - pathSb.append(" description: |\n"); - pathSb.append(" Update an existing " + xmlRootElementName + "\n"); - pathSb.append(" #\n"); - pathSb.append(" Note: Endpoints that are not devoted to object relationships support both PUT and PATCH operations.\n"); - pathSb.append(" The PUT operation will entirely replace an existing object.\n"); - pathSb.append(" The PATCH operation sends a \"description of changes\" for an existing object. The entire set of changes must be applied. An error result means no change occurs.\n"); - pathSb.append(" #\n"); - pathSb.append(" Other differences between PUT and PATCH are:\n"); - pathSb.append(" #\n"); - pathSb.append(" - For PATCH, you can send any of the values shown in sample REQUEST body. There are no required values.\n"); - pathSb.append(" - For PATCH, resource-id which is a required REQUEST body element for PUT, must not be sent.\n"); - pathSb.append(" - PATCH cannot be used to update relationship elements; there are dedicated PUT operations for this.\n"); - } - pathSb.append(" operationId: Update" + useOpId + "\n"); - pathSb.append(" consumes:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" produces:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" responses:\n"); - pathSb.append(" \"default\":\n"); - pathSb.append(" " + GenerateXsd.getResponsesUrl()); - pathSb.append(" parameters:\n"); - pathSb.append(pathParams); // for nesting - pathSb.append(" - name: body\n"); - pathSb.append(" in: body\n"); - pathSb.append(" description: " + xmlRootElementName + " object that needs to be updated."+relationshipExamplesSb.toString()+"\n"); - pathSb.append(" required: true\n"); - pathSb.append(" schema:\n"); - pathSb.append(" $ref: \"#/patchDefinitions/" + xmlRootElementName + "\"\n"); - return pathSb.toString(); - } - } -
\ No newline at end of file diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/PutOperation.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/PutOperation.java deleted file mode 100644 index 6597d034..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/PutOperation.java +++ /dev/null @@ -1,118 +0,0 @@ -/** - * ============LICENSE_START======================================================= - * org.onap.aai - * ================================================================================ - * Copyright © 2017-2018 AT&T Intellectual Property. All rights reserved. - * ================================================================================ - * Modifications Copyright © 2018 IBM. - * ================================================================================ - * 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.util.genxsd; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.util.GenerateXsd; - -public class PutOperation { - public static final String RELATIONSHIP = "relationship"; - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private SchemaVersion version; - - public PutOperation(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, SchemaVersion v) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams = pathParams; - this.version = v; - } - - @Override - public String toString() { - //a valid tag is necessary - if ( StringUtils.isEmpty(tag) ) { - return ""; - } - //All Put operation paths end with "relationship" - //or there is a parameter at the end of the path - //and there is a parameter in the path - if ( path.contains("/"+RELATIONSHIP+"/") ) { // filter paths with relationship-list - return ""; - } - if ( path.endsWith("/"+RELATIONSHIP+"-list")) { - return ""; - } - if ( !path.endsWith("/"+RELATIONSHIP) && !path.endsWith("}") ) { - return ""; - } - if ( path.startsWith("/search")) { - return ""; - } - StringBuffer pathSb = new StringBuffer(); - StringBuffer relationshipExamplesSb = new StringBuffer(); - if ( path.endsWith("/"+RELATIONSHIP) ) { - pathSb.append(" " + path + ":\n" ); - } - pathSb.append(" put:\n"); - pathSb.append(" tags:\n"); - pathSb.append(" - " + tag + "\n"); - - if ( path.endsWith("/"+RELATIONSHIP) ) { - pathSb.append(" summary: see node definition for valid relationships\n"); - } else { - pathSb.append(" summary: create or update an existing " + xmlRootElementName + "\n"); - pathSb.append(" description: |\n Create or update an existing " + xmlRootElementName + ".\n #\n Note! This PUT method has a corresponding PATCH method that can be used to update just a few of the fields of an existing object, rather than a full object replacement. An example can be found in the [PATCH section] below\n"); - } - relationshipExamplesSb.append("[Valid relationship examples shown here](apidocs/relations/"+version.toString()+"/"+useOpId.replace("RelationshipListRelationship", "")+".json)"); - pathSb.append(" operationId: createOrUpdate" + useOpId + "\n"); - pathSb.append(" consumes:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - pathSb.append(" produces:\n"); - pathSb.append(" - application/json\n"); - pathSb.append(" - application/xml\n"); - pathSb.append(" responses:\n"); - pathSb.append(" \"default\":\n"); - pathSb.append(" " + GenerateXsd.getResponsesUrl()); - - pathSb.append(" parameters:\n"); - pathSb.append(pathParams); // for nesting - pathSb.append(" - name: body\n"); - pathSb.append(" in: body\n"); - pathSb.append(" description: " + xmlRootElementName + " object that needs to be created or updated. "+relationshipExamplesSb.toString()+"\n"); - pathSb.append(" required: true\n"); - pathSb.append(" schema:\n"); - String useElement = xmlRootElementName; - if ( xmlRootElementName.equals("relationship")) { - useElement += "-dict"; - } - pathSb.append(" $ref: \"#/definitions/" + useElement + "\"\n"); - this.tagRelationshipPathMapEntry(); - return pathSb.toString(); - } - - public String tagRelationshipPathMapEntry() { - if ( path.endsWith("/"+RELATIONSHIP) ) { - PutRelationPathSet.add(useOpId, path); - } - return ""; - } - - } diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/PutRelationPathSet.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/PutRelationPathSet.java deleted file mode 100644 index 3d055b81..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/PutRelationPathSet.java +++ /dev/null @@ -1,224 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.apache.commons.text.similarity.LevenshteinDistance; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.config.SpringContextAware; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.EdgeRuleQuery; -import org.onap.aai.util.GenerateXsd; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.google.common.collect.Multimap; - -public class PutRelationPathSet { - EdgeIngestor ei; - private static final Logger logger = LoggerFactory.getLogger("PutRelationPathSet.class"); - protected static HashMap<String, String> putRelationPaths = new HashMap<String, String>(); - public static void add(String useOpId, String path) { - putRelationPaths.put(useOpId, path); - } - - String apiPath; - String opId; - SchemaVersion version; - protected ArrayList<String> relations = new ArrayList<String>(); - String objectName = ""; - - public PutRelationPathSet(SchemaVersion v) { - this.version = v; - } - - public PutRelationPathSet(String opId, String path, SchemaVersion v) { - this.apiPath = path.replace("/relationship-list/relationship", ""); - this.opId = opId; - this.version = v; - objectName = DeleteOperation.deletePaths.get(apiPath); - logger.debug("II-apiPath: "+apiPath+"\nPath: "+path+"\nopId="+opId+"\nobjectName="+objectName); - } - private void process(EdgeIngestor edgeIngestor) { - this.ei = edgeIngestor; - this.toRelations(); - this.fromRelations(); - this.writeRelationsFile(); - - } - private void toRelations() { - logger.debug("{“comment”: “Valid TO Relations that can be added”},"); - logger.debug("apiPath: "+apiPath+"\nopId="+opId+"\nobjectName="+objectName); - try { - - EdgeRuleQuery q1 = new EdgeRuleQuery.Builder("ToOnly",objectName).version(version).build(); - Multimap<String, EdgeRule> results = ei.getRules(q1); - relations.add("{\"comment\": \"Valid TO Relations that can be added\"}\n"); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (! i.isPrivateEdge())).forEach((i) ->{ String rel = selectedRelation(i); relations.add(rel); logger.debug("Relation added: "+rel); } ); - } - } catch(Exception e) { - logger.debug("objectName: "+objectName+"\n"+e); - } - } - private String selectedRelation(EdgeRule rule) { - String selectedRelation = ""; - EdgeDescription ed = new EdgeDescription(rule); - logger.debug(ed.getRuleKey()+"Type="+ed.getType()); - String obj = ed.getRuleKey().replace(objectName,"").replace("|",""); - - if(ed.getType() == EdgeDescription.LineageType.UNRELATED) { - String selectObj = getUnrelatedObjectPaths(obj, apiPath); - logger.debug("SelectedObj"+selectObj); - selectedRelation = formatObjectRelationSet(obj,selectObj); - logger.trace("ObjectRelationSet"+selectedRelation); - } else { - String selectObj = getKinObjectPath(obj, apiPath); - logger.debug("SelectedObj"+selectObj); - selectedRelation = formatObjectRelation(obj,selectObj); - logger.trace("ObjectRelationSet"+selectedRelation); - } - return selectedRelation; - } - - private void fromRelations() { - logger.debug("“comment”: “Valid FROM Relations that can be added”"); - try { - - EdgeRuleQuery q1 = new EdgeRuleQuery.Builder(objectName,"FromOnly").version(version).build(); - Multimap<String, EdgeRule> results = ei.getRules(q1); - relations.add("{\"comment\": \"Valid FROM Relations that can be added\"}\n"); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (! i.isPrivateEdge())).forEach((i) ->{ String rel = selectedRelation(i); relations.add(rel); logger.debug("Relation added: "+rel); } ); - } - } catch(Exception e) { - logger.debug("objectName: "+objectName+"\n"+e); - } - } - private void writeRelationsFile() { - File examplefilePath = new File(GenerateXsd.getYamlDir() + "/relations/" + version.toString()+"/"+opId.replace("RelationshipListRelationship", "") + ".json"); - - logger.debug(String.join("exampleFilePath: ", examplefilePath.toString())); - FileOutputStream fop = null; - try { - if (!examplefilePath.exists()) { - examplefilePath.getParentFile().mkdirs(); - examplefilePath.createNewFile(); - } - fop = new FileOutputStream(examplefilePath); - } catch(Exception e) { - e.printStackTrace(); - return; - } - try { - if(relations.size() > 0) {fop.write("[\n".getBytes());} - fop.write(String.join(",\n", relations).getBytes()); - if(relations.size() > 0) {fop.write("\n]\n".getBytes());} - fop.flush(); - fop.close(); - } catch (Exception e) { - e.printStackTrace(); - return; - } - finally{ - try { - fop.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } - logger.debug(String.join(",\n", relations)); - return; - } - - private static String formatObjectRelationSet(String obj, String selectObj) { - StringBuffer pathSb = new StringBuffer(); - String[] paths = selectObj.split("[|]"); - for (String s: paths) { - logger.trace("SelectOBJ"+s); - pathSb.append(formatObjectRelation(obj, s)+",\n"); - } - pathSb.deleteCharAt(pathSb.length()-2); - return pathSb.toString(); - } - - private static String formatObjectRelation(String obj, String selectObj) { - StringBuffer pathSb = new StringBuffer(); - pathSb.append("{\n"); - pathSb.append("\"related-to\" : \""+obj+"\",\n"); - pathSb.append("\"related-link\" : \""+selectObj+"\"\n"); - pathSb.append("}"); - return pathSb.toString(); - } - - private static String getKinObjectPath(String obj, String apiPath) { - LevenshteinDistance proximity = new LevenshteinDistance(); - String targetPath = ""; - int targetScore = Integer.MAX_VALUE; - int targetMaxScore = 0; - for (Map.Entry<String, String> p : DeleteOperation.deletePaths.entrySet()) { - if(p.getValue().equals(obj)) { - targetScore = (targetScore >= proximity.apply(apiPath, p.getKey())) ? proximity.apply(apiPath, p.getKey()) : targetScore; - targetPath = (targetScore >= proximity.apply(apiPath, p.getKey())) ? p.getKey() : targetPath; - targetMaxScore = (targetMaxScore <= proximity.apply(apiPath, p.getKey())) ? proximity.apply(apiPath, p.getKey()) : targetScore; - logger.trace(proximity.apply(apiPath, p.getKey())+":"+p.getKey()); - logger.trace(proximity.apply(apiPath, p.getKey())+":"+apiPath); - } - } - return targetPath; - } - - private static String getUnrelatedObjectPaths(String obj, String apiPath) { - String targetPath = ""; - logger.trace("Obj:"+obj +"\n" + apiPath); - for (Map.Entry<String, String> p : DeleteOperation.deletePaths.entrySet()) { - if(p.getValue().equals(obj)) { - logger.trace("p.getvalue:"+p.getValue()+"p.getkey:"+p.getKey()); - targetPath += ((targetPath.length() == 0 ? "" : "|") + p.getKey()); - logger.trace("Match:"+apiPath +"\n" + targetPath); - } - } - return targetPath; - } - - public void generateRelations(EdgeIngestor edgeIngestor) { - putRelationPaths.forEach((k,v)->{ - logger.trace("k="+k+"\n"+"v="+v+v.equals("/business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}/service-instances/service-instance/{service-instance-id}/allotted-resources/allotted-resource/{id}/relationship-list/relationship")); - logger.debug("apiPath(Operation): "+v); - logger.debug("Target object: "+v.replace("/relationship-list/relationship", "")); - logger.debug("Relations: "); - PutRelationPathSet prp = new PutRelationPathSet(k, v, this.version); - prp.process(edgeIngestor); - }); - } - -} - diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDElement.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDElement.java deleted file mode 100644 index db7c54c3..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDElement.java +++ /dev/null @@ -1,756 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.util.ArrayList; -import java.util.List; -import java.util.StringTokenizer; -import java.util.Vector; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.setup.SchemaVersion; -import org.w3c.dom.Attr; -import org.w3c.dom.DOMException; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NamedNodeMap; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.w3c.dom.TypeInfo; -import org.w3c.dom.UserDataHandler; - -import com.google.common.base.Joiner; - -public class XSDElement implements Element { - Element xmlElementElement; - String maxOccurs; - private static final int VALUE_NONE = 0; - private static final int VALUE_DESCRIPTION = 1; - private static final int VALUE_INDEXED_PROPS = 2; - private static final int VALUE_CONTAINER = 3; - private static final int VALUE_REQUIRES = 4; - - public XSDElement(Element xmlElementElement, String maxOccurs) { - super(); - this.xmlElementElement = xmlElementElement; - this.maxOccurs = maxOccurs; - } - - public XSDElement(Element xmlElementElement) { - super(); - this.xmlElementElement = xmlElementElement; - this.maxOccurs = null; - } - - public String name() { - return this.getAttribute("name"); - } - - public Vector<String> getAddTypes(String version) { - String apiVersionFmt = "." + version + "."; - NamedNodeMap attributes = this.getAttributes(); - Vector<String> addTypeV = new Vector<String>(); // vector of 1 - String addType = null; - - for ( int j = 0; j < attributes.getLength(); ++j ) { - Attr attr = (Attr) attributes.item(j); - String attrName = attr.getNodeName(); - - String attrValue = attr.getNodeValue(); - if ( attrName.equals("type")) { - if ( attrValue.contains(apiVersionFmt) ) { - addType = attrValue.substring(attrValue.lastIndexOf('.')+1); - if ( addTypeV == null ) - addTypeV = new Vector<String>(); - addTypeV.add(addType); - } - - } - } - return addTypeV; - } - - public String getRequiresProperty() { - String elementAlsoRequiresProperty = null; - NodeList xmlPropNodes = this.getElementsByTagName("xml-properties"); - - for ( int i = 0; i < xmlPropNodes.getLength(); ++i ) { - Element xmlPropElement = (Element)xmlPropNodes.item(i); - if (! xmlPropElement.getParentNode().getAttributes().getNamedItem("name").getNodeValue().equals(this.xmlElementElement.getAttribute("name"))){ - continue; - } - NodeList childNodes = xmlPropElement.getElementsByTagName("xml-property"); - - for ( int j = 0; j < childNodes.getLength(); ++j ) { - Element childElement = (Element)childNodes.item(j); - // get name - int useValue = VALUE_NONE; - NamedNodeMap attributes = childElement.getAttributes(); - for ( int k = 0; k < attributes.getLength(); ++k ) { - Attr attr = (Attr) attributes.item(k); - String attrName = attr.getNodeName(); - String attrValue = attr.getNodeValue(); - if ( attrName == null || attrValue == null ) - continue; - if ( attrName.equals("name") && attrValue.equals("requires")) { - useValue = VALUE_REQUIRES; - } - if ( useValue == VALUE_REQUIRES && attrName.equals("value")) { - elementAlsoRequiresProperty = attrValue; - } - } - } - } - return elementAlsoRequiresProperty; - } - - public String getPathDescriptionProperty() { - String pathDescriptionProperty = null; - NodeList xmlPropNodes = this.getElementsByTagName("xml-properties"); - - for ( int i = 0; i < xmlPropNodes.getLength(); ++i ) { - Element xmlPropElement = (Element)xmlPropNodes.item(i); - if (! xmlPropElement.getParentNode().getAttributes().getNamedItem("name").getNodeValue().equals(this.xmlElementElement.getAttribute("name"))){ - continue; - } -// This stopped working, replaced with above - should figure out why... -// if ( !xmlPropElement.getParentNode().isSameNode(this.xmlElementElement)) -// continue; - NodeList childNodes = xmlPropElement.getElementsByTagName("xml-property"); - - for ( int j = 0; j < childNodes.getLength(); ++j ) { - Element childElement = (Element)childNodes.item(j); - // get name - int useValue = VALUE_NONE; - NamedNodeMap attributes = childElement.getAttributes(); - for ( int k = 0; k < attributes.getLength(); ++k ) { - Attr attr = (Attr) attributes.item(k); - String attrName = attr.getNodeName(); - String attrValue = attr.getNodeValue(); - if ( attrName == null || attrValue == null ) - continue; - if ( attrName.equals("name") && attrValue.equals("description")) { - useValue = VALUE_DESCRIPTION; - } - if ( useValue == VALUE_DESCRIPTION && attrName.equals("value")) { - pathDescriptionProperty = attrValue; - } - } - } - } - return pathDescriptionProperty; - } - public Vector<String> getIndexedProps() { - Vector<String> indexedProps = new Vector<String>(); - NodeList xmlPropNodes = this.getElementsByTagName("xml-properties"); - - for ( int i = 0; i < xmlPropNodes.getLength(); ++i ) { - Element xmlPropElement = (Element)xmlPropNodes.item(i); - if ( !xmlPropElement.getParentNode().isSameNode(this.xmlElementElement)) - continue; - NodeList childNodes = xmlPropElement.getElementsByTagName("xml-property"); - for ( int j = 0; j < childNodes.getLength(); ++j ) { - Element childElement = (Element)childNodes.item(j); - // get name - int useValue = VALUE_NONE; - NamedNodeMap attributes = childElement.getAttributes(); - for ( int k = 0; k < attributes.getLength(); ++k ) { - Attr attr = (Attr) attributes.item(k); - String attrName = attr.getNodeName(); - String attrValue = attr.getNodeValue(); - if ( attrName == null || attrValue == null ) - continue; - if ( attrValue.equals("indexedProps")) { - useValue = VALUE_INDEXED_PROPS; - } - if ( useValue == VALUE_INDEXED_PROPS && attrName.equals("value")) { - indexedProps = getIndexedProps( attrValue ); - } - } - } - } - return indexedProps; - } - - private static Vector<String> getIndexedProps( String attrValue ) - { - if ( attrValue == null ) - return null; - StringTokenizer st = new StringTokenizer( attrValue, ","); - if ( st.countTokens() == 0 ) - return null; - Vector<String> result = new Vector<String>(); - while ( st.hasMoreTokens()) { - result.add(st.nextToken()); - } - return result; - } - - public String getContainerProperty() { - NodeList xmlPropNodes = this.getElementsByTagName("xml-properties"); - String container = null; - for ( int i = 0; i < xmlPropNodes.getLength(); ++i ) { - Element xmlPropElement = (Element)xmlPropNodes.item(i); - if ( !xmlPropElement.getParentNode().isSameNode(this.xmlElementElement)) - continue; - NodeList childNodes = xmlPropElement.getElementsByTagName("xml-property"); - for ( int j = 0; j < childNodes.getLength(); ++j ) { - Element childElement = (Element)childNodes.item(j); - // get name - int useValue = VALUE_NONE; - NamedNodeMap attributes = childElement.getAttributes(); - for ( int k = 0; k < attributes.getLength(); ++k ) { - Attr attr = (Attr) attributes.item(k); - String attrName = attr.getNodeName(); - String attrValue = attr.getNodeValue(); - if ( attrName == null || attrValue == null ) - continue; - if ( useValue == VALUE_CONTAINER && attrName.equals("value")) { - container = attrValue; - } - if ( attrValue.equals("container")) { - useValue = VALUE_CONTAINER; - } - } - } - } - return container; - } - - public String getQueryParamYAML() { - return getQueryParamYAML(null); - } - - public String getQueryParamYAML(String elementDescription ) { - // when elementDescription is not null, return parameters with description and example - StringBuffer sbParameter = new StringBuffer(); - sbParameter.append((" - name: " + this.getAttribute("name") + "\n")); - sbParameter.append((" in: query\n")); - String useDescription = elementDescription; - if ( elementDescription == null ) { - useDescription = this.getAttribute("description"); - } - if ( useDescription != null && useDescription.length() > 0 ) { - sbParameter.append((" description: " + useDescription + "\n")); - } else { - sbParameter.append((" description:\n")); - } - sbParameter.append((" required: false\n")); - if ( ("java.lang.String").equals(this.getAttribute("type"))) - sbParameter.append(" type: string\n"); - if ( ("java.lang.Long").equals(this.getAttribute("type"))) { - sbParameter.append(" type: integer\n"); - sbParameter.append(" format: int64\n"); - } - if ( ("java.lang.Integer").equals(this.getAttribute("type"))) { - sbParameter.append(" type: integer\n"); - sbParameter.append(" format: int32\n"); - } - if ( ("java.lang.Boolean").equals(this.getAttribute("type"))) { - sbParameter.append(" type: boolean\n"); - } - if ( elementDescription != null && StringUtils.isNotBlank(this.getAttribute("name"))) { - sbParameter.append(" example: "+"__"+this.getAttribute("name").toUpperCase()+"__"+"\n"); - } - return sbParameter.toString(); - } - - public String getPathParamYAML(String elementDescription) { - return getPathParamYAMLRqd( elementDescription, true); - } - - public String getPathParamYAMLRqd(String elementDescription, boolean isRqd) { - StringBuffer sbParameter = new StringBuffer(); - sbParameter.append((" - name: " + this.getAttribute("name") + "\n")); - sbParameter.append((" in: path\n")); - if ( elementDescription != null && elementDescription.length() > 0 ) - sbParameter.append((" description: " + elementDescription + "\n")); - if ( isRqd ) { - sbParameter.append((" required: true\n")); - } else { - // used by Nodes API for query params - sbParameter.append((" required: false\n")); - } - if ( ("java.lang.String").equals(this.getAttribute("type"))) - sbParameter.append(" type: string\n"); - if ( ("java.lang.Long").equals(this.getAttribute("type"))) { - sbParameter.append(" type: integer\n"); - sbParameter.append(" format: int64\n"); - } - if ( ("java.lang.Integer").equals(this.getAttribute("type"))) { - sbParameter.append(" type: integer\n"); - sbParameter.append(" format: int32\n"); - } - if ( ("java.lang.Boolean").equals(this.getAttribute("type"))) { - sbParameter.append(" type: boolean\n"); - } - if(StringUtils.isNotBlank(this.getAttribute("name"))) { - sbParameter.append(" example: "+"__"+this.getAttribute("name").toUpperCase()+"__"+"\n"); - } - return sbParameter.toString(); - } - - public String getHTMLElement(SchemaVersion v, boolean useAnnotation, HTMLfromOXM driver) { - StringBuffer sbElement = new StringBuffer(); - String elementName = this.getAttribute("name"); - String elementType = this.getAttribute("type"); - String elementContainerType = this.getAttribute("container-type"); - String elementIsRequired = this.getAttribute("required"); - String addType = elementType.contains("." + v.toString() + ".") ? elementType.substring(elementType.lastIndexOf('.')+1) : null; - - if ( addType != null ) { - sbElement.append(" <xs:element ref=\"tns:" + driver.getXmlRootElementName(addType)+"\""); - } else { - sbElement.append(" <xs:element name=\"" + elementName +"\""); - } - if ( elementType.equals("java.lang.String")) - sbElement.append(" type=\"xs:string\""); - if ( elementType.equals("java.lang.Long")) - sbElement.append(" type=\"xs:unsignedInt\""); - if ( elementType.equals("java.lang.Integer")) - sbElement.append(" type=\"xs:int\""); - if ( elementType.equals("java.lang.Boolean")) - sbElement.append(" type=\"xs:boolean\""); - if ( addType != null || elementType.startsWith("java.lang.") ) { - sbElement.append(" minOccurs=\"0\""); - } - if ( elementContainerType != null && elementContainerType.equals("java.util.ArrayList")) { - sbElement.append(" maxOccurs=\"" + maxOccurs + "\""); - } - if(useAnnotation) { - String annotation = new XSDElement(xmlElementElement, maxOccurs).getHTMLAnnotation("field", " "); - sbElement.append(StringUtils.isNotEmpty(annotation) ? ">" + OxmFileProcessor.LINE_SEPARATOR : ""); - sbElement.append(annotation); - sbElement.append(StringUtils.isNotEmpty(annotation) ? " </xs:element>" + OxmFileProcessor.LINE_SEPARATOR : "/>" + OxmFileProcessor.LINE_SEPARATOR ); - } else { - sbElement.append("/>" + OxmFileProcessor.LINE_SEPARATOR); - } - return this.getHTMLElementWrapper(sbElement.toString(), v, useAnnotation); -// return sbElement.toString(); - } - - public String getHTMLElementWrapper(String unwrappedElement, SchemaVersion v, boolean useAnnotation) { - - NodeList childNodes = this.getElementsByTagName("xml-element-wrapper"); - - String xmlElementWrapper = null; - if ( childNodes.getLength() > 0 ) { - Element childElement = (Element)childNodes.item(0); - // get name - xmlElementWrapper = childElement == null ? null : childElement.getAttribute("name"); - } - if(xmlElementWrapper == null) - return unwrappedElement; - - StringBuffer sbElement = new StringBuffer(); - sbElement.append(" <xs:element name=\"" + xmlElementWrapper +"\""); - String elementType = xmlElementElement.getAttribute("type"); - String elementIsRequired = this.getAttribute("required"); - String addType = elementType.contains("." + v.toString() + ".") ? elementType.substring(elementType.lastIndexOf('.')+1) : null; - - if ( elementIsRequired == null || !elementIsRequired.equals("true")||addType != null) { - sbElement.append(" minOccurs=\"0\""); - } - sbElement.append(">" + OxmFileProcessor.LINE_SEPARATOR); - sbElement.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - if(useAnnotation) { - XSDElement javaTypeElement = new XSDElement((Element)this.getParentNode(), maxOccurs); - sbElement.append(javaTypeElement.getHTMLAnnotation("class", " ")); - } - sbElement.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sbElement.append(" "); - sbElement.append(unwrappedElement); - sbElement.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sbElement.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sbElement.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - return sbElement.toString(); - } - - public String getHTMLAnnotation(String target, String indentation) { - StringBuffer sb = new StringBuffer(); - List<String> metadata = new ArrayList<>(); - if("true".equals(this.getAttribute("xml-key")) ) { - metadata.add("isKey=true"); - } - - NodeList xmlPropTags = this.getElementsByTagName("xml-properties"); - Element xmlPropElement = null; - for ( int i = 0; i < xmlPropTags.getLength(); ++i ) { - xmlPropElement = (Element)xmlPropTags.item(i); - if (! xmlPropElement.getParentNode().getAttributes().getNamedItem("name").getNodeValue().equals(this.xmlElementElement.getAttribute("name"))) - continue; - else - break; - } - if(xmlPropElement != null) { - NodeList xmlProperties = xmlPropElement.getElementsByTagName("xml-property"); - for (int i = 0; i < xmlProperties.getLength(); i++) { - Element item = (Element)xmlProperties.item(i); - String name = item.getAttribute("name"); - String value = item.getAttribute("value"); - if (name.equals("abstract")) { - name = "isAbstract"; - } else if (name.equals("extends")) { - name = "extendsFrom"; - } - metadata.add(name + "=\"" + value.replaceAll("&", "&") + "\""); - } - } - if(metadata.size() == 0) { - return ""; - } - sb.append(indentation +"<xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append( - indentation + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + - indentation + " <annox:annotate target=\""+target+"\">@org.onap.aai.annotations.Metadata(" + Joiner.on(",").join(metadata) + ")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + - indentation + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(indentation +"</xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - return sb.toString(); - } - - public String getTypePropertyYAML() { - StringBuffer sbProperties = new StringBuffer(); - sbProperties.append(" " + this.getAttribute("name") + ":\n"); - sbProperties.append(" type: "); - - if ( ("java.lang.String").equals(this.getAttribute("type"))) - sbProperties.append("string\n"); - else if ( ("java.lang.Long").equals(this.getAttribute("type"))) { - sbProperties.append("integer\n"); - sbProperties.append(" format: int64\n"); - } - else if ( ("java.lang.Integer").equals(this.getAttribute("type"))){ - sbProperties.append("integer\n"); - sbProperties.append(" format: int32\n"); - } - else if ( ("java.lang.Boolean").equals(this.getAttribute("type"))) - sbProperties.append("boolean\n"); - String attrDescription = this.getPathDescriptionProperty(); - if ( attrDescription != null && attrDescription.length() > 0 ) - sbProperties.append(" description: " + attrDescription + "\n"); - String elementAlsoRequiresProperty=this.getRequiresProperty(); - if ( StringUtils.isNotEmpty(elementAlsoRequiresProperty) ) - sbProperties.append(" also requires: " + elementAlsoRequiresProperty + "\n"); - return sbProperties.toString(); - } - - public boolean isStandardType() - { - switch ( this.getAttribute("type") ) { - case "java.lang.String": - case "java.lang.Long": - case "java.lang.Integer": - case"java.lang.Boolean": - return true; - } - return false; - } - - @Override - public String getNodeName() { - return xmlElementElement.getNodeName(); - } - - @Override - public String getNodeValue() throws DOMException { - return xmlElementElement.getNodeValue(); - } - - @Override - public void setNodeValue(String nodeValue) throws DOMException { - xmlElementElement.setNodeValue(nodeValue); - } - - @Override - public short getNodeType() { - return xmlElementElement.getNodeType(); - } - - @Override - public Node getParentNode() { - return xmlElementElement.getParentNode(); - } - - @Override - public NodeList getChildNodes() { - return xmlElementElement.getChildNodes(); - } - - @Override - public Node getFirstChild() { - return xmlElementElement.getFirstChild(); - } - - @Override - public Node getLastChild() { - return xmlElementElement.getLastChild(); - } - - @Override - public Node getPreviousSibling() { - return xmlElementElement.getPreviousSibling(); - } - - @Override - public Node getNextSibling() { - return xmlElementElement.getNextSibling(); - } - - @Override - public NamedNodeMap getAttributes() { - return xmlElementElement.getAttributes(); - } - - @Override - public Document getOwnerDocument() { - return xmlElementElement.getOwnerDocument(); - } - - @Override - public Node insertBefore(Node newChild, Node refChild) throws DOMException { - return xmlElementElement.insertBefore(newChild, refChild); - } - - @Override - public Node replaceChild(Node newChild, Node oldChild) throws DOMException { - return xmlElementElement.replaceChild(newChild, oldChild); - } - - @Override - public Node removeChild(Node oldChild) throws DOMException { - return xmlElementElement.removeChild(oldChild); - } - - @Override - public Node appendChild(Node newChild) throws DOMException { - return xmlElementElement.appendChild(newChild); - } - - @Override - public boolean hasChildNodes() { - return xmlElementElement.hasChildNodes(); - } - - @Override - public Node cloneNode(boolean deep) { - return xmlElementElement.cloneNode(deep); - } - - @Override - public void normalize() { - xmlElementElement.normalize(); - } - - @Override - public boolean isSupported(String feature, String version) { - return xmlElementElement.isSupported(feature, version); - } - - @Override - public String getNamespaceURI() { - return xmlElementElement.getNamespaceURI(); - } - - @Override - public String getPrefix() { - return xmlElementElement.getPrefix(); - } - - @Override - public void setPrefix(String prefix) throws DOMException { - xmlElementElement.setPrefix(prefix); - } - - @Override - public String getLocalName() { - - return xmlElementElement.getLocalName(); - } - - @Override - public boolean hasAttributes() { - return xmlElementElement.hasAttributes(); - } - - @Override - public String getBaseURI() { - return xmlElementElement.getBaseURI(); - } - - @Override - public short compareDocumentPosition(Node other) throws DOMException { - return xmlElementElement.compareDocumentPosition(other); - } - - @Override - public String getTextContent() throws DOMException { - return xmlElementElement.getTextContent(); - } - - @Override - public void setTextContent(String textContent) throws DOMException { - xmlElementElement.setTextContent(textContent); - } - - @Override - public boolean isSameNode(Node other) { - return xmlElementElement.isSameNode(other); - } - - @Override - public String lookupPrefix(String namespaceURI) { - return xmlElementElement.lookupPrefix(namespaceURI); - } - - @Override - public boolean isDefaultNamespace(String namespaceURI) { - return xmlElementElement.isDefaultNamespace(namespaceURI); - } - - @Override - public String lookupNamespaceURI(String prefix) { - return xmlElementElement.lookupNamespaceURI(prefix); - } - - @Override - public boolean isEqualNode(Node arg) { - return xmlElementElement.isEqualNode(arg); - } - - @Override - public Object getFeature(String feature, String version) { - return xmlElementElement.getFeature(feature, version); - } - - @Override - public Object setUserData(String key, Object data, UserDataHandler handler) { - return xmlElementElement.setUserData(key, data, handler); - } - - @Override - public Object getUserData(String key) { - return xmlElementElement.getUserData(key); - } - - @Override - public String getTagName() { - return xmlElementElement.getTagName(); - } - - @Override - public String getAttribute(String name) { - return xmlElementElement.getAttribute(name); - } - - @Override - public void setAttribute(String name, String value) throws DOMException { - xmlElementElement.setAttribute(name, value); - } - - @Override - public void removeAttribute(String name) throws DOMException { - xmlElementElement.removeAttribute(name); - } - - @Override - public Attr getAttributeNode(String name) { - return xmlElementElement.getAttributeNode(name); - } - - @Override - public Attr setAttributeNode(Attr newAttr) throws DOMException { - return xmlElementElement.setAttributeNode(newAttr); - } - - @Override - public Attr removeAttributeNode(Attr oldAttr) throws DOMException { - return xmlElementElement.removeAttributeNode(oldAttr); - } - - @Override - public NodeList getElementsByTagName(String name) { - return xmlElementElement.getElementsByTagName(name); - } - - @Override - public String getAttributeNS(String namespaceURI, String localName) throws DOMException { - return xmlElementElement.getAttributeNS(namespaceURI, localName); - } - - @Override - public void setAttributeNS(String namespaceURI, String qualifiedName, String value) throws DOMException { - xmlElementElement.setAttributeNS(namespaceURI, qualifiedName, value); - return; - } - - @Override - public void removeAttributeNS(String namespaceURI, String localName) throws DOMException { - xmlElementElement.removeAttributeNS(namespaceURI, localName); - } - - @Override - public Attr getAttributeNodeNS(String namespaceURI, String localName) throws DOMException { - return xmlElementElement.getAttributeNodeNS(namespaceURI, localName); - } - - @Override - public Attr setAttributeNodeNS(Attr newAttr) throws DOMException { - return xmlElementElement.setAttributeNodeNS(newAttr); - } - - @Override - public NodeList getElementsByTagNameNS(String namespaceURI, String localName) throws DOMException { - return xmlElementElement.getElementsByTagNameNS(namespaceURI, localName); - } - - @Override - public boolean hasAttribute(String name) { - return xmlElementElement.hasAttribute(name); - } - - @Override - public boolean hasAttributeNS(String namespaceURI, String localName) throws DOMException { - return xmlElementElement.hasAttributeNS(namespaceURI, localName); - } - - @Override - public TypeInfo getSchemaTypeInfo() { - return xmlElementElement.getSchemaTypeInfo(); - } - - @Override - public void setIdAttribute(String name, boolean isId) throws DOMException { - xmlElementElement.setIdAttribute(name, isId); - - } - - @Override - public void setIdAttributeNS(String namespaceURI, String localName, boolean isId) throws DOMException { - xmlElementElement.setIdAttributeNS(namespaceURI, localName, isId); - } - - @Override - public void setIdAttributeNode(Attr idAttr, boolean isId) throws DOMException { - xmlElementElement.setIdAttributeNode(idAttr, isId); - return; - } - - -}
\ No newline at end of file diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDJavaType.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDJavaType.java deleted file mode 100644 index 6315ddff..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/XSDJavaType.java +++ /dev/null @@ -1,64 +0,0 @@ -/** - * ============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.util.genxsd; - -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; - -public class XSDJavaType extends XSDElement { - StringBuffer pathSb; - StringBuffer definitionsSb; - StringBuffer pathParams; - - public XSDJavaType(Element javaTypeElement) { - super(javaTypeElement); - } -/* - public XSDJavaType(XSDElement javaTypeElement, StringBuffer pathSb, StringBuffer definitionsSb, - StringBuffer pathParams) { - super(javaTypeElement); - this.pathSb = pathSb; - this.definitionsSb = definitionsSb; - this.pathParams = pathParams; - } -*/ - public String getItemName() { - NodeList parentNodes = this.getElementsByTagName("java-attributes"); - if(parentNodes.getLength() == 0) - return null; - Element parentElement = (Element)parentNodes.item(0); - NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - XSDElement xmlElementElement = new XSDElement((Element)xmlElementNodes.item(0)); - return xmlElementElement.getAttribute("name"); - } - - public String getArrayType() { - NodeList parentNodes = this.getElementsByTagName("java-attributes"); - if(parentNodes.getLength() == 0) - return null; - Element parentElement = (Element)parentNodes.item(0); - NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - XSDElement xmlElementElement = new XSDElement((Element)xmlElementNodes.item(0)); - if ( xmlElementElement.hasAttribute("container-type") && xmlElementElement.getAttribute("container-type").equals("java.util.ArrayList")) { - return xmlElementElement.getAttribute("name"); - } - return null; - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/genxsd/YAMLfromOXM.java b/aai-core/src/main/java/org/onap/aai/util/genxsd/YAMLfromOXM.java deleted file mode 100644 index f807bcb1..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/genxsd/YAMLfromOXM.java +++ /dev/null @@ -1,598 +0,0 @@ -/** - * ============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.util.genxsd; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileNotFoundException; -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.HashMap; -import java.util.LinkedHashSet; -import java.util.Map; -import java.util.Set; -import java.util.SortedSet; -import java.util.StringTokenizer; -import java.util.TreeMap; -import java.util.TreeSet; -import java.util.Vector; - -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.lang3.StringUtils; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.EdgeRuleQuery; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.exceptions.AAIException; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.nodes.NodeIngestor; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; -import com.google.common.collect.Multimap; - - -public class YAMLfromOXM extends OxmFileProcessor { - private static final Logger logger = LoggerFactory.getLogger("YAMLfromOXM.class"); -// private static StringBuffer totalPathSbAccumulator = new StringBuffer(); - private static final String root = "../aai-schema/src/main/resources"; - private static final String autoGenRoot = "aai-schema/src/main/resources"; - private static final String generateTypeYAML = "yaml"; - private static final String normalStartDir = "aai-core"; - private static final String yaml_dir = (((System.getProperty("user.dir") != null) && (!System.getProperty("user.dir").contains(normalStartDir))) ? autoGenRoot : root) + "/aai_swagger_yaml"; - private StringBuilder inventoryDefSb = null; - - - private String basePath; - - public YAMLfromOXM(String basePath, SchemaVersions schemaVersions, NodeIngestor ni, EdgeIngestor ei){ - super(schemaVersions, ni,ei); - this.basePath = basePath; - } - public void setOxmVersion(File oxmFile, SchemaVersion v) { - super.setOxmVersion(oxmFile, v); - } - public void setXmlVersion(String xml, SchemaVersion v){ - super.setXmlVersion(xml, v); - } - - public void setVersion(SchemaVersion v) { - super.setVersion(v); - } - - @Override - public String getDocumentHeader() { - StringBuffer sb = new StringBuffer(); - sb.append("swagger: \"2.0\"\ninfo:\n "); - sb.append("description: |"); - if ( versionSupportsSwaggerDiff(v.toString())) { - sb.append("\n\n [Differences versus the previous schema version](" + "apidocs/aai_swagger_" + v.toString() + ".diff)"); - } - sb.append("\n\n Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.\n\n Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except in compliance with the License.\n\n You may obtain a copy of the License at\n\n (https://creativecommons.org/licenses/by/4.0/)\n\n 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.\n\n This document is best viewed with Firefox or Chrome. Nodes can be found by appending /#/definitions/node-type-to-find to the path to this document. Edge definitions can be found with the node definitions.\n version: \"" + v.toString() +"\"\n"); - sb.append(" title: Active and Available Inventory REST API\n"); - sb.append(" license:\n name: Apache 2.0\n url: http://www.apache.org/licenses/LICENSE-2.0.html\n"); - sb.append(" contact:\n name:\n url:\n email:\n"); - sb.append("host:\nbasePath: " + basePath + "/" + v.toString() + "\n"); - sb.append("schemes:\n - https\npaths:\n"); - return sb.toString(); - } - - protected void init() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException { - super.init(); - } - - @Override - public String process() throws ParserConfigurationException, SAXException, IOException, AAIException, FileNotFoundException, EdgeRuleNotFoundException { - StringBuffer sb = new StringBuffer(); - StringBuffer pathSb = new StringBuffer(); - try { - init(); - } catch(Exception e) { - logger.error( "Error initializing " + this.getClass(),e); - throw e; - } - pathSb.append(getDocumentHeader()); - StringBuffer definitionsSb = new StringBuffer(); - Element elem; - String javaTypeName; - combinedJavaTypes = new HashMap(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - elem = (Element)javaTypeNodes.item(i); - javaTypeName = elem.getAttribute("name"); - if ( !"Inventory".equals(javaTypeName ) ) { - if ( generatedJavaType.containsKey(getXmlRootElementName(javaTypeName) ) ) { - continue; - } - // will combine all matching java-types - elem = getJavaTypeElementSwagger(javaTypeName ); - } - - XSDElement javaTypeElement = new XSDElement(elem); - if ( javaTypeName == null ) { - String msg = "Invalid OXM file: <java-type> has no name attribute in " + oxmFile; - logger.error(msg); - throw new AAIException(msg); - } - namespaceFilter.add(getXmlRootElementName(javaTypeName)); - processJavaTypeElementSwagger( javaTypeName, javaTypeElement, pathSb, - definitionsSb, null, null, null, null, null, null); - } - sb.append(pathSb); - - sb.append(appendDefinitions()); - PutRelationPathSet prp = new PutRelationPathSet(v); - prp.generateRelations(ei); - return sb.toString(); - } - - public String appendDefinitions() { - return appendDefinitions(null); - } - - public String appendDefinitions(Set<String> namespaceFilter) { - //append definitions - if ( inventoryDefSb != null ) { - javaTypeDefinitions.put("inventory", inventoryDefSb.toString()); - } - StringBuffer sb = new StringBuffer("definitions:\n"); - Map<String, String> sortedJavaTypeDefinitions = new TreeMap<String, String>(javaTypeDefinitions); - for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) { -// logger.info("Key: "+entry.getKey()+"Value: "+ entry.getValue()); - if(namespaceFilter != null && entry.getKey().matches("service-capabilities")) { - for(String tally : namespaceFilter) { logger.debug("Marker: "+tally);} - } - if(namespaceFilter != null && (! namespaceFilter.contains(entry.getKey()))) { - continue; - } - logger.debug("Key: "+entry.getKey()+"Test: "+ (entry.getKey() == "relationship-dict")); - if(entry.getKey().matches("relationship-dict")) { - String jb=entry.getValue(); - logger.debug("Value: "+jb); - int ndx=jb.indexOf("related-to-property:"); - if(ndx > 0) { - jb=jb.substring(0, ndx); - jb=jb.replaceAll(" +$", ""); - } - logger.debug("Value-after: "+jb); - sb.append(jb); - continue; - } - sb.append(entry.getValue()); - } - - sb.append("patchDefinitions:\n"); - for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) { - if(namespaceFilter != null && (! namespaceFilter.contains(entry.getKey()))) { - continue; - } - String jb=entry.getValue().replaceAll("/definitions/", "/patchDefinitions/"); - int ndx=jb.indexOf("relationship-list:"); - if(ndx > 0) { - jb=jb.substring(0, ndx); - jb=jb.replaceAll(" +$", ""); - } - int ndx1=jb.indexOf("resource-version:"); - logger.debug("Key: "+entry.getKey()+" index: " + ndx1); - logger.debug("Value: "+jb); - if(ndx1 > 0) { - jb=jb.substring(0, ndx1); - jb=jb.replaceAll(" +$", ""); - } - logger.debug("Value-after: "+jb); - sb.append(jb); - } - - sb.append("getDefinitions:\n"); - for (Map.Entry<String, String> entry : sortedJavaTypeDefinitions.entrySet()) { - if(namespaceFilter != null && (! namespaceFilter.contains(entry.getKey()))) { - continue; - } - String jb=entry.getValue().replaceAll("/definitions/", "/getDefinitions/"); - sb.append(jb); - } - return sb.toString(); - } - - private String getDictionary(String resource ) { - StringBuffer dictSb = new StringBuffer(); - dictSb.append(" " + resource + ":\n"); - dictSb.append(" description: |\n"); - dictSb.append(" dictionary of " + resource + "\n" ); - dictSb.append(" type: object\n"); - dictSb.append(" properties:\n"); - dictSb.append(" " + resource + ":\n"); - dictSb.append(" type: array\n"); - dictSb.append(" items:\n"); - dictSb.append(" $ref: \"#/definitions/" + resource + "-dict\"\n"); - return dictSb.toString(); - } - - private String processJavaTypeElementSwagger( String javaTypeName, Element javaTypeElement, - StringBuffer pathSb, StringBuffer definitionsSb, String path, String tag, String opId, - String getItemName, StringBuffer pathParams, String validEdges) { - - String xmlRootElementName = getXMLRootElementName(javaTypeElement); - StringBuilder definitionsLocalSb = new StringBuilder(256); - - String useTag = null; - String useOpId = null; - logger.debug("tag="+tag); - if ( tag != null ) { - switch ( tag ) { - case "Network": - case "ServiceDesignAndCreation": - case "Business": - case "LicenseManagement": - case "CloudInfrastructure": - case "Common": - break; - default: - logger.debug("javaTypeName="+javaTypeName); - return null; - } - } - - if ( !javaTypeName.equals("Inventory") ) { - if ( javaTypeName.equals("AaiInternal")) - return null; - if ( opId == null ) - useOpId = javaTypeName; - else - useOpId = opId + javaTypeName; - if ( tag == null ) - useTag = javaTypeName; - } - path = xmlRootElementName.equals("inventory") ? "" : (path == null) ? "/" + xmlRootElementName : path + "/" + xmlRootElementName; - XSDJavaType javaType = new XSDJavaType(javaTypeElement); - if ( getItemName != null) { - if ( getItemName.equals("array") ) - return javaType.getArrayType(); - else - return javaType.getItemName(); - } - - NodeList parentNodes = javaTypeElement.getElementsByTagName("java-attributes"); - if ( parentNodes.getLength() == 0 ) { - logger.debug( "no java-attributes for java-type " + javaTypeName); - return ""; - } - - String pathDescriptionProperty = javaType.getPathDescriptionProperty(); - String container = javaType.getContainerProperty(); - Vector<String> indexedProps = javaType.getIndexedProps(); - Vector<String> containerProps = new Vector<String>(); - if(container != null) { - logger.debug("javaTypeName " + javaTypeName + " container:" + container +" indexedProps:"+indexedProps); - } - - Element parentElement = (Element)parentNodes.item(0); - NodeList xmlElementNodes = parentElement.getElementsByTagName("xml-element"); - - StringBuffer sbParameters = new StringBuffer(); - StringBuffer sbRequired = new StringBuffer(); - int requiredCnt = 0; - int propertyCnt = 0; - StringBuffer sbProperties = new StringBuffer(); - - if ( appliedPaths.containsKey(path)) - return null; - - StringTokenizer st = new StringTokenizer(path, "/"); - logger.debug("path: " + path + " st? " + st.toString()); - if ( st.countTokens() > 1 && getItemName == null ) { - logger.debug("appliedPaths: " + appliedPaths + " containsKey? " + appliedPaths.containsKey(path)); - appliedPaths.put(path, xmlRootElementName); - } - - Vector<String> addTypeV = null; - for ( int i = 0; i < xmlElementNodes.getLength(); ++i ) { - XSDElement xmlElementElement = new XSDElement((Element)xmlElementNodes.item(i)); - if ( !xmlElementElement.getParentNode().isSameNode(parentElement)) - continue; - String elementDescription=xmlElementElement.getPathDescriptionProperty(); - if(getItemName == null) { - addTypeV = xmlElementElement.getAddTypes(v.toString()); - } - if ( "true".equals(xmlElementElement.getAttribute("xml-key"))) { - path += "/{" + xmlElementElement.getAttribute("name") + "}"; - } - logger.debug("path: " + path); - logger.debug( "xmlElementElement.getAttribute(required):"+xmlElementElement.getAttribute("required") ); - - if ( ("true").equals(xmlElementElement.getAttribute("required"))) { - if ( requiredCnt == 0 ) - sbRequired.append(" required:\n"); - ++requiredCnt; - if ( addTypeV == null || addTypeV.isEmpty()) { - sbRequired.append(" - " + xmlElementElement.getAttribute("name") + "\n"); - } else { - for ( int k = 0; k < addTypeV.size(); ++k ) { - sbRequired.append(" - " + getXmlRootElementName(addTypeV.elementAt(k)) + ":\n"); - } - } - } - - if ( "true".equals(xmlElementElement.getAttribute("xml-key")) ) { - sbParameters.append(xmlElementElement.getPathParamYAML(elementDescription)); - } - if ( indexedProps != null - && indexedProps.contains(xmlElementElement.getAttribute("name") ) ) { - containerProps.add(xmlElementElement.getQueryParamYAML()); - GetOperation.addContainerProps(container, containerProps); - } - if ( xmlElementElement.isStandardType()) { - sbProperties.append(xmlElementElement.getTypePropertyYAML()); - ++propertyCnt; - } - - StringBuffer newPathParams = new StringBuffer((pathParams == null ? "" : pathParams.toString())+sbParameters.toString()); - for ( int k = 0; addTypeV != null && k < addTypeV.size(); ++k ) { - String addType = addTypeV.elementAt(k); - namespaceFilter.add(getXmlRootElementName(addType)); - logger.debug("addType: "+ addType); - - if ( opId == null || !opId.contains(addType)) { - processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, null, - newPathParams, validEdges); - } - // need item name of array - String itemName = processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, - "array", null, null ); - - if ( itemName != null ) { - if ( addType.equals("AaiInternal") ) { - logger.debug( "addType AaiInternal, skip properties"); - - } else if ( getItemName == null) { - ++propertyCnt; - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: array\n items:\n"); - sbProperties.append(" $ref: \"#/definitions/" + (itemName == "" ? "inventory-item-data" : itemName) + "\"\n"); - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - } - } else { - if ( ("java.util.ArrayList").equals(xmlElementElement.getAttribute("container-type"))) { - // need properties for getXmlRootElementName(addType) - namespaceFilter.add(getXmlRootElementName(addType)); - newPathParams = new StringBuffer((pathParams == null ? "" : pathParams.toString())+sbParameters.toString()); - processJavaTypeElementSwagger( addType, getJavaTypeElementSwagger(addType), - pathSb, definitionsSb, path, tag == null ? useTag : tag, useOpId, - null, newPathParams, validEdges ); - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: array\n items: \n"); - sbProperties.append(" $ref: \"#/definitions/" + getXmlRootElementName(addType) + "\"\n"); - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - - } else { - //Make sure certain types added to the filter don't appear - if(nodeFilter.contains(getXmlRootElementName(addType))) { - ; - } else { - sbProperties.append(" " + getXmlRootElementName(addType) + ":\n"); - sbProperties.append(" type: object\n"); - sbProperties.append(" $ref: \"#/definitions/" + getXmlRootElementName(addType) + "\"\n"); - } - } - if ( StringUtils.isNotEmpty(elementDescription) ) - sbProperties.append(" description: " + elementDescription + "\n"); - ++propertyCnt; - } - } - } - - if ( sbParameters.toString().length() > 0 ) { - if ( pathParams == null ) - pathParams = new StringBuffer(); - pathParams.append(sbParameters); - } - GetOperation get = new GetOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString()); - pathSb.append(get.toString()); - logger.debug("opId vs useOpId:"+opId+" vs "+useOpId+" PathParams="+pathParams); - // add PUT - PutOperation put = new PutOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString(), this.v); - pathSb.append(put.toString()); - // add PATCH - PatchOperation patch = new PatchOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString()); - pathSb.append(patch.toString()); - // add DELETE - DeleteOperation del = new DeleteOperation(useOpId, xmlRootElementName, tag, path, pathParams == null ? "" : pathParams.toString()); - pathSb.append(del.toString()); - if ( generatedJavaType.containsKey(xmlRootElementName) ) { - logger.debug("xmlRootElementName(1)="+xmlRootElementName); - return null; - } - - boolean processingInventoryDef = false; - String dict = null; - if ( xmlRootElementName.equals("inventory")) { - // inventory properties for each oxm to be concatenated - processingInventoryDef = true; - if ( inventoryDefSb == null ) { - inventoryDefSb = new StringBuilder(); - definitionsSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" properties:\n"); - } - } else if ( xmlRootElementName.equals("relationship")) { - definitionsSb.append(" " + "relationship-dict" + ":\n"); - definitionsLocalSb.append(" " + "relationship-dict" + ":\n"); - dict = getDictionary(xmlRootElementName); - } else { - definitionsSb.append(" " + xmlRootElementName + ":\n"); - definitionsLocalSb.append(" " + xmlRootElementName + ":\n"); - } -// Collection<EdgeDescription> edges = edgeRuleSet.getEdgeRules(xmlRootElementName ); - DeleteFootnoteSet footnotes = new DeleteFootnoteSet(xmlRootElementName); - StringBuffer sbEdge = new StringBuffer(); - LinkedHashSet<String> preventDelete = new LinkedHashSet<String>(); - String prevent=null; - String nodeCaption = new String(" ###### Related Nodes\n"); - try { - EdgeRuleQuery q = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).fromOnly().build(); - Multimap<String, EdgeRule> results = ei.getRules(q); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - sbEdge.append(nodeCaption); - nodeCaption=""; - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ logger.info(new String(new StringBuffer(" - TO ").append(i.getTo()).append(i.getDirection().toString()).append(i.getContains())));} ); - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ sbEdge.append(" - TO "+i.getTo()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("TO", xmlRootElementName)+footnote+"\n"); if(StringUtils.isNotEmpty(footnote)) footnotes.add(footnote);} ); - results.get(key).stream().filter((i) -> (i.getFrom().equals(xmlRootElementName) && (! i.isPrivateEdge() && i.getPreventDelete().equals("OUT")))).forEach((i) ->{ preventDelete.add(i.getTo().toUpperCase());} ); - } - } catch(Exception e) { - logger.debug("xmlRootElementName: "+xmlRootElementName+" from edge exception\n", e); - } - try { - EdgeRuleQuery q1 = new EdgeRuleQuery.Builder(xmlRootElementName).version(v).toOnly().build(); - Multimap<String, EdgeRule> results = ei.getRules(q1); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - sbEdge.append(nodeCaption); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ sbEdge.append(" - FROM "+i.getFrom()); EdgeDescription ed = new EdgeDescription(i); String footnote = ed.getAlsoDeleteFootnote(xmlRootElementName); sbEdge.append(ed.getRelationshipDescription("FROM", xmlRootElementName)+footnote+"\n"); if(StringUtils.isNotEmpty(footnote)) footnotes.add(footnote);} ); - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge()))).forEach((i) ->{ logger.info(new String(new StringBuffer(" - FROM ").append(i.getFrom()).append(i.getDirection().toString()).append(i.getContains())));} ); - results.get(key).stream().filter((i) -> (i.getTo().equals(xmlRootElementName) && (! i.isPrivateEdge() && i.getPreventDelete().equals("IN")))).forEach((i) ->{ preventDelete.add(i.getFrom().toUpperCase());} ); - } - } catch(Exception e) { - logger.debug("xmlRootElementName: "+xmlRootElementName+" to edge exception\n", e); - } - if(preventDelete.size() > 0) { - prevent = xmlRootElementName.toUpperCase()+" cannot be deleted if related to "+String.join(",",preventDelete); - logger.debug(prevent); - } - - if(StringUtils.isNotEmpty(prevent)) { - footnotes.add(prevent); - } - if(footnotes.footnotes.size() > 0) { - sbEdge.append(footnotes.toString()); - } - validEdges = sbEdge.toString(); - - // Handle description property. Might have a description OR valid edges OR both OR neither. - // Only put a description: tag if there is at least one. - if (StringUtils.isNotEmpty(pathDescriptionProperty) || StringUtils.isNotEmpty(validEdges) ) { - definitionsSb.append(" description: |\n"); - definitionsLocalSb.append(" description: |\n"); - - if ( pathDescriptionProperty != null ) { - definitionsSb.append(" " + pathDescriptionProperty + "\n" ); - definitionsLocalSb.append(" " + pathDescriptionProperty + "\n" ); - } - definitionsSb.append(validEdges); - definitionsLocalSb.append(validEdges); - } - - if ( requiredCnt > 0 ) { - definitionsSb.append(sbRequired); - definitionsLocalSb.append(sbRequired); - } - - if ( propertyCnt > 0 ) { - definitionsSb.append(" properties:\n"); - definitionsSb.append(sbProperties); - if ( !processingInventoryDef) { - definitionsLocalSb.append(" properties:\n"); - } - definitionsLocalSb.append(sbProperties); - } - try { - namespaceFilter.add(xmlRootElementName); - if ( xmlRootElementName.equals("inventory") ) { - //will add to javaTypeDefinitions at end - inventoryDefSb.append(definitionsLocalSb.toString()); - } else if ( xmlRootElementName.equals("relationship") ){ - javaTypeDefinitions.put(xmlRootElementName, dict); - javaTypeDefinitions.put(xmlRootElementName+ "-dict", definitionsLocalSb.toString()); - } else { - javaTypeDefinitions.put(xmlRootElementName, definitionsLocalSb.toString()); - } - } catch (Exception e) { - e.printStackTrace(); - logger.error("Exception adding in javaTypeDefinitions",e); - } - if ( xmlRootElementName.equals("inventory") ) { - logger.trace("skip xmlRootElementName(2)="+xmlRootElementName); - return null; - } - generatedJavaType.put(xmlRootElementName, null); -/* - if( validTag(javaTypeName) && javaTypeName == useTag && tag == null) { - String nameSpaceResult = getDocumentHeader()+pathSb.toString()+appendDefinitions(namespaceFilter); - writeYAMLfile(javaTypeName, nameSpaceResult); - totalPathSbAccumulator.append(pathSb); - pathSb.delete(0, pathSb.length()); - namespaceFilter.clear(); - } -*/ - logger.trace("xmlRootElementName(2)="+xmlRootElementName); - return null; - } - - private void writeYAMLfile(String outfileName, String fileContent) { - outfileName = (StringUtils.isEmpty(outfileName)) ? "aai_swagger" : outfileName; - outfileName = (outfileName.lastIndexOf(File.separator) == -1) ? yaml_dir + File.separator +outfileName+"_" + v.toString() + "." + generateTypeYAML : outfileName; - File outfile = new File(outfileName); - File parentDir = outfile.getParentFile(); - if(parentDir != null && ! parentDir.exists()) - parentDir.mkdirs(); - try { - outfile.createNewFile(); - } catch (IOException e) { - logger.error( "Exception creating output file " + outfileName); - e.printStackTrace(); - } - Charset charset = Charset.forName("UTF-8"); - Path path = Paths.get(outfileName); - try(BufferedWriter bw = Files.newBufferedWriter(path, charset)){ - bw.write(fileContent); - } catch ( IOException e) { - logger.error( "Exception writing output file " + outfileName); - e.printStackTrace(); - } - } - - public boolean validTag(String tag) { - if(tag != null) { - switch ( tag ) { - case "Network": -// case "Search": -// case "Actions": - case "ServiceDesignAndCreation": - case "Business": - case "LicenseManagement": - case "CloudInfrastructure": - case "Common": - return true; - } - } - return false; - } - -} diff --git a/aai-core/src/main/java/org/onap/aai/util/swagger/Api.java b/aai-core/src/main/java/org/onap/aai/util/swagger/Api.java deleted file mode 100644 index cc422d95..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/swagger/Api.java +++ /dev/null @@ -1,318 +0,0 @@ -/** - * ============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.util.swagger; - -import java.util.List; -import java.util.Map; - -public class Api { - - private String path; - - private List<HttpVerb> httpMethods; - - private String tag; - - public List<HttpVerb> getHttpMethods() { - return httpMethods; - } - - public void setHttpMethods(List<HttpVerb> httpMethods) { - this.httpMethods = httpMethods; - } - - public String getTag(){ - - if(this.tag != null){ - return this.tag; - } - - if(this.httpMethods != null){ - if(this.httpMethods.size() != 0){ - if(this.httpMethods.get(0).getTags() != null){ - if(this.httpMethods.get(0).getTags().size() != 0){ - this.tag = this.httpMethods.get(0).getTags().get(0); - } - } - } - } - - if(this.tag == null){ - this.tag = ""; - } - - return this.tag; - } - - @Override - public String toString() { - return "Api{" + - "path='" + path + '\'' + - ", httpMethods=" + httpMethods + - '}'; - } - - public void setPath(String path) { - this.path = path; - } - - public String getPath() { - return this.path; - } - - public String getOperation(){ - - if(this.path != null){ - return this.path.replaceAll("[^a-zA-Z0-9\\-]", "-") + "-"; - } - - return ""; - } - - public static class HttpVerb { - - private List<String> tags; - - private String type; - - private String summary; - - private String operationId; - - private List<String> consumes; - - private boolean consumerEnabled; - - private List<String> produces; - - private List<Response> responses; - - private List<Map<String, Object>> parameters; - - private Map<String, Object> bodyParameters; - - private boolean bodyParametersEnabled; - - private boolean parametersEnabled; - - private String schemaLink; - - private String schemaType; - - private boolean hasReturnSchema; - - private String returnSchemaLink; - - private String returnSchemaObject; - - public void setConsumerEnabled(boolean consumerEnabled){ - this.consumerEnabled = consumerEnabled; - } - - public boolean isConsumerEnabled() { - return consumerEnabled; - } - - - public List<String> getTags() { - return tags; - } - - public void setTags(List<String> tags) { - this.tags = tags; - } - - public String getType() { - return type; - } - - public void setType(String type) { - this.type = type; - } - - public String getSummary() { - return summary; - } - - public void setSummary(String summary) { - this.summary = summary; - } - - public String getOperationId() { - return operationId; - } - - public void setOperationId(String operationId) { - this.operationId = operationId; - } - - public List<String> getConsumes() { - return consumes; - } - - public void setConsumes(List<String> consumes) { - this.consumes = consumes; - } - - public List<String> getProduces() { - return produces; - } - - public void setProduces(List<String> produces) { - this.produces = produces; - } - - public List<Response> getResponses() { - return responses; - } - - public void setResponses(List<Response> responses) { - this.responses = responses; - } - - public List<Map<String, Object>> getParameters() { - return parameters; - } - - public void setParameters(List<Map<String, Object>> parameters) { - this.parameters = parameters; - } - - @Override - public String toString() { - return "HttpVerb{" + - "tags=" + tags + - ", type='" + type + '\'' + - ", summary='" + summary + '\'' + - ", operationId='" + operationId + '\'' + - ", consumes=" + consumes + - ", produces=" + produces + - ", responses=" + responses + - ", parameters=" + parameters + - '}'; - } - - public void setParametersEnabled(boolean b) { - this.parametersEnabled = b; - } - - public boolean isParametersEnabled() { - return parametersEnabled; - } - - public boolean isBodyParametersEnabled() { - return bodyParametersEnabled; - } - public boolean isOpNotPatch() { - return type.equalsIgnoreCase("patch") ? false : true; - } - - public void setBodyParametersEnabled(boolean bodyParametersEnabled) { - this.bodyParametersEnabled = bodyParametersEnabled; - } - - public Map<String, Object> getBodyParameters() { - return bodyParameters; - } - - public void setBodyParameters(Map<String, Object> bodyParameters) { - this.bodyParameters = bodyParameters; - } - - public String getSchemaLink() { - return schemaLink; - } - - public void setSchemaLink(String schemaLink) { - this.schemaLink = schemaLink; - } - - public String getSchemaType() { - return schemaType; - } - - public void setSchemaType(String schemaType) { - this.schemaType = schemaType; - } - - public boolean isHasReturnSchema() { - return hasReturnSchema; - } - - public void setHasReturnSchema(boolean hasReturnSchema) { - this.hasReturnSchema = hasReturnSchema; - } - - public String getReturnSchemaLink() { - return returnSchemaLink; - } - - public void setReturnSchemaLink(String returnSchemaLink) { - this.returnSchemaLink = returnSchemaLink; - } - - public String getReturnSchemaObject() { - return returnSchemaObject; - } - - public void setReturnSchemaObject(String returnSchemaObject) { - this.returnSchemaObject = returnSchemaObject; - } - - public static class Response { - - private String responseCode; - - private String description; - - private String version; - - public String getResponseCode() { - return responseCode; - } - - public void setResponseCode(String responseCode) { - this.responseCode = responseCode; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public String toString() { - return "Response{" + - "responseCode='" + responseCode + '\'' + - ", description='" + description + '\'' + - '}'; - } - - public void setVersion(String version) { - this.version = version; - } - } - - } - -} diff --git a/aai-core/src/main/java/org/onap/aai/util/swagger/Definition.java b/aai-core/src/main/java/org/onap/aai/util/swagger/Definition.java deleted file mode 100644 index 5e8a5ec6..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/swagger/Definition.java +++ /dev/null @@ -1,198 +0,0 @@ -/** - * ============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.util.swagger; - -import java.util.List; - -public class Definition { - - private String definitionName; - - private String definitionDescription; - - private List<Property> propertyList; - - private List<Property> schemaPropertyList; - - private List<Property> regularPropertyList; - - private boolean hasDescription; - - public String getDefinitionName() { - return definitionName; - } - - public void setDefinitionName(String definitionName) { - this.definitionName = definitionName; - } - - public List<Property> getPropertyList() { - return propertyList; - } - - public void setPropertyList(List<Property> propertyList) { - this.propertyList = propertyList; - } - - public String getDefinitionDescription() { - return definitionDescription; - } - - public void setDefinitionDescription(String definitionDescription) { - this.definitionDescription = definitionDescription; - } - - @Override - public String toString() { - return "Definition{" + - "definitionName='" + definitionName + '\'' + - ", definitionDescription='" + definitionDescription + '\'' + - ", propertyList=" + propertyList + - '}'; - } - - public boolean isHasDescription() { - return hasDescription; - } - - public void setHasDescription(boolean hasDescription) { - this.hasDescription = hasDescription; - } - - public List<Property> getSchemaPropertyList() { - return schemaPropertyList; - } - - public void setSchemaPropertyList(List<Property> schemaPropertyList) { - this.schemaPropertyList = schemaPropertyList; - } - - public List<Property> getRegularPropertyList() { - return regularPropertyList; - } - - public void setRegularPropertyList(List<Property> regularPropertyList) { - this.regularPropertyList = regularPropertyList; - } - - public static class Property { - - private String propertyName; - - private String propertyDescription; - - private boolean hasPropertyDescription; - - private String propertyType; - - private boolean hasType; - - private String propertyReference; - - private String propertyReferenceObjectName; - - private boolean isRequired; - - private boolean hasPropertyReference; - - public Property(){} - - public String getPropertyName() { - return propertyName; - } - - public void setPropertyName(String propertyName) { - this.propertyName = propertyName; - } - - public String getPropertyType() { - return propertyType; - } - - public void setPropertyType(String propertyType) { - this.propertyType = propertyType; - } - - public String getPropertyReference() { - return propertyReference; - } - - public void setPropertyReference(String propertyReference) { - this.propertyReference = propertyReference; - } - - @Override - public String toString() { - return "Property{" + - "propertyName='" + propertyName + '\'' + - ", propertyType='" + propertyType + '\'' + - ", propertyReference='" + propertyReference + '\'' + - '}'; - } - - public boolean isHasType() { - return hasType; - } - - public void setHasType(boolean hasType) { - this.hasType = hasType; - } - - public boolean isRequired() { - return isRequired; - } - - public void setRequired(boolean required) { - isRequired = required; - } - - public boolean isHasPropertyReference() { - return hasPropertyReference; - } - - public void setHasPropertyReference(boolean hasPropertyReference) { - this.hasPropertyReference = hasPropertyReference; - } - - public String getPropertyReferenceObjectName() { - return propertyReferenceObjectName; - } - - public void setPropertyReferenceObjectName(String propertyReferenceObjectName) { - this.propertyReferenceObjectName = propertyReferenceObjectName; - } - - public String getPropertyDescription() { - return propertyDescription; - } - - public void setPropertyDescription(String propertyDescription) { - this.propertyDescription = propertyDescription; - } - - public boolean isHasPropertyDescription() { - return hasPropertyDescription; - } - - public void setHasPropertyDescription(boolean hasPropertyDescription) { - this.hasPropertyDescription = hasPropertyDescription; - } - } -} diff --git a/aai-core/src/main/java/org/onap/aai/util/swagger/GenerateSwagger.java b/aai-core/src/main/java/org/onap/aai/util/swagger/GenerateSwagger.java deleted file mode 100644 index 21e264a1..00000000 --- a/aai-core/src/main/java/org/onap/aai/util/swagger/GenerateSwagger.java +++ /dev/null @@ -1,488 +0,0 @@ -/** - * ============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.util.swagger; - -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.Yaml; -import com.fasterxml.jackson.dataformat.yaml.snakeyaml.constructor.SafeConstructor; -import freemarker.template.Configuration; -import freemarker.template.Template; -import freemarker.template.TemplateException; - -import org.onap.aai.setup.SchemaVersions; - -import java.io.*; -import java.util.*; -import java.util.stream.Collectors; - -public class GenerateSwagger { - - public static final String LINE_SEPARATOR = System.getProperty("line.separator"); - public static final String DEFAULT_WIKI = ""; - - public static final String DEFAULT_SCHEMA_DIR = "../aai-schema"; - //if the program is run from aai-common, use this directory as default" - public static final String ALT_SCHEMA_DIR = "aai-schema"; - //used to check to see if program is run from aai-core - public static final String DEFAULT_RUN_DIR = "aai-core"; - - public static SchemaVersions schemaVersions; - - public SchemaVersions getSchemaVersions() { - return schemaVersions; - } - - - - public static void main(String[] args) throws IOException, TemplateException { - - - - - // SchemaVersions schemaVersions = SpringContextAware.getBean(SchemaVersions.class); - String CURRENT_VERSION = schemaVersions.getDefaultVersion().toString(); - String schemaDir = System.getProperty("aai.schema.dir"); - String versionToGenerate = System.getProperty("aai.generate.version"); - String wikiLink = System.getProperty("aai.wiki.link"); - String release = System.getProperty("aai.release", "onap"); - - if(schemaDir == null){ - if(System.getProperty("user.dir") != null && !System.getProperty("user.dir").contains(DEFAULT_RUN_DIR)) { - System.out.println("Warning: Schema directory is not set so using default schema dir: " + ALT_SCHEMA_DIR); - schemaDir = ALT_SCHEMA_DIR; - } - else { - System.out.println("Warning: Schema directory is not set so using default schema dir: " + DEFAULT_SCHEMA_DIR); - schemaDir = DEFAULT_SCHEMA_DIR; - } - } - - if(versionToGenerate == null){ - System.out.println("Warning: Version to generate is not set so using default versionToGenerate " + CURRENT_VERSION); - versionToGenerate = CURRENT_VERSION; - } - - if(wikiLink == null){ - System.out.println("Warning: aai.wiki.link property is not set so using default"); - wikiLink = DEFAULT_WIKI; - } - - String yamlFile = schemaDir + "/src/main/resources/" + release + "/aai_swagger_yaml/aai_swagger_" + versionToGenerate + ".yaml"; - File swaggerYamlFile = new File(yamlFile); - - if(!swaggerYamlFile.exists()){ - System.err.println("Unable to find the swagger yaml file: " + swaggerYamlFile); - System.exit(1); - } - - Yaml yaml = new Yaml(new SafeConstructor()); - Map<String, Object> swaggerMap = null; - - try (BufferedReader reader = new BufferedReader(new FileReader(swaggerYamlFile))){ - swaggerMap = (Map<String, Object>) yaml.load(reader); - } catch(Exception ex){ - ex.printStackTrace(); - } - - if(null == swaggerMap) { - throw new IOException(); - } - - Map<String, Object> map = (Map<String, Object>) swaggerMap.get("paths"); - Map<String, Object> schemaDefinitionmap = (Map<String, Object>) swaggerMap.get("definitions"); - Map<String, Object> infoMap = (Map<String, Object>) swaggerMap.get("info"); - Map<String, List<Api>> tagMap = new LinkedHashMap<>(); - - List<Api> apis = convertToApi(map); - apis.forEach((api) -> { - if(!tagMap.containsKey(api.getTag())){ - List<Api> newApis = new ArrayList<>(); - newApis.add(api); - tagMap.put(api.getTag(), newApis); - } else { - tagMap.get(api.getTag()).add(api); - } - }); - - Map<String, List<Api>> sortedTagMap = new TreeMap<>(tagMap); - sortedTagMap.forEach((key, value) -> { - value.sort(Comparator.comparing(Api::getPath)); - }); - - Map<String, Object> resultMap = new HashMap<>(); - - List<Definition> definitionList = convertToDefinition(schemaDefinitionmap); - - definitionList = definitionList - .stream().sorted(Comparator.comparing(Definition::getDefinitionName)).collect(Collectors.toList()); - - resultMap.put("aaiApis", tagMap); - resultMap.put("sortedAaiApis", sortedTagMap); - resultMap.put("wikiLink", wikiLink); - resultMap.put("definitions", definitionList); - resultMap.put("version", versionToGenerate); - if (infoMap.containsKey("description")) { - String infoDescription = infoMap.get("description").toString(); - - infoDescription = Arrays.stream(infoDescription.split("\n")) - .map(line -> { - line = line.trim(); - String hyperLink = ""; - if(line.trim().contains("Differences versus")) { - return String.format(""); - } - if(line.trim().contains("https://")){ - int startIndex = line.indexOf("https://"); - int endIndex = line.lastIndexOf("/"); - hyperLink = line.substring(startIndex, endIndex); - return String.format("<a href=\"%s\">%s</a><br/>", hyperLink, line); - } - return String.format("%s<br/>", line); - }) - - .collect(Collectors.joining(LINE_SEPARATOR)); - - resultMap.put("description", infoDescription); - } - - Configuration configuration = new Configuration(); - configuration.setClassForTemplateLoading(Api.class, "/"); - String resourcePath = "src/main/resources"; - if(System.getProperty("user.dir") != null && !System.getProperty("user.dir").contains(DEFAULT_RUN_DIR)) { - configuration.setDirectoryForTemplateLoading(new File(DEFAULT_RUN_DIR + "/" + resourcePath)); - } - else { - configuration.setDirectoryForTemplateLoading(new File(resourcePath)); - } - Template template = configuration.getTemplate("swagger.html.ftl"); - - String outputDirStr = schemaDir + "/src/main/resources/" + release + "/aai_swagger_html"; - - File outputDir = new File(outputDirStr); - - if(!outputDir.exists()){ - boolean resp = outputDir.mkdir(); - if(!resp){ - System.err.println("Unable to create the directory: " + outputDirStr); - System.exit(1); - } - } else if(outputDir.isFile()){ - System.err.println("Unable to create the directory: " + outputDirStr + " since a filename with that string exists"); - System.exit(1); - } - - Writer file = new FileWriter(new File(outputDirStr + "/aai_swagger_" + versionToGenerate + ".html")); - template.process(resultMap, file); - } - - public static List<Api> convertToApi(Map<String, Object> pathMap){ - - if(pathMap == null) - throw new IllegalArgumentException(); - - List<Api> apis = new ArrayList<>(); - - pathMap.forEach( (pathKey, pathValue) -> { - - Api api = new Api(); - Map<String, Object> httpVerbMap = (Map<String, Object>) pathValue; - List<Api.HttpVerb> httpVerbs = new ArrayList<>(); - - api.setPath(pathKey); - - httpVerbMap.forEach((httpVerbKey, httpVerbValue) -> { - - Api.HttpVerb httpVerb = new Api.HttpVerb(); - - Map<String, Object> httpVerbValueMap = (Map<String,Object>)httpVerbValue; - - httpVerb.setType(httpVerbKey); - - if(httpVerbValueMap.containsKey("tags")){ - httpVerb.setTags((List<String>)httpVerbValueMap.get("tags")); - } - - if(httpVerbValueMap.containsKey("summary")){ - httpVerb.setSummary((String)httpVerbValueMap.get("summary")); - } - - if(httpVerbValueMap.containsKey("operationId")){ - httpVerb.setOperationId((String)httpVerbValueMap.get("operationId")); - } - - if(httpVerbValueMap.containsKey("consumes")){ - httpVerb.setConsumes((List<String>)httpVerbValueMap.get("consumes")); - if(httpVerb.getConsumes() != null){ - httpVerb.setConsumerEnabled(true); - } - } - - if(httpVerbValueMap.containsKey("produces")){ - httpVerb.setProduces((List<String>)httpVerbValueMap.get("produces")); - } - - if(httpVerbValueMap.containsKey("parameters")){ - List<Map<String, Object>> parameters = (List<Map<String, Object>>) httpVerbValueMap.get("parameters"); - List<Map<String, Object>> requestParameters = parameters - .stream() - .filter((parameter) -> !parameter.get("name").equals("body")) - .collect(Collectors.toList()); - httpVerb.setParameters(requestParameters); - if(httpVerb.getParameters() != null){ - httpVerb.setParametersEnabled(true); - } - - List<Map<String, Object>> requestBodyList = parameters - .stream() - .filter((parameter) -> parameter.get("name").equals("body")) - .collect(Collectors.toList()); - - Map<String, Object> requestBody = null; - - if(requestBodyList != null && requestBodyList.size() == 1){ - requestBody = requestBodyList.get(0); - for(String key : requestBody.keySet()) { - //Filter out all the relationship links that appear in the YAML - if(key.equals("description")) { - String reqBody=(String)requestBody.get(key); - if(reqBody.replaceAll("\\[.*.json\\)", "") != reqBody) { - requestBody.put(key, reqBody.replaceAll("\\[.*.json\\)", "")); - } - } - //Filter out all the patchDefinition links that appear in the YAML - if(key.equals("schema")) { - LinkedHashMap<String,String> reqBody = (LinkedHashMap<String,String>)requestBody.get(key); - String schema=reqBody.get("$ref"); - String schemaNopatch = schema.replace("patchDefinitions", "definitions"); - - if(! schema.equals(schemaNopatch)) { - reqBody.put("$ref", schemaNopatch); - requestBody.put(key, reqBody); - } - } - } - httpVerb.setBodyParametersEnabled(true); - httpVerb.setBodyParameters(requestBody); - - if(requestBody != null && requestBody.containsKey("schema")){ - Map<String, Object> schemaMap = (Map<String, Object>)requestBody.get("schema"); - if(schemaMap != null && schemaMap.containsKey("$ref")){ - String schemaLink = schemaMap.get("$ref").toString(); - httpVerb.setSchemaLink(schemaLink); - int retCode = schemaLink.lastIndexOf('/'); - if(retCode != -1 && retCode != schemaLink.length()){ - httpVerb.setSchemaType(schemaLink.substring(retCode)); - } - } - } - } - } - - if(httpVerbValueMap.containsKey("responses")){ - - List<Api.HttpVerb.Response> responses = new ArrayList<Api.HttpVerb.Response>(); - - Map<String, Object> responsesMap = (Map<String, Object>) httpVerbValueMap.get("responses"); - - responsesMap - .entrySet() - .stream() - .filter((res) -> !"default".equalsIgnoreCase(res.getKey())) - .forEach((responseMap) -> { - - Map<String, Object> responseValueMap = (Map<String, Object>)responseMap.getValue(); - - Api.HttpVerb.Response response = new Api.HttpVerb.Response(); - - response.setResponseCode(responseMap.getKey()); - response.setDescription((String) responseValueMap.get("description")); - response.setVersion((String) responseValueMap.get("version")); - - if(responseValueMap != null && responseValueMap.containsKey("schema")){ - Map<String, Object> schemaMap = (Map<String, Object>)responseValueMap.get("schema"); - if(schemaMap != null && schemaMap.containsKey("$ref")){ - String schemaLink = schemaMap.get("$ref").toString(); - httpVerb.setHasReturnSchema(true); - //Filter out all the getDefinition links that appear in the YAML - httpVerb.setReturnSchemaLink(schemaLink.replace("getDefinitions", "definitions")); - int retCode = schemaLink.lastIndexOf('/'); - if(retCode != -1 && retCode != schemaLink.length()){ - httpVerb.setReturnSchemaObject(schemaLink.substring(retCode)); - } - } - } - - responses.add(response); - } - ); - - httpVerb.setResponses(responses); - } - - httpVerbs.add(httpVerb); - }); - - api.setHttpMethods(httpVerbs); - apis.add(api); - }); - - return apis; - } - - public static List<Definition> convertToDefinition(Map<String, Object> definitionMap) { - - if(definitionMap == null) - throw new IllegalArgumentException(); - - List<Definition> defintionsList = new ArrayList<>(); - - definitionMap - .entrySet() - .forEach((entry) -> { - - Definition definition = new Definition(); - String key = entry.getKey(); - Map<String, Object> valueMap = (Map<String, Object>) entry.getValue(); - - definition.setDefinitionName(key); - - if(valueMap.containsKey("description")){ - String description = valueMap.get("description").toString(); - description = formatDescription(description); - definition.setDefinitionDescription(description); - definition.setHasDescription(true); - } - - List<Definition.Property> definitionProperties = new ArrayList<>(); - - List<String> requiredProperties = (valueMap.get("required") == null) ? new ArrayList<>() : (List<String>) valueMap.get("required"); - - Set<String> requiredPropsSet = requiredProperties.stream().collect(Collectors.toSet()); - - valueMap - .entrySet() - .stream() - .filter( (e) -> "properties".equals(e.getKey())) - .forEach((propertyEntries) -> { - Map<String, Object> propertyRealEntries = (Map<String, Object>) propertyEntries.getValue(); - propertyRealEntries - .entrySet() - .forEach((propertyEntry) -> { - Definition.Property definitionProperty = new Definition.Property(); - String propertyKey = propertyEntry.getKey(); - if(requiredPropsSet.contains(propertyKey)){ - definitionProperty.setRequired(true); - } - definitionProperty.setPropertyName(propertyKey); - Map<String, Object> definitionPropertyMap = (Map<String, Object>) propertyEntry.getValue(); - - if(definitionPropertyMap.containsKey("description")){ - definitionProperty.setPropertyDescription(definitionPropertyMap.get("description").toString()); - definitionProperty.setHasPropertyDescription(true); - } - if(definitionPropertyMap.containsKey("type")){ - String type = definitionPropertyMap.get("type").toString(); - definitionProperty.setPropertyType(type); - definitionProperty.setHasType(true); - if ("array".equals(type)) { - definitionProperty.setPropertyType("object[]"); - if(!definitionPropertyMap.containsKey("items")){ - throw new RuntimeException("Unable to find the property items even though the type is array for " + propertyEntry.getKey()); - } else { - Map<String, Object> itemMap = (Map<String, Object>) definitionPropertyMap.get("items"); - if(itemMap.containsKey("$ref")){ - definitionProperty.setHasPropertyReference(true); - String refItem = itemMap.get("$ref").toString(); - int retCode = refItem.lastIndexOf('/'); - if(retCode != -1 && retCode != refItem.length()){ - definitionProperty.setPropertyReferenceObjectName(refItem.substring(retCode + 1)); - } - definitionProperty.setPropertyReference(refItem); - } - } - } else { - if(definitionPropertyMap.containsKey("$ref")){ - definitionProperty.setHasPropertyReference(true); - String refItem = definitionPropertyMap.get("$ref").toString(); - int retCode = refItem.lastIndexOf('/'); - if(retCode != -1 && retCode != refItem.length()){ - definitionProperty.setPropertyReferenceObjectName(refItem.substring(retCode + 1)); - } - definitionProperty.setPropertyReference(refItem); - } - } - } - definitionProperties.add(definitionProperty); - }); - }); - - definition.setPropertyList(definitionProperties); - - List<Definition.Property> schemaProperties = definitionProperties. - stream() - .filter((o) -> o.isHasPropertyReference()) - .collect(Collectors.toList()); - - List<Definition.Property> regularProperties = definitionProperties. - stream() - .filter((o) -> !o.isHasPropertyReference()) - .collect(Collectors.toList()); - - definition.setRegularPropertyList(regularProperties); - definition.setSchemaPropertyList(schemaProperties); - - defintionsList.add(definition); - }); - return defintionsList; - } - - public static String formatDescription(String description){ - - description = Arrays.stream(description.split("\n")) - .map((line) -> { - line = line.trim(); - if(line.contains("######")){ - line = line.replaceAll("#", ""); - line = line.trim(); - String headerId = line.toLowerCase().replaceAll("\\s", "-"); - - if(line.contains("Related Nodes")){ - return String.format("<h6 id=\"%s\">%s</h6>%s<ul>", headerId, line, LINE_SEPARATOR); - } else { - return String.format("<h6 id=\"%s\">%s</h6>", headerId, line); - } - } else if(line.startsWith("-")){ - line = line.replaceFirst("-", ""); - line = line.trim(); - return String.format("<li>%s</li>", line); - } else { - return String.format("<p>%s</p>", line); - } - }) - .collect(Collectors.joining(LINE_SEPARATOR)); - - if(description.contains("<ul>")){ - description = description + "</ul>"; - } - - return description; - } - -} - diff --git a/aai-core/src/main/resources/swagger.html.ftl b/aai-core/src/main/resources/swagger.html.ftl deleted file mode 100644 index 1a2827f8..00000000 --- a/aai-core/src/main/resources/swagger.html.ftl +++ /dev/null @@ -1,241 +0,0 @@ -<#-- - - ============LICENSE_START======================================================= - org.onap.aai - ================================================================================ - Copyright © 2017-18 AT&T Intellectual Property. All rights reserved. - Copyright © 2018 Huawei Technologies (Australia) Pty Ltd. 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========================================================= - - ECOMP is a trademark and service mark of AT&T Intellectual Property. - ---> -<!DOCTYPE html> -<html> -<head> -<style>/*! - * Bootstrap v3.3.6 (http://getbootstrap.com) - * Copyright 2011-2015 Twitter, Inc. - * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) - *//*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace,monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:.35em .625em .75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}/*! Source: https://github.com/h5bp/html5-boilerplate/blob/master/src/css/main.css */@media print{*,*:before,*:after{background:transparent !important;color:#000 !important;box-shadow:none !important;text-shadow:none !important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}a[href^="#"]:after,a[href^="javascript:"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100% !important}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000 !important}.label{border:1px solid #000}.table{border-collapse:collapse !important}.table td,.table th{background-color:#fff !important}.table-bordered th,.table-bordered td{border:1px solid #ddd !important}}@font-face{p EdgeRules.ftl - ont-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff2') format('woff2'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons_halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';font-style:normal;font-weight:normal;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.glyphicon-asterisk:before{content:"\002a"}.glyphicon-plus:before{content:"\002b"}.glyphicon-euro:before,.glyphicon-eur:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-lock:before{content:"\e033"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-bookmark:before{content:"\e044"}.glyphicon-print:before{content:"\e045"}.glyphicon-camera:before{content:"\e046"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-fire:before{content:"\e104"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-calendar:before{content:"\e109"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-bell:before{content:"\e123"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-wrench:before{content:"\e136"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-briefcase:before{content:"\e139"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-paperclip:before{content:"\e142"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-pushpin:before{content:"\e146"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-cd:before{content:"\e201"}.glyphicon-save-file:before{content:"\e202"}.glyphicon-open-file:before{content:"\e203"}.glyphicon-level-up:before{content:"\e204"}.glyphicon-copy:before{content:"\e205"}.glyphicon-paste:before{content:"\e206"}.glyphicon-alert:before{content:"\e209"}.glyphicon-equalizer:before{content:"\e210"}.glyphicon-king:before{content:"\e211"}.glyphicon-queen:before{content:"\e212"}.glyphicon-pawn:before{content:"\e213"}.glyphicon-bishop:before{content:"\e214"}.glyphicon-knight:before{content:"\e215"}.glyphicon-baby-formula:before{content:"\e216"}.glyphicon-tent:before{content:"\26fa"}.glyphicon-blackboard:before{content:"\e218"}.glyphicon-bed:before{content:"\e219"}.glyphicon-apple:before{content:"\f8ff"}.glyphicon-erase:before{content:"\e221"}.glyphicon-hourglass:before{content:"\231b"}.glyphicon-lamp:before{content:"\e223"}.glyphicon-duplicate:before{content:"\e224"}.glyphicon-piggy-bank:before{content:"\e225"}.glyphicon-scissors:before{content:"\e226"}.glyphicon-bitcoin:before{content:"\e227"}.glyphicon-btc:before{content:"\e227"}.glyphicon-xbt:before{content:"\e227"}.glyphicon-yen:before{content:"\00a5"}.glyphicon-jpy:before{content:"\00a5"}.glyphicon-ruble:before{content:"\20bd"}.glyphicon-rub:before{content:"\20bd"}.glyphicon-scale:before{content:"\e230"}.glyphicon-ice-lolly:before{content:"\e231"}.glyphicon-ice-lolly-tasted:before{content:"\e232"}.glyphicon-education:before{content:"\e233"}.glyphicon-option-horizontal:before{content:"\e234"}.glyphicon-option-vertical:before{content:"\e235"}.glyphicon-menu-hamburger:before{content:"\e236"}.glyphicon-modal-window:before{content:"\e237"}.glyphicon-oil:before{content:"\e238"}.glyphicon-grain:before{content:"\e239"}.glyphicon-sunglasses:before{content:"\e240"}.glyphicon-text-size:before{content:"\e241"}.glyphicon-text-color:before{content:"\e242"}.glyphicon-text-background:before{content:"\e243"}.glyphicon-object-align-top:before{content:"\e244"}.glyphicon-object-align-bottom:before{content:"\e245"}.glyphicon-object-align-horizontal:before{content:"\e246"}.glyphicon-object-align-left:before{content:"\e247"}.glyphicon-object-align-vertical:before{content:"\e248"}.glyphicon-object-align-right:before{content:"\e249"}.glyphicon-triangle-right:before{content:"\e250"}.glyphicon-triangle-left:before{content:"\e251"}.glyphicon-triangle-bottom:before{content:"\e252"}.glyphicon-triangle-top:before{content:"\e253"}.glyphicon-console:before{content:"\e254"}.glyphicon-superscript:before{content:"\e255"}.glyphicon-subscript:before{content:"\e256"}.glyphicon-menu-left:before{content:"\e257"}.glyphicon-menu-right:before{content:"\e258"}.glyphicon-menu-down:before{content:"\e259"}.glyphicon-menu-up:before{content:"\e260"}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:10px;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.42857143;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}a{color:#337ab7;text-decoration:none}a:hover,a:focus{color:#23527c;text-decoration:underline}a:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}figure{margin:0}img{vertical-align:middle}.img-responsive,.thumbnail>img,.thumbnail a>img,.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;max-width:100%;height:auto}.img-rounded{border-radius:6px}.img-thumbnail{padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out;display:inline-block;max-width:100%;height:auto}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}[role="button"]{cursor:pointer}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:inherit;font-weight:500;line-height:1.1;color:inherit}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 .small,h2 .small,h3 .small,h4 .small,h5 .small,h6 .small,.h1 .small,.h2 .small,.h3 .small,.h4 .small,.h5 .small,.h6 .small{font-weight:normal;line-height:1;color:#777}h1,.h1,h2,.h2,h3,.h3{margin-top:20px;margin-bottom:10px}h1 small,.h1 small,h2 small,.h2 small,h3 small,.h3 small,h1 .small,.h1 .small,h2 .small,.h2 .small,h3 .small,.h3 .small{font-size:65%}h4,.h4,h5,.h5,h6,.h6{margin-top:10px;margin-bottom:10px}h4 small,.h4 small,h5 small,.h5 small,h6 small,.h6 small,h4 .small,.h4 .small,h5 .small,.h5 .small,h6 .small,.h6 .small{font-size:75%}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16px;font-weight:300;line-height:1.4}@media (min-width:768px){.lead{font-size:21px}}small,.small{font-size:85%}mark,.mark{background-color:#fcf8e3;padding:.2em}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.text-justify{text-align:justify}.text-nowrap{white-space:nowrap}.text-lowercase{text-transform:lowercase}.text-uppercase{text-transform:uppercase}.text-capitalize{text-transform:capitalize}.text-muted{color:#777}.text-primary{color:#337ab7}a.text-primary:hover,a.text-primary:focus{color:#286090}.text-success{color:#3c763d}a.text-success:hover,a.text-success:focus{color:#2b542c}.text-info{color:#31708f}a.text-info:hover,a.text-info:focus{color:#245269}.text-warning{color:#8a6d3b}a.text-warning:hover,a.text-warning:focus{color:#66512c}.text-danger{color:#a94442}a.text-danger:hover,a.text-danger:focus{color:#843534}.bg-primary{color:#fff;background-color:#337ab7}a.bg-primary:hover,a.bg-primary:focus{background-color:#286090}.bg-success{background-color:#dff0d8}a.bg-success:hover,a.bg-success:focus{background-color:#c1e2b3}.bg-info{background-color:#d9edf7}a.bg-info:hover,a.bg-info:focus{background-color:#afd9ee}.bg-warning{background-color:#fcf8e3}a.bg-warning:hover,a.bg-warning:focus{background-color:#f7ecb5}.bg-danger{background-color:#f2dede}a.bg-danger:hover,a.bg-danger:focus{background-color:#e4b9b9}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none;margin-left:-5px}.list-inline>li{display:inline-block;padding-left:5px;padding-right:5px}dl{margin-top:0;margin-bottom:20px}dt,dd{line-height:1.42857143}dt{font-weight:bold}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #777}.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;font-size:17.5px;border-left:5px solid #eee}blockquote p:last-child,blockquote ul:last-child,blockquote ol:last-child{margin-bottom:0}blockquote footer,blockquote small,blockquote .small{display:block;font-size:80%;line-height:1.42857143;color:#777}blockquote footer:before,blockquote small:before,blockquote .small:before{content:'\2014 \00A0'}.blockquote-reverse,blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0;text-align:right}.blockquote-reverse footer:before,blockquote.pull-right footer:before,.blockquote-reverse small:before,blockquote.pull-right small:before,.blockquote-reverse .small:before,blockquote.pull-right .small:before{content:''}.blockquote-reverse footer:after,blockquote.pull-right footer:after,.blockquote-reverse small:after,blockquote.pull-right small:after,.blockquote-reverse .small:after,blockquote.pull-right .small:after{content:'\00A0 \2014'}address{margin-bottom:20px;font-style:normal;line-height:1.42857143}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;background-color:#f9f2f4;border-radius:4px}kbd{padding:2px 4px;font-size:90%;color:#fff;background-color:#333;border-radius:3px;box-shadow:inset 0 -1px 0 rgba(0,0,0,0.25)}kbd kbd{padding:0;font-size:100%;font-weight:bold;box-shadow:none}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.42857143;word-break:break-all;word-wrap:break-word;color:#333;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border-radius:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}@media (min-width:768px){.container{width:800px}}@media (min-width:992px){.container{width:970px}}@media (min-width:1200px){.container{width:900px}}.container-fluid{margin-right:auto;margin-left:auto;padding-left:15px;padding-right:15px}.row{margin-left:-15px;margin-right:-15px}.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .col-lg-12{position:relative;min-height:1px;padding-left:15px;padding-right:15px}.col-xs-1, .col-xs-2, .col-xs-3, .col-xs-4, .col-xs-5, .col-xs-6, .col-xs-7, .col-xs-8, .col-xs-9, .col-xs-10, .col-xs-11, .col-xs-12{float:left}.col-xs-12{width:100%}.col-xs-11{width:91.66666667%}.col-xs-10{width:83.33333333%}.col-xs-9{width:75%}.col-xs-8{width:66.66666667%}.col-xs-7{width:58.33333333%}.col-xs-6{width:50%}.col-xs-5{width:41.66666667%}.col-xs-4{width:33.33333333%}.col-xs-3{width:25%}.col-xs-2{width:16.66666667%}.col-xs-1{width:8.33333333%}.col-xs-pull-12{right:100%}.col-xs-pull-11{right:91.66666667%}.col-xs-pull-10{right:83.33333333%}.col-xs-pull-9{right:75%}.col-xs-pull-8{right:66.66666667%}.col-xs-pull-7{right:58.33333333%}.col-xs-pull-6{right:50%}.col-xs-pull-5{right:41.66666667%}.col-xs-pull-4{right:33.33333333%}.col-xs-pull-3{right:25%}.col-xs-pull-2{right:16.66666667%}.col-xs-pull-1{right:8.33333333%}.col-xs-pull-0{right:auto}.col-xs-push-12{left:100%}.col-xs-push-11{left:91.66666667%}.col-xs-push-10{left:83.33333333%}.col-xs-push-9{left:75%}.col-xs-push-8{left:66.66666667%}.col-xs-push-7{left:58.33333333%}.col-xs-push-6{left:50%}.col-xs-push-5{left:41.66666667%}.col-xs-push-4{left:33.33333333%}.col-xs-push-3{left:25%}.col-xs-push-2{left:16.66666667%}.col-xs-push-1{left:8.33333333%}.col-xs-push-0{left:auto}.col-xs-offset-12{margin-left:100%}.col-xs-offset-11{margin-left:91.66666667%}.col-xs-offset-10{margin-left:83.33333333%}.col-xs-offset-9{margin-left:75%}.col-xs-offset-8{margin-left:66.66666667%}.col-xs-offset-7{margin-left:58.33333333%}.col-xs-offset-6{margin-left:50%}.col-xs-offset-5{margin-left:41.66666667%}.col-xs-offset-4{margin-left:33.33333333%}.col-xs-offset-3{margin-left:25%}.col-xs-offset-2{margin-left:16.66666667%}.col-xs-offset-1{margin-left:8.33333333%}.col-xs-offset-0{margin-left:0}@media (min-width:768px){.col-sm-1, .col-sm-2, .col-sm-3, .col-sm-4, .col-sm-5, .col-sm-6, .col-sm-7, .col-sm-8, .col-sm-9, .col-sm-10, .col-sm-11, .col-sm-12{float:left}.col-sm-12{width:100%}.col-sm-11{width:91.66666667%}.col-sm-10{width:83.33333333%}.col-sm-9{width:75%}.col-sm-8{width:66.66666667%}.col-sm-7{width:58.33333333%}.col-sm-6{width:50%}.col-sm-5{width:41.66666667%}.col-sm-4{width:33.33333333%}.col-sm-3{width:25%}.col-sm-2{width:16.66666667%}.col-sm-1{width:8.33333333%}.col-sm-pull-12{right:100%}.col-sm-pull-11{right:91.66666667%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-9{right:75%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-6{right:50%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-3{right:25%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-0{right:auto}.col-sm-push-12{left:100%}.col-sm-push-11{left:91.66666667%}.col-sm-push-10{left:83.33333333%}.col-sm-push-9{left:75%}.col-sm-push-8{left:66.66666667%}.col-sm-push-7{left:58.33333333%}.col-sm-push-6{left:50%}.col-sm-push-5{left:41.66666667%}.col-sm-push-4{left:33.33333333%}.col-sm-push-3{left:25%}.col-sm-push-2{left:16.66666667%}.col-sm-push-1{left:8.33333333%}.col-sm-push-0{left:auto}.col-sm-offset-12{margin-left:100%}.col-sm-offset-11{margin-left:91.66666667%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-0{margin-left:0}}@media (min-width:992px){.col-md-1, .col-md-2, .col-md-3, .col-md-4, .col-md-5, .col-md-6, .col-md-7, .col-md-8, .col-md-9, .col-md-10, .col-md-11, .col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}.col-md-pull-12{right:100%}.col-md-pull-11{right:91.66666667%}.col-md-pull-10{right:83.33333333%}.col-md-pull-9{right:75%}.col-md-pull-8{right:66.66666667%}.col-md-pull-7{right:58.33333333%}.col-md-pull-6{right:50%}.col-md-pull-5{right:41.66666667%}.col-md-pull-4{right:33.33333333%}.col-md-pull-3{right:25%}.col-md-pull-2{right:16.66666667%}.col-md-pull-1{right:8.33333333%}.col-md-pull-0{right:auto}.col-md-push-12{left:100%}.col-md-push-11{left:91.66666667%}.col-md-push-10{left:83.33333333%}.col-md-push-9{left:75%}.col-md-push-8{left:66.66666667%}.col-md-push-7{left:58.33333333%}.col-md-push-6{left:50%}.col-md-push-5{left:41.66666667%}.col-md-push-4{left:33.33333333%}.col-md-push-3{left:25%}.col-md-push-2{left:16.66666667%}.col-md-push-1{left:8.33333333%}.col-md-push-0{left:auto}.col-md-offset-12{margin-left:100%}.col-md-offset-11{margin-left:91.66666667%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-9{margin-left:75%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-6{margin-left:50%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-3{margin-left:25%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-0{margin-left:0}}@media (min-width:1200px){.col-lg-1, .col-lg-2, .col-lg-3, .col-lg-4, .col-lg-5, .col-lg-6, .col-lg-7, .col-lg-8, .col-lg-9, .col-lg-10, .col-lg-11, .col-lg-12{float:left}.col-lg-12{width:100%}.col-lg-11{width:91.66666667%}.col-lg-10{width:83.33333333%}.col-lg-9{width:75%}.col-lg-8{width:66.66666667%}.col-lg-7{width:58.33333333%}.col-lg-6{width:50%}.col-lg-5{width:41.66666667%}.col-lg-4{width:33.33333333%}.col-lg-3{width:25%}.col-lg-2{width:16.66666667%}.col-lg-1{width:8.33333333%}.col-lg-pull-12{right:100%}.col-lg-pull-11{right:91.66666667%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-9{right:75%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-6{right:50%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-3{right:25%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-0{right:auto}.col-lg-push-12{left:100%}.col-lg-push-11{left:91.66666667%}.col-lg-push-10{left:83.33333333%}.col-lg-push-9{left:75%}.col-lg-push-8{left:66.66666667%}.col-lg-push-7{left:58.33333333%}.col-lg-push-6{left:50%}.col-lg-push-5{left:41.66666667%}.col-lg-push-4{left:33.33333333%}.col-lg-push-3{left:25%}.col-lg-push-2{left:16.66666667%}.col-lg-push-1{left:8.33333333%}.col-lg-push-0{left:auto}.col-lg-offset-12{margin-left:100%}.col-lg-offset-11{margin-left:91.66666667%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-0{margin-left:0}}table{background-color:transparent}caption{padding-top:8px;padding-bottom:8px;color:#777;text-align:left}th{text-align:left}.table{width:100%;max-width:100%;margin-bottom:20px}.table>thead>tr>th,.table>tbody>tr>th,.table>tfoot>tr>th,.table>thead>tr>td,.table>tbody>tr>td,.table>tfoot>tr>td{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table>thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table>caption+thead>tr:first-child>th,.table>colgroup+thead>tr:first-child>th,.table>thead:first-child>tr:first-child>th,.table>caption+thead>tr:first-child>td,.table>colgroup+thead>tr:first-child>td,.table>thead:first-child>tr:first-child>td{border-top:0}.table>tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed>thead>tr>th,.table-condensed>tbody>tr>th,.table-condensed>tfoot>tr>th,.table-condensed>thead>tr>td,.table-condensed>tbody>tr>td,.table-condensed>tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-of-type(odd){background-color:#f9f9f9}.table-hover>tbody>tr:hover{background-color:#f5f5f5}table col[class*="col-"]{position:static;float:none;display:table-column}table td[class*="col-"],table th[class*="col-"]{position:static;float:none;display:table-cell}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table-hover>tbody>tr>td.active:hover,.table-hover>tbody>tr>th.active:hover,.table-hover>tbody>tr.active:hover>td,.table-hover>tbody>tr:hover>.active,.table-hover>tbody>tr.active:hover>th{background-color:#e8e8e8}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr:hover>.success,.table-hover>tbody>tr.success:hover>th{background-color:#d0e9c6}.table>thead>tr>td.info,.table>tbody>tr>td.info,.table>tfoot>tr>td.info,.table>thead>tr>th.info,.table>tbody>tr>th.info,.table>tfoot>tr>th.info,.table>thead>tr.info>td,.table>tbody>tr.info>td,.table>tfoot>tr.info>td,.table>thead>tr.info>th,.table>tbody>tr.info>th,.table>tfoot>tr.info>th{background-color:#d9edf7}.table-hover>tbody>tr>td.info:hover,.table-hover>tbody>tr>th.info:hover,.table-hover>tbody>tr.info:hover>td,.table-hover>tbody>tr:hover>.info,.table-hover>tbody>tr.info:hover>th{background-color:#c4e3f3}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr:hover>.warning,.table-hover>tbody>tr.warning:hover>th{background-color:#faf2cc}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr:hover>.danger,.table-hover>tbody>tr.danger:hover>th{background-color:#ebcccc}.table-responsive{overflow-x:auto;min-height:.01%}@media screen and (max-width:767px){.table-responsive{width:100%;margin-bottom:15px;overflow-y:hidden;-ms-overflow-style:-ms-autohiding-scrollbar;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0;min-width:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;max-width:100%;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}input[type="range"]{display:block;width:100%}select[multiple],select[size]{height:auto}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}output{display:block;padding-top:7px;font-size:14px;line-height:1.42857143;color:#555}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;background-color:#fff;background-image:none;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;-o-transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s, box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(102, 175, 233, 0.6)}.form-control::-moz-placeholder{color:#999;opacity:1}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control::-ms-expand{border:0;background-color:transparent}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{background-color:#eee;opacity:1}.form-control[disabled],fieldset[disabled] .form-control{cursor:not-allowed}textarea.form-control{height:auto}input[type="search"]{-webkit-appearance:none}@media screen and (-webkit-min-device-pixel-ratio:0){input[type="date"].form-control,input[type="time"].form-control,input[type="datetime-local"].form-control,input[type="month"].form-control{line-height:34px}input[type="date"].input-sm,input[type="time"].input-sm,input[type="datetime-local"].input-sm,input[type="month"].input-sm,.input-group-sm input[type="date"],.input-group-sm input[type="time"],.input-group-sm input[type="datetime-local"],.input-group-sm input[type="month"]{line-height:30px}input[type="date"].input-lg,input[type="time"].input-lg,input[type="datetime-local"].input-lg,input[type="month"].input-lg,.input-group-lg input[type="date"],.input-group-lg input[type="time"],.input-group-lg input[type="datetime-local"],.input-group-lg input[type="month"]{line-height:46px}}.form-group{margin-bottom:15px}.radio,.checkbox{position:relative;display:block;margin-top:10px;margin-bottom:10px}.radio label,.checkbox label{min-height:20px;padding-left:20px;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{position:absolute;margin-left:-20px;margin-top:4px \9}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{position:relative;display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle;font-weight:normal;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"].disabled,input[type="checkbox"].disabled,fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"]{cursor:not-allowed}.radio-inline.disabled,.checkbox-inline.disabled,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.radio.disabled label,.checkbox.disabled label,fieldset[disabled] .radio label,fieldset[disabled] .checkbox label{cursor:not-allowed}.form-control-static{padding-top:7px;padding-bottom:7px;margin-bottom:0;min-height:34px}.form-control-static.input-lg,.form-control-static.input-sm{padding-left:0;padding-right:0}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm,select[multiple].input-sm{height:auto}.form-group-sm .form-control{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.form-group-sm select.form-control{height:30px;line-height:30px}.form-group-sm textarea.form-control,.form-group-sm select[multiple].form-control{height:auto}.form-group-sm .form-control-static{height:30px;min-height:32px;padding:6px 10px;font-size:12px;line-height:1.5}.input-lg{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-lg{height:46px;line-height:46px}textarea.input-lg,select[multiple].input-lg{height:auto}.form-group-lg .form-control{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.form-group-lg select.form-control{height:46px;line-height:46px}.form-group-lg textarea.form-control,.form-group-lg select[multiple].form-control{height:auto}.form-group-lg .form-control-static{height:46px;min-height:38px;padding:11px 16px;font-size:18px;line-height:1.3333333}.has-feedback{position:relative}.has-feedback .form-control{padding-right:42.5px}.form-control-feedback{position:absolute;top:0;right:0;z-index:2;display:block;width:34px;height:34px;line-height:34px;text-align:center;pointer-events:none}.input-lg+.form-control-feedback,.input-group-lg+.form-control-feedback,.form-group-lg .form-control+.form-control-feedback{width:46px;height:46px;line-height:46px}.input-sm+.form-control-feedback,.input-group-sm+.form-control-feedback,.form-group-sm .form-control+.form-control-feedback{width:30px;height:30px;line-height:30px}.has-success .help-block,.has-success .control-label,.has-success .radio,.has-success .checkbox,.has-success .radio-inline,.has-success .checkbox-inline,.has-success.radio label,.has-success.checkbox label,.has-success.radio-inline label,.has-success.checkbox-inline label{color:#3c763d}.has-success .form-control{border-color:#3c763d;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#2b542c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #67b168}.has-success .input-group-addon{color:#3c763d;border-color:#3c763d;background-color:#dff0d8}.has-success .form-control-feedback{color:#3c763d}.has-warning .help-block,.has-warning .control-label,.has-warning .radio,.has-warning .checkbox,.has-warning .radio-inline,.has-warning .checkbox-inline,.has-warning.radio label,.has-warning.checkbox label,.has-warning.radio-inline label,.has-warning.checkbox-inline label{color:#8a6d3b}.has-warning .form-control{border-color:#8a6d3b;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#66512c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #c0a16b}.has-warning .input-group-addon{color:#8a6d3b;border-color:#8a6d3b;background-color:#fcf8e3}.has-warning .form-control-feedback{color:#8a6d3b}.has-error .help-block,.has-error .control-label,.has-error .radio,.has-error .checkbox,.has-error .radio-inline,.has-error .checkbox-inline,.has-error.radio label,.has-error.checkbox label,.has-error.radio-inline label,.has-error.checkbox-inline label{color:#a94442}.has-error .form-control{border-color:#a94442;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#843534;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #ce8483}.has-error .input-group-addon{color:#a94442;border-color:#a94442;background-color:#f2dede}.has-error .form-control-feedback{color:#a94442}.has-feedback label~.form-control-feedback{top:25px}.has-feedback label.sr-only~.form-control-feedback{top:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block;width:auto;vertical-align:middle}.form-inline .form-control-static{display:inline-block}.form-inline .input-group{display:inline-table;vertical-align:middle}.form-inline .input-group .input-group-addon,.form-inline .input-group .input-group-btn,.form-inline .input-group .form-control{width:auto}.form-inline .input-group>.form-control{width:100%}.form-inline .control-label{margin-bottom:0;vertical-align:middle}.form-inline .radio,.form-inline .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.form-inline .radio label,.form-inline .checkbox label{padding-left:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{position:relative;margin-left:0}.form-inline .has-feedback .form-control-feedback{top:0}}.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{margin-top:0;margin-bottom:0;padding-top:7px}.form-horizontal .radio,.form-horizontal .checkbox{min-height:27px}.form-horizontal .form-group{margin-left:-15px;margin-right:-15px}@media (min-width:768px){.form-horizontal .control-label{text-align:right;margin-bottom:0;padding-top:7px}}.form-horizontal .has-feedback .form-control-feedback{right:15px}@media (min-width:768px){.form-horizontal .form-group-lg .control-label{padding-top:11px;font-size:18px}}@media (min-width:768px){.form-horizontal .form-group-sm .control-label{padding-top:6px;font-size:12px}}.btn{display:inline-block;margin-bottom:0;font-weight:normal;text-align:center;vertical-align:middle;touch-action:manipulation;cursor:pointer;background-image:none;border:1px solid transparent;white-space:nowrap;padding:6px 12px;font-size:14px;line-height:1.42857143;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.btn:focus,.btn:active:focus,.btn.active:focus,.btn.focus,.btn:active.focus,.btn.active.focus{outline:thin dotted;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus,.btn.focus{color:#333;text-decoration:none}.btn:active,.btn.active{outline:0;background-image:none;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}a.btn.disabled,fieldset[disabled] a.btn{pointer-events:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:focus,.btn-default.focus{color:#333;background-color:#e6e6e6;border-color:#8c8c8c}.btn-default:hover{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{color:#333;background-color:#e6e6e6;border-color:#adadad}.btn-default:active:hover,.btn-default.active:hover,.open>.dropdown-toggle.btn-default:hover,.btn-default:active:focus,.btn-default.active:focus,.open>.dropdown-toggle.btn-default:focus,.btn-default:active.focus,.btn-default.active.focus,.open>.dropdown-toggle.btn-default.focus{color:#333;background-color:#d4d4d4;border-color:#8c8c8c}.btn-default:active,.btn-default.active,.open>.dropdown-toggle.btn-default{background-image:none}.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled.focus,.btn-default[disabled].focus,fieldset[disabled] .btn-default.focus{background-color:#fff;border-color:#ccc}.btn-default .badge{color:#fff;background-color:#333}.btn-primary{color:#fff;background-color:#337ab7;border-color:#2e6da4}.btn-primary:focus,.btn-primary.focus{color:#fff;background-color:#286090;border-color:#122b40}.btn-primary:hover{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{color:#fff;background-color:#286090;border-color:#204d74}.btn-primary:active:hover,.btn-primary.active:hover,.open>.dropdown-toggle.btn-primary:hover,.btn-primary:active:focus,.btn-primary.active:focus,.open>.dropdown-toggle.btn-primary:focus,.btn-primary:active.focus,.btn-primary.active.focus,.open>.dropdown-toggle.btn-primary.focus{color:#fff;background-color:#204d74;border-color:#122b40}.btn-primary:active,.btn-primary.active,.open>.dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled.focus,.btn-primary[disabled].focus,fieldset[disabled] .btn-primary.focus{background-color:#337ab7;border-color:#2e6da4}.btn-primary .badge{color:#337ab7;background-color:#fff}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:focus,.btn-success.focus{color:#fff;background-color:#449d44;border-color:#255625}.btn-success:hover{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{color:#fff;background-color:#449d44;border-color:#398439}.btn-success:active:hover,.btn-success.active:hover,.open>.dropdown-toggle.btn-success:hover,.btn-success:active:focus,.btn-success.active:focus,.open>.dropdown-toggle.btn-success:focus,.btn-success:active.focus,.btn-success.active.focus,.open>.dropdown-toggle.btn-success.focus{color:#fff;background-color:#398439;border-color:#255625}.btn-success:active,.btn-success.active,.open>.dropdown-toggle.btn-success{background-image:none}.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled.focus,.btn-success[disabled].focus,fieldset[disabled] .btn-success.focus{background-color:#5cb85c;border-color:#4cae4c}.btn-success .badge{color:#5cb85c;background-color:#fff}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:focus,.btn-info.focus{color:#fff;background-color:#31b0d5;border-color:#1b6d85}.btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{color:#fff;background-color:#31b0d5;border-color:#269abc}.btn-info:active:hover,.btn-info.active:hover,.open>.dropdown-toggle.btn-info:hover,.btn-info:active:focus,.btn-info.active:focus,.open>.dropdown-toggle.btn-info:focus,.btn-info:active.focus,.btn-info.active.focus,.open>.dropdown-toggle.btn-info.focus{color:#fff;background-color:#269abc;border-color:#1b6d85}.btn-info:active,.btn-info.active,.open>.dropdown-toggle.btn-info{background-image:none}.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled.focus,.btn-info[disabled].focus,fieldset[disabled] .btn-info.focus{background-color:#5bc0de;border-color:#46b8da}.btn-info .badge{color:#5bc0de;background-color:#fff}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:focus,.btn-warning.focus{color:#fff;background-color:#ec971f;border-color:#985f0d}.btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{color:#fff;background-color:#ec971f;border-color:#d58512}.btn-warning:active:hover,.btn-warning.active:hover,.open>.dropdown-toggle.btn-warning:hover,.btn-warning:active:focus,.btn-warning.active:focus,.open>.dropdown-toggle.btn-warning:focus,.btn-warning:active.focus,.btn-warning.active.focus,.open>.dropdown-toggle.btn-warning.focus{color:#fff;background-color:#d58512;border-color:#985f0d}.btn-warning:active,.btn-warning.active,.open>.dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled.focus,.btn-warning[disabled].focus,fieldset[disabled] .btn-warning.focus{background-color:#f0ad4e;border-color:#eea236}.btn-warning .badge{color:#f0ad4e;background-color:#fff}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:focus,.btn-danger.focus{color:#fff;background-color:#c9302c;border-color:#761c19}.btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{color:#fff;background-color:#c9302c;border-color:#ac2925}.btn-danger:active:hover,.btn-danger.active:hover,.open>.dropdown-toggle.btn-danger:hover,.btn-danger:active:focus,.btn-danger.active:focus,.open>.dropdown-toggle.btn-danger:focus,.btn-danger:active.focus,.btn-danger.active.focus,.open>.dropdown-toggle.btn-danger.focus{color:#fff;background-color:#ac2925;border-color:#761c19}.btn-danger:active,.btn-danger.active,.open>.dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled.focus,.btn-danger[disabled].focus,fieldset[disabled] .btn-danger.focus{background-color:#d9534f;border-color:#d43f3a}.btn-danger .badge{color:#d9534f;background-color:#fff}.btn-link{color:#337ab7;font-weight:normal;border-radius:0}.btn-link,.btn-link:active,.btn-link.active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#23527c;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#777;text-decoration:none}.btn-lg,.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}.btn-sm,.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs,.btn-group-xs>.btn{padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-block{display:block;width:100%}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}tr.collapse.in{display:table-row}tbody.collapse.in{display:table-row-group}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition-property:height, visibility;transition-property:height, visibility;-webkit-transition-duration:.35s;transition-duration:.35s;-webkit-transition-timing-function:ease;transition-timing-function:ease}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px dashed;border-top:4px solid \9;border-right:4px solid transparent;border-left:4px solid transparent}.dropup,.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;font-size:14px;text-align:left;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.42857143;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{text-decoration:none;color:#262626;background-color:#f5f5f5}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;outline:0;background-color:#337ab7}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#777}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:not-allowed}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-menu-right{left:auto;right:0}.dropdown-menu-left{left:0;right:auto}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.42857143;color:#777;white-space:nowrap}.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px dashed;border-bottom:4px solid \9;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:2px}@media (min-width:768px){.navbar-right .dropdown-menu{left:auto;right:0}.navbar-right .dropdown-menu-left{left:0;right:auto}}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar{margin-left:-5px}.btn-toolbar .btn,.btn-toolbar .btn-group,.btn-toolbar .input-group{float:left}.btn-toolbar>.btn,.btn-toolbar>.btn-group,.btn-toolbar>.input-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-top-right-radius:0}.btn-group>.btn-group:last-child:not(:first-child)>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-left:12px;padding-right:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn-group.open .dropdown-toggle.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group,.btn-group-vertical>.btn-group>.btn{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-top-left-radius:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child:not(:last-child)>.btn:last-child,.btn-group-vertical>.btn-group:first-child:not(:last-child)>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child:not(:first-child)>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;table-layout:fixed;border-collapse:separate}.btn-group-justified>.btn,.btn-group-justified>.btn-group{float:none;display:table-cell;width:1%}.btn-group-justified>.btn-group .btn{width:100%}.btn-group-justified>.btn-group .dropdown-menu{left:auto}[data-toggle="buttons"]>.btn input[type="radio"],[data-toggle="buttons"]>.btn-group>.btn input[type="radio"],[data-toggle="buttons"]>.btn input[type="checkbox"],[data-toggle="buttons"]>.btn-group>.btn input[type="checkbox"]{position:absolute;clip:rect(0, 0, 0, 0);pointer-events:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group[class*="col-"]{float:none;padding-left:0;padding-right:0}.input-group .form-control{position:relative;z-index:2;float:left;width:100%;margin-bottom:0}.input-group .form-control:focus{z-index:3}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:46px;padding:10px 16px;font-size:18px;line-height:1.3333333;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:46px;line-height:46px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn,select[multiple].input-group-lg>.form-control,select[multiple].input-group-lg>.input-group-addon,select[multiple].input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn,select[multiple].input-group-sm>.form-control,select[multiple].input-group-sm>.input-group-addon,select[multiple].input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;color:#555;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle),.input-group-btn:last-child>.btn-group:not(:last-child)>.btn{border-bottom-right-radius:0;border-top-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:first-child>.btn-group:not(:first-child)>.btn{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;font-size:0;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-1px}.input-group-btn>.btn:hover,.input-group-btn>.btn:focus,.input-group-btn>.btn:active{z-index:2}.input-group-btn:first-child>.btn,.input-group-btn:first-child>.btn-group{margin-right:-1px}.input-group-btn:last-child>.btn,.input-group-btn:last-child>.btn-group{z-index:2;margin-left:-1px}.nav{margin-bottom:0;padding-left:0;list-style:none}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#777}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#777;text-decoration:none;background-color:transparent;cursor:not-allowed}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#337ab7}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-tabs.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}.nav-tabs.nav-justified>li>a{margin-bottom:0}}.nav-tabs.nav-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs.nav-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs.nav-justified>.active>a,.nav-tabs.nav-justified>.active>a:hover,.nav-tabs.nav-justified>.active>a:focus{border-bottom-color:#fff}}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:4px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#337ab7}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center;margin-bottom:5px}.nav-justified>.dropdown .dropdown-menu{top:auto;left:auto}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}.nav-justified>li>a{margin-bottom:0}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-radius:4px}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border:1px solid #ddd}@media (min-width:768px){.nav-tabs-justified>li>a{border-bottom:1px solid #ddd;border-radius:4px 4px 0 0}.nav-tabs-justified>.active>a,.nav-tabs-justified>.active>a:hover,.nav-tabs-justified>.active>a:focus{border-bottom-color:#fff}}.tab-content>.tab-pane{display:none}.tab-content>.active{display:block}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;min-height:50px;margin-bottom:20px;border:1px solid transparent}@media (min-width:768px){.navbar{border-radius:4px}}@media (min-width:768px){.navbar-header{float:left}}.navbar-collapse{overflow-x:visible;padding-right:15px;padding-left:15px;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block !important;height:auto !important;padding-bottom:0;overflow:visible !important}.navbar-collapse.in{overflow-y:visible}.navbar-fixed-top .navbar-collapse,.navbar-static-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{padding-left:0;padding-right:0}}.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:340px}@media (max-device-width:480px) and (orientation:landscape){.navbar-fixed-top .navbar-collapse,.navbar-fixed-bottom .navbar-collapse{max-height:200px}}.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media (min-width:768px){.container>.navbar-header,.container-fluid>.navbar-header,.container>.navbar-collapse,.container-fluid>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{z-index:1000;border-width:0 0 1px}@media (min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030}@media (min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;border-width:0 0 1px}.navbar-fixed-bottom{bottom:0;margin-bottom:0;border-width:1px 0 0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px;height:50px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}.navbar-brand>img{display:block}@media (min-width:768px){.navbar>.container .navbar-brand,.navbar>.container-fluid .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;margin-right:15px;padding:9px 10px;margin-top:8px;margin-bottom:8px;background-color:transparent;background-image:none;border:1px solid transparent;border-radius:4px}.navbar-toggle:focus{outline:0}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media (min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media (min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}.navbar-form{margin-left:-15px;margin-right:-15px;padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);margin-top:8px;margin-bottom:8px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block;width:auto;vertical-align:middle}.navbar-form .form-control-static{display:inline-block}.navbar-form .input-group{display:inline-table;vertical-align:middle}.navbar-form .input-group .input-group-addon,.navbar-form .input-group .input-group-btn,.navbar-form .input-group .form-control{width:auto}.navbar-form .input-group>.form-control{width:100%}.navbar-form .control-label{margin-bottom:0;vertical-align:middle}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;margin-top:0;margin-bottom:0;vertical-align:middle}.navbar-form .radio label,.navbar-form .checkbox label{padding-left:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{position:relative;margin-left:0}.navbar-form .has-feedback .form-control-feedback{top:0}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}.navbar-form .form-group:last-child{margin-bottom:0}}@media (min-width:768px){.navbar-form{width:auto;border:0;margin-left:0;margin-right:0;padding-top:0;padding-bottom:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{margin-bottom:0;border-top-right-radius:4px;border-top-left-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-btn.btn-sm{margin-top:10px;margin-bottom:10px}.navbar-btn.btn-xs{margin-top:14px;margin-bottom:14px}.navbar-text{margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{float:left;margin-left:15px;margin-right:15px}}@media (min-width:768px){.navbar-left{float:left !important}.navbar-right{float:right !important;margin-right:-15px}.navbar-right~.navbar-right{margin-right:0}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#888}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e7e7e7}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{background-color:#e7e7e7;color:#555}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-default .btn-link{color:#777}.navbar-default .btn-link:hover,.navbar-default .btn-link:focus{color:#333}.navbar-default .btn-link[disabled]:hover,fieldset[disabled] .navbar-default .btn-link:hover,.navbar-default .btn-link[disabled]:focus,fieldset[disabled] .navbar-default .btn-link:focus{color:#ccc}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#9d9d9d}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{background-color:#080808;color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu .divider{background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#9d9d9d}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#9d9d9d}.navbar-inverse .navbar-link:hover{color:#fff}.navbar-inverse .btn-link{color:#9d9d9d}.navbar-inverse .btn-link:hover,.navbar-inverse .btn-link:focus{color:#fff}.navbar-inverse .btn-link[disabled]:hover,fieldset[disabled] .navbar-inverse .btn-link:hover,.navbar-inverse .btn-link[disabled]:focus,fieldset[disabled] .navbar-inverse .btn-link:focus{color:#444}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{content:"/\00a0";padding:0 5px;color:#ccc}.breadcrumb>.active{color:#777}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;line-height:1.42857143;text-decoration:none;color:#337ab7;background-color:#fff;border:1px solid #ddd;margin-left:-1px}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-bottom-right-radius:4px;border-top-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{z-index:2;color:#23527c;background-color:#eee;border-color:#ddd}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:3;color:#fff;background-color:#337ab7;border-color:#337ab7;cursor:default}.pagination>.disabled>span,.pagination>.disabled>span:hover,.pagination>.disabled>span:focus,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#777;background-color:#fff;border-color:#ddd;cursor:not-allowed}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px;line-height:1.3333333}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-bottom-right-radius:6px;border-top-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px;line-height:1.5}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-bottom-right-radius:3px;border-top-right-radius:3px}.pager{padding-left:0;margin:20px 0;list-style:none;text-align:center}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#777;background-color:#fff;cursor:not-allowed}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}a.label:hover,a.label:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.btn .label{position:relative;top:-1px}.label-default{background-color:#777}.label-default[href]:hover,.label-default[href]:focus{background-color:#5e5e5e}.label-primary{background-color:#337ab7}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#286090}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;color:#fff;line-height:1;vertical-align:middle;white-space:nowrap;text-align:center;background-color:#777;border-radius:10px}.badge:empty{display:none}.btn .badge{position:relative;top:-1px}.btn-xs .badge,.btn-group-xs>.btn .badge{top:0;padding:1px 5px}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#337ab7;background-color:#fff}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding-top:30px;padding-bottom:30px;margin-bottom:30px;color:inherit;background-color:#eee}.jumbotron h1,.jumbotron .h1{color:inherit}.jumbotron p{margin-bottom:15px;font-size:21px;font-weight:200}.jumbotron>hr{border-top-color:#d5d5d5}.container .jumbotron,.container-fluid .jumbotron{border-radius:6px;padding-left:15px;padding-right:15px}.jumbotron .container{max-width:100%}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron,.container-fluid .jumbotron{padding-left:60px;padding-right:60px}.jumbotron h1,.jumbotron .h1{font-size:63px}}.thumbnail{display:block;padding:4px;margin-bottom:20px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:border .2s ease-in-out;-o-transition:border .2s ease-in-out;transition:border .2s ease-in-out}.thumbnail>img,.thumbnail a>img{margin-left:auto;margin-right:auto}a.thumbnail:hover,a.thumbnail:focus,a.thumbnail.active{border-color:#337ab7}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable,.alert-dismissible{padding-right:35px}.alert-dismissable .close,.alert-dismissible .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#3c763d}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#2b542c}.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#31708f}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#245269}.alert-warning{background-color:#fcf8e3;border-color:#faebcc;color:#8a6d3b}.alert-warning hr{border-top-color:#f7e1b5}.alert-warning .alert-link{color:#66512c}.alert-danger{background-color:#f2dede;border-color:#ebccd1;color:#a94442}.alert-danger hr{border-top-color:#e4b9c0}.alert-danger .alert-link{color:#843534}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;line-height:20px;color:#fff;text-align:center;background-color:#337ab7;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;-o-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar,.progress-bar-striped{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-size:40px 40px}.progress.active .progress-bar,.progress-bar.active{-webkit-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255,255,255,0.15) 25%, transparent 25%, transparent 50%, rgba(255,255,255,0.15) 50%, rgba(255,255,255,0.15) 75%, transparent 75%, transparent)}.media{margin-top:15px}.media:first-child{margin-top:0}.media,.media-body{zoom:1;overflow:hidden}.media-body{width:10000px}.media-object{display:block}.media-object.img-thumbnail{max-width:none}.media-right,.media>.pull-right{padding-left:10px}.media-left,.media>.pull-left{padding-right:10px}.media-left,.media-right,.media-body{display:table-cell;vertical-align:top}.media-middle{vertical-align:middle}.media-bottom{vertical-align:bottom}.media-heading{margin-top:0;margin-bottom:5px}.media-list{padding-left:0;list-style:none}.list-group{margin-bottom:20px;padding-left:0}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}a.list-group-item,button.list-group-item{color:#555}a.list-group-item .list-group-item-heading,button.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,button.list-group-item:hover,a.list-group-item:focus,button.list-group-item:focus{text-decoration:none;color:#555;background-color:#f5f5f5}button.list-group-item{width:100%;text-align:left}.list-group-item.disabled,.list-group-item.disabled:hover,.list-group-item.disabled:focus{background-color:#eee;color:#777;cursor:not-allowed}.list-group-item.disabled .list-group-item-heading,.list-group-item.disabled:hover .list-group-item-heading,.list-group-item.disabled:focus .list-group-item-heading{color:inherit}.list-group-item.disabled .list-group-item-text,.list-group-item.disabled:hover .list-group-item-text,.list-group-item.disabled:focus .list-group-item-text{color:#777}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#337ab7;border-color:#337ab7}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active .list-group-item-heading>small,.list-group-item.active:hover .list-group-item-heading>small,.list-group-item.active:focus .list-group-item-heading>small,.list-group-item.active .list-group-item-heading>.small,.list-group-item.active:hover .list-group-item-heading>.small,.list-group-item.active:focus .list-group-item-heading>.small{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#c7ddef}.list-group-item-success{color:#3c763d;background-color:#dff0d8}a.list-group-item-success,button.list-group-item-success{color:#3c763d}a.list-group-item-success .list-group-item-heading,button.list-group-item-success .list-group-item-heading{color:inherit}a.list-group-item-success:hover,button.list-group-item-success:hover,a.list-group-item-success:focus,button.list-group-item-success:focus{color:#3c763d;background-color:#d0e9c6}a.list-group-item-success.active,button.list-group-item-success.active,a.list-group-item-success.active:hover,button.list-group-item-success.active:hover,a.list-group-item-success.active:focus,button.list-group-item-success.active:focus{color:#fff;background-color:#3c763d;border-color:#3c763d}.list-group-item-info{color:#31708f;background-color:#d9edf7}a.list-group-item-info,button.list-group-item-info{color:#31708f}a.list-group-item-info .list-group-item-heading,button.list-group-item-info .list-group-item-heading{color:inherit}a.list-group-item-info:hover,button.list-group-item-info:hover,a.list-group-item-info:focus,button.list-group-item-info:focus{color:#31708f;background-color:#c4e3f3}a.list-group-item-info.active,button.list-group-item-info.active,a.list-group-item-info.active:hover,button.list-group-item-info.active:hover,a.list-group-item-info.active:focus,button.list-group-item-info.active:focus{color:#fff;background-color:#31708f;border-color:#31708f}.list-group-item-warning{color:#8a6d3b;background-color:#fcf8e3}a.list-group-item-warning,button.list-group-item-warning{color:#8a6d3b}a.list-group-item-warning .list-group-item-heading,button.list-group-item-warning .list-group-item-heading{color:inherit}a.list-group-item-warning:hover,button.list-group-item-warning:hover,a.list-group-item-warning:focus,button.list-group-item-warning:focus{color:#8a6d3b;background-color:#faf2cc}a.list-group-item-warning.active,button.list-group-item-warning.active,a.list-group-item-warning.active:hover,button.list-group-item-warning.active:hover,a.list-group-item-warning.active:focus,button.list-group-item-warning.active:focus{color:#fff;background-color:#8a6d3b;border-color:#8a6d3b}.list-group-item-danger{color:#a94442;background-color:#f2dede}a.list-group-item-danger,button.list-group-item-danger{color:#a94442}a.list-group-item-danger .list-group-item-heading,button.list-group-item-danger .list-group-item-heading{color:inherit}a.list-group-item-danger:hover,button.list-group-item-danger:hover,a.list-group-item-danger:focus,button.list-group-item-danger:focus{color:#a94442;background-color:#ebcccc}a.list-group-item-danger.active,button.list-group-item-danger.active,a.list-group-item-danger.active:hover,button.list-group-item-danger.active:hover,a.list-group-item-danger.active:focus,button.list-group-item-danger.active:focus{color:#fff;background-color:#a94442;border-color:#a94442}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-heading>.dropdown .dropdown-toggle{color:inherit}.panel-title{margin-top:0;margin-bottom:0;font-size:16px;color:inherit}.panel-title>a,.panel-title>small,.panel-title>.small,.panel-title>small>a,.panel-title>.small>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.list-group,.panel>.panel-collapse>.list-group{margin-bottom:0}.panel>.list-group .list-group-item,.panel>.panel-collapse>.list-group .list-group-item{border-width:1px 0;border-radius:0}.panel>.list-group:first-child .list-group-item:first-child,.panel>.panel-collapse>.list-group:first-child .list-group-item:first-child{border-top:0;border-top-right-radius:3px;border-top-left-radius:3px}.panel>.list-group:last-child .list-group-item:last-child,.panel>.panel-collapse>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.panel-heading+.panel-collapse>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.list-group+.panel-footer{border-top-width:0}.panel>.table,.panel>.table-responsive>.table,.panel>.panel-collapse>.table{margin-bottom:0}.panel>.table caption,.panel>.table-responsive>.table caption,.panel>.panel-collapse>.table caption{padding-left:15px;padding-right:15px}.panel>.table:first-child,.panel>.table-responsive:first-child>.table:first-child{border-top-right-radius:3px;border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child{border-top-left-radius:3px;border-top-right-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:first-child,.panel>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:first-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:first-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:first-child{border-top-left-radius:3px}.panel>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child td:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child td:last-child,.panel>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>thead:first-child>tr:first-child th:last-child,.panel>.table:first-child>tbody:first-child>tr:first-child th:last-child,.panel>.table-responsive:first-child>.table:first-child>tbody:first-child>tr:first-child th:last-child{border-top-right-radius:3px}.panel>.table:last-child,.panel>.table-responsive:last-child>.table:last-child{border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child{border-bottom-left-radius:3px;border-bottom-right-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:first-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:first-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:first-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:first-child{border-bottom-left-radius:3px}.panel>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child td:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child td:last-child,.panel>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tbody:last-child>tr:last-child th:last-child,.panel>.table:last-child>tfoot:last-child>tr:last-child th:last-child,.panel>.table-responsive:last-child>.table:last-child>tfoot:last-child>tr:last-child th:last-child{border-bottom-right-radius:3px}.panel>.panel-body+.table,.panel>.panel-body+.table-responsive,.panel>.table+.panel-body,.panel>.table-responsive+.panel-body{border-top:1px solid #ddd}.panel>.table>tbody:first-child>tr:first-child th,.panel>.table>tbody:first-child>tr:first-child td{border-top:0}.panel>.table-bordered,.panel>.table-responsive>.table-bordered{border:0}.panel>.table-bordered>thead>tr>th:first-child,.panel>.table-responsive>.table-bordered>thead>tr>th:first-child,.panel>.table-bordered>tbody>tr>th:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:first-child,.panel>.table-bordered>tfoot>tr>th:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:first-child,.panel>.table-bordered>thead>tr>td:first-child,.panel>.table-responsive>.table-bordered>thead>tr>td:first-child,.panel>.table-bordered>tbody>tr>td:first-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:first-child,.panel>.table-bordered>tfoot>tr>td:first-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.panel>.table-bordered>thead>tr>th:last-child,.panel>.table-responsive>.table-bordered>thead>tr>th:last-child,.panel>.table-bordered>tbody>tr>th:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>th:last-child,.panel>.table-bordered>tfoot>tr>th:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>th:last-child,.panel>.table-bordered>thead>tr>td:last-child,.panel>.table-responsive>.table-bordered>thead>tr>td:last-child,.panel>.table-bordered>tbody>tr>td:last-child,.panel>.table-responsive>.table-bordered>tbody>tr>td:last-child,.panel>.table-bordered>tfoot>tr>td:last-child,.panel>.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.panel>.table-bordered>thead>tr:first-child>td,.panel>.table-responsive>.table-bordered>thead>tr:first-child>td,.panel>.table-bordered>tbody>tr:first-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>td,.panel>.table-bordered>thead>tr:first-child>th,.panel>.table-responsive>.table-bordered>thead>tr:first-child>th,.panel>.table-bordered>tbody>tr:first-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:first-child>th{border-bottom:0}.panel>.table-bordered>tbody>tr:last-child>td,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>td,.panel>.table-bordered>tfoot>tr:last-child>td,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>td,.panel>.table-bordered>tbody>tr:last-child>th,.panel>.table-responsive>.table-bordered>tbody>tr:last-child>th,.panel>.table-bordered>tfoot>tr:last-child>th,.panel>.table-responsive>.table-bordered>tfoot>tr:last-child>th{border-bottom:0}.panel>.table-responsive{border:0;margin-bottom:0}.panel-group{margin-bottom:20px}.panel-group .panel{margin-bottom:0;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse>.panel-body,.panel-group .panel-heading+.panel-collapse>.list-group{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ddd}.panel-default>.panel-heading .badge{color:#f5f5f5;background-color:#333}.panel-default>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#337ab7}.panel-primary>.panel-heading{color:#fff;background-color:#337ab7;border-color:#337ab7}.panel-primary>.panel-heading+.panel-collapse>.panel-body{border-top-color:#337ab7}.panel-primary>.panel-heading .badge{color:#337ab7;background-color:#fff}.panel-primary>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#337ab7}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#3c763d;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d6e9c6}.panel-success>.panel-heading .badge{color:#dff0d8;background-color:#3c763d}.panel-success>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d6e9c6}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#31708f;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse>.panel-body{border-top-color:#bce8f1}.panel-info>.panel-heading .badge{color:#d9edf7;background-color:#31708f}.panel-info>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#bce8f1}.panel-warning{border-color:#faebcc}.panel-warning>.panel-heading{color:#8a6d3b;background-color:#fcf8e3;border-color:#faebcc}.panel-warning>.panel-heading+.panel-collapse>.panel-body{border-top-color:#faebcc}.panel-warning>.panel-heading .badge{color:#fcf8e3;background-color:#8a6d3b}.panel-warning>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#faebcc}.panel-danger{border-color:#ebccd1}.panel-danger>.panel-heading{color:#a94442;background-color:#f2dede;border-color:#ebccd1}.panel-danger>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ebccd1}.panel-danger>.panel-heading .badge{color:#f2dede;background-color:#a94442}.panel-danger>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ebccd1}.embed-responsive{position:relative;display:block;height:0;padding:0;overflow:hidden}.embed-responsive .embed-responsive-item,.embed-responsive iframe,.embed-responsive embed,.embed-responsive object,.embed-responsive video{position:absolute;top:0;left:0;bottom:0;height:100%;width:100%;border:0}.embed-responsive-16by9{padding-bottom:56.25%}.embed-responsive-4by3{padding-bottom:75%}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}.modal{display:none;overflow:hidden;position:fixed;top:0;right:0;bottom:0;left:0;z-index:1050;-webkit-overflow-scrolling:touch;outline:0}.modal.fade .modal-dialog{-webkit-transform:translate(0, -25%);-ms-transform:translate(0, -25%);-o-transform:translate(0, -25%);transform:translate(0, -25%);-webkit-transition:-webkit-transform 0.3s ease-out;-moz-transition:-moz-transform 0.3s ease-out;-o-transition:-o-transform 0.3s ease-out;transition:transform 0.3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0, 0);-ms-transform:translate(0, 0);-o-transform:translate(0, 0);transform:translate(0, 0)}.modal-open .modal{overflow-x:hidden;overflow-y:auto}.modal-dialog{position:relative;width:auto;margin:10px}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box;outline:0}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:15px}.modal-footer{padding:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}.modal-scrollbar-measure{position:absolute;top:-9999px;width:50px;height:50px;overflow:scroll}@media (min-width:768px){.modal-dialog{width:600px;margin:30px auto}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}.modal-sm{width:300px}}@media (min-width:992px){.modal-lg{width:900px}}.tooltip{position:absolute;z-index:1070;display:block;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:12px;opacity:0;filter:alpha(opacity=0)}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{margin-top:-3px;padding:5px 0}.tooltip.right{margin-left:3px;padding:0 5px}.tooltip.bottom{margin-top:3px;padding:5px 0}.tooltip.left{margin-left:-3px;padding:0 5px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-left .tooltip-arrow{bottom:0;right:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.top-right .tooltip-arrow{bottom:0;left:5px;margin-bottom:-5px;border-width:5px 5px 0;border-top-color:#000}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-left .tooltip-arrow{top:0;right:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.tooltip.bottom-right .tooltip-arrow{top:0;left:5px;margin-top:-5px;border-width:0 5px 5px;border-bottom-color:#000}.popover{position:absolute;top:0;left:0;z-index:1060;display:none;max-width:276px;padding:1px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-style:normal;font-weight:normal;letter-spacing:normal;line-break:auto;line-height:1.42857143;text-align:left;text-align:start;text-decoration:none;text-shadow:none;text-transform:none;white-space:normal;word-break:normal;word-spacing:normal;word-wrap:normal;font-size:14px;background-color:#fff;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{margin:0;padding:8px 14px;font-size:14px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover>.arrow,.popover>.arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover>.arrow{border-width:11px}.popover>.arrow:after{border-width:10px;content:""}.popover.top>.arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);bottom:-11px}.popover.top>.arrow:after{content:" ";bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#fff}.popover.right>.arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0,0,0,0.25)}.popover.right>.arrow:after{content:" ";left:1px;bottom:-10px;border-left-width:0;border-right-color:#fff}.popover.bottom>.arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);top:-11px}.popover.bottom>.arrow:after{content:" ";top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#fff}.popover.left>.arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0,0,0,0.25)}.popover.left>.arrow:after{content:" ";right:1px;border-right-width:0;border-left-color:#fff;bottom:-10px}.carousel{position:relative}.carousel-inner{position:relative;overflow:hidden;width:100%}.carousel-inner>.item{display:none;position:relative;-webkit-transition:.6s ease-in-out left;-o-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{line-height:1}@media all and (transform-3d),(-webkit-transform-3d){.carousel-inner>.item{-webkit-transition:-webkit-transform 0.6s ease-in-out;-moz-transition:-moz-transform 0.6s ease-in-out;-o-transition:-o-transform 0.6s ease-in-out;transition:transform 0.6s ease-in-out;-webkit-backface-visibility:hidden;-moz-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;-moz-perspective:1000px;perspective:1000px}.carousel-inner>.item.next,.carousel-inner>.item.active.right{-webkit-transform:translate3d(100%, 0, 0);transform:translate3d(100%, 0, 0);left:0}.carousel-inner>.item.prev,.carousel-inner>.item.active.left{-webkit-transform:translate3d(-100%, 0, 0);transform:translate3d(-100%, 0, 0);left:0}.carousel-inner>.item.next.left,.carousel-inner>.item.prev.right,.carousel-inner>.item.active{-webkit-transform:translate3d(0, 0, 0);transform:translate3d(0, 0, 0);left:0}}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;left:0;bottom:0;width:15%;opacity:.5;filter:alpha(opacity=50);font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);background-color:rgba(0,0,0,0)}.carousel-control.left{background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.5) 0, rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{left:auto;right:0;background-image:-webkit-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:-o-linear-gradient(left, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right, rgba(0,0,0,0.0001) 0, rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:hover,.carousel-control:focus{outline:0;color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;margin-top:-10px;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .glyphicon-chevron-left{left:50%;margin-left:-10px}.carousel-control .icon-next,.carousel-control .glyphicon-chevron-right{right:50%;margin-right:-10px}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;line-height:1;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;margin-left:-30%;padding-left:0;list-style:none;text-align:center}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;border:1px solid #fff;border-radius:10px;cursor:pointer;background-color:#000 \9;background-color:rgba(0,0,0,0)}.carousel-indicators .active{margin:0;width:12px;height:12px;background-color:#fff}.carousel-caption{position:absolute;left:15%;right:15%;bottom:20px;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-10px;font-size:30px}.carousel-control .glyphicon-chevron-left,.carousel-control .icon-prev{margin-left:-10px}.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next{margin-right:-10px}.carousel-caption{left:20%;right:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after,.dl-horizontal dd:before,.dl-horizontal dd:after,.container:before,.container:after,.container-fluid:before,.container-fluid:after,.row:before,.row:after,.form-horizontal .form-group:before,.form-horizontal .form-group:after,.btn-toolbar:before,.btn-toolbar:after,.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after,.nav:before,.nav:after,.navbar:before,.navbar:after,.navbar-header:before,.navbar-header:after,.navbar-collapse:before,.navbar-collapse:after,.pager:before,.pager:after,.panel-body:before,.panel-body:after,.modal-header:before,.modal-header:after,.modal-footer:before,.modal-footer:after{content:" ";display:table}.clearfix:after,.dl-horizontal dd:after,.container:after,.container-fluid:after,.row:after,.form-horizontal .form-group:after,.btn-toolbar:after,.btn-group-vertical>.btn-group:after,.nav:after,.navbar:after,.navbar-header:after,.navbar-collapse:after,.pager:after,.panel-body:after,.modal-header:after,.modal-footer:after{clear:both}.center-block{display:block;margin-left:auto;margin-right:auto}.pull-right{float:right !important}.pull-left{float:left !important}.hide{display:none !important}.show{display:block !important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.hidden{display:none !important}.affix{position:fixed}@-ms-viewport{width:device-width}.visible-xs,.visible-sm,.visible-md,.visible-lg{display:none !important}.visible-xs-block,.visible-xs-inline,.visible-xs-inline-block,.visible-sm-block,.visible-sm-inline,.visible-sm-inline-block,.visible-md-block,.visible-md-inline,.visible-md-inline-block,.visible-lg-block,.visible-lg-inline,.visible-lg-inline-block{display:none !important}@media (max-width:767px){.visible-xs{display:block !important}table.visible-xs{display:table !important}tr.visible-xs{display:table-row !important}th.visible-xs,td.visible-xs{display:table-cell !important}}@media (max-width:767px){.visible-xs-block{display:block !important}}@media (max-width:767px){.visible-xs-inline{display:inline !important}}@media (max-width:767px){.visible-xs-inline-block{display:inline-block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block !important}table.visible-sm{display:table !important}tr.visible-sm{display:table-row !important}th.visible-sm,td.visible-sm{display:table-cell !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-block{display:block !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline{display:inline !important}}@media (min-width:768px) and (max-width:991px){.visible-sm-inline-block{display:inline-block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block !important}table.visible-md{display:table !important}tr.visible-md{display:table-row !important}th.visible-md,td.visible-md{display:table-cell !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-block{display:block !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline{display:inline !important}}@media (min-width:992px) and (max-width:1199px){.visible-md-inline-block{display:inline-block !important}}@media (min-width:1200px){.visible-lg{display:block !important}table.visible-lg{display:table !important}tr.visible-lg{display:table-row !important}th.visible-lg,td.visible-lg{display:table-cell !important}}@media (min-width:1200px){.visible-lg-block{display:block !important}}@media (min-width:1200px){.visible-lg-inline{display:inline !important}}@media (min-width:1200px){.visible-lg-inline-block{display:inline-block !important}}@media (max-width:767px){.hidden-xs{display:none !important}}@media (min-width:768px) and (max-width:991px){.hidden-sm{display:none !important}}@media (min-width:992px) and (max-width:1199px){.hidden-md{display:none !important}}@media (min-width:1200px){.hidden-lg{display:none !important}}.visible-print{display:none !important}@media print{.visible-print{display:block !important}table.visible-print{display:table !important}tr.visible-print{display:table-row !important}th.visible-print,td.visible-print{display:table-cell !important}}.visible-print-block{display:none !important}@media print{.visible-print-block{display:block !important}}.visible-print-inline{display:none !important}@media print{.visible-print-inline{display:inline !important}}.visible-print-inline-block{display:none !important}@media print{.visible-print-inline-block{display:inline-block !important}}@media print{.hidden-print{display:none !important}}.panel-definition{border-color:#a2a2a2}.panel-definition>.panel-heading{color:#000;background-color:#eee;border-color:#a2a2a2}.panel-definition>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a2a2a2}.panel-definition>.panel-heading .badge{color:#eee;background-color:#000}.panel-definition>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a2a2a2}.json-schema-description:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Description";padding-bottom:.5em;display:block}.json-schema-description:not(:last-child){padding-bottom:1.5em}.json-schema-properties:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Properties";padding-bottom:.5em;display:block}.json-schema-properties:not(:last-child){padding-bottom:1.5em}.json-schema-properties dd:not(:last-child){padding-bottom:1em}.json-schema-properties dl{margin:0}.json-schema-example:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Example";padding-bottom:.5em;display:block}.json-schema-example:not(:last-child){padding-bottom:1.5em}.json-schema-array-items:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Items";padding-bottom:.5em;display:block}.json-schema-array-items:not(:last-child){padding-bottom:1.5em}.json-schema-allOf-inherited:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Inherited";padding-bottom:.5em;display:block}.json-schema-allOf-inherited:not(:last-child){padding-bottom:1.5em}.json-schema-allOf-inherited ul{padding-left:0;list-style:none}.json-schema-anyOf>dl{border-left:2px solid #a2a2a2;padding-left:1em}.json-schema-anyOf>dl dt:not(:first-child):before{content:"or "}.json-schema-anyOf>dl dt:first-child:before{content:"either "}.json-schema-additionalProperties:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Additional properties";padding-bottom:.5em;display:block}.json-schema-additionalProperties:not(:last-child){padding-bottom:1.5em}.json-inner-schema .json-schema-properties,.json-inner-schema .json-schema-array-items,.json-inner-schema .json-schema-description,.json-inner-schema .json-schema-example{padding-left:1em;margin-top:.5em;padding-bottom:.5em;border-left:2px solid #a2a2a2}.json-property-discriminator:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"discriminator"}a.json-property-discriminator:before:hover,a.json-property-discriminator:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-discriminator:before:empty{display:none}.btn .json-property-discriminator:before{position:relative;top:-1px}.json-property-discriminator:before[href]:hover,.json-property-discriminator:before[href]:focus{background-color:#5e5e5e}.json-property-required:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"required"}a.json-property-required:before:hover,a.json-property-required:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-required:before:empty{display:none}.btn .json-property-required:before{position:relative;top:-1px}.json-property-required:before[href]:hover,.json-property-required:before[href]:focus{background-color:#5e5e5e}.json-property-read-only:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:"read only"}a.json-property-read-only:before:hover,a.json-property-read-only:before:focus{color:#fff;text-decoration:none;cursor:pointer}.json-property-read-only:before:empty{display:none}.btn .json-property-read-only:before{position:relative;top:-1px}.json-property-read-only:before[href]:hover,.json-property-read-only:before[href]:focus{background-color:#5e5e5e}.json-property-type{font-style:italic;font-weight:100}.json-property-format{font-size:smaller}.json-property-enum{font-weight:lighter;font-size:small}.json-property-default-value{font-weight:lighter;font-size:small}.json-property-default-value:before{content:'(default: "'}.json-property-default-value:after{content:'")'}.json-property-enum-item{font-weight:lighter;font-size:small}.json-property-enum-item:before,.json-property-enum-item:after{content:"\""}.json-schema--reference{font-size:90%}.table.swagger--summary>tbody>tr>td.swagger--summary-path{vertical-align:middle}.table.swagger--summary>tbody>tr>td p{margin:0}.swagger--panel-operation-post{border-color:#78cc94}.swagger--panel-operation-post>.panel-heading{color:#333;background-color:#e7f6ec;border-color:#78cc94}.swagger--panel-operation-post>.panel-heading+.panel-collapse>.panel-body{border-top-color:#78cc94}.swagger--panel-operation-post>.panel-heading .badge{color:#e7f6ec;background-color:#333}.swagger--panel-operation-post>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#78cc94}.swagger--panel-operation-post .operation-name{font-weight:bold}.swagger--panel-operation-post .operation-summary{float:right !important}.swagger--panel-operation-get{border-color:#74a8d1}.swagger--panel-operation-get>.panel-heading{color:#333;background-color:#e7f0f7;border-color:#74a8d1}.swagger--panel-operation-get>.panel-heading+.panel-collapse>.panel-body{border-top-color:#74a8d1}.swagger--panel-operation-get>.panel-heading .badge{color:#e7f0f7;background-color:#333}.swagger--panel-operation-get>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#74a8d1}.swagger--panel-operation-get .operation-name{font-weight:bold}.swagger--panel-operation-get .operation-summary{float:right !important}.swagger--panel-operation-put{border-color:#d8ab71}.swagger--panel-operation-put>.panel-heading{color:#333;background-color:#f9f2e9;border-color:#d8ab71}.swagger--panel-operation-put>.panel-heading+.panel-collapse>.panel-body{border-top-color:#d8ab71}.swagger--panel-operation-put>.panel-heading .badge{color:#f9f2e9;background-color:#333}.swagger--panel-operation-put>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#d8ab71}.swagger--panel-operation-put .operation-name{font-weight:bold}.swagger--panel-operation-put .operation-summary{float:right !important}.swagger--panel-operation-patch{border-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading{color:#333;background-color:#FCE9E3;border-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading+.panel-collapse>.panel-body{border-top-color:#ed7c59}.swagger--panel-operation-patch>.panel-heading .badge{color:#FCE9E3;background-color:#333}.swagger--panel-operation-patch>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#ed7c59}.swagger--panel-operation-patch .operation-name{font-weight:bold}.swagger--panel-operation-patch .operation-summary{float:right !important}.swagger--panel-operation-options{border-color:#74a8d1}.swagger--panel-operation-options>.panel-heading{color:#333;background-color:#e7f0f7;border-color:#74a8d1}.swagger--panel-operation-options>.panel-heading+.panel-collapse>.panel-body{border-top-color:#74a8d1}.swagger--panel-operation-options>.panel-heading .badge{color:#e7f0f7;background-color:#333}.swagger--panel-operation-options>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#74a8d1}.swagger--panel-operation-options .operation-name{font-weight:bold}.swagger--panel-operation-options .operation-summary{float:right !important}.swagger--panel-operation-delete{border-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading{color:#333;background-color:#f5e8e8;border-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading+.panel-collapse>.panel-body{border-top-color:#c77d7d}.swagger--panel-operation-delete>.panel-heading .badge{color:#f5e8e8;background-color:#333}.swagger--panel-operation-delete>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#c77d7d}.swagger--panel-operation-delete .operation-name{font-weight:bold}.swagger--panel-operation-delete .operation-summary{float:right !important}.swagger--panel-operation-head{border-color:#f3ff34}.swagger--panel-operation-head>.panel-heading{color:#333;background-color:#fcffcd;border-color:#f3ff34}.swagger--panel-operation-head>.panel-heading+.panel-collapse>.panel-body{border-top-color:#f3ff34}.swagger--panel-operation-head>.panel-heading .badge{color:#fcffcd;background-color:#333}.swagger--panel-operation-head>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#f3ff34}.swagger--panel-operation-head .operation-name{font-weight:bold}.swagger--panel-operation-head .operation-summary{float:right !important}.sw-operation-description:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Description";padding-bottom:.5em;display:block}.sw-operation-description:not(:last-child){padding-bottom:1.5em}.sw-request-params:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Request parameters";padding-bottom:.5em;display:block}.sw-request-params:not(:last-child){padding-bottom:1.5em}.sw-request-body:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Request body";padding-bottom:.5em;display:block}.sw-request-body:not(:last-child){padding-bottom:1.5em}.sw-responses:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Responses";padding-bottom:.5em;display:block}.sw-responses:not(:last-child){padding-bottom:1.5em}.swagger--global:before{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em;background-color:#777;content:'global'}a.swagger--global:before:hover,a.swagger--global:before:focus{color:#fff;text-decoration:none;cursor:pointer}.swagger--global:before:empty{display:none}.btn .swagger--global:before{position:relative;top:-1px}.swagger--global:before[href]:hover,.swagger--global:before[href]:focus{background-color:#5e5e5e}table.table th.sw-param-key{width:auto}table.table th.sw-param-key:before{content:"Key"}table.table th.sw-param-name{width:auto}table.table th.sw-param-name:before{content:"Name"}table.table th.sw-param-description{width:auto}table.table th.sw-param-description:before{content:"Description"}table.table th.sw-param-data-type{width:auto}table.table th.sw-param-data-type:before{content:"Data type"}table.table th.sw-param-type{width:auto}table.table th.sw-param-type:before{content:"Type"}table.table th.sw-request-security-schema{width:auto}table.table th.sw-request-security-schema:before{content:"Schema"}table.table th.sw-request-security-scopes{width:auto}table.table th.sw-request-security-scopes:before{content:"Scopes"}table.table th.sw-response-header-name{width:auto}table.table th.sw-response-header-name:before{content:"Header"}table.table th.sw-response-header-description{width:auto}table.table th.sw-response-header-description:before{content:"Description"}table.table th.sw-response-header-data-type{width:auto}table.table th.sw-response-header-data-type:before{content:"Data type"}.sw-response-name-value{font-weight:bold}.sw-response-description-text{padding-bottom:.5em}code.highlight{padding:0}.panel-security-definition{border-color:#a2a2a2}.panel-security-definition>.panel-heading{color:#000;background-color:#eee;border-color:#a2a2a2}.panel-security-definition>.panel-heading+.panel-collapse>.panel-body{border-top-color:#a2a2a2}.panel-security-definition>.panel-heading .badge{color:#eee;background-color:#000}.panel-security-definition>.panel-footer+.panel-collapse>.panel-body{border-bottom-color:#a2a2a2}.sw-request-security:before{font-weight:bold;color:#555;text-transform:uppercase;content:"Security";padding-bottom:.5em;display:block}.sw-request-security:not(:last-child){padding-bottom:1.5em}.sw-security-definition-basic:before{color:#555;font-size:smaller;content:"(HTTP Basic Authentication)"}span.sw-default-value-header{font-weight:bold}.sw-info-version{font-weight:bold}.sw-info-version span{font-family:monospace;font-weight:normal;font-size:1.1em}</style> - - <meta charset="UTF-8"> - <title>Active and Available Inventory REST API.</title> -</head> -<body> -<div class="container"> - <h1>Active and Available Inventory REST API.</h1> - <p class="sw-info-version">Version: <span>${version}</span></p> - <p><p>${description}</p> - </p> - - <div id="sw-schemes" class="sw-default-value"> - <span class="sw-default-value-header">Schemes:</span> - https - </div> - - <h2 id="swagger--summary-tags">Summary</h2> - <ol> - <#list aaiApis?keys as key> - <li><a href="#tag-${key}">Tag: ${key}</a> - </#list> - <li><a href="#Paths">Paths</a> - <li><a href="#SchemaDefinitions">Schema definitions</a> - </ol> - - <#list aaiApis?keys as key> - <h3 id="tag-${key}" class="swagger-summary-tag">Tag: ${key}</h3> - <table class="table table-bordered table-condensed swagger--summary"> - <thead><tr> - <th>Operation</th><th>Description</th> - </tr></thead> - <tbody> - <#list aaiApis[key] as api> - <#list api.getHttpMethods() as httpVerb> - <tr><td><a href="#operation-${api.getOperation()}${httpVerb.getType()}"> - ${httpVerb.getType()?upper_case} ${api.getPath()}</a></td> - <td><p>${httpVerb.getSummary()}</p></td> - </tr> - </#list> - </#list> - </tbody> - </table> - </#list> - - <h2 id="Paths">Paths</h2> - <#list sortedAaiApis?keys as key> - <#list sortedAaiApis[key] as api> - <#list api.getHttpMethods() as httpVerb> - <span id="path-${api.getOperation()}"></span> - <div id="operation-${api.getOperation()}${httpVerb.getType()}" class="swagger--panel-operation-${httpVerb.getType()} panel"> - <div class="panel-heading"> - <div class="operation-summary">${httpVerb.getSummary()}</div> - <h3 class="panel-title"><span class="operation-name">${httpVerb.getType()?upper_case}</span> - <strong>${api.getPath()}</strong></h3> - Tags: <a href="#tag-${api.getTag()}">${api.getTag()}</a> - </div> - <div class="panel-body"> - <section class="sw-operation-description"> - <p>${httpVerb.getSummary()}</p> - </section> - <#if httpVerb.isConsumerEnabled()> - <section class="sw-request-body"> - <p><span class="label label-default">application/json</span> <span class="label label-default">application/xml</span> </p> - <#if httpVerb.isBodyParametersEnabled()> - <div class="row"> - <div class="col-md-6"> - <p><p>${httpVerb.getBodyParameters()["description"]}</p></p> - </div> - <div class="col-md-6 sw-request-model"> - <div class="panel panel-definition"> - <div class="panel-body"> - <a class="json-schema-ref" href="${httpVerb.getSchemaLink()}">${httpVerb.getSchemaType()}</a> - </div></div></div></div> - </#if> - </section> - </#if> - <#if httpVerb.isParametersEnabled()> - <section class="sw-request-params"> - <table class="table"> - <thead><tr> - <th class="sw-param-name"></th> - <th class="sw-param-description"></th> - <th class="sw-param-type"></th> - <th class="sw-param-data-type"></th> - <th class="sw-param-annotation"></th> - </tr></thead> - <tbody> - <#list httpVerb.getParameters() as param> - <tr><td>${param["name"]}</td> - <td> - <#if param['description']??> - <p>${param["description"]}</p> - </#if> - </td> - <td>${param["in"]}</td> - <td> - <#if param['type']??> - <span class="json-property-type">${param["type"]}</span> - <span class="json-property-range" title="Value limits"></span> - </#if> - </td> - <td> - <#if param['required']> - <span class="json-property-required"></span> - </#if> - </td> - </tr> - </#list> - </tbody> - </table></section> - </#if> - - <section class="sw-responses"> - <p><span class="label label-default">application/json</span> <span class="label label-default">application/xml</span> </p> - <dl> - <#list httpVerb.getResponses() as response> - <dt class="sw-response-${response.getResponseCode()}"> - ${response.getResponseCode()} OK - </dt> - <dd class="sw-response-${response.getResponseCode()}"> - <div class="row"><div class="col-md-12"> - <p>successful operation</p> - </div></div> - <div class="row"> - <#if httpVerb.isHasReturnSchema()> - <div class="col-md-6 sw-response-model"> - <div class="panel panel-definition"> - <div class="panel-body"> - <a class="json-schema-ref" href="${httpVerb.getReturnSchemaLink()}">${httpVerb.getReturnSchemaObject()}</a> - </div></div></div> - </#if> - </div> - </dd> - </#list> - <dt class="sw-response-default">default</dt> - <dd class="sw-response-default"> - <div class="row"><div class="col-md-12"> - <p>Response codes found in <a href="${wikiLink}">response codes</a>.</p> - </div></div> - <div class="row"><div class="col-md-6 sw-response-model"></div></div> - </dd> - </dl> - </section> - </div> - </div> - - </#list> - </#list> - </#list> - - <h2 id="SchemaDefinitions">Schema definitions</h2> - <#list definitions as definition> - <div id="definition-${definition.getDefinitionName()}" class="panel panel-definition"> - <div class="panel-heading"><h3 class="panel-title"> - <a name="/definitions/${definition.getDefinitionName()}"></a>${definition.getDefinitionName()}: - <span class="json-property-type"><span class="json-property-type">object</span> - <span class="json-property-range" title="Value limits"></span></span> - </h3></div> - <div class="panel-body"> - <#if definition.isHasDescription()> - <section class="json-schema-description"> - ${definition.getDefinitionDescription()} - </section> - </#if> - <section class="json-schema-properties"><dl> - <#list definition.getRegularPropertyList() as definitionProperty> - <dt data-property-name="${definitionProperty.getPropertyName()}"> - <span class="json-property-name">${definitionProperty.getPropertyName()}:</span> - <#if definitionProperty.isHasType()> - <span class="json-property-type">${definitionProperty.getPropertyType()}</span> - </#if> - <span class="json-property-range" title="Value limits"></span> - <#if definitionProperty.isRequired()> - <span class="json-property-required"></span> - </#if> - </dt> - <dd> - <#if definitionProperty.isHasPropertyDescription()> - <p>${definitionProperty.getPropertyDescription()}</p> - </#if> - <div class="json-inner-schema"></div> - </dd> - </#list> - <#list definition.getSchemaPropertyList() as definitionProperty> - <dt data-property-name="${definitionProperty.getPropertyName()}"> - <span class="json-property-name">${definitionProperty.getPropertyName()}:</span> - <#if definitionProperty.isHasType()> - <span class="json-property-type">${definitionProperty.getPropertyType()}</span> - </#if> - <span class="json-property-range" title="Value limits"></span> - <#if definitionProperty.isRequired()> - <span class="json-property-required"></span> - </#if> - </dt> - <dd><div class="json-inner-schema"><section class="json-schema-array-items"> - <span class="json-property-type"> - <a class="json-schema-ref" href="${definitionProperty.getPropertyReference()}">${definitionProperty.getPropertyReferenceObjectName()}</a></span> - <span class="json-property-range" title="Value limits"></span> - <div class="json-inner-schema"></div> - </section></div></dd> - </#list> - </dl></section> - </div></div> - - </#list> -</div> -</body> -</html> diff --git a/aai-core/src/test/java/org/onap/aai/util/GenerateXsdTest.java b/aai-core/src/test/java/org/onap/aai/util/GenerateXsdTest.java deleted file mode 100644 index 00bbae49..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/GenerateXsdTest.java +++ /dev/null @@ -1,153 +0,0 @@ -/** - * ============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.util; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; - -import java.io.BufferedWriter; -import java.io.FileWriter; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.aai.config.ConfigConfiguration; -import org.onap.aai.config.SwaggerGenerationConfiguration; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.testutils.TestUtilConfigTranslatorforBusiness; - -import org.onap.aai.AAISetup; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.util.genxsd.HTMLfromOXM; -import org.onap.aai.util.genxsd.HTMLfromOXMTest; -import org.onap.aai.util.genxsd.XSDElementTest; -import org.onap.aai.util.genxsd.YAMLfromOXM; -import org.onap.aai.util.genxsd.YAMLfromOXMTest; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { - ConfigConfiguration.class, - TestUtilConfigTranslatorforBusiness.class, - EdgeIngestor.class, - NodeIngestor.class, - SwaggerGenerationConfiguration.class -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai" -}) -public class GenerateXsdTest { - private static final Logger logger = LoggerFactory.getLogger("GenerateXsd.class"); - private static final String OXMFILENAME = "src/test/resources/oxm/business_oxm_v11.xml"; - private static final String EDGEFILENAME = "src/test/resources/dbedgerules/DbEdgeBusinessRules_test.json"; - public static AnnotationConfigApplicationContext ctx = null; - private static String testXML; - - @Autowired - YAMLfromOXM yamlFromOxm; - - @Autowired - HTMLfromOXM htmlFromOxm; - - @Autowired - SchemaVersions schemaVersions; - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - XSDElementTest x = new XSDElementTest(); - x.setUp(); - testXML = x.getTestXML(); - logger.debug(testXML); - BufferedWriter bw = new BufferedWriter(new FileWriter(OXMFILENAME)); - bw.write(testXML); - bw.close(); - BufferedWriter bw1 = new BufferedWriter(new FileWriter(EDGEFILENAME)); - bw1.write(YAMLfromOXMTest.EdgeDefs()); - bw1.close(); - - } - - @Before - public void setUp() throws Exception { - //PowerMockito.mockStatic(GenerateXsd.class); - XSDElementTest x = new XSDElementTest(); - x.setUp(); - testXML = x.getTestXML(); -// logger.info(testXML); - } - - @Test - public void test_generateSwaggerFromOxmFile( ) { - - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - - yamlFromOxm.setXmlVersion(testXML, v); - fileContent = yamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat(fileContent, is(new YAMLfromOXMTest().YAMLresult())); - } - - @Test - public void test_generateXSDFromOxmFile( ) { - - SchemaVersion v = schemaVersions.getAppRootVersion(); - String fileContent = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - fileContent = htmlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } -// logger.debug(fileContent); - assertThat(fileContent, is(new HTMLfromOXMTest().HTMLresult())); - } - - @Test - public void testGetAPIVersion() { - GenerateXsd.apiVersion = schemaVersions.getAppRootVersion().toString(); - assertThat(GenerateXsd.getAPIVersion(),is("v11")); - } - - @Test - public void testGetYamlDir() { - assertThat(GenerateXsd.getYamlDir(),is("aai-schema/src/main/resources/onap/aai_swagger_yaml")); - } - - @Test - public void testGetResponsesUrl() { - assertNull(GenerateXsd.getResponsesUrl()); - } -} - diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteFootnoteSetTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteFootnoteSetTest.java deleted file mode 100644 index 633d7891..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteFootnoteSetTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; -import static org.mockito.Mockito.*; - -import java.util.Arrays; -import java.util.Collection; - -import org.mockito.runners.MockitoJUnitRunner; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.hamcrest.CoreMatchers.is; -import org.mockito.BDDMockito; -import org.mockito.InjectMocks; -import org.hamcrest.Matcher; -import org.junit.runners.*; -import org.junit.runners.Parameterized.Parameters; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; - -@RunWith(Parameterized.class) -public class DeleteFootnoteSetTest { - String targetNode; - String flavor; - String result; - DeleteFootnoteSet footnotes = null; - - @Parameters - public static Collection<String[]> testConditions() { - String inputs [][] = { - {"vserver","(1)", "\n -(1) IF this VSERVER node is deleted, this FROM node is DELETED also\n"}, - {"ctag-pool","(2)", "\n -(2) IF this CTAG-POOL node is deleted, this TO node is DELETED also\n"}, - {"pserver","(3)", "\n -(3) IF this FROM node is deleted, this PSERVER is DELETED also\n"}, - {"oam-network","(4)", "\n -(4) IF this TO node is deleted, this OAM-NETWORK is DELETED also\n"}, - {"dvs-switch","(1)", "\n -(1) IF this DVS-SWITCH node is deleted, this FROM node is DELETED also\n"}, - {"availability-zone","(3)", "\n -(3) IF this FROM node is deleted, this AVAILABILITY-ZONE is DELETED also\n"} - }; - return (Arrays.asList(inputs)); - } - - public DeleteFootnoteSetTest(String targetNode, String flavor, String result) { - super(); - this.targetNode = targetNode; - this.flavor = flavor; - this.result=result; - } - - @Before - public void setUp() throws Exception { - footnotes = new DeleteFootnoteSet(this.targetNode); - } - - @Test - public void testDeleteFootnoteSet() { - assertThat(footnotes.targetNode, is(this.targetNode)); - } - - @Test - public void testAdd() { - footnotes.add(this.flavor); - assertThat(footnotes.footnotes.size(), is(1)); - } - - @Test - public void testToString() { - footnotes.add(this.flavor); - assertThat(footnotes.toString(), is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteOperationTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteOperationTest.java deleted file mode 100644 index 812cd087..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/DeleteOperationTest.java +++ /dev/null @@ -1,82 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.Collection; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(Parameterized.class) -public class DeleteOperationTest { - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String result; - - @Parameters - public static Collection<String []> testConditions() { - String inputs [][] = { - {"NetworkGenericVnfsGenericVnf","generic-vnf","Network","/network/generic-vnfs/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__\n"," delete:\n tags:\n - Network\n summary: delete an existing generic-vnf\n description: delete an existing generic-vnf\n operationId: deleteNetworkGenericVnfsGenericVnf\n consumes:\n - application/json\n - application/xml\n produces:\n - application/json\n - application/xml\n responses:\n \"default\":\n null parameters:\n - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__\n - name: resource-version\n in: query\n description: resource-version for concurrency\n required: true\n type: string\n"}, -// if ( StringUtils.isEmpty(tag) ) - {"GenericVnf","generic-vnf","","/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__\n",""}, -// Test: if ( !path.endsWith("/relationship") && !path.endsWith("}") ) - {"CloudInfrastructurePserversPserverPInterfaces","p-interfaces","CloudInfrastructure","/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces"," - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__",""}, -// {"","ctag-pool","","","",""}, -// {"","pserver","","","",""}, -// {"","oam-network","","","",""}, -// {"","dvs-switch","","","",""}, -// {"","availability-zone","","","",""} - }; - return Arrays.asList(inputs); - } - - public DeleteOperationTest(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, String result) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams=pathParams; - this.result = result; - } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - } - - @Test - public void testToString() { - DeleteOperation delete = new DeleteOperation(useOpId, xmlRootElementName, tag, path, pathParams); - String modResult = delete.toString(); - assertThat(modResult, is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/EdgeDescriptionTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/EdgeDescriptionTest.java deleted file mode 100644 index f6684f43..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/EdgeDescriptionTest.java +++ /dev/null @@ -1,353 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -import java.util.Arrays; -import java.util.List; -import java.util.Map; -import java.util.SortedSet; -import java.util.TreeSet; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.aai.config.ConfigConfiguration; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.setup.ConfigTranslator; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.testutils.TestUtilConfigTranslatorforEdges; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import com.google.common.collect.Multimap; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = {ConfigConfiguration.class, TestUtilConfigTranslatorforEdges.class, EdgeIngestor.class}) -@TestPropertySource(properties = {"schemaIngestPropLoc = src/test/resources/schemaIngest/schemaIngestTest.properties"}) - - -public class EdgeDescriptionTest { - private static final String EDGEFILENAME = "src/test/resources/dbedgerules/EdgeDescriptionRules_test.json"; - @Autowired - ConfigTranslator ct; - @Autowired - EdgeIngestor edgeIngestor; - String nodeName = "availability-zone"; - String toNode = "complex"; - SchemaVersion v10 = new SchemaVersion("v10"); - @BeforeClass - public static void setUpBeforeClass() throws Exception { - String json = "{" - + " \"rules\": [" - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"complex\"," - + " \"label\": \"org.onap.relationships.inventory.LocatedIn\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"this description\"" - + " }," - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"service-capability\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"cloud-region\"," - + " \"label\": \"org.onap.relationships.inventory.BelongsTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"!${direction}\"," - + " \"delete-other-v\": \"!${direction}\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"NONE\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"ctag-pool\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"${direction}\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"dvs-switch\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"generic-vnf\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.Uses\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"${direction}\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"pserver\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.MemberOf\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"${direction}\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"vce\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.Uses\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " ]}"; - BufferedWriter bw = new BufferedWriter(new FileWriter(EDGEFILENAME)); - bw.write(json); - bw.close(); - } - @AfterClass - public static void tearDownAfterClass() throws Exception { - File edges = new File(EDGEFILENAME); - edges.delete(); - } - @Before - public void setUp() throws Exception { - - } - @Test - public void test() { - - Map<SchemaVersion, List<String>> edges = ct.getEdgeFiles(); - assertTrue(edges.containsKey(v10)); - assertTrue(1 == edges.get(v10).size()); - assertTrue("src/test/resources/dbedgerules/DbEdgeBusinessRules_test.json".equals(edges.get(v10).get(0))); - } - @Test - public void testGetDeleteOtherV() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"NONE"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getDeleteOtherV(), is(target)); } ); - } - } - - @Test - public void testGetPreventDelete() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"IN"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getPreventDelete(), is(target)); } ); - } - } - - @Test - public void testGetAlsoDeleteFootnote() throws EdgeRuleNotFoundException { -// String toNode="cloud-region"; -// String target = "availability-zone"+"|"+toNode+"-"+"(4)"; - List<String> notedTypes = Arrays.asList("cloud-region", "ctag-pool"); - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals("availability-zone") && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); String target = ed.getRuleKey()+"-"+(notedTypes.contains(ed.getTo()) ? "(4)" : ""); assertThat(ed.getRuleKey()+"-"+ed.getAlsoDeleteFootnote(ed.getFrom()), is(target)); } ); - } -/* - for (EdgeDescription ed : edges) { - String modResult = ed.getRuleKey() + "-" + ed.getAlsoDeleteFootnote(ed.getFrom()); - assertThat(modResult, is(target)); - ed.setDeleteOtherV("IN"); - target = "availability-zone"+"|"+"complex"+"-"+"(4)"; - modResult = ed.getRuleKey() + "-" + ed.getAlsoDeleteFootnote(ed.getFrom()); - assertThat(modResult, is(target)); - target = "availability-zone"+"|"+"complex"+"-"+"(1)"; - modResult = ed.getRuleKey() + "-" + ed.getAlsoDeleteFootnote(ed.getTo()); - assertThat(modResult, is(target)); - ed.setDeleteOtherV("OUT"); - target = "availability-zone"+"|"+"complex"+"-"+"(2)"; - modResult = ed.getRuleKey() + "-" + ed.getAlsoDeleteFootnote(ed.getFrom()); - assertThat(modResult, is(target)); - target = "availability-zone"+"|"+"complex"+"-"+"(3)"; - modResult = ed.getRuleKey() + "-" + ed.getAlsoDeleteFootnote(ed.getTo()); - assertThat(modResult, is(target)); - } -*/ - } - - @Test - public void testGetTo() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+toNode; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getTo(), is(target)); } ); - } - } - - @Test - public void testGetFrom() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"availability-zone"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getFrom(), is(target)); } ); - } - } - - @Test - public void testGetRuleKey() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey(), is(target)); } ); - } - } - - @Test - public void testGetMultiplicity() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"MANY2ONE"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getMultiplicity(), is(target)); } ); - } - } - - @Test - public void testGetDirection() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"OUT"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getDirection(), is(target)); } ); - } - } - - @Test - public void testGetDescription() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"this description"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getDescription(), is(target)); } ); - } - } - - @Test - public void testGetRelationshipDescription() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"this description"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getDescription(), is(target)); } ); - } - } - - @Test - public void testGetType() throws EdgeRuleNotFoundException { - String toNode = "cloud-region"; - String target = "availability-zone"+"|"+toNode+"-"+"PARENT"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getType(), is(target)); } ); - } - } - - @Test - public void testGetLabel() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"org.onap.relationships.inventory.LocatedIn"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getLabel(), is(target)); } ); - } - } - - @Test - public void testGetShortLabel() throws EdgeRuleNotFoundException { - String target = "availability-zone"+"|"+toNode+"-"+"LocatedIn"; - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(v10); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> (i.getTo().equals(toNode) && (! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); assertThat(ed.getRuleKey()+"-"+ed.getShortLabel(), is(target)); } ); - } - } -} - - diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/GetOperationTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/GetOperationTest.java deleted file mode 100644 index bd4c5f95..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/GetOperationTest.java +++ /dev/null @@ -1,107 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Vector; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(Parameterized.class) -public class GetOperationTest { - private static final Logger logger = LoggerFactory.getLogger("GetOperationTest.class"); - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String result; - - @Parameters - public static Collection<String []> testConditions() { - String inputs [][] = { - {"NetworkGenericVnfsGenericVnf","generic-vnf","Network","/network/generic-vnfs/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"," /network/generic-vnfs/generic-vnf/{vnf-id}:\n get:\n tags:\n - Network\n summary: returns generic-vnf\n description: returns generic-vnf\n operationId: getNetworkGenericVnfsGenericVnf\n produces:\n - application/json\n - application/xml\n responses:\n \"200\":\n description: successful operation\n schema:\n $ref: \"#/getDefinitions/generic-vnf\"\n \"default\":\n null parameters:\n - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"}, - {"GenericVnf","generic-vnf","","/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__",""}, - {"CloudInfrastructurePserversPserverPInterfaces","p-interfaces","CloudInfrastructure","/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces"," - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__"," /cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces:\n get:\n tags:\n - CloudInfrastructure\n summary: returns p-interfaces\n description: returns p-interfaces\n operationId: getCloudInfrastructurePserversPserverPInterfaces\n produces:\n - application/json\n - application/xml\n responses:\n \"200\":\n description: successful operation\n schema:\n $ref: \"#/getDefinitions/p-interfaces\"\n \"default\":\n null parameters:\n - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__ - name: interface-name\n in: query\n description:\n required: false\n type: string - name: prov-status\n in: query\n description:\n required: false\n type: string"}, - // {"","ctag-pool","","","",""}, -// {"","pserver","","","",""}, -// {"","oam-network","","","",""}, -// {"","dvs-switch","","","",""}, -// {"","availability-zone","","","",""} - }; - return Arrays.asList(inputs); - } - - public GetOperationTest(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, String result) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams=pathParams; - this.result = result; - } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - String container = "p-interfaces"; - String queryProps[] = { - " - name: interface-name\n in: query\n description:\n required: false\n type: string", - " - name: prov-status\n in: query\n description:\n required: false\n type: string" - }; - Vector<String> containerProps = new Vector<String>(); - for(String prop : queryProps) { - containerProps.add(prop); - } - GetOperation.addContainerProps(container, containerProps); - } - - @Test - public void testAddContainerProps() { - String container = this.xmlRootElementName; - String prop = " - name: "+container+"\n in: query\n description:\n required: false\n type: string"; - Vector<String> queryProps = new Vector<String>(); - queryProps.add(prop); - for(String p : queryProps) { - logger.debug("qProp="+p); - } - logger.debug("Done="+this.xmlRootElementName); - GetOperation.addContainerProps(container, queryProps); - assertThat(GetOperation.containers.get(container).get(0), is(prop)); - } - - @Test - public void testToString() { - GetOperation get = new GetOperation(useOpId, xmlRootElementName, tag, path, pathParams); - String modResult = get.toString(); - assertThat(modResult, is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/HTMLfromOXMTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/HTMLfromOXMTest.java deleted file mode 100644 index ca63244e..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/HTMLfromOXMTest.java +++ /dev/null @@ -1,384 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.hamcrest.CoreMatchers.is; -import static org.junit.Assert.*; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -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 org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Ignore; -import org.junit.Test; -import org.onap.aai.config.ConfigConfiguration; -import org.onap.aai.config.SwaggerGenerationConfiguration; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.junit.runner.RunWith; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.serialization.queryformats.QueryFormatTestHelper; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.testutils.TestUtilConfigTranslatorforBusiness; -import org.onap.aai.util.AAIConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.w3c.dom.Element; - - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { - ConfigConfiguration.class, - TestUtilConfigTranslatorforBusiness.class, - EdgeIngestor.class, - NodeIngestor.class, - SwaggerGenerationConfiguration.class - -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai", - "schema.xsd.maxoccurs = 5000" -}) -public class HTMLfromOXMTest { - private static final Logger logger = LoggerFactory.getLogger("HTMLfromOXMTest.class"); - private static final String OXMFILENAME = "src/test/resources/oxm/business_oxm_v11.xml"; - public static AnnotationConfigApplicationContext ctx = null; - private static String testXML; - protected static final String SERVICE_NAME = "JUNIT"; - - - @Autowired - HTMLfromOXM htmlFromOxm; - - @Autowired - SchemaVersions schemaVersions; - - @BeforeClass - public static void setUpContext() throws Exception { - - } - @BeforeClass - public static void setupBundleconfig() throws Exception { - System.setProperty("AJSC_HOME", "."); - System.setProperty("BUNDLECONFIG_DIR", "src/test/resources/bundleconfig-local"); - System.setProperty("aai.service.name", SERVICE_NAME); - QueryFormatTestHelper.setFinalStatic(AAIConstants.class.getField("AAI_HOME_ETC_OXM"), "src/test/resources/bundleconfig-local/etc/oxm/"); - } - - @Before - public void setUp() throws Exception { - setUp(0); - } - - public void setUp(int sbopt) throws Exception - { - XSDElementTest x = new XSDElementTest(); - x.setUp(sbopt); - testXML = x.testXML; - logger.debug(testXML); - BufferedWriter bw = new BufferedWriter(new FileWriter(OXMFILENAME)); - bw.write(testXML); - bw.close(); - } - - @Test - public void testGetDocumentHeader() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String header = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - htmlFromOxm.setSchemaVersions(schemaVersions); - header = htmlFromOxm.getDocumentHeader(); - } catch(Exception e) { - e.printStackTrace(); - } - logger.debug("Header:"); - logger.debug(header); - assertThat(header, is(HTMLheader())); - } - - @Test - public void testProcess() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String fileContent = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - fileContent = htmlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - logger.debug("FileContent-I:"); - logger.debug(fileContent); - assertThat(fileContent, is(HTMLresult(0))); - } - - @Test - public void testProcessWithCombiningJavaTypes() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String fileContent = null; - try { - setUp(1); - htmlFromOxm.setXmlVersion(testXML, v); - fileContent = htmlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - logger.debug("FileContent-I:"); - logger.debug(fileContent); - assertThat(fileContent, is(HTMLresult(1))); - } - - @Test - public void testHTMLfromOXMFileVersion() throws IOException { - String outfileName = "testXML.xml"; - File XMLfile = new File(outfileName); - XMLfile.createNewFile(); - BufferedWriter bw = null; - Charset charset = Charset.forName("UTF-8"); - Path path = Paths.get(outfileName); - bw = Files.newBufferedWriter(path, charset); - bw.write(testXML); - bw.close(); - SchemaVersion v = schemaVersions.getAppRootVersion(); - String fileContent = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - fileContent = htmlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - XMLfile.delete(); - logger.debug("FileContent-I:"); - logger.debug(fileContent); - assertThat(fileContent, is(HTMLresult(0))); - } - - @Test - public void testHTMLfromOXMStringVersion() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String fileContent = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - fileContent = htmlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - logger.debug("FileContent-II:"); - logger.debug(fileContent); - assertThat(fileContent, is(HTMLresult(0))); - } - - @Test - public void testProcessJavaTypeElement() { - String target = "Element=java-type/Customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - Element customer = null; - try { - htmlFromOxm.setXmlVersion(testXML, v); - htmlFromOxm.process(); - customer = htmlFromOxm.getJavaTypeElementSwagger("Customer"); - } catch(Exception e) { - e.printStackTrace(); - } - logger.debug("Element:"); - logger.debug("Element="+customer.getNodeName()+"/"+customer.getAttribute("name")); - assertThat("Element="+customer.getNodeName()+"/"+customer.getAttribute("name"), is(target)); } - - public String HTMLresult() { - return HTMLresult(0); - } - - public String HTMLresult(int sbopt) { - StringBuilder sb = new StringBuilder(32368); - sb.append(HTMLheader()); - sb.append(HTMLdefs(sbopt)); - return sb.toString(); - } - - public String HTMLheader() { - StringBuilder sb = new StringBuilder(1500); - sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append("<xs:schema elementFormDefault=\"qualified\" version=\"1.0\" targetNamespace=\"http://org.onap.aai.inventory/v11\" xmlns:tns=\"http://org.onap.aai.inventory/v11\" xmlns:xs=\"http://www.w3.org/2001/XMLSchema\"" + OxmFileProcessor.LINE_SEPARATOR + "xmlns:jaxb=\"http://java.sun.com/xml/ns/jaxb\"" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" jaxb:version=\"2.1\"" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" xmlns:annox=\"http://annox.dev.java.net\"" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" jaxb:extensionBindingPrefixes=\"annox\">" + OxmFileProcessor.DOUBLE_LINE_SEPARATOR); - return sb.toString(); - } - - public String HTMLdefs() { - return HTMLdefs(0); - } - public String HTMLdefs(int sbopt) { - StringBuilder sb = new StringBuilder(1500); - sb.append(" <xs:element name=\"service-subscription\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"Object that group service instances.\",indexedProps=\"service-type\",dependentOn=\"customer\",container=\"service-subscriptions\",crossEntityReference=\"service-instance,service-type\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"service-type\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(isKey=true,description=\"Value defined by orchestration to identify this service.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"temp-ub-sub-account-id\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"This property will be deleted from A&AI in the near future. Only stop gap solution.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"resource-version\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"service-subscriptions\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"Collection of objects that group service instances.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element ref=\"tns:service-subscription\" minOccurs=\"0\" maxOccurs=\"5000\"/>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"customer\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - if ( sbopt == 0 ) { - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"customer identifiers to provide linkage back to BSS information.\",nameProps=\"subscriber-name\",indexedProps=\"subscriber-name,global-customer-id,subscriber-type\",searchable=\"global-customer-id,subscriber-name\",uniqueProps=\"global-customer-id\",container=\"customers\",namespace=\"business\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - } else { - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"customer identifiers to provide linkage back to BSS information.\",nameProps=\"subscriber-name\",indexedProps=\"subscriber-type,subscriber-name,global-customer-id\",searchable=\"global-customer-id,subscriber-name\",uniqueProps=\"global-customer-id\",container=\"customers\",namespace=\"business\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - } - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"global-customer-id\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(isKey=true,description=\"Global customer id used across to uniquely identify customer.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"subscriber-name\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Subscriber name, an alternate way to retrieve a customer.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - if ( sbopt == 0 ) { - sb.append(" <xs:element name=\"subscriber-type\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Subscriber type, a way to provide VID with only the INFRA customers.\",defaultValue=\"CUST\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"resource-version\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - } else { - sb.append(" <xs:element name=\"resource-version\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"subscriber-type\" type=\"xs:string\" minOccurs=\"0\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"field\">@org.onap.aai.annotations.Metadata(description=\"Subscriber type, a way to provide VID with only the INFRA customers.\",defaultValue=\"CUST\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - - } - sb.append(" <xs:element ref=\"tns:service-subscriptions\" minOccurs=\"0\"/>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"customers\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"Collection of customer identifiers to provide linkage back to BSS information.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element ref=\"tns:customer\" minOccurs=\"0\" maxOccurs=\"5000\"/>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"business\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <annox:annotate target=\"class\">@org.onap.aai.annotations.Metadata(description=\"Namespace for business related constructs\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element ref=\"tns:customers\" minOccurs=\"0\"/>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element name=\"inventory\">" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" <xs:element ref=\"tns:business\" minOccurs=\"0\"/>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:sequence>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:complexType>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append(" </xs:element>" + OxmFileProcessor.LINE_SEPARATOR); - sb.append("</xs:schema>" + OxmFileProcessor.LINE_SEPARATOR); - return sb.toString(); - } -} - diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/NodeGetOperationTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/NodeGetOperationTest.java deleted file mode 100644 index 54013b7c..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/NodeGetOperationTest.java +++ /dev/null @@ -1,109 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.Collection; -import java.util.Vector; - -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(Parameterized.class) -public class NodeGetOperationTest { - private static final Logger logger = LoggerFactory.getLogger("NodeGetOperationTest.class"); - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String result; - - @Parameters - public static Collection<String []> testConditions() { - String inputs [][] = { - {"NetworkGenericVnfsGenericVnf","generic-vnf","Network","/network/generic-vnfs/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"," /nodes/generic-vnfs/generic-vnf/{vnf-id}:\n get:\n tags:\n - Operations\n summary: returns generic-vnf\n description: returns generic-vnf\n operationId: getNetworkGenericVnfsGenericVnf\n produces:\n - application/json\n - application/xml\n responses:\n \"200\":\n description: successful operation\n schema:\n $ref: \"#/definitions/generic-vnf\"\n \"default\":\n null\n parameters:\n - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"}, - {"GenericVnf","generic-vnf","","/Network/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__",""}, - {"CloudInfrastructurePserversPserverPInterfaces","p-interfaces","CloudInfrastructure","/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces"," - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__"," /nodes/p-interfaces?parameter=value[¶meter2=value2]:\n get:\n tags:\n - Operations\n summary: returns p-interfaces\n description: returns p-interfaces\n operationId: getCloudInfrastructurePserversPserverPInterfaces\n produces:\n - application/json\n - application/xml\n responses:\n \"200\":\n description: successful operation\n schema:\n $ref: \"#/definitions/p-interfaces\"\n \"default\":\n null\n parameters:\n - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__\n - name: interface-name\n in: query\n description:\n required: false\n type: string - name: prov-status\n in: query\n description:\n required: false\n type: string"}, - // {"","ctag-pool","","","",""}, -// {"","pserver","","","",""}, -// {"","oam-network","","","",""}, -// {"","dvs-switch","","","",""}, -// {"","availability-zone","","","",""} - }; - return Arrays.asList(inputs); - } - - public NodeGetOperationTest(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, String result) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams=pathParams; - this.result = result; - } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - String container = "p-interfaces"; - String queryProps[] = { - " - name: interface-name\n in: query\n description:\n required: false\n type: string", - " - name: prov-status\n in: query\n description:\n required: false\n type: string" - }; - Vector<String> containerProps = new Vector<String>(); - for(String prop : queryProps) { - containerProps.add(prop); - } - NodeGetOperation.addContainerProps(container, containerProps); - } - - @Test - public void testAddContainerProps() { - String container = this.xmlRootElementName; - String prop = " - name: "+container+"\n in: query\n description:\n required: false\n type: string"; - Vector<String> queryProps = new Vector<String>(); - queryProps.add(prop); - String props=null; - for(String p : queryProps) { - props += "qProp="+p+"\n"; -// logger.debug("qProp="+p); - } -// logger.debug("Done="+this.xmlRootElementName); - NodeGetOperation.addContainerProps(container, queryProps); - assertThat(props+"Done="+this.xmlRootElementName,NodeGetOperation.containers.get(container).get(0), is(prop)); - } - - @Test - public void testToString() { - NodeGetOperation get = new NodeGetOperation(useOpId, xmlRootElementName, tag, path, pathParams); - String modResult = get.toString(); - assertThat(modResult, is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/NodesYAMLfromOXMTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/NodesYAMLfromOXMTest.java deleted file mode 100644 index b08ddcee..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/NodesYAMLfromOXMTest.java +++ /dev/null @@ -1,636 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.hamcrest.CoreMatchers.is; - -import static org.junit.Assert.*; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -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 org.apache.commons.lang.StringUtils; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.onap.aai.AAISetup; -import org.onap.aai.config.ConfigConfiguration; -import org.onap.aai.config.SwaggerGenerationConfiguration; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.junit.runner.RunWith; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.testutils.TestUtilConfigTranslatorforEdges; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.w3c.dom.Element; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { - ConfigConfiguration.class, - TestUtilConfigTranslatorforEdges.class, - EdgeIngestor.class, - NodeIngestor.class, - SwaggerGenerationConfiguration.class - -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai", - "schema.xsd.maxoccurs = 5000" -}) -public class NodesYAMLfromOXMTest { -//public class NodesYAMLfromOXMTest extends AAISetup { - private static final Logger logger = LoggerFactory.getLogger("NodesYAMLfromOXMTest.class"); - private static final String OXMFILENAME = "src/test/resources/oxm/business_v11.xml"; - private static final String EDGEFILENAME = "src/test/resources/dbedgerules/EdgeDescriptionRules_test.json"; - public static AnnotationConfigApplicationContext ctx = null; - private static String testXML; - - @Autowired - NodesYAMLfromOXM nodesYamlFromOxm; - @Autowired - SchemaVersions schemaVersions; - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - XSDElementTest x = new XSDElementTest(); - x.setUp(); - testXML = x.testXML; - logger.debug(testXML); - BufferedWriter bw = new BufferedWriter(new FileWriter(OXMFILENAME)); - bw.write(testXML); - bw.close(); - BufferedWriter bw1 = new BufferedWriter(new FileWriter(EDGEFILENAME)); - bw1.write(YAMLfromOXMTest.EdgeDefs()); - bw1.close(); - - - } - - @Before - public void setUp() throws Exception { - - NodeGetOperation.checklist.clear(); - XSDElementTest x = new XSDElementTest(); - x.setUp(); - testXML = x.testXML; - - logger.debug(testXML); - } - - @Test - public void testGetDocumentHeader() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String header = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - nodesYamlFromOxm.process(); - header = nodesYamlFromOxm.getDocumentHeader(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Header:\n"+header,header, is(YAMLheader())); - } - - @Test - public void testProcess() { - - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - fileContent = nodesYamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("FileContent-I:\n"+fileContent,fileContent, is(YAMLresult())); - } - - @Test - public void testNodesYAMLfromOXMFileVersionFile() throws IOException { - String outfileName = "testXML.xml"; - File XMLfile = new File(outfileName); - XMLfile.createNewFile(); - BufferedWriter bw = null; - Charset charset = Charset.forName("UTF-8"); - Path path = Paths.get(outfileName); - bw = Files.newBufferedWriter(path, charset); - bw.write(testXML); - bw.close(); - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - fileContent = nodesYamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - XMLfile.delete(); - assertThat("FileContent:\n"+fileContent,fileContent, is(YAMLresult())); - } - - @Test - public void testNodesYAMLfromOXMStringVersionFile() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - fileContent = nodesYamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("FileContent-II:\n"+fileContent,fileContent, is(YAMLresult())); - } - - @Test - public void testAppendDefinitions() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String definitions = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - nodesYamlFromOxm.process(); - definitions = nodesYamlFromOxm.appendDefinitions(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Definitions:\n"+definitions,definitions, is(YAMLgetDefs())); - } - - @Test - public void testGetXMLRootElementName() { - String target = "RootElement=customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - Element customer = null; - String root = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - nodesYamlFromOxm.process(); - customer = nodesYamlFromOxm.getJavaTypeElementSwagger("Customer"); - root = nodesYamlFromOxm.getXMLRootElementName(customer); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("RootElement="+root, is(target)); - } - - @Test - public void testGetXmlRootElementName() { - String target = "RootElement=customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String root = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - nodesYamlFromOxm.process(); - root = nodesYamlFromOxm.getXmlRootElementName("Customer"); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("RootElement="+root, is(target)); - } - - @Test - public void testGetJavaTypeElementSwagger() { - String target = "Element=java-type/Customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - Element customer = null; - try { - nodesYamlFromOxm.setXmlVersion(testXML, v); - nodesYamlFromOxm.process(); - customer = nodesYamlFromOxm.getJavaTypeElementSwagger("Customer"); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Element="+customer.getNodeName()+"/"+customer.getAttribute("name"), is(target)); - } - - public String YAMLresult() { - StringBuilder sb = new StringBuilder(32368); - sb.append(YAMLheader()); - sb.append(YAMLops()); -// sb.append(YAMLdefs()); -// sb.append(YAMLpatchDefs()); - sb.append(YAMLgetDefs()); - return sb.toString(); - } - public String YAMLheader() { - StringBuilder sb = new StringBuilder(1500); - sb.append("swagger: \"2.0\"\n"); - sb.append("info:\n"); - sb.append(" description: |\n"); - sb.append("\n"); - sb.append(" [Differences versus the previous schema version](apidocs/aai_swagger_v11.diff)\n"); - sb.append("\n"); - sb.append(" Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.\n"); - sb.append("\n"); - sb.append(" Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except in compliance with the License.\n"); - sb.append("\n"); - sb.append(" You may obtain a copy of the License at\n"); - sb.append("\n"); - sb.append(" (https://creativecommons.org/licenses/by/4.0/)\n"); - sb.append("\n"); - sb.append(" 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.\n"); - sb.append("\n"); - sb.append(" This document is best viewed with Firefox or Chrome. Nodes can be found by appending /#/definitions/node-type-to-find to the path to this document. Edge definitions can be found with the node definitions.\n"); - sb.append(" version: \"v11\"\n"); - sb.append(" title: Active and Available Inventory REST API\n"); - sb.append(" license:\n"); - sb.append(" name: Apache 2.0\n"); - sb.append(" url: http://www.apache.org/licenses/LICENSE-2.0.html\n"); - sb.append(" contact:\n"); - sb.append(" name:\n"); - sb.append(" url:\n"); - sb.append(" email:\n"); - sb.append("host:\n"); - sb.append("basePath: /aai/v11\n"); - sb.append("schemes:\n"); - sb.append(" - https\n"); - sb.append("paths:\n"); - return sb.toString(); - } - - public String YAMLops() { - StringBuilder sb = new StringBuilder(16384); - sb.append(" /nodes/customers/customer/{global-customer-id}:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Operations\n"); - sb.append(" summary: returns customer\n"); - sb.append(" description: returns customer\n"); - sb.append(" operationId: getBusinessCustomersCustomer\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null\n parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" /nodes/customers?parameter=value[¶meter2=value2]:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Operations\n"); - sb.append(" summary: returns customers\n"); - sb.append(" description: returns customers\n"); - sb.append(" operationId: getBusinessCustomers\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/definitions/customers\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null\n parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: query\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: subscriber-name\n"); - sb.append(" in: query\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" example: __SUBSCRIBER-NAME__\n"); - sb.append(" - name: subscriber-type\n"); - sb.append(" in: query\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" example: __SUBSCRIBER-TYPE__\n"); - sb.append(" /nodes/service-subscriptions?parameter=value[¶meter2=value2]:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Operations\n"); - sb.append(" summary: returns service-subscriptions\n"); - sb.append(" description: returns service-subscriptions\n"); - sb.append(" operationId: getBusinessCustomersCustomerServiceSubscriptions\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/definitions/service-subscriptions\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null\n parameters:\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: query\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" example: __SERVICE-TYPE__\n"); - return sb.toString(); - } - public String YAMLdefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("definitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/definitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (PARENT of service-subscription, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - return sb.toString(); - } - public String YAMLpatchDefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("patchDefinitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/patchDefinitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/patchDefinitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/patchDefinitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/patchDefinitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/patchDefinitions/service-subscription\"\n"); - return sb.toString(); - } - public String YAMLgetDefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("definitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/definitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (PARENT of service-subscription, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - return sb.toString(); - } -} - diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/PatchOperationTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/PatchOperationTest.java deleted file mode 100644 index 7706e09c..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/PatchOperationTest.java +++ /dev/null @@ -1,81 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.Collection; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(Parameterized.class) -public class PatchOperationTest { - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String result; - - @Parameters - public static Collection<String []> testConditions() { - String inputs [][] = { - {"NetworkGenericVnfsGenericVnf","generic-vnf","Network","/network/generic-vnfs/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"," patch:\n tags:\n - Network\n summary: update an existing generic-vnf\n description: |\n Update an existing generic-vnf\n #\n Note: Endpoints that are not devoted to object relationships support both PUT and PATCH operations.\n The PUT operation will entirely replace an existing object.\n The PATCH operation sends a \"description of changes\" for an existing object. The entire set of changes must be applied. An error result means no change occurs.\n #\n Other differences between PUT and PATCH are:\n #\n - For PATCH, you can send any of the values shown in sample REQUEST body. There are no required values.\n - For PATCH, resource-id which is a required REQUEST body element for PUT, must not be sent.\n - PATCH cannot be used to update relationship elements; there are dedicated PUT operations for this.\n operationId: UpdateNetworkGenericVnfsGenericVnf\n consumes:\n - application/json\n produces:\n - application/json\n responses:\n \"default\":\n null parameters:\n - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__ - name: body\n in: body\n description: generic-vnf object that needs to be updated.\n required: true\n schema:\n $ref: \"#/patchDefinitions/generic-vnf\"\n"}, -// if ( StringUtils.isEmpty(tag) ) - {"GenericVnf","generic-vnf","","/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__",""}, -// Test: if ( !path.endsWith("/relationship") && !path.endsWith("}") ) - {"CloudInfrastructurePserversPserverPInterfaces","p-interfaces","CloudInfrastructure","/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces"," - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__",""}, - // {"","ctag-pool","","","",""}, -// {"","pserver","","","",""}, -// {"","oam-network","","","",""}, -// {"","dvs-switch","","","",""}, -// {"","availability-zone","","","",""} - }; - return Arrays.asList(inputs); - } - - public PatchOperationTest(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, String result) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams=pathParams; - this.result = result; - } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - } - - @Test - public void testToString() { - PatchOperation patch = new PatchOperation(useOpId, xmlRootElementName, tag, path, pathParams); - String modResult = patch.toString(); - assertThat(modResult, is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/PutOperationTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/PutOperationTest.java deleted file mode 100644 index 23eb469a..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/PutOperationTest.java +++ /dev/null @@ -1,83 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; - -import java.util.Arrays; -import java.util.Collection; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; -import org.onap.aai.setup.SchemaVersion; - -import static org.hamcrest.CoreMatchers.is; - -@RunWith(Parameterized.class) -public class PutOperationTest { - private String useOpId; - private String xmlRootElementName; - private String tag; - private String path; - private String pathParams; - private String result; - private static SchemaVersion v = new SchemaVersion("v14"); - - @Parameters - public static Collection<String []> testConditions() { - String inputs [][] = { - {"NetworkGenericVnfsGenericVnf","generic-vnf","Network","/network/generic-vnfs/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__"," put:\n tags:\n - Network\n summary: create or update an existing generic-vnf\n description: |\n Create or update an existing generic-vnf.\n #\n Note! This PUT method has a corresponding PATCH method that can be used to update just a few of the fields of an existing object, rather than a full object replacement. An example can be found in the [PATCH section] below\n operationId: createOrUpdateNetworkGenericVnfsGenericVnf\n consumes:\n - application/json\n - application/xml\n produces:\n - application/json\n - application/xml\n responses:\n \"default\":\n null parameters:\n - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__ - name: body\n in: body\n description: generic-vnf object that needs to be created or updated. [Valid relationship examples shown here](apidocs/relations/"+v.toString()+"/NetworkGenericVnfsGenericVnf.json)\n required: true\n schema:\n $ref: \"#/definitions/generic-vnf\"\n"}, -// if ( StringUtils.isEmpty(tag) ) - {"GenericVnf","generic-vnf","","/generic-vnf/{vnf-id}"," - name: vnf-id\n in: path\n description: Unique id of VNF. This is unique across the graph.\n required: true\n type: string\n example: __VNF-ID__",""}, -// Test: if ( !path.endsWith("/relationship") && !path.endsWith("}") ) - {"CloudInfrastructurePserversPserverPInterfaces","p-interfaces","CloudInfrastructure","/cloud-infrastructure/pservers/pserver/{hostname}/p-interfaces"," - name: hostname\n in: path\n description: Value from executing hostname on the compute node.\n required: true\n type: string\n example: __HOSTNAME__",""}, - // {"","ctag-pool","","","",""}, -// {"","pserver","","","",""}, -// {"","oam-network","","","",""}, -// {"","dvs-switch","","","",""}, -// {"","availability-zone","","","",""} - }; - return Arrays.asList(inputs); - } - - public PutOperationTest(String useOpId, String xmlRootElementName, String tag, String path, String pathParams, String result) { - super(); - this.useOpId = useOpId; - this.xmlRootElementName = xmlRootElementName; - this.tag = tag; - this.path = path; - this.pathParams=pathParams; - this.result = result; - } - @BeforeClass - public static void setUpBeforeClass() throws Exception { - - } - - @Test - public void testToString() { - PutOperation put = new PutOperation(useOpId, xmlRootElementName, tag, path, pathParams, v); - String modResult = put.toString(); - assertThat(modResult, is(this.result)); - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/PutRelationPathSetTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/PutRelationPathSetTest.java deleted file mode 100644 index c39479f5..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/PutRelationPathSetTest.java +++ /dev/null @@ -1,259 +0,0 @@ -/** - * ============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.util.genxsd; - -import org.junit.AfterClass; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.onap.aai.util.GenerateXsd; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; - -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.MatcherAssert.assertThat; -import static org.junit.Assert.assertTrue; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { - SchemaVersions.class, - EdgeIngestor.class -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai" -}) -@Ignore("This test needs to get major rework done as it is written very poorly") -public class PutRelationPathSetTest { - private static final String EDGEFILENAME = "src/test/resources/dbedgerules/EdgeDescriptionRules_test.json"; - - private static String json; - private SchemaVersion v ; - private File relationsFile ; - private String target = "/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/availability-zones/availability-zone/{availability-zone-name}/relationship-list/relationship"; - private String opId = "createOrUpdateCloudInfrastructureCloudRegionsCloudRegionAvailabilityZonesAvailabilityZoneRelationshipListRelationship"; - private String path = "/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/availability-zones/availability-zone/{availability-zone-name}/relationship-list/relationship"; - PutRelationPathSet prp = null; - @Autowired - SchemaVersions schemaVersions; - - @Autowired - EdgeIngestor edgeIngestor; - - - @Before - public void setUpBeforeClass() throws Exception { - v = schemaVersions.getDefaultVersion(); - - relationsFile = new File(GenerateXsd.getYamlDir() + "/relations/" + v.toString()+"/createOrUpdateCloudInfrastructureCloudRegionsCloudRegionAvailabilityZonesAvailabilityZone.json"); - json = "{" - + " \"rules\": [" - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"complex\"," - + " \"label\": \"org.onap.relationships.inventory.LocatedIn\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"this description\"" - + " }," - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"service-capability\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"availability-zone\"," - + " \"to\": \"cloud-region\"," - + " \"label\": \"org.onap.relationships.inventory.BelongsTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"!${direction}\"," - + " \"delete-other-v\": \"!${direction}\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"NONE\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"ctag-pool\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"dvs-switch\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.AppliesTo\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"generic-vnf\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.Uses\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"${direction}\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"vf-module\"," - + " \"to\": \"vnfc\"," - + " \"label\": \"org.onap.relationships.inventory.Uses\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"ONE2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"${direction}\"," - + " \"prevent-delete\": \"${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"pserver\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.MemberOf\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2ONE\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"${direction}\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " {" - + " \"from\": \"vce\"," - + " \"to\": \"availability-zone\"," - + " \"label\": \"org.onap.relationships.inventory.Uses\"," - + " \"direction\": \"OUT\"," - + " \"multiplicity\": \"MANY2MANY\"," - + " \"contains-other-v\": \"NONE\"," - + " \"delete-other-v\": \"NONE\"," - + " \"SVC-INFRA\": \"NONE\"," - + " \"prevent-delete\": \"!${direction}\"," - + " \"default\": \"true\"," - + " \"description\":\"\"" - + " }," - + " ]}"; - - BufferedWriter bw = new BufferedWriter(new FileWriter(EDGEFILENAME)); - bw.write(json); - bw.close(); - - } - - @Before - public void setUp() throws Exception { - - DeleteOperation.deletePaths.put("/cloud-infrastructure/pservers/pserver/{hostname}","pserver"); - DeleteOperation.deletePaths.put("/network/vces/vce/{vnf-id}","vce"); - DeleteOperation.deletePaths.put("/cloud-infrastructure/complexes/complex/{physical-location-id}","complex"); - DeleteOperation.deletePaths.put("/service-design-and-creation/service-capabilities/service-capability/{service-type}/{vnf-type}","service-capability"); - DeleteOperation.deletePaths.put("/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}","cloud-region"); - DeleteOperation.deletePaths.put("/network/generic-vnfs/generic-vnf/{vnf-id}","generic-vnf"); - DeleteOperation.deletePaths.put("/cloud-infrastructure/cloud-regions/cloud-region/{cloud-owner}/{cloud-region-id}/dvs-switches/dvs-switch/{switch-name}","dvs-switch"); - DeleteOperation.deletePaths.put("/cloud-infrastructure/complexes/complex/{physical-location-id}/ctag-pools/ctag-pool/{target-pe}/{availability-zone-name}","ctag-pool"); - - DeleteOperation.deletePaths.put(path.replace("/relationship-list/relationship", ""),"availability-zone"); - PutRelationPathSet.add(opId, path); - } - @AfterClass - public static void tearDownAfterClass() throws Exception { - File edges = new File(EDGEFILENAME); - edges.delete(); - } - @Test - public void testAdd() { - PutRelationPathSet.add(opId, path); - assertThat(PutRelationPathSet.putRelationPaths.size(), is(1)); - assertThat(PutRelationPathSet.putRelationPaths.get(opId), is(target)); - } - - @Test - public void testPutRelationPathSet() { - - this.prp = new PutRelationPathSet(v); - assertThat(PutRelationPathSet.putRelationPaths.size(), is(1)); - prp.generateRelations(edgeIngestor); - assertTrue(this.relationsFile.exists()); - this.relationsFile.delete(); - } - - @Test - public void testPutRelationPathSetStringString() { - this.prp = new PutRelationPathSet(opId, path, v); - assertThat(PutRelationPathSet.putRelationPaths.size(), is(1)); - } - - @Test - public void testGenerateRelations() { - PutRelationPathSet prp = new PutRelationPathSet(opId, "availability-zone", v); - prp.generateRelations(edgeIngestor); - assertThat(PutRelationPathSet.putRelationPaths.size(), is(1)); - assertThat(PutRelationPathSet.putRelationPaths.get(opId), is(target)); - assertTrue(this.relationsFile.exists()); -// this.relationsFile.delete(); - } - -} - - diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDElementTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDElementTest.java deleted file mode 100644 index 6058ecee..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDElementTest.java +++ /dev/null @@ -1,631 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.junit.Assert.*; -import static org.hamcrest.CoreMatchers.is; -import static org.hamcrest.collection.IsIn.*; -import static org.hamcrest.CoreMatchers.both; -import static org.hamcrest.CoreMatchers.equalTo; -import static org.hamcrest.collection.IsIterableContainingInAnyOrder.containsInAnyOrder; -import static org.hamcrest.core.Every.everyItem; - -import java.io.IOException; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import java.util.Vector; - -import javax.xml.XMLConstants; -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; -import javax.xml.parsers.ParserConfigurationException; - -import org.apache.commons.lang.StringUtils; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.onap.aai.exceptions.AAIException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; -import org.xml.sax.SAXException; - -public class XSDElementTest { - private static final Logger logger = LoggerFactory.getLogger("XSDElementTest.class"); - private static final int maxSizeForXml = 20000; - protected String testXML; - protected Document doc = null; - protected NodeList javaTypeNodes=null; - - public String getTestXML() { - return testXML; - } - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - } - - @Before - public void setUp() throws Exception { - setUp(0); - } - - public void setUp( int sbopt ) throws Exception { - StringBuilder sb = new StringBuilder(maxSizeForXml); - addNamespace(sb); - addBusiness(sb); - addCustomers(sb); - if ( sbopt == 0 ) { - addCustomer(sb); - } else { - addCustomerNoSubscriberType(sb); - addCustomerSubscriberType(sb); - } - addServiceSubscriptions(sb); - addServiceSubscription(sb); - addEndOfXML(sb); - testXML = sb.toString(); - init(); -} - - private void addNamespace(StringBuilder sb){ - sb.append("<xml-bindings xmlns=\"http://www.eclipse.org/eclipselink/xsds/persistence/oxm\" package-name=\"inventory.aai.onap.org.v11\" xml-mapping-metadata-complete=\"true\">\n"); - sb.append("<xml-schema element-form-default=\"QUALIFIED\">\n"); - sb.append("<xml-ns namespace-uri=\"http://org.onap.aai.inventory/v11\" />\n"); - sb.append("</xml-schema>\n"); - sb.append("<java-types>\n"); - sb.append("<java-type name=\"Inventory\">\n"); - sb.append("<xml-root-element name=\"inventory\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"business\" name=\"business\" type=\"inventory.aai.onap.org.v11.Business\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - private void addBusiness(StringBuilder sb){ - sb.append("<java-type name=\"Business\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Namespace for business related constructs\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("<xml-root-element name=\"business\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"customers\" name=\"customers\" type=\"inventory.aai.onap.org.v11.Customers\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - private void addCustomers(StringBuilder sb){ - sb.append("<java-type name=\"Customers\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Collection of customer identifiers to provide linkage back to BSS information.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("<xml-root-element name=\"customers\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"customer\" name=\"customer\" type=\"inventory.aai.onap.org.v11.Customer\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"maximumDepth\" value=\"0\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</java-type>\n"); - } - - private void addCustomer(StringBuilder sb){ - sb.append("<java-type name=\"Customer\">\n"); - sb.append("<xml-root-element name=\"customer\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"globalCustomerId\" name=\"global-customer-id\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Global customer id used across to uniquely identify customer.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"subscriberName\" name=\"subscriber-name\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Subscriber name, an alternate way to retrieve a customer.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n"); - sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n"); -// sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n"); - sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n"); - sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id,subscriber-type\" />\n"); - sb.append("<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n"); - sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n"); - sb.append("<xml-property name=\"container\" value=\"customers\" />\n"); - sb.append("<xml-property name=\"namespace\" value=\"business\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</java-type>\n"); - } - - private void addCustomerNoSubscriberType(StringBuilder sb){ - sb.append("<java-type name=\"Customer\">\n"); - sb.append("<xml-root-element name=\"customer\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"globalCustomerId\" name=\"global-customer-id\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Global customer id used across to uniquely identify customer.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"subscriberName\" name=\"subscriber-name\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Subscriber name, an alternate way to retrieve a customer.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"serviceSubscriptions\" name=\"service-subscriptions\" type=\"inventory.aai.onap.org.v11.ServiceSubscriptions\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"customer identifiers to provide linkage back to BSS information.\" />\n"); - sb.append("<xml-property name=\"nameProps\" value=\"subscriber-name\" />\n"); - sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-name,global-customer-id\" />\n"); - sb.append("<xml-property name=\"searchable\" value=\"global-customer-id,subscriber-name\" />\n"); - sb.append("<xml-property name=\"uniqueProps\" value=\"global-customer-id\" />\n"); - sb.append("<xml-property name=\"container\" value=\"customers\" />\n"); - sb.append("<xml-property name=\"namespace\" value=\"business\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</java-type>\n"); - } - - private void addCustomerSubscriberType(StringBuilder sb){ - sb.append("<java-type name=\"Customer\">\n"); - sb.append("<xml-root-element name=\"customer\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"subscriberType\" name=\"subscriber-type\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Subscriber type, a way to provide VID with only the INFRA customers.\" />\n"); - sb.append("<xml-property name=\"defaultValue\" value=\"CUST\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("</java-attributes>\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"indexedProps\" value=\"subscriber-type\" />\n"); - sb.append("<xml-property name=\"container\" value=\"customers\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</java-type>\n"); - } - - private void addServiceSubscriptions(StringBuilder sb){ - sb.append("<java-type name=\"ServiceSubscriptions\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Collection of objects that group service instances.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("<xml-root-element name=\"service-subscriptions\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"serviceSubscription\" name=\"service-subscription\" type=\"inventory.aai.onap.org.v11.ServiceSubscription\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - private void addServiceSubscription(StringBuilder sb){ - sb.append("<java-type name=\"ServiceSubscription\">\n"); - sb.append("<xml-root-element name=\"service-subscription\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"serviceType\" name=\"service-type\" required=\"true\" type=\"java.lang.String\" xml-key=\"true\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Value defined by orchestration to identify this service.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"tempUbSubAccountId\" name=\"temp-ub-sub-account-id\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"This property will be deleted from A&AI in the near future. Only stop gap solution.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"resourceVersion\" name=\"resource-version\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Used for optimistic concurrency. Must be empty on create, valid on update and delete.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); -// sb.append("<xml-element java-attribute=\"relationshipList\" name=\"relationship-list\" type=\"inventory.aai.onap.org.v11.RelationshipList\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Object that group service instances.\" />\n"); - sb.append("<xml-property name=\"indexedProps\" value=\"service-type\" />\n"); - sb.append("<xml-property name=\"dependentOn\" value=\"customer\" />\n"); - sb.append("<xml-property name=\"container\" value=\"service-subscriptions\" />\n"); - sb.append("<xml-property name=\"crossEntityReference\" value=\"service-instance,service-type\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</java-type>\n"); - } - - private void addRelationshipList(StringBuilder sb ) { - sb.append("<java-type name=\"RelationshipList\">\n"); - sb.append("<xml-root-element name=\"relationship-list\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationship\" name=\"relationship\" type=\"inventory.aai.onap.org.v11.Relationship\" />/n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - private void addRelationship(StringBuilder sb ) { - sb.append("<java-type name=\"Relationship\">\n"); - sb.append("<xml-root-element name=\"relationship\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"relatedTo\" name=\"related-to\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&AI to indicate type of node.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"relatedLink\" name=\"related-link\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"URL to the object in A&AI.\" />"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relationshipData\" name=\"relationship-data\" type=\"inventory.aai.onap.org.v11.RelationshipData\" />\n"); - sb.append("<xml-element container-type=\"java.util.ArrayList\" java-attribute=\"relatedToProperty\" name=\"related-to-property\" type=\"inventory.aai.onap.org.v11.RelatedToProperty\" />\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - private void addRelatedToProperty(StringBuilder sb) { - sb.append("<java-type name=\"RelatedToProperty\">\n"); - sb.append("<xml-root-element name=\"related-to-property\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"propertyKey\" name=\"property-key\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Key part of a key/value pair\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"propertyValue\" name=\"property-value\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Value part of a key/value pair\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - private void addRelationshipData(StringBuilder sb){ - sb.append("<java-type name=\"RelationshipData\">\n"); - sb.append("<xml-root-element name=\"relationship-data\" />\n"); - sb.append("<java-attributes>\n"); - sb.append("<xml-element java-attribute=\"relationshipKey\" name=\"relationship-key\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"A keyword provided by A&AI to indicate an attribute.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("<xml-element java-attribute=\"relationshipValue\" name=\"relationship-value\" required=\"true\" type=\"java.lang.String\">\n"); - sb.append("<xml-properties>\n"); - sb.append("<xml-property name=\"description\" value=\"Value of the attribute.\" />\n"); - sb.append("</xml-properties>\n"); - sb.append("</xml-element>\n"); - sb.append("</java-attributes>\n"); - sb.append("</java-type>\n"); - } - - - private void addEndOfXML(StringBuilder sb){ - sb.append("</java-types>\n"); - sb.append("</xml-bindings>\n"); - } - - public void init() throws ParserConfigurationException, SAXException, IOException, AAIException { - DocumentBuilder dBuilder = null; - try { - DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance(); - dbFactory.setFeature(XMLConstants.FEATURE_SECURE_PROCESSING, true); - dBuilder = dbFactory.newDocumentBuilder(); - } catch (ParserConfigurationException e) { - throw e; - } - try { - InputSource isInput = new InputSource(new StringReader(testXML)); - doc = dBuilder.parse(isInput); - } catch (SAXException e) { - throw e; - } catch (IOException e) { - throw e; - } - - NodeList bindingsNodes = doc.getElementsByTagName("xml-bindings"); - Element bindingElement; - NodeList javaTypesNodes; - Element javaTypesElement; - - if ( bindingsNodes == null || bindingsNodes.getLength() == 0 ) { - throw new AAIException("OXM file error: missing <binding-nodes> in XML"); - } - - bindingElement = (Element) bindingsNodes.item(0); - javaTypesNodes = bindingElement.getElementsByTagName("java-types"); - if ( javaTypesNodes.getLength() < 1 ) { - throw new AAIException("OXM file error: missing <binding-nodes><java-types> in XML"); - } - javaTypesElement = (Element) javaTypesNodes.item(0); - - javaTypeNodes = javaTypesElement.getElementsByTagName("java-type"); - if ( javaTypeNodes.getLength() < 1 ) { - throw new AAIException("OXM file error: missing <binding-nodes><java-types><java-type> in XML"); - } - logger.debug(testXML); - } - @Test - public void testXSDElement() { - // repeat of testGetIndexedProps() which uses the constructor - ArrayList<String> target = new ArrayList<String>(); - target.add("subscriber-name"); - target.add("global-customer-id"); - target.add("subscriber-type"); - target.add("service-type"); - - Vector<String> indexedProps = new Vector<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - indexedProps.addAll(javaTypeElement.getIndexedProps()); - } - assertThat(new ArrayList<>(indexedProps),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testName() { - ArrayList<String> target = new ArrayList<String>(); - target.add("ServiceSubscriptions"); - target.add("ServiceSubscription"); - target.add("Inventory"); - target.add("Business"); - target.add("Customers"); - target.add("Customer"); - ArrayList<String> names = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - names.add(javaTypeElement.name()); - } - logger.debug(String.join("|", names)); - assertThat(names,both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testGetAddTypes() { - HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>(); - HashMap<String,ArrayList<String>> target = new HashMap<String,ArrayList<String>>(); - target.put("Customer", new ArrayList<>(Arrays.asList("ServiceSubscriptions", "RelationshipList"))); - target.put("Customer", new ArrayList<>(Arrays.asList("ServiceSubscriptions"))); - target.put("Business", new ArrayList<>(Arrays.asList("Customers"))); - target.put("Inventory", new ArrayList<>(Arrays.asList("Business"))); - target.put("Customers", new ArrayList<>(Arrays.asList("Customer"))); - target.put("ServiceSubscription", new ArrayList<>(Arrays.asList("RelationshipList"))); - target.put("ServiceSubscription", new ArrayList<>(Arrays.asList())); - target.put("ServiceSubscriptions", new ArrayList<>(Arrays.asList("ServiceSubscription"))); - - for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - ArrayList<String> addTypes = new ArrayList<String>(); - NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element"); - String name=javaTypeElement.name(); - for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) { - XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j)); - addTypes.addAll(xmlElement.getAddTypes("v11")); - map.put(name,addTypes); - } - } - for(String key : map.keySet()) { - assertThat("Expected for key:"+key, map.get(key),equalTo(target.get(key))); - } - } -/* - @Test - public void testGetRequiredElements() { - HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>(); - ArrayList<String> target = new ArrayList<String>(); - target.add("global-customer-id\n"); - target.add("subscriber-name\n"); - target.add("subscriber-type"); - for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - ArrayList<String> requiredItems = new ArrayList<String>(); - String name=javaTypeElement.name(); - requiredItems.addAll(javaTypeElement.getRequiredElements("v11")); - map.put(name,requiredItems); - } - for(String key : map.keySet()) { - assertThat(map.get(key),equalTo(target)); - } - } -*/ - @Test - public void testGetPathDescriptionProperty() { - ArrayList<String> target = new ArrayList<String>(); - target.add("Namespace for business related constructs"); - target.add("Collection of customer identifiers to provide linkage back to BSS information."); - target.add("customer identifiers to provide linkage back to BSS information."); - target.add("Collection of objects that group service instances."); - target.add("Object that group service instances."); - List<String> descs = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getPathDescriptionProperty() != null) - descs.add(javaTypeElement.getPathDescriptionProperty()); - } - logger.debug(String.join("|", descs)); - assertThat(new ArrayList<>(descs),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testGetIndexedProps() { - ArrayList<String> target = new ArrayList<String>(); - target.add("subscriber-name"); - target.add("global-customer-id"); - target.add("subscriber-type"); - target.add("service-type"); - - Vector<String> indexedProps = new Vector<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - indexedProps.addAll(javaTypeElement.getIndexedProps()); - } - assertThat(new ArrayList<>(indexedProps),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testGetContainerProperty() { - ArrayList<String> target = new ArrayList<String>(); - target.add("service-subscriptions"); - target.add("customers"); - List<String> containers = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getContainerProperty() != null) - containers.add(javaTypeElement.getContainerProperty()); - } - logger.debug(String.join("|", containers)); - assertThat(new ArrayList<>(containers),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testGetQueryParamYAML() { - ArrayList<String> target = new ArrayList<String>(); - target.add(" - name: global-customer-id\n in: query\n description:\n required: false\n type: string\n"); - target.add(" - name: subscriber-name\n in: query\n description:\n required: false\n type: string\n"); - target.add(" - name: subscriber-type\n in: query\n description:\n required: false\n type: string\n"); - Vector<String> indexedProps = new Vector<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getContainerProperty() != null) { - indexedProps.addAll(javaTypeElement.getIndexedProps()); - String container = javaTypeElement.getContainerProperty(); - Vector<String> containerProps = new Vector<String>(); - NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element"); - for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) { - XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j)); - if(indexedProps.contains(xmlElement.name())) - containerProps.add(xmlElement.getQueryParamYAML()); - } - GetOperation.addContainerProps(container, containerProps); - } - } -/* - List<String> queryParams = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getQueryParamYAML() != null) - queryParams.add(javaTypeElement.getQueryParamYAML()); - } -*/ - assertThat(GetOperation.containers.get("customers"),equalTo( target)); - } - - @Test - public void testGetPathParamYAML() { - ArrayList<String> target = new ArrayList<String>(); - target.add(" - name: Inventory\n in: path\n description: Inventory\n required: true\n example: __INVENTORY__\n"); - target.add(" - name: Business\n in: path\n description: Business\n required: true\n example: __BUSINESS__\n"); - target.add(" - name: Customers\n in: path\n description: Customers\n required: true\n example: __CUSTOMERS__\n"); - target.add(" - name: Customer\n in: path\n description: Customer\n required: true\n example: __CUSTOMER__\n"); - target.add(" - name: ServiceSubscriptions\n in: path\n description: ServiceSubscriptions\n required: true\n example: __SERVICESUBSCRIPTIONS__\n"); - target.add(" - name: ServiceSubscription\n in: path\n description: ServiceSubscription\n required: true\n example: __SERVICESUBSCRIPTION__\n"); - List<String> pathParams = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getPathParamYAML(javaTypeElement.name()) != null) - pathParams.add(javaTypeElement.getPathParamYAML(javaTypeElement.name())); - } - logger.debug(String.join("|", pathParams)); - assertThat(new ArrayList<>(pathParams),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testGetHTMLAnnotation() { - ArrayList<String> target = new ArrayList<String>(); - target.add(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " <annox:annotate target=\"Business\">@org.onap.aai.annotations.Metadata(description=\"Namespace for business related constructs\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - target.add(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " <annox:annotate target=\"Customers\">@org.onap.aai.annotations.Metadata(description=\"Collection of customer identifiers to provide linkage back to BSS information.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - target.add(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " <annox:annotate target=\"Customer\">@org.onap.aai.annotations.Metadata(description=\"customer identifiers to provide linkage back to BSS information.\",nameProps=\"subscriber-name\",indexedProps=\"subscriber-name,global-customer-id,subscriber-type\",searchable=\"global-customer-id,subscriber-name\",uniqueProps=\"global-customer-id\",container=\"customers\",namespace=\"business\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - target.add(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " <annox:annotate target=\"ServiceSubscriptions\">@org.onap.aai.annotations.Metadata(description=\"Collection of objects that group service instances.\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - target.add(" <xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR + " <xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " <annox:annotate target=\"ServiceSubscription\">@org.onap.aai.annotations.Metadata(description=\"Object that group service instances.\",indexedProps=\"service-type\",dependentOn=\"customer\",container=\"service-subscriptions\",crossEntityReference=\"service-instance,service-type\")</annox:annotate>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:appinfo>" + OxmFileProcessor.LINE_SEPARATOR + " </xs:annotation>" + OxmFileProcessor.LINE_SEPARATOR); - List<String> annotes = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(StringUtils.isNotEmpty(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(),""))) - annotes.add(javaTypeElement.getHTMLAnnotation(javaTypeElement.name(), " ")); - } - logger.debug("result:"); - logger.debug(String.join("|", annotes)); - logger.debug("Expected:"); - logger.debug(String.join("|", target)); - assertThat(new ArrayList<>(annotes),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - - } - - @Test - public void testGetTypePropertyYAML() { - ArrayList<String> target = new ArrayList<String>(); - target.add(" Inventory:\n type: "); - target.add(" Business:\n type: description: Namespace for business related constructs\n"); - target.add(" Customers:\n type: description: Collection of customer identifiers to provide linkage back to BSS information.\n"); - target.add(" Customer:\n type: description: customer identifiers to provide linkage back to BSS information.\n"); - target.add(" ServiceSubscriptions:\n type: description: Collection of objects that group service instances.\n"); - target.add(" ServiceSubscription:\n type: description: Object that group service instances.\n"); - List<String> types = new ArrayList<String>(); - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - if(javaTypeElement.getTypePropertyYAML() != null) - types.add(javaTypeElement.getTypePropertyYAML()); - } - assertThat(new ArrayList<>(types),both(everyItem(is(in(target.toArray())))).and(containsInAnyOrder(target.toArray()))); - } - - @Test - public void testIsStandardType() { - HashMap<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>(); - HashMap<String,ArrayList<String>> target = new HashMap<String,ArrayList<String>>(); - target.put("Customer", new ArrayList<>(Arrays.asList("global-customer-id","subscriber-name", "subscriber-type","resource-version"))); - target.put("Business", new ArrayList<>()); - target.put("Inventory", new ArrayList<>()); - target.put("Customers", new ArrayList<>()); - target.put("ServiceSubscriptions", new ArrayList<>()); - target.put("ServiceSubscription", new ArrayList<>(Arrays.asList("service-type", "temp-ub-sub-account-id", "resource-version"))); - - for ( int i = 0; i < javaTypeNodes.getLength(); ++i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - ArrayList<String> addTypes = new ArrayList<String>(); - NodeList xmlElementNodes = javaTypeElement.getElementsByTagName("xml-element"); - String name=javaTypeElement.name(); - for ( int j = 0; j < xmlElementNodes.getLength(); ++j ) { - XSDElement xmlElement = new XSDElement((Element) xmlElementNodes.item(j)); - if(xmlElement.isStandardType()) - addTypes.add(xmlElement.name()); - } - map.put(name,addTypes); - } - for(String key : map.keySet()) { - assertThat(map.get(key),equalTo(target.get(key))); - } - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDJavaTypeTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDJavaTypeTest.java deleted file mode 100644 index 27d9898b..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/XSDJavaTypeTest.java +++ /dev/null @@ -1,101 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.hamcrest.CoreMatchers.equalTo; -import static org.junit.Assert.*; - -import java.util.HashMap; - -import org.junit.Before; -import org.junit.Test; -import org.w3c.dom.Element; - -public class XSDJavaTypeTest extends XSDElementTest { - - @Before - public void setUp() throws Exception { - super.setUp(); - } - - @Test - public void testXSDJavaTypeElement() { - HashMap<String,String> map = new HashMap<String,String>(); - HashMap<String,String> target = new HashMap<String,String>(); - target.put("Customer", "global-customer-id"); - target.put("Business", "customers"); - target.put("Inventory", "business"); - target.put("Customers","customer"); - target.put("ServiceSubscriptions", "service-subscription"); - target.put("ServiceSubscription", "service-type"); - - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - XSDJavaType javaType = new XSDJavaType(javaTypeElement); - map.put(javaType.name(),javaType.getItemName()); - } - for(String key : map.keySet()) { - assertThat("For key: "+key,map.get(key),equalTo(target.get(key))); - } - } - - @Test - public void testGetItemName() { - HashMap<String,String> map = new HashMap<String,String>(); - HashMap<String,String> target = new HashMap<String,String>(); - target.put("Customer", "global-customer-id"); - target.put("Business", "customers"); - target.put("Inventory", "business"); - target.put("Customers","customer"); - target.put("ServiceSubscriptions", "service-subscription"); - target.put("ServiceSubscription", "service-type"); - - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - XSDJavaType javaType = new XSDJavaType(javaTypeElement); - map.put(javaType.name(),javaType.getItemName()); - } - for(String key : map.keySet()) { - assertThat("For key: "+key,map.get(key),equalTo(target.get(key))); - } - } - - @Test - public void testGetArrayType() { - HashMap<String,String> map = new HashMap<String,String>(); - HashMap<String,String> target = new HashMap<String,String>(); - target.put("Customer", null); - target.put("Business", null); - target.put("Inventory", null); - target.put("Customers","customer"); - target.put("ServiceSubscriptions", "service-subscription"); - target.put("ServiceSubscription", null); - - for ( int i = 0; i < javaTypeNodes.getLength(); ++ i ) { - XSDElement javaTypeElement = new XSDElement((Element) javaTypeNodes.item(i)); - XSDJavaType javaType = new XSDJavaType(javaTypeElement); - map.put(javaType.name(),javaType.getArrayType()); - } - for(String key : map.keySet()) { - assertThat(map.get(key),equalTo(target.get(key))); - } - } - -} diff --git a/aai-core/src/test/java/org/onap/aai/util/genxsd/YAMLfromOXMTest.java b/aai-core/src/test/java/org/onap/aai/util/genxsd/YAMLfromOXMTest.java deleted file mode 100644 index e9a52a39..00000000 --- a/aai-core/src/test/java/org/onap/aai/util/genxsd/YAMLfromOXMTest.java +++ /dev/null @@ -1,942 +0,0 @@ -/** - * ============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.util.genxsd; - -import static org.hamcrest.CoreMatchers.is; - -import static org.junit.Assert.*; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileWriter; -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.SortedSet; -import java.util.TreeSet; - -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.onap.aai.AAISetup; -import org.onap.aai.config.ConfigConfiguration; -import org.onap.aai.config.SwaggerGenerationConfiguration; -import org.onap.aai.setup.SchemaVersion; -import org.onap.aai.setup.SchemaVersions; -import org.junit.runner.RunWith; -import org.onap.aai.edges.EdgeIngestor; -import org.onap.aai.edges.EdgeRule; -import org.onap.aai.edges.exceptions.EdgeRuleNotFoundException; -import org.onap.aai.nodes.NodeIngestor; -import org.onap.aai.serialization.queryformats.QueryFormatTestHelper; -import org.onap.aai.setup.SchemaLocationsBean; -import org.onap.aai.testutils.TestUtilConfigTranslatorforBusiness; -import org.onap.aai.util.AAIConstants; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.AnnotationConfigApplicationContext; -import org.springframework.test.annotation.DirtiesContext; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.TestPropertySource; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import org.w3c.dom.Document; -import org.w3c.dom.Element; - -import com.google.common.collect.Multimap; - - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(classes = { - ConfigConfiguration.class, - TestUtilConfigTranslatorforBusiness.class, - EdgeIngestor.class, - NodeIngestor.class, - SwaggerGenerationConfiguration.class - -}) -@TestPropertySource(properties = { - "schema.uri.base.path = /aai", - "schema.xsd.maxoccurs = 5000" -}) -public class YAMLfromOXMTest { - @Autowired - EdgeIngestor edgeIngestor; - - @Autowired - NodeIngestor nodeIngestor; - private static final Logger logger = LoggerFactory.getLogger("YAMLfromOXMTest.class"); - private static final String OXMFILENAME = "src/test/resources/oxm/business_oxm_v11.xml"; - private static final String EDGEFILENAME = "src/test/resources/dbedgerules/DbEdgeBusinessRules_test.json"; - public static AnnotationConfigApplicationContext ctx = null; - private static String testXML; - protected static final String SERVICE_NAME = "JUNIT"; - boolean first = true; - - @Autowired - YAMLfromOXM yamlFromOxm; - - @Autowired - SchemaVersions schemaVersions; - - @BeforeClass - public static void setUpBeforeClass() throws Exception { - System.setProperty("AJSC_HOME", "."); - System.setProperty("BUNDLECONFIG_DIR", "src/test/resources/bundleconfig-local"); - System.setProperty("aai.service.name", SERVICE_NAME); - - QueryFormatTestHelper.setFinalStatic(AAIConstants.class.getField("AAI_HOME_ETC_OXM"), "src/test/resources/bundleconfig-local/etc/oxm/"); - XSDElementTest x = new XSDElementTest(); - x.setUp(); - testXML = x.testXML; - logger.debug(testXML); - BufferedWriter bw = new BufferedWriter(new FileWriter(OXMFILENAME)); - bw.write(testXML); - bw.close(); - BufferedWriter bw1 = new BufferedWriter(new FileWriter(EDGEFILENAME)); - bw1.write(EdgeDefs()); - bw1.close(); - - - - - - } - - @Before - public void setUp() throws Exception { - - } - - @Test - public void AtestIngestors() throws EdgeRuleNotFoundException { - Multimap<String, EdgeRule> results = edgeIngestor.getAllRules(schemaVersions.getDefaultVersion()); - SortedSet<String> ss=new TreeSet<String>(results.keySet()); - for(String key : ss) { - results.get(key).stream().filter((i) -> ((! i.isPrivateEdge()))).forEach((i) ->{ EdgeDescription ed = new EdgeDescription(i); System.out.println(ed.getRuleKey()); } ); - } - Document doc = nodeIngestor.getSchema(schemaVersions.getDefaultVersion()); - assertNotNull(doc); - } - - @Test - public void testGetDocumentHeader() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String header = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - yamlFromOxm.process(); - header = yamlFromOxm.getDocumentHeader(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Header:\n"+header,header, is(YAMLheader())); - } - - @Test - public void testProcess() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - fileContent = yamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("FileContent-TestProcess:\n"+fileContent,fileContent, is(YAMLresult())); - } - - - @Test - public void testYAMLfromOXMFileVersionFile() throws IOException { - String outfileName = "testXML.xml"; - File XMLfile = new File(outfileName); - XMLfile.createNewFile(); - BufferedWriter bw = null; - Charset charset = Charset.forName("UTF-8"); - Path path = Paths.get(outfileName); - bw = Files.newBufferedWriter(path, charset); - bw.write(testXML); - bw.close(); - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - fileContent = yamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - XMLfile.delete(); - assertThat("FileContent-OXMFileVersionFile:\n"+fileContent,fileContent, is(YAMLresult())); - } - - @Test - public void testYAMLfromOXMStringVersionFile() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String fileContent = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - fileContent = yamlFromOxm.process(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("FileContent-OXMStringVersionFile:\n"+fileContent,fileContent, is(YAMLresult())); - } - - @Test - public void testAppendDefinitions() { - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String definitions = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - yamlFromOxm.process(); - definitions = yamlFromOxm.appendDefinitions(); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Definitions:\n"+definitions,definitions, is(YAMLdefs()+YAMLpatchDefs()+YAMLgetDefs())); - } - - @Test - public void testGetXMLRootElementName() { - String target = "RootElement=customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - Element customer = null; - String root = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - yamlFromOxm.process(); - customer = yamlFromOxm.getJavaTypeElementSwagger("Customer"); - root = yamlFromOxm.getXMLRootElementName(customer); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("RootElement="+root, is(target)); - } - - @Test - public void testGetXmlRootElementName() { - String target = "RootElement=customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - String root = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - yamlFromOxm.process(); - root = yamlFromOxm.getXmlRootElementName("Customer"); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("RootElement="+root, is(target)); - } - - @Test - public void testGetJavaTypeElementSwagger() { - String target = "Element=java-type/Customer"; - SchemaVersion v = schemaVersions.getAppRootVersion(); - String apiVersion = v.toString(); - Element customer = null; - try { - yamlFromOxm.setXmlVersion(testXML, v); - yamlFromOxm.process(); - customer = yamlFromOxm.getJavaTypeElementSwagger("Customer"); - } catch(Exception e) { - e.printStackTrace(); - } - assertThat("Element="+customer.getNodeName()+"/"+customer.getAttribute("name"), is(target)); - } - - public String YAMLresult() { - StringBuilder sb = new StringBuilder(32368); - sb.append(YAMLheader()); - sb.append(YAMLops()); - sb.append(YAMLdefs()); - sb.append(YAMLpatchDefs()); - sb.append(YAMLgetDefs()); - return sb.toString(); - } - public String YAMLheader() { - StringBuilder sb = new StringBuilder(1500); - sb.append("swagger: \"2.0\"\n"); - sb.append("info:\n"); - sb.append(" description: |\n"); - sb.append("\n"); - sb.append(" [Differences versus the previous schema version](apidocs/aai_swagger_v11.diff)\n"); - sb.append("\n"); - sb.append(" Copyright © 2017-18 AT&T Intellectual Property. All rights reserved.\n"); - sb.append("\n"); - sb.append(" Licensed under the Creative Commons License, Attribution 4.0 Intl. (the "License"); you may not use this documentation except in compliance with the License.\n"); - sb.append("\n"); - sb.append(" You may obtain a copy of the License at\n"); - sb.append("\n"); - sb.append(" (https://creativecommons.org/licenses/by/4.0/)\n"); - sb.append("\n"); - sb.append(" 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.\n"); - sb.append("\n"); - sb.append(" This document is best viewed with Firefox or Chrome. Nodes can be found by appending /#/definitions/node-type-to-find to the path to this document. Edge definitions can be found with the node definitions.\n"); - sb.append(" version: \"v11\"\n"); - sb.append(" title: Active and Available Inventory REST API\n"); - sb.append(" license:\n"); - sb.append(" name: Apache 2.0\n"); - sb.append(" url: http://www.apache.org/licenses/LICENSE-2.0.html\n"); - sb.append(" contact:\n"); - sb.append(" name:\n"); - sb.append(" url:\n"); - sb.append(" email:\n"); - sb.append("host:\n"); - sb.append("basePath: /aai/v11\n"); - sb.append("schemes:\n"); - sb.append(" - https\n"); - sb.append("paths:\n"); - return sb.toString(); - } - - public String YAMLops() { - StringBuilder sb = new StringBuilder(16384); - sb.append(" /business/customers/customer/{global-customer-id}/service-subscriptions/service-subscription/{service-type}:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: returns service-subscription\n"); - sb.append(" description: returns service-subscription\n"); - sb.append(" operationId: getBusinessCustomersCustomerServiceSubscriptionsServiceSubscription\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/getDefinitions/service-subscription\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: path\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __SERVICE-TYPE__\n"); - sb.append(" put:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: create or update an existing service-subscription\n"); - sb.append(" description: |\n"); - sb.append(" Create or update an existing service-subscription.\n"); - sb.append(" #\n"); - sb.append(" Note! This PUT method has a corresponding PATCH method that can be used to update just a few of the fields of an existing object, rather than a full object replacement. An example can be found in the [PATCH section] below\n"); - sb.append(" operationId: createOrUpdateBusinessCustomersCustomerServiceSubscriptionsServiceSubscription\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: path\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __SERVICE-TYPE__\n"); - sb.append(" - name: body\n"); - sb.append(" in: body\n"); - sb.append(" description: service-subscription object that needs to be created or updated. [Valid relationship examples shown here](apidocs/relations/v11/BusinessCustomersCustomerServiceSubscriptionsServiceSubscription.json)\n"); - sb.append(" required: true\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - sb.append(" patch:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: update an existing service-subscription\n"); - sb.append(" description: |\n"); - sb.append(" Update an existing service-subscription\n"); - sb.append(" #\n"); - sb.append(" Note: Endpoints that are not devoted to object relationships support both PUT and PATCH operations.\n"); - sb.append(" The PUT operation will entirely replace an existing object.\n"); - sb.append(" The PATCH operation sends a \"description of changes\" for an existing object. The entire set of changes must be applied. An error result means no change occurs.\n"); - sb.append(" #\n"); - sb.append(" Other differences between PUT and PATCH are:\n"); - sb.append(" #\n"); - sb.append(" - For PATCH, you can send any of the values shown in sample REQUEST body. There are no required values.\n"); - sb.append(" - For PATCH, resource-id which is a required REQUEST body element for PUT, must not be sent.\n"); - sb.append(" - PATCH cannot be used to update relationship elements; there are dedicated PUT operations for this.\n"); - sb.append(" operationId: UpdateBusinessCustomersCustomerServiceSubscriptionsServiceSubscription\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: path\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __SERVICE-TYPE__\n"); - sb.append(" - name: body\n"); - sb.append(" in: body\n"); - sb.append(" description: service-subscription object that needs to be updated.\n"); - sb.append(" required: true\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/patchDefinitions/service-subscription\"\n"); - sb.append(" delete:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: delete an existing service-subscription\n"); - sb.append(" description: delete an existing service-subscription\n"); - sb.append(" operationId: deleteBusinessCustomersCustomerServiceSubscriptionsServiceSubscription\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: path\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __SERVICE-TYPE__\n"); - sb.append(" - name: resource-version\n"); - sb.append(" in: query\n"); - sb.append(" description: resource-version for concurrency\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" /business/customers/customer/{global-customer-id}/service-subscriptions:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: returns service-subscriptions\n"); - sb.append(" description: returns service-subscriptions\n"); - sb.append(" operationId: getBusinessCustomersCustomerServiceSubscriptions\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/getDefinitions/service-subscriptions\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: service-type\n"); - sb.append(" in: query\n"); - sb.append(" description:\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" /business/customers/customer/{global-customer-id}:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: returns customer\n"); - sb.append(" description: returns customer\n"); - sb.append(" operationId: getBusinessCustomersCustomer\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/getDefinitions/customer\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" put:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: create or update an existing customer\n"); - sb.append(" description: |\n"); - sb.append(" Create or update an existing customer.\n"); - sb.append(" #\n"); - sb.append(" Note! This PUT method has a corresponding PATCH method that can be used to update just a few of the fields of an existing object, rather than a full object replacement. An example can be found in the [PATCH section] below\n"); - sb.append(" operationId: createOrUpdateBusinessCustomersCustomer\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: body\n"); - sb.append(" in: body\n"); - sb.append(" description: customer object that needs to be created or updated. [Valid relationship examples shown here](apidocs/relations/v11/BusinessCustomersCustomer.json)\n"); - sb.append(" required: true\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" patch:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: update an existing customer\n"); - sb.append(" description: |\n"); - sb.append(" Update an existing customer\n"); - sb.append(" #\n"); - sb.append(" Note: Endpoints that are not devoted to object relationships support both PUT and PATCH operations.\n"); - sb.append(" The PUT operation will entirely replace an existing object.\n"); - sb.append(" The PATCH operation sends a \"description of changes\" for an existing object. The entire set of changes must be applied. An error result means no change occurs.\n"); - sb.append(" #\n"); - sb.append(" Other differences between PUT and PATCH are:\n"); - sb.append(" #\n"); - sb.append(" - For PATCH, you can send any of the values shown in sample REQUEST body. There are no required values.\n"); - sb.append(" - For PATCH, resource-id which is a required REQUEST body element for PUT, must not be sent.\n"); - sb.append(" - PATCH cannot be used to update relationship elements; there are dedicated PUT operations for this.\n"); - sb.append(" operationId: UpdateBusinessCustomersCustomer\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: body\n"); - sb.append(" in: body\n"); - sb.append(" description: customer object that needs to be updated.\n"); - sb.append(" required: true\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/patchDefinitions/customer\"\n"); - sb.append(" delete:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: delete an existing customer\n"); - sb.append(" description: delete an existing customer\n"); - sb.append(" operationId: deleteBusinessCustomersCustomer\n"); - sb.append(" consumes:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: path\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" example: __GLOBAL-CUSTOMER-ID__\n"); - sb.append(" - name: resource-version\n"); - sb.append(" in: query\n"); - sb.append(" description: resource-version for concurrency\n"); - sb.append(" required: true\n"); - sb.append(" type: string\n"); - sb.append(" /business/customers:\n"); - sb.append(" get:\n"); - sb.append(" tags:\n"); - sb.append(" - Business\n"); - sb.append(" summary: returns customers\n"); - sb.append(" description: returns customers\n"); - sb.append(" operationId: getBusinessCustomers\n"); - sb.append(" produces:\n"); - sb.append(" - application/json\n"); - sb.append(" - application/xml\n"); - sb.append(" responses:\n"); - sb.append(" \"200\":\n"); - sb.append(" description: successful operation\n"); - sb.append(" schema:\n"); - sb.append(" $ref: \"#/getDefinitions/customers\"\n"); - sb.append(" \"default\":\n"); - sb.append(" null parameters:\n"); - sb.append(" - name: global-customer-id\n"); - sb.append(" in: query\n"); - sb.append(" description:\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" - name: subscriber-name\n"); - sb.append(" in: query\n"); - sb.append(" description:\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - sb.append(" - name: subscriber-type\n"); - sb.append(" in: query\n"); - sb.append(" description:\n"); - sb.append(" required: false\n"); - sb.append(" type: string\n"); - return sb.toString(); - } - public String YAMLdefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("definitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/definitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/definitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (PARENT of service-subscription, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/definitions/service-subscription\"\n"); - return sb.toString(); - } - public String YAMLpatchDefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("patchDefinitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/patchDefinitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/patchDefinitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/patchDefinitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/patchDefinitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (PARENT of service-subscription, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/patchDefinitions/service-subscription\"\n"); - return sb.toString(); - } - public String YAMLgetDefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("getDefinitions:\n"); - sb.append(" business:\n"); - sb.append(" description: |\n"); - sb.append(" Namespace for business related constructs\n"); - sb.append(" properties:\n"); - sb.append(" customers:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/getDefinitions/customer\"\n"); - sb.append(" customer:\n"); - sb.append(" description: |\n"); - sb.append(" customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - FROM service-subscription (CHILD of customer, service-subscription BelongsTo customer, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this CUSTOMER node is deleted, this FROM node is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - global-customer-id\n"); - sb.append(" - subscriber-name\n"); - sb.append(" - subscriber-type\n"); - sb.append(" properties:\n"); - sb.append(" global-customer-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: Global customer id used across to uniquely identify customer.\n"); - sb.append(" subscriber-name:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber name, an alternate way to retrieve a customer.\n"); - sb.append(" subscriber-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Subscriber type, a way to provide VID with only the INFRA customers.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/getDefinitions/service-subscription\"\n"); - sb.append(" customers:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of customer identifiers to provide linkage back to BSS information.\n"); - sb.append(" properties:\n"); - sb.append(" customer:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/getDefinitions/customer\"\n"); - sb.append(" inventory:\n"); - sb.append(" properties:\n"); - sb.append(" business:\n"); - sb.append(" type: object\n"); - sb.append(" $ref: \"#/getDefinitions/business\"\n"); - sb.append(" nodes:\n"); - sb.append(" properties:\n"); - sb.append(" inventory-item-data:\n"); - sb.append(" type: array\n"); - sb.append(" items:\n"); - sb.append(" $ref: \"#/getDefinitions/inventory-item-data\"\n"); - sb.append(" service-subscription:\n"); - sb.append(" description: |\n"); - sb.append(" Object that group service instances.\n"); - sb.append(" ###### Related Nodes\n"); - sb.append(" - TO customer (PARENT of service-subscription, service-subscription BelongsTo customer, MANY2ONE)(4)\n"); - sb.append(" - TO tenant( service-subscription Uses tenant, MANY2MANY)\n"); - sb.append(" - FROM service-instance (CHILD of service-subscription, service-instance BelongsTo service-subscription, MANY2ONE)(1)\n"); - sb.append("\n"); - sb.append(" -(1) IF this SERVICE-SUBSCRIPTION node is deleted, this FROM node is DELETED also\n"); - sb.append(" -(4) IF this TO node is deleted, this SERVICE-SUBSCRIPTION is DELETED also\n"); - sb.append(" required:\n"); - sb.append(" - service-type\n"); - sb.append(" properties:\n"); - sb.append(" service-type:\n"); - sb.append(" type: string\n"); - sb.append(" description: Value defined by orchestration to identify this service.\n"); - sb.append(" temp-ub-sub-account-id:\n"); - sb.append(" type: string\n"); - sb.append(" description: This property will be deleted from A&AI in the near future. Only stop gap solution.\n"); - sb.append(" resource-version:\n"); - sb.append(" type: string\n"); - sb.append(" description: Used for optimistic concurrency. Must be empty on create, valid on update and delete.\n"); - sb.append(" service-subscriptions:\n"); - sb.append(" description: |\n"); - sb.append(" Collection of objects that group service instances.\n"); - sb.append(" properties:\n"); - sb.append(" service-subscription:\n"); - sb.append(" type: array\n"); - sb.append(" items: \n"); - sb.append(" $ref: \"#/getDefinitions/service-subscription\"\n"); - return sb.toString(); - } - public static String EdgeDefs() { - StringBuilder sb = new StringBuilder(8092); - sb.append("{\n" + - " \"rules\": [\n"); - sb.append(" {\n"); - sb.append(" \"from\": \"service-subscription\",\n"); - sb.append(" \"to\": \"customer\",\n" + - " \"label\": \"org.onap.relationships.inventory.BelongsTo\",\n" + - " \"direction\": \"OUT\",\n" + - " \"multiplicity\": \"MANY2ONE\",\n" + - " \"contains-other-v\": \"!${direction}\",\n" + - " \"delete-other-v\": \"!${direction}\",\n" + - " \"prevent-delete\": \"NONE\",\n" + - " \"default\": \"true\",\n" + - " \"description\":\"\"\n"); - sb.append(" },\n"); - sb.append(" {\n" + - " \"from\": \"service-instance\",\n" + - " \"to\": \"service-subscription\",\n" + - " \"label\": \"org.onap.relationships.inventory.BelongsTo\",\n" + - " \"direction\": \"OUT\",\n" + - " \"multiplicity\": \"MANY2ONE\",\n" + - " \"contains-other-v\": \"!${direction}\",\n" + - " \"delete-other-v\": \"!${direction}\",\n" + - " \"prevent-delete\": \"NONE\",\n" + - " \"default\": \"true\",\n" + - " \"description\":\"\"\n" + - " },\n"); - sb.append(" {\n" + - " \"from\": \"service-subscription\",\n" + - " \"to\": \"tenant\",\n" + - " \"label\": \"org.onap.relationships.inventory.Uses\",\n" + - " \"direction\": \"OUT\",\n" + - " \"multiplicity\": \"MANY2MANY\",\n" + - " \"contains-other-v\": \"NONE\",\n" + - " \"delete-other-v\": \"NONE\",\n" + - " \"prevent-delete\": \"NONE\",\n" + - " \"default\": \"true\",\n" + - " \"description\":\"\"\n" + - " }"); - sb.append(" ]\n" + - "}\n"); - return sb.toString(); - } -} - diff --git a/aai-rest/pom.xml b/aai-rest/pom.xml index 4f05440e..3d57e69f 100644 --- a/aai-rest/pom.xml +++ b/aai-rest/pom.xml @@ -29,11 +29,11 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-rest</artifactId> <name>aai-rest</name> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <properties> <onap.nexus.url>https://nexus.onap.org</onap.nexus.url> diff --git a/aai-schema-ingest/pom.xml b/aai-schema-ingest/pom.xml index b73a7209..73ac17f4 100644 --- a/aai-schema-ingest/pom.xml +++ b/aai-schema-ingest/pom.xml @@ -25,11 +25,11 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-schema-ingest</artifactId> <name>aai-schema-ingest</name> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <packaging>jar</packaging> <properties> diff --git a/aai-utils/pom.xml b/aai-utils/pom.xml index 8154eb73..5a6cba4e 100644 --- a/aai-utils/pom.xml +++ b/aai-utils/pom.xml @@ -29,11 +29,11 @@ <parent> <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> </parent> <artifactId>aai-utils</artifactId> <name>aai-utils</name> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <properties> <onap.nexus.url>https://nexus.onap.org</onap.nexus.url> @@ -30,7 +30,7 @@ <groupId>org.onap.aai.aai-common</groupId> <artifactId>aai-common</artifactId> - <version>1.4.2-SNAPSHOT</version> + <version>1.4.3-SNAPSHOT</version> <packaging>pom</packaging> <name>aai-aai-common</name> <description>Contains all of the common code for resources and traversal repos</description> diff --git a/version.properties b/version.properties index 695ab2b2..fc6970be 100644 --- a/version.properties +++ b/version.properties @@ -5,7 +5,7 @@ major_version=1 minor_version=4 -patch_version=2 +patch_version=3 base_version=${major_version}.${minor_version}.${patch_version} |