Merge "[ONOS-5766] Define YANG compiler API"
diff --git a/compiler/api/pom.xml b/compiler/api/pom.xml
index fd80dc2..e2398a6 100644
--- a/compiler/api/pom.xml
+++ b/compiler/api/pom.xml
@@ -25,10 +25,7 @@
</parent>
<artifactId>onos-yang-compiler-api</artifactId>
- <packaging>pom</packaging>
- <!--
- Change packaging to jar
- -->
+ <packaging>jar</packaging>
<build>
<plugins>
<plugin>
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModel.java b/compiler/api/src/main/java/org/onosproject/yang/YangModel.java
new file mode 100644
index 0000000..cd5f403
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/YangModel.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
+ * Vestibulum commodo. Ut rhoncus gravida arcu.
+ */
+
+package org.onosproject.yang;
+
+import java.util.Set;
+
+/**
+ * Representation of a compiled YANG model.
+ */
+public interface YangModel {
+
+ /**
+ * Returns set of YANG module with information.
+ *
+ * @return YANG module info
+ */
+ Set<YangModule> getYangModules();
+
+ /**
+ * Returns set of YANG modules identifier.
+ *
+ * @return YANG module identifier
+ */
+ Set<YangModuleId> getYangModulesId();
+
+ /**
+ * Returns YANG module information corresponding to a given module
+ * identifier.
+ *
+ * @param id module identifier
+ * @return YANG module information
+ */
+ YangModule getYangModule(YangModuleId id);
+}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModule.java b/compiler/api/src/main/java/org/onosproject/yang/YangModule.java
new file mode 100644
index 0000000..70990f9
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/YangModule.java
@@ -0,0 +1,38 @@
+/*
+ * Copyright (c) 2017. Lorem ipsum dolor sit amet, consectetur adipiscing elit.
+ * Morbi non lorem porttitor neque feugiat blandit. Ut vitae ipsum eget quam lacinia accumsan.
+ * Etiam sed turpis ac ipsum condimentum fringilla. Maecenas magna.
+ * Proin dapibus sapien vel ante. Aliquam erat volutpat. Pellentesque sagittis ligula eget metus.
+ * Vestibulum commodo. Ut rhoncus gravida arcu.
+ */
+
+package org.onosproject.yang;
+
+import java.io.InputStream;
+
+/**
+ * Representation of YANG module information.
+ */
+public interface YangModule {
+
+ /**
+ * Returns YANG module identifier.
+ *
+ * @return module identifier
+ */
+ YangModuleId getYangModuleId();
+
+ /**
+ * Returns input stream corresponding to a given YANG file path.
+ *
+ * @return stream
+ */
+ InputStream getYangSource();
+
+ /**
+ * Returns metadata stream.
+ *
+ * @return stream
+ */
+ InputStream getMetadata();
+}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java b/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java
new file mode 100644
index 0000000..44872df
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/YangModuleId.java
@@ -0,0 +1,45 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.yang;
+
+/**
+ * Representation of an entity which provides YANG module identifiers.
+ * Reference RFC 7895.
+ */
+public interface YangModuleId {
+
+ /**
+ * Returns the name of the YANG module.
+ *
+ * @return name of the YANG module
+ */
+ String moduleName();
+
+ /**
+ * Returns revision of the YANG module.
+ * <p>
+ * Reference RFC 7895
+ * Each YANG module and submodule within the library has a
+ * revision. This is derived from the most recent revision statement
+ * within the module or submodule. If no such revision statement
+ * exists, the module's or submodule's revision is the zero-length
+ * string.
+ *
+ * @return revision of the YANG module
+ */
+ String revision();
+}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java
new file mode 100644
index 0000000..b44814f
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilationParam.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.yang.compiler.api;
+
+import java.nio.file.Path;
+import java.util.Set;
+
+/**
+ * Representation of parameters required for YANG compilation.
+ */
+public interface YangCompilationParam {
+
+ /**
+ * Returns set of YANG files path. This could be a directory in which
+ * YANG files resides, all files under that directory will be taken.
+ *
+ * @return set of YANG file path
+ */
+ Set<Path> getYangFiles();
+
+ /**
+ * Adds YANG file path. This could be a directory in which YANG files are
+ * available.
+ *
+ * @param path YANG file path
+ */
+ void addYangFile(Path path);
+
+ /**
+ * Returns set of dependent metadata paths.
+ *
+ * @return set of dependent metadata path
+ */
+ Set<Path> getDependentSchemas();
+
+ /**
+ * Adds dependent metadata path.
+ *
+ * @param path metadata path
+ */
+ void addDependentSchema(Path path);
+
+ /**
+ * Returns the desired path of generated code. If its not specified default
+ * path will be taken.
+ *
+ * @return path to generated code destination directory
+ */
+ Path getCodeGenDir();
+
+ /**
+ * Sets code generation directory.
+ *
+ * @param path expected code generation directory
+ */
+ void setCodeGenDir(Path path);
+
+ /**
+ * Returns the desired path of metadata. If its not specified default
+ * path will be taken.
+ *
+ * @return path to generated metadata destination directory.
+ */
+ Path getMetadataGenDir();
+
+ /**
+ * Sets metadata generation directory.
+ *
+ * @param path expected metadata generation directory
+ */
+ void setMetadataGenDir(Path path);
+}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java
new file mode 100644
index 0000000..4caedb8
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompiledOutput.java
@@ -0,0 +1,42 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.yang.compiler.api;
+
+import org.onosproject.yang.YangModel;
+
+import java.nio.file.Path;
+import java.util.Set;
+
+/**
+ * Representation of an entity that provides YANG compiled output.
+ */
+public interface YangCompiledOutput {
+
+ /**
+ * Returns compiled YANG model.
+ *
+ * @return YANG model
+ */
+ YangModel getYangModel();
+
+ /**
+ * Returns generated JAVA files.
+ *
+ * @return generated JAVA files.
+ */
+ Set<Path> getGeneratedJava();
+}
\ No newline at end of file
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerException.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerException.java
new file mode 100644
index 0000000..6857a31
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerException.java
@@ -0,0 +1,82 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.yang.compiler.api;
+
+import java.nio.file.Path;
+
+/**
+ * Represents base class for exceptions in YANG tool operations.
+ */
+public class YangCompilerException extends RuntimeException {
+
+ private static final long serialVersionUID = 20161028L;
+
+ private Path yangFile;
+
+ /**
+ * Creates a new YANG tool exception with given message. It's expected
+ * that caller of YANG compiler display's exception message to communicate
+ * error information with user.
+ *
+ * @param message the detail of exception in string
+ */
+ public YangCompilerException(String message) {
+ super(message);
+ }
+
+ /**
+ * Creates a new tool exception from given message and cause. It's expected
+ * that caller of YANG compiler display's exception cause and message to
+ * communicate error information with user.
+ *
+ * @param message the detail of exception in string
+ * @param cause underlying cause of the error
+ */
+ public YangCompilerException(final String message, final Throwable cause) {
+ super(message, cause);
+ }
+
+ /**
+ * Creates a new tool exception from cause. It's expected
+ * that caller of YANG compiler display's exception cause to communicate
+ * error information with user.
+ *
+ * @param cause underlying cause of the error
+ */
+ public YangCompilerException(final Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * Retrieves the current YANG files for which exception has occured.
+ *
+ * @return current YANG file
+ */
+ public Path getYangFile() {
+ return yangFile;
+ }
+
+
+ /**
+ * Updates the YANG file which caused the exception.
+ *
+ * @param yangFile YANG files being processed
+ */
+ public void setYangFile(Path yangFile) {
+ this.yangFile = yangFile;
+ }
+}
diff --git a/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerService.java b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerService.java
new file mode 100644
index 0000000..6fb9643
--- /dev/null
+++ b/compiler/api/src/main/java/org/onosproject/yang/compiler/api/YangCompilerService.java
@@ -0,0 +1,37 @@
+/*
+ * Copyright 2016-present Open Networking Laboratory
+ *
+ * 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.
+ */
+
+package org.onosproject.yang.compiler.api;
+
+import java.io.IOException;
+
+/**
+ * Representation of an entity that provides YANG compilation service.
+ */
+public interface YangCompilerService {
+
+ /**
+ * Compiles YANG files and generates the required code with serialized
+ * metadata.
+ *
+ * @param param YANG compilation parameters
+ * @return compiled output
+ * @throws IOException a violation in IO rule
+ * @throws YangCompilerException a violation in YANG compilation rule
+ */
+ YangCompiledOutput compileYangFiles(YangCompilationParam param)
+ throws IOException, YangCompilerException;
+}
diff --git a/runtime/src/main/java/org/onosproject/yang/package-info.java b/compiler/api/src/main/java/org/onosproject/yang/package-info.java
similarity index 90%
rename from runtime/src/main/java/org/onosproject/yang/package-info.java
rename to compiler/api/src/main/java/org/onosproject/yang/package-info.java
index e1a76c3..d720de4 100644
--- a/runtime/src/main/java/org/onosproject/yang/package-info.java
+++ b/compiler/api/src/main/java/org/onosproject/yang/package-info.java
@@ -15,6 +15,6 @@
*/
/**
- * Basic constructs for compiling and working with YANG models.
+ * Representation of a compiled YANG model.
*/
package org.onosproject.yang;
\ No newline at end of file
diff --git a/runtime/pom.xml b/runtime/pom.xml
index c3ca80a..372f8bb 100644
--- a/runtime/pom.xml
+++ b/runtime/pom.xml
@@ -43,6 +43,11 @@
<artifactId>slf4j-api</artifactId>
<version>1.7.21</version>
</dependency>
+ <dependency>
+ <groupId>org.onosproject</groupId>
+ <artifactId>onos-yang-compiler-api</artifactId>
+ <version>1.12-SNAPSHOT</version>
+ </dependency>
</dependencies>
<build>
diff --git a/runtime/src/main/java/org/onosproject/yang/YangModel.java b/runtime/src/main/java/org/onosproject/yang/YangModel.java
deleted file mode 100644
index dbfcfee..0000000
--- a/runtime/src/main/java/org/onosproject/yang/YangModel.java
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * Copyright 2016-present Open Networking Laboratory
- *
- * 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.
- */
-
-package org.onosproject.yang;
-
-import java.io.InputStream;
-import java.util.Set;
-
-/**
- * Representation of a compiled YANG model.
- */
-public interface YangModel {
-
- // name
- // schema meta-data!!!
-
- // set of source yang files (names & streams)
- Set<String> getYangFiles();
-
- InputStream getYangSource(String name);
-
- // set of generated model classes
- Set<String> getJavaModelClasses();
-
-}