[ONOS-6764][ONOS-6673] YANG Runtime: GET API's for YANG Models and YANG Compiler & Runtime: Identification of YANG Model with a name.
Change-Id: I01d6ed970b98125d3ae9f8b42f51d25d7087a69a
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
index b44814f..1c49050 100644
--- 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
@@ -33,14 +33,6 @@
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
@@ -48,13 +40,6 @@
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.
*
@@ -63,13 +48,6 @@
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.
*
@@ -78,9 +56,9 @@
Path getMetadataGenDir();
/**
- * Sets metadata generation directory.
+ * Returns the model identifier.
*
- * @param path expected metadata generation directory
+ * @return model identifier
*/
- void setMetadataGenDir(Path path);
+ String getModelId();
}
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
index 9bf8b2d..71f7238 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/YangModule.java
@@ -432,7 +432,7 @@
/**
* Adds a unique holder to a unique holder list.
*
- * @param uniqueHolder
+ * @param uniqueHolder unique holder
*/
@Override
public void addToUniqueHolderList(YangUniqueHolder uniqueHolder) {
diff --git a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
index 6b74df1..9ebb194 100644
--- a/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
+++ b/compiler/base/datamodel/src/main/java/org/onosproject/yang/compiler/datamodel/utils/DataModelUtils.java
@@ -67,11 +67,9 @@
import org.onosproject.yang.model.SchemaId;
import java.io.File;
-import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
-import java.io.ObjectInputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;
@@ -398,30 +396,6 @@
}
/**
- * Returns de-serializes YANG data-model nodes.
- *
- * @param serializedFileInfo serialized File Info
- * @return de-serializes YANG data-model nodes
- * @throws IOException when fails do IO operations
- */
- public static Set<YangNode> deSerializeDataModel(String serializedFileInfo)
- throws IOException {
-
- Set<YangNode> nodes;
- try {
- FileInputStream fileInputStream = new FileInputStream(serializedFileInfo);
- ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
- nodes = (Set<YangNode>) objectInputStream.readObject();
- objectInputStream.close();
- fileInputStream.close();
- } catch (IOException | ClassNotFoundException e) {
- throw new IOException(serializedFileInfo + " failed to fetch " +
- "nodes due to " + e.getLocalizedMessage());
- }
- return nodes;
- }
-
- /**
* Adds the list of leaf present under a node to resolution list, after
* cloning. Under the cloned node, with cloned leaf, attributes are set
* and added to resolution list.
@@ -864,57 +838,6 @@
* @return list of serialized files
* @throws IOException when fails to do IO operations
*/
- public static List<YangNode> parseJarFile(String jarFile, String directory)
- throws IOException {
-
- List<YangNode> nodes = new ArrayList<>();
- JarFile jar = new JarFile(jarFile);
- Enumeration<?> enumEntries = jar.entries();
-
- while (enumEntries.hasMoreElements()) {
- JarEntry file = (JarEntry) enumEntries.nextElement();
- if (file.getName().endsWith(".ser")) {
-
- if (file.getName().contains(SLASH)) {
- String[] strArray = file.getName().split(SLASH);
- String tempPath = "";
- for (int i = 0; i < strArray.length - 1; i++) {
- tempPath = SLASH + tempPath + SLASH + strArray[i];
- }
- File dir = new File(directory + tempPath);
- dir.mkdirs();
- }
- File serializedFile = new File(directory + SLASH + file.getName());
- if (file.isDirectory()) {
- serializedFile.mkdirs();
- continue;
- }
- InputStream inputStream = jar.getInputStream(file);
-
- FileOutputStream fileOutputStream = new FileOutputStream(serializedFile);
- while (inputStream.available() > 0) {
- fileOutputStream.write(inputStream.read());
- }
- fileOutputStream.close();
- inputStream.close();
- nodes.addAll(deSerializeDataModel(serializedFile.toString()));
- //As of now only one metadata files will be there so if we
- // found one then we should break the loop.
- break;
- }
- }
- jar.close();
- return nodes;
- }
-
- /**
- * Parses jar file and returns list of serialized file names.
- *
- * @param jarFile jar file to be parsed
- * @param directory directory where to search
- * @return list of serialized files
- * @throws IOException when fails to do IO operations
- */
public static File parseDepSchemaPath(String jarFile, String directory)
throws IOException {
JarFile jar = new JarFile(jarFile);
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
index f5f981a..5a86c88 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/DefaultYangCompilationParam.java
@@ -24,23 +24,35 @@
import java.util.Set;
import static com.google.common.base.MoreObjects.toStringHelper;
+import static java.util.Collections.unmodifiableSet;
/**
* Represents default YANG compilation parameter.
*/
-public class DefaultYangCompilationParam implements YangCompilationParam {
+public final class DefaultYangCompilationParam implements YangCompilationParam {
private final Set<Path> yangFiles;
private final Set<Path> dependentSchemas;
private Path codeGenDir;
private Path metaDataPath;
+ private String modelId;
/**
* Creates an instance of YANG compilation parameter.
+ *
+ * @param files yang files path
+ * @param schemas dependent schema path
+ * @param metaPath metadata path
+ * @param id model id
+ * @param path generated code directory path
*/
- public DefaultYangCompilationParam() {
- yangFiles = new LinkedHashSet<>();
- dependentSchemas = new LinkedHashSet<>();
+ private DefaultYangCompilationParam(Set<Path> files, Set<Path>
+ schemas, Path metaPath, String id, Path path) {
+ yangFiles = unmodifiableSet(files);
+ dependentSchemas = unmodifiableSet(schemas);
+ modelId = id;
+ codeGenDir = path;
+ metaDataPath = metaPath;
}
@Override
@@ -49,44 +61,29 @@
}
@Override
- public void addYangFile(Path path) {
- yangFiles.add(path);
- }
-
- @Override
public Set<Path> getDependentSchemas() {
return dependentSchemas;
}
@Override
- public void addDependentSchema(Path path) {
- dependentSchemas.add(path);
- }
-
- @Override
public Path getCodeGenDir() {
return codeGenDir;
}
@Override
- public void setCodeGenDir(Path path) {
- codeGenDir = path;
- }
-
- @Override
public Path getMetadataGenDir() {
return metaDataPath;
}
@Override
- public void setMetadataGenDir(Path path) {
- metaDataPath = path;
+ public String getModelId() {
+ return modelId;
}
@Override
public int hashCode() {
return Objects.hash(yangFiles, dependentSchemas, codeGenDir,
- metaDataPath);
+ metaDataPath, modelId);
}
@Override
@@ -101,7 +98,8 @@
yangFiles.containsAll(that.yangFiles) &&
dependentSchemas.containsAll(that.dependentSchemas) &&
Objects.equals(codeGenDir, that.codeGenDir) &&
- Objects.equals(metaDataPath, that.metaDataPath);
+ Objects.equals(metaDataPath, that.metaDataPath) &&
+ Objects.equals(modelId, that.modelId);
}
@Override
@@ -111,6 +109,103 @@
.add("dependentSchemas", dependentSchemas)
.add("codeGenDir", codeGenDir)
.add("metaDataPath", metaDataPath)
+ .add("modelId", modelId)
.toString();
}
+
+ /**
+ * Retrieves a new YANG compilation param builder.
+ *
+ * @return YANG compilation param builder
+ */
+ public static DefaultYangCompilationParam.Builder builder() {
+ return new DefaultYangCompilationParam.Builder();
+ }
+
+ /**
+ * Builder to construct compilation param.
+ */
+ public static class Builder {
+ private final Set<Path> yangFiles;
+ private final Set<Path> dependentSchemas;
+ private Path codeGenDir;
+ private Path metaDataPath;
+ private String modelId;
+
+ /**
+ * Creates an instance of YANG compilation parameter builder.
+ */
+ public Builder() {
+ yangFiles = new LinkedHashSet<>();
+ dependentSchemas = new LinkedHashSet<>();
+ }
+
+ /**
+ * Sets metadata generation directory.
+ *
+ * @param path expected metadata generation directory
+ * @return updated builder with metadata generated schema
+ */
+ public Builder setMetadataGenDir(Path path) {
+ metaDataPath = path;
+ return this;
+ }
+
+ /**
+ * Sets yang model identifier.
+ *
+ * @param id model identifier
+ * @return updated builder with YANG model id
+ * instance
+ */
+ public Builder setModelId(String id) {
+ modelId = id;
+ return this;
+ }
+
+ /**
+ * Sets code generation directory.
+ *
+ * @param path expected code generation directory
+ * @return updated builder with generated code path value instance
+ */
+ public Builder setCodeGenDir(Path path) {
+ codeGenDir = path;
+ return this;
+ }
+
+ /**
+ * Adds dependent metadata path.
+ *
+ * @param path metadata path
+ * @return updated builder with dependent schema path value instance
+ */
+ public Builder addDependentSchema(Path path) {
+ dependentSchemas.add(path);
+ return this;
+ }
+
+ /**
+ * Adds YANG file path. This could be a directory in which YANG files are
+ * available.
+ *
+ * @param path YANG file path
+ * @return updated builder with YANG files path
+ */
+ public Builder addYangFile(Path path) {
+ yangFiles.add(path);
+ return this;
+ }
+
+ /**
+ * Builds a YangCompilationParam.
+ *
+ * @return built YangCompilationParam
+ */
+ public DefaultYangCompilationParam build() {
+ return new DefaultYangCompilationParam(
+ yangFiles, dependentSchemas, metaDataPath, modelId,
+ codeGenDir);
+ }
+ }
}
diff --git a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
index 2763004..d7dcfb5 100644
--- a/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangCompilerManager.java
@@ -32,7 +32,6 @@
import org.onosproject.yang.compiler.parser.impl.YangUtilsParserManager;
import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
import org.onosproject.yang.model.DefaultYangModel;
-import org.onosproject.yang.model.DefaultYangModule;
import org.onosproject.yang.model.DefaultYangModuleId;
import org.onosproject.yang.model.YangModel;
import org.onosproject.yang.model.YangModule;
@@ -40,17 +39,23 @@
import org.slf4j.Logger;
import java.io.File;
+import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
+import java.util.Enumeration;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
+import java.util.jar.JarEntry;
+import java.util.jar.JarFile;
import static java.nio.file.Files.copy;
import static java.nio.file.Paths.get;
@@ -58,13 +63,11 @@
import static java.util.Collections.sort;
import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_DERIVED_DATA_TYPE;
import static org.onosproject.yang.compiler.datamodel.ResolvableType.YANG_IDENTITYREF;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
import static org.onosproject.yang.compiler.linker.impl.YangLinkerUtils.resolveGroupingInDefinationScope;
import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.generateJavaCode;
import static org.onosproject.yang.compiler.translator.tojava.JavaCodeGeneratorUtil.translatorErrorHandler;
import static org.onosproject.yang.compiler.utils.UtilConstants.NEW_LINE;
-import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_META_DATA;
import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getJavaFiles;
import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.createDirectories;
@@ -84,41 +87,65 @@
private Set<YangFileInfo> yangFileInfoSet; //initialize in tool invocation;
private YangFileInfo curYangFileInfo = new YangFileInfo();
private Set<Path> genJavaPath = new LinkedHashSet<>();
+ private YangModel model;
+ private static final String SLASH = File.separator;
@Override
public YangCompiledOutput compileYangFiles(YangCompilationParam param)
throws IOException, YangCompilerException {
synchronized (YangCompilerManager.class) {
-
- YangPluginConfig config = new YangPluginConfig();
- config.setCodeGenDir(param.getCodeGenDir().toString() + SLASH);
- config.resourceGenDir(param.getMetadataGenDir().toString() +
- SLASH);
-
- processYangFiles(createYangFileInfoSet(param.getYangFiles()),
- dependentSchema(param.getDependentSchemas()), config);
-
- return new DefaultYangCompiledOutput(
- processYangModel(config.resourceGenDir()), genJavaPath);
+ processYangFiles(param);
+ return new DefaultYangCompiledOutput(model, genJavaPath);
}
}
/**
* Returns YANG model for application.
*
- * @param path path for metadata file
+ * @param path path for metadata file
+ * @param list list of YANG node
+ * @param modelId model id
+ * @param fromUt if method is called from unit test
* @return YANG model
+ * @throws IOException when fails to IO operations
*/
- private YangModel processYangModel(String path) {
+ public static YangModel processYangModel(
+ String path, List<YangNode> list, String modelId, boolean fromUt)
+ throws IOException {
YangModel.Builder b = DefaultYangModel.builder();
YangModuleId id;
- for (YangNode node : yangNodeSet) {
+ for (YangNode node : list) {
id = processModuleId(node);
- YangModule module =
- new DefaultYangModule(id, get(node.getFileName()), get(path));
+ String serFile = path + id.moduleName() + id.revision() + ".ser";
+ if (!fromUt) {
+ serializeModuleMetaData(serFile, node);
+ }
+ YangModule module = new YangModuleExtendedInfo(
+ id, new File(node.getFileName()), new File(serFile));
+ ((YangModuleExtendedInfo) module).setSchema(node);
b.addModule(id, module);
}
- return b.build();
+ return b.addModelId(modelId).build();
+ }
+
+ /**
+ * Serializes YANG Node.
+ *
+ * @param serFileName path of resource directory
+ * @param node YangNode
+ * @throws IOException when fails to IO operations
+ */
+ private static void serializeModuleMetaData(String serFileName, YangNode node)
+ throws IOException {
+ try {
+ FileOutputStream outStream = new FileOutputStream(serFileName);
+ ObjectOutputStream objOutStream = new ObjectOutputStream(outStream);
+ objOutStream.writeObject(node);
+ objOutStream.close();
+ outStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
}
/**
@@ -127,7 +154,7 @@
* @param module YANG module
* @return YANG module id for a given YANG module node
*/
- private YangModuleId processModuleId(YangNode module) {
+ public static YangModuleId processModuleId(YangNode module) {
String rev = getDateInStringFormat(module);
return new DefaultYangModuleId(module.getName(), rev);
}
@@ -163,19 +190,18 @@
* Compile te YANG files and generate the corresponding Java files.
* Update the generated bundle with the schema metadata.
*
- * @param yangFiles Application YANG files
- * @param dependentSchema inter jar linked schema nodes
- * @param config tool configurations
+ * @param param YANG compilation parameters
* @throws IOException when fails to do IO operations
*/
- private void processYangFiles(Set<YangFileInfo> yangFiles,
- Set<YangNode> dependentSchema,
- YangPluginConfig config) throws IOException {
-
+ private void processYangFiles(YangCompilationParam param) throws IOException {
+ YangPluginConfig config = new YangPluginConfig();
synchronized (YangCompilerManager.class) {
try {
-
- yangFileInfoSet = yangFiles;
+ String codeGenDir = param.getCodeGenDir() + SLASH;
+ String resourceGenDir = param.getMetadataGenDir() + SLASH;
+ config.setCodeGenDir(codeGenDir);
+ config.resourceGenDir(resourceGenDir);
+ yangFileInfoSet = createYangFileInfoSet(param.getYangFiles());
// Check if there are any file to translate, if not return.
if (yangFileInfoSet.isEmpty()) {
@@ -184,16 +210,19 @@
}
//Create resource directory.
- createDirectories(config.resourceGenDir());
+ createDirectories(resourceGenDir);
// Resolve inter jar dependency.
- addSchemaToFileSet(dependentSchema);
+ addSchemaToFileSet(dependentSchema(
+ param.getDependentSchemas()));
// Carry out the parsing for all the YANG files.
parseYangFileInfoSet();
+ createYangNodeSet();
+
// Serialize data model.
- processSerialization(config.resourceGenDir());
+ processSerialization(resourceGenDir, param.getModelId());
// Resolve dependencies using linker.
resolveDependenciesUsingLinker();
@@ -202,10 +231,10 @@
translateToJava(config);
//add to generated java code map
- processGeneratedCode(config.getCodeGenDir());
+ processGeneratedCode(codeGenDir);
//add YANG files to JAR
- processCopyYangFile(config.resourceGenDir());
+ processCopyYangFile(resourceGenDir);
} catch (IOException | ParserException e) {
//TODO: provide unified framework for exceptions
YangCompilerException exception =
@@ -251,7 +280,8 @@
Set<YangNode> depNodes = new LinkedHashSet<>();
for (Path path : dependentSchemaPath) {
try {
- depNodes.addAll(deSerializeDataModel(path.toString()));
+ depNodes.addAll(getYangNodes(
+ deSerializeDataModel(path.toString())));
} catch (IOException e) {
throw new YangCompilerException(
"Failed to fetch dependent schema from given " +
@@ -289,7 +319,6 @@
* @throws YangCompilerException failed to link schema
*/
public void resolveDependenciesUsingLinker() {
- createYangNodeSet();
try {
yangLinker.resolveDependencies(yangNodeSet);
} catch (LinkerException e) {
@@ -388,18 +417,18 @@
* Process serialization of datamodel.
*
* @param path path of resource directory
+ * @param id model id
* @throws IOException when fails to IO operations
*/
- private void processSerialization(String path) throws IOException {
- Set<YangNode> compiledSchemas = new HashSet<>();
- for (YangFileInfo fileInfo : yangFileInfoSet) {
- compiledSchemas.add(fileInfo.getRootNode());
- }
-
+ public void processSerialization(String path, String id) throws
+ IOException {
+ List<YangNode> nodelist = new ArrayList<>();
+ nodelist.addAll(yangNodeSet);
+ model = processYangModel(path, nodelist, id, false);
String serFileName = path + YANG_META_DATA;
FileOutputStream fileOutputStream = new FileOutputStream(serFileName);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
- objectOutputStream.writeObject(compiledSchemas);
+ objectOutputStream.writeObject(model);
objectOutputStream.close();
fileOutputStream.close();
}
@@ -463,4 +492,95 @@
}
return files;
}
+
+ /**
+ * Returns de-serializes YANG data-model.
+ *
+ * @param info serialized File Info
+ * @return de-serializes YANG data-model
+ * @throws IOException when fails do IO operations
+ */
+ public static YangModel deSerializeDataModel(String info)
+ throws IOException {
+ YangModel model;
+ try {
+ FileInputStream fileInputStream = new FileInputStream(info);
+ ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream);
+ model = ((YangModel) objectInputStream.readObject());
+ objectInputStream.close();
+ fileInputStream.close();
+ } catch (IOException | ClassNotFoundException e) {
+ throw new IOException(info + " failed to fetch nodes due to " + e
+ .getLocalizedMessage(), e);
+ }
+ return model;
+ }
+
+ /**
+ * Returs the set of YANG nodes from a given YANG model.
+ *
+ * @param model YANG model
+ * @return set of YANG nodes
+ */
+ public static Set<YangNode> getYangNodes(YangModel model) {
+ Set<YangNode> yangNodes = new HashSet<>();
+ if (model != null) {
+ Set<YangModule> modules = model.getYangModules();
+ for (YangModule info : modules) {
+ yangNodes.add(((YangModuleExtendedInfo) info).getSchema());
+ }
+ }
+ return yangNodes;
+ }
+
+ /**
+ * Parses jar file and returns YANG model.
+ *
+ * @param jarFile jar file to be parsed
+ * @param directory directory where to search
+ * @return YANG model
+ * @throws IOException when fails to do IO operations
+ */
+ public static YangModel parseJarFile(String jarFile, String directory)
+ throws IOException {
+
+ YangModel model = null;
+ JarFile jar = new JarFile(jarFile);
+ Enumeration<?> enumEntries = jar.entries();
+
+ while (enumEntries.hasMoreElements()) {
+ JarEntry file = (JarEntry) enumEntries.nextElement();
+ if (file.getName().endsWith(".ser")) {
+
+ if (file.getName().contains(SLASH)) {
+ String[] strArray = file.getName().split(SLASH);
+ String tempPath = "";
+ for (int i = 0; i < strArray.length - 1; i++) {
+ tempPath = SLASH + tempPath + SLASH + strArray[i];
+ }
+ File dir = new File(directory + tempPath);
+ dir.mkdirs();
+ }
+ File serializedFile = new File(directory + SLASH + file.getName());
+ if (file.isDirectory()) {
+ serializedFile.mkdirs();
+ continue;
+ }
+ InputStream inputStream = jar.getInputStream(file);
+
+ FileOutputStream fileOutputStream = new FileOutputStream(serializedFile);
+ while (inputStream.available() > 0) {
+ fileOutputStream.write(inputStream.read());
+ }
+ fileOutputStream.close();
+ inputStream.close();
+ model = deSerializeDataModel(serializedFile.toString());
+ //As of now only one metadata files will be there so if we
+ // found one then we should break the loop.
+ break;
+ }
+ }
+ jar.close();
+ return model;
+ }
}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
similarity index 84%
rename from runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java
rename to compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
index cc85080..9f01482 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangModuleExtendedInfo.java
+++ b/compiler/base/tool/src/main/java/org/onosproject/yang/compiler/tool/YangModuleExtendedInfo.java
@@ -14,18 +14,19 @@
* limitations under the License.
*/
-package org.onosproject.yang.runtime.helperutils;
+package org.onosproject.yang.compiler.tool;
import org.onosproject.yang.compiler.datamodel.YangNode;
import org.onosproject.yang.model.DefaultYangModule;
import org.onosproject.yang.model.YangModuleId;
-import java.nio.file.Path;
+import java.io.File;
+import java.io.Serializable;
/**
* Represents extended info for YANG module.
*/
-public class YangModuleExtendedInfo extends DefaultYangModule {
+public class YangModuleExtendedInfo extends DefaultYangModule implements Serializable {
private YangNode schema;
@@ -36,7 +37,7 @@
* @param yangSrc YANG resource path
* @param metadata meta data resource path
*/
- YangModuleExtendedInfo(YangModuleId id, Path yangSrc, Path metadata) {
+ public YangModuleExtendedInfo(YangModuleId id, File yangSrc, File metadata) {
super(id, yangSrc, metadata);
}
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
index 28e067a..ddbce9c 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangGenerator.java
@@ -16,7 +16,6 @@
package org.onosproject.yang.compiler.plugin.buck;
-import org.onosproject.yang.compiler.api.YangCompilationParam;
import org.onosproject.yang.compiler.api.YangCompiledOutput;
import org.onosproject.yang.compiler.api.YangCompilerException;
import org.onosproject.yang.compiler.api.YangCompilerService;
@@ -41,6 +40,7 @@
private final List<String> depJar;
private String outputDirectory;
private YangCompiledOutput output;
+ private String modelId;
/**
* Creates an instance of YANG generator.
@@ -48,11 +48,13 @@
* @param models YANG models
* @param outputDirectory output directory
* @param depJar dependent jar paths
+ * @param id model id
*/
- YangGenerator(List<File> models, String outputDirectory, List<String> depJar) {
+ YangGenerator(List<File> models, String outputDirectory, List<String> depJar, String id) {
this.models = models;
this.depJar = depJar;
this.outputDirectory = outputDirectory + SLASH;
+ modelId = id;
}
/**
@@ -66,31 +68,34 @@
YangCompilerService compiler = new YangCompilerManager();
//Create compiler param.
- YangCompilationParam param = new DefaultYangCompilationParam();
+ DefaultYangCompilationParam.Builder bldr =
+ DefaultYangCompilationParam.builder();
//Need to get dependent schema paths to give inter jar dependencies.
for (String jar : depJar) {
try {
File path = parseDepSchemaPath(jar, outputDirectory);
if (path != null) {
- param.addDependentSchema(Paths.get(path.getAbsolutePath()));
+ bldr.addDependentSchema(Paths.get(path.getAbsolutePath()));
}
} catch (IOException e) {
throw new YangCompilerException(
"Failed to parse dependent schema path");
}
}
- param.setCodeGenDir(Paths.get(outputDirectory));
- param.setMetadataGenDir(Paths.get(outputDirectory + SLASH +
- YANG_RESOURCES + SLASH));
+ bldr.setCodeGenDir(Paths.get(outputDirectory));
+ bldr.setMetadataGenDir(Paths.get(outputDirectory + SLASH +
+ YANG_RESOURCES + SLASH));
for (File file : models) {
- param.addYangFile(Paths.get(file.getAbsolutePath()));
+ bldr.addYangFile(Paths.get(file.getAbsolutePath()));
}
+ bldr.setModelId(modelId);
+
//Compile yang files and generate java code.
try {
- output = compiler.compileYangFiles(param);
+ output = compiler.compileYangFiles(bldr.build());
} catch (IOException e) {
throw new YangParsingException(e);
}
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
index f431ee3..0f6578a 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibrary.java
@@ -80,14 +80,17 @@
private final Path genSrcsDirectory;
private final Path outputDirectory;
private final Path output;
+ private final String modelId;
public YangLibrary(
BuildRuleParams params,
SourcePathResolver resolver,
- ImmutableSortedSet<SourcePath> srcs) {
+ ImmutableSortedSet<SourcePath> srcs,
+ String id) {
super(params, resolver);
this.srcs = srcs;
this.params = params;
+ modelId = id;
genSrcsDirectory = BuildTargets.getGenPath(getProjectFilesystem(),
params.getBuildTarget(),
"%s__yang-gen");
@@ -122,7 +125,7 @@
.collect(Collectors.toList());
steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory,
- params.getDeps()));
+ params.getDeps(), modelId));
steps.add(new JarDirectoryStep(
getProjectFilesystem(),
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
index 54a1e07..6dd70f9 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangLibraryDescription.java
@@ -99,7 +99,8 @@
unflavoredBuildTarget, SOURCES));
BuildRule yangLib = resolver.getRuleOptional(yangParams.getBuildTarget())
- .or(() -> resolver.addToIndex(new YangLibrary(yangParams, pathResolver, args.srcs)));
+ .or(() -> resolver.addToIndex(new YangLibrary(
+ yangParams, pathResolver, args.srcs, args.modelId.get())));
if (params.getBuildTarget().getFlavors().contains(SOURCES)) {
return yangLib;
@@ -113,7 +114,6 @@
args
);
-
// Create to main compile rule.
BuildRuleParams javaParams = params.copyWithChanges(
params.getBuildTarget(),
@@ -179,6 +179,7 @@
public static class Arg extends JvmLibraryArg {
public ImmutableSortedSet<SourcePath> srcs;
public Optional<ImmutableSortedSet<BuildTarget>> deps;
+ public Optional<String> modelId;
//TODO other params here
}
diff --git a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
index 58e8eb9..5fe66a8 100644
--- a/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
+++ b/compiler/plugin/buck/src/main/java/org/onosproject/yang/compiler/plugin/buck/YangStep.java
@@ -48,15 +48,17 @@
private final ProjectFilesystem filesystem;
private final List<Path> srcs;
private final Path output;
+ private final String modelId;
YangStep(ProjectFilesystem filesystem,
List<Path> srcs,
- Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps) {
+ Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps, String id) {
super(DESCRIPTION);
this.filesystem = filesystem;
this.srcs = srcs;
this.deps = deps;
this.output = genSourcesDirectory;
+ modelId = id;
}
@Override
@@ -67,8 +69,8 @@
List<File> sourceFiles = srcs.stream().map(Path::toFile)
.collect(Collectors.toList());
try {
- new YangGenerator(sourceFiles, output.toString(), getJarPaths())
- .execute();
+ new YangGenerator(sourceFiles, output.toString(), getJarPaths(),
+ modelId).execute();
return StepExecutionResult.SUCCESS;
} catch (YangParsingException e) {
executionContext.getConsole().printErrorText(e.getMessage());
diff --git a/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
index 3612a48..92472e2 100644
--- a/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
+++ b/compiler/plugin/maven/src/main/java/org/onosproject/yang/compiler/plugin/maven/YangUtilManager.java
@@ -25,7 +25,6 @@
import org.apache.maven.plugins.annotations.Parameter;
import org.apache.maven.project.MavenProject;
import org.apache.maven.rtinfo.RuntimeInformation;
-import org.onosproject.yang.compiler.api.YangCompilationParam;
import org.onosproject.yang.compiler.api.YangCompiledOutput;
import org.onosproject.yang.compiler.api.YangCompilerException;
import org.onosproject.yang.compiler.api.YangCompilerService;
@@ -85,6 +84,12 @@
private String classFileDir;
/**
+ * YANG Model id.
+ */
+ @Parameter(property = "modelId")
+ private String modelId;
+
+ /**
* Base directory for project.
*/
@Parameter(property = "basedir", defaultValue = "${basedir}")
@@ -163,20 +168,28 @@
project, localRepository, remoteRepository, outputDir);
//Create compiler param.
- YangCompilationParam param = new DefaultYangCompilationParam();
- param.setCodeGenDir(Paths.get(codeGenDir));
- param.setMetadataGenDir(Paths.get(metaDataGenDir));
+ DefaultYangCompilationParam.Builder bldr =
+ DefaultYangCompilationParam.builder();
+
+ bldr.setCodeGenDir(Paths.get(codeGenDir));
+ bldr.setMetadataGenDir(Paths.get(metaDataGenDir));
for (Path path : depSchemas) {
- param.addDependentSchema(path);
+ bldr.addDependentSchema(path);
}
for (String file : getYangFiles(searchDir)) {
- param.addYangFile(Paths.get(file));
+ bldr.addYangFile(Paths.get(file));
+ }
+
+ if (modelId != null) {
+ bldr.setModelId(modelId);
+ } else {
+ bldr.setModelId(project.getArtifactId());
}
//Compile yang files and generate java code.
- output = compiler.compileYangFiles(param);
+ output = compiler.compileYangFiles(bldr.build());
addToCompilationRoot(codeGenDir, project, context);
addToProjectResource(outputDir + SLASH + TEMP + SLASH, project);
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
index 63c21fe..3e4b2cb 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterFileLinkingTest.java
@@ -740,6 +740,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -769,6 +770,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -795,6 +797,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -821,6 +824,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangPluginConfig yangPluginConfig = new YangPluginConfig();
@@ -849,6 +853,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangNode selfNode = null;
@@ -903,6 +908,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangNode selfNode = null;
@@ -965,6 +971,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangNode selfNode = null;
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
index 90a717a..5506848 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/InterJarLinkerTest.java
@@ -26,12 +26,12 @@
import org.onosproject.yang.compiler.tool.YangCompilerManager;
import org.onosproject.yang.compiler.tool.YangFileInfo;
import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
+import org.onosproject.yang.model.YangModel;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
-import java.io.ObjectOutputStream;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
@@ -45,16 +45,17 @@
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.parseJarFile;
import static org.onosproject.yang.compiler.datamodel.utils.ResolvableStatus.RESOLVED;
import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.DERIVED;
import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.STRING;
-import static org.onosproject.yang.compiler.utils.UtilConstants.DEFAULT_JAR_RES_PATH;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
import static org.onosproject.yang.compiler.utils.UtilConstants.SLASH;
import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_META_DATA;
import static org.onosproject.yang.compiler.utils.UtilConstants.YANG_RESOURCES;
import static org.onosproject.yang.compiler.utils.io.impl.YangFileScanner.getYangFiles;
+import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.createDirectories;
import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
/**
@@ -67,7 +68,9 @@
private static final String TARGET = "target/interJarFileLinking/";
private static final String YANG_FILES_DIR = "src/test/resources/interJarFileLinking/yangFiles/";
- private static final String TARGET_RESOURCE_PATH = SLASH + TEMP + SLASH + YANG_RESOURCES + SLASH;
+ private static final String TARGET_RESOURCE_PATH = System.getProperty(
+ "user.dir") + SLASH + TARGET + TEMP + SLASH + YANG_RESOURCES +
+ SLASH;
private static final String JAR_FILE_NAME = "onlab-test-1.7.0-SNAPSHOT.jar";
private static final String SER_FILE_NAME = "portPair.ser";
@@ -76,6 +79,7 @@
private static final String PORT_PAIR_FOLDER = "target/interJarFileLinking/org/onosproject"
+ "/yang/gen/v1/portpair/rev20160524";
private static final String FLOW_CLASSIFIER_MANAGER = FLOW_CLASSIFIER_FOLDER + SLASH + "FlowClassifierManager.java";
+ private String id = "onos-yang-runtime";
/**
* Unit test case for a single jar dependency.
@@ -93,23 +97,22 @@
}
utilManager.createYangFileInfoSet(paths);
- int size1 = utilManager.getYangFileInfoSet().size();
utilManager.parseYangFileInfoSet();
- utilManager.createYangNodeSet();
- provideTestJarFile();
- utilManager.setYangFileInfoSet(removeFileInfoFromSet(utilManager.getYangFileInfoSet()));
+ //at this point port-pair will be in current context.
+ testPortPairFileForInterJar(true);
+ //process jar operations. we need to add only one node in serialized
+ // file which will be added to a jar file. this jar file will be
+ // used while resolving dependant schema nodes.
- for (String file : getListOfTestJar(TARGET)) {
- addInterJarRootNodes(file);
- }
+ //pass 1 because only 1 jar need to be created.
+ processJarOperation(1);
+ //at this point port-pair will be in jar context.
+ testPortPairFileForInterJar(false);
utilManager.resolveDependenciesUsingLinker();
- int size2 = utilManager.getYangFileInfoSet().size();
- assertThat(true, is(size1 != size2));
assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
-
deleteDirectory(TARGET);
deleteTestSerFile();
}
@@ -132,19 +135,21 @@
utilManager.createYangFileInfoSet(paths);
- int size1 = utilManager.getYangFileInfoSet().size();
utilManager.parseYangFileInfoSet();
- utilManager.createYangNodeSet();
- provideTestJarFile();
- utilManager.setYangFileInfoSet(removeFileInfoFromSet(utilManager.getYangFileInfoSet()));
- for (String file : getListOfTestJar(TARGET)) {
- addInterJarRootNodes(file);
- }
+ //at this point port-pair will be in current context.
+ testPortPairFileForInterJar(true);
+ //process jar operations. we need to add only one node in serialized
+ // file which will be added to a jar file. this jar file will be
+ // used while resolving dependant schema nodes.
+ //pass 2 because 2 jar need to be created.
+ processJarOperation(2);
+
+ //at this point port-pair will be in current context.
+ testPortPairFileForInterJar(false);
utilManager.resolveDependenciesUsingLinker();
- int size2 = utilManager.getYangFileInfoSet().size();
- assertThat(true, is(size1 != size2));
+ //adding process yang model for serialization
assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
assertThat(true, is(parseFileInfoSet(utilManager.getYangFileInfoSet().iterator())));
@@ -214,19 +219,89 @@
utilManager.translateToJava(yangPluginConfig);
- testIfFlowClassifierFilesExists();
+ testIfFlowClassifierFilesExists(false);
testIfPortPairFileDoesNotExist();
deleteDirectory(TARGET);
deleteTestSerFile();
}
/**
+ * Test when port pair is in current context/ jar context.
+ *
+ * @param val assert value
+ */
+ private void testPortPairFileForInterJar(boolean val) {
+ for (YangFileInfo info : utilManager.getYangFileInfoSet()) {
+ if (info.getYangFileName().endsWith("portpair.yang")) {
+ assertThat(val, is(info.getRootNode().isToTranslate()));
+ }
+ }
+ }
+
+ /**
+ * Process jar operation for UT.
+ *
+ * @throws IOException when fails to do IO operations
+ */
+ private void processJarOperation(int count) throws IOException {
+ if (count == 1) {
+ createJarAndUpdateCompilerManager("portpair");
+ } else if (count == 2) {
+ createJarAndUpdateCompilerManager("portpair");
+ createJarAndUpdateCompilerManager("flowclassifier");
+ }
+ //create node set for other 2 yang files. (test and flow classifier)
+ utilManager.createYangNodeSet();
+
+ //resolve inter jar linking.
+ for (String file : getListOfTestJar(TARGET)) {
+ //add inter jar node to node set.
+ utilManager.getYangNodeSet().addAll(addInterJarRootNodes(file));
+ }
+ }
+
+ /**
+ * Creates node set , then create jar file for it and remove node and
+ * file info form file info set.
+ *
+ * @param name name of current node
+ * @throws IOException when fails to do IO operations
+ */
+ private void createJarAndUpdateCompilerManager(String name) throws IOException {
+ YangNode node = null;
+ for (YangFileInfo info : utilManager.getYangFileInfoSet()) {
+ if (info.getYangFileName().endsWith(name + ".yang")) {
+ node = info.getRootNode();
+ }
+ }
+ //add only port pair node to yang node set.
+ utilManager.getYangNodeSet().add(node);
+
+ createDirectories(TARGET_RESOURCE_PATH);
+
+ List<YangNode> nodes = new ArrayList<>();
+ nodes.addAll(utilManager.getYangNodeSet());
+ //process model which will have only port pair node.
+ processYangModel(TARGET_RESOURCE_PATH, nodes, id, false);
+
+ //create a test jar file.
+ provideTestJarFile(name);
+
+ //now we will remove this port pair yang file form file info set and
+ // yang node set so when we will resolve this node using deserialization
+ //we can add it to yang node set and can test inter file linking
+ utilManager.setYangFileInfoSet(removeFileInfoFromSet(
+ utilManager.getYangFileInfoSet(), name));
+ utilManager.getYangNodeSet().remove(node);
+ }
+
+ /**
* Test if flow classifier code is generated.
*/
- private void testIfFlowClassifierFilesExists() {
+ private void testIfFlowClassifierFilesExists(boolean val) {
File folder = new File(System.getProperty("user.dir") + SLASH + FLOW_CLASSIFIER_FOLDER);
File file = new File(System.getProperty("user.dir") + SLASH + FLOW_CLASSIFIER_MANAGER);
- assertThat(true, is(folder.exists()));
+ assertThat(val, is(folder.exists()));
assertThat(false, is(file.exists()));
}
@@ -236,7 +311,7 @@
private void testIfPortPairFileDoesNotExist() {
File folder = new File(System.getProperty("user.dir") +
SLASH + PORT_PAIR_FOLDER);
- assertThat(true, is(folder.exists()));
+ assertThat(false, is(folder.exists()));
}
/**
@@ -246,9 +321,11 @@
* @param fileInfoSet YANG file info set
* @return updated file info set
*/
- private Set<YangFileInfo> removeFileInfoFromSet(Set<YangFileInfo> fileInfoSet) {
+ private Set<YangFileInfo> removeFileInfoFromSet(Set<YangFileInfo>
+ fileInfoSet,
+ String name) {
String portPairFile = System.getProperty("user.dir") + SLASH +
- YANG_FILES_DIR + "portpair.yang";
+ YANG_FILES_DIR + name + ".yang";
for (YangFileInfo fileInfo : fileInfoSet) {
if (fileInfo.getYangFileName().equals(portPairFile)) {
fileInfoSet.remove(fileInfo);
@@ -263,29 +340,17 @@
*
* @throws IOException when fails to do IO operations
*/
- private void provideTestJarFile() throws IOException {
- serializeDataModel();
- createTestJar();
- }
-
- /**
- * Serializes data-model.
- *
- * @throws IOException when fails to do IO operations
- */
- private void serializeDataModel() throws IOException {
-
- String serFileDirPath = TARGET + DEFAULT_JAR_RES_PATH;
+ private void provideTestJarFile(String name) throws IOException {
+ String serFileDirPath = TARGET + TEMP + SLASH +
+ YANG_RESOURCES + SLASH;
File dir = new File(serFileDirPath);
if (dir.exists()) {
dir.delete();
}
dir.mkdirs();
- FileOutputStream fileOutputStream = new FileOutputStream(serFileDirPath + YANG_META_DATA);
- ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream);
- objectOutputStream.writeObject(utilManager.getYangNodeSet());
- objectOutputStream.close();
- fileOutputStream.close();
+ utilManager.processSerialization(System.getProperty("user.dir") + SLASH +
+ serFileDirPath, id);
+ createTestJar(name);
}
/**
@@ -304,14 +369,14 @@
* @return true if present
*/
private boolean parseFileInfoSet(Iterator<YangFileInfo> yangFileInfoIterator) {
- YangFileInfo yangFileInfo = yangFileInfoIterator.next();
+ YangFileInfo yangFileInfo;
while (yangFileInfoIterator.hasNext()) {
+ yangFileInfo = yangFileInfoIterator.next();
if (yangFileInfo.getRootNode().getName().equals("port-pair")) {
return true;
} else if (yangFileInfo.getRootNode().getName().equals("flow-classifier")) {
return true;
}
- yangFileInfo = yangFileInfoIterator.next();
}
return false;
}
@@ -343,10 +408,12 @@
* @param jarFile jar file name
* @throws IOException when fails to do IO operations
*/
- private void addInterJarRootNodes(String jarFile) throws IOException {
+ private List<YangNode> addInterJarRootNodes(String jarFile) throws IOException {
+ List<YangNode> interJarResolvedNodes = new ArrayList<>();
try {
- List<YangNode> interJarResolvedNodes = parseJarFile(jarFile, TARGET);
-
+ YangModel model = parseJarFile(jarFile, TARGET);
+ id = model.getYangModelId();
+ interJarResolvedNodes.addAll(getYangNodes(model));
for (YangNode node : interJarResolvedNodes) {
YangFileInfo dependentFileInfo = new YangFileInfo();
node.setToTranslate(false);
@@ -358,14 +425,15 @@
} catch (IOException e) {
throw new IOException("failed to resolve in interjar scenario.");
}
+ return interJarResolvedNodes;
}
/**
* Creates a temporary test jar files.
*/
- private void createTestJar() {
+ private void createTestJar(String name) {
- File file = new File(TARGET + TARGET_RESOURCE_PATH);
+ File file = new File(TARGET_RESOURCE_PATH);
File[] files = file.listFiles();
String[] source = new String[files.length];
@@ -375,7 +443,7 @@
byte[] buf = new byte[1024];
try {
- String target = TARGET + JAR_FILE_NAME;
+ String target = TARGET + name + JAR_FILE_NAME;
JarOutputStream out = new JarOutputStream(new FileOutputStream(target));
for (String element : source) {
FileInputStream in = new FileInputStream(element);
diff --git a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
index ed4e608..fa73a7c 100644
--- a/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
+++ b/compiler/plugin/maven/src/test/java/org/onosproject/yang/compiler/plugin/maven/ietfyang/IetfYangFileTest.java
@@ -57,6 +57,7 @@
utilManager.createYangFileInfoSet(paths);
utilManager.parseYangFileInfoSet();
+ utilManager.createYangNodeSet();
utilManager.resolveDependenciesUsingLinker();
YangPluginConfig yangPluginConfig = new YangPluginConfig();
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
index 974a71d..600e943 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModel.java
@@ -16,6 +16,7 @@
package org.onosproject.yang.model;
+import java.io.Serializable;
import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Map;
@@ -27,9 +28,10 @@
/**
* Represents default YANG model implementation.
*/
-public class DefaultYangModel implements YangModel {
+public class DefaultYangModel implements YangModel, Serializable {
private final Map<YangModuleId, YangModule> moduleMap;
+ private String modelId;
/**
* Creates an instance of YANG model.
@@ -37,6 +39,7 @@
* @param b YANG model builder
*/
private DefaultYangModel(Builder b) {
+ modelId = b.modelId;
moduleMap = b.moduleMap;
}
@@ -67,6 +70,11 @@
}
@Override
+ public String getYangModelId() {
+ return modelId;
+ }
+
+ @Override
public YangModule getYangModule(YangModuleId id) {
return moduleMap.get(id);
}
@@ -79,7 +87,7 @@
@Override
public int hashCode() {
- return Objects.hash(moduleMap);
+ return Objects.hash(moduleMap, modelId);
}
@Override
@@ -99,13 +107,14 @@
} else {
return false;
}
- return true;
+ return Objects.equals(modelId, that.modelId);
}
@Override
public String toString() {
return toStringHelper(getClass())
.add("model", moduleMap)
+ .add("modelId", modelId)
.toString();
}
@@ -123,6 +132,7 @@
*/
public static class Builder implements YangModel.Builder {
private final Map<YangModuleId, YangModule> moduleMap;
+ private String modelId;
/**
* Creates an instance of YANG model builder.
@@ -138,6 +148,12 @@
}
@Override
+ public Builder addModelId(String id) {
+ modelId = id;
+ return this;
+ }
+
+ @Override
public YangModel build() {
return new DefaultYangModel(this);
}
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
index d209144..846b205 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModule.java
@@ -16,10 +16,11 @@
package org.onosproject.yang.model;
+import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
-import java.nio.file.Path;
+import java.io.Serializable;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
@@ -28,11 +29,11 @@
/**
* Represents default YANG module.
*/
-public class DefaultYangModule implements YangModule {
+public class DefaultYangModule implements YangModule, Serializable {
private YangModuleId id;
- private Path yangSrc;
- private Path metadata;
+ private File yangSrc;
+ private File metadata;
/**
* Creates an instance of default YANG module.
@@ -41,7 +42,7 @@
* @param yangSrc YANG source file path
* @param metadata YANG metadata source file path
*/
- public DefaultYangModule(YangModuleId id, Path yangSrc, Path metadata) {
+ public DefaultYangModule(YangModuleId id, File yangSrc, File metadata) {
checkNotNull(yangSrc);
checkNotNull(metadata);
checkNotNull(id);
@@ -58,17 +59,16 @@
@Override
public InputStream getYangSource() {
try {
- return new FileInputStream(yangSrc.toString());
+ return new FileInputStream(yangSrc);
} catch (FileNotFoundException e) {
- throw new ModelException("Yang source file not found." +
- yangSrc);
+ throw new ModelException("Yang source file not found." + yangSrc);
}
}
@Override
public InputStream getMetadata() {
try {
- return new FileInputStream(metadata.toString());
+ return new FileInputStream(metadata);
} catch (FileNotFoundException e) {
throw new ModelException("metadata source file not found." +
metadata);
diff --git a/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java b/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
index 284d605..b81a7f8 100644
--- a/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
+++ b/model/src/main/java/org/onosproject/yang/model/DefaultYangModuleId.java
@@ -16,6 +16,7 @@
package org.onosproject.yang.model;
+import java.io.Serializable;
import java.util.Objects;
import static com.google.common.base.MoreObjects.toStringHelper;
@@ -24,7 +25,7 @@
/**
* Represents default YANG module identifier.
*/
-public class DefaultYangModuleId implements YangModuleId {
+public class DefaultYangModuleId implements YangModuleId, Serializable {
private String moduleName;
private String revision;
diff --git a/model/src/main/java/org/onosproject/yang/model/YangModel.java b/model/src/main/java/org/onosproject/yang/model/YangModel.java
index e4cca01..fe482a3 100644
--- a/model/src/main/java/org/onosproject/yang/model/YangModel.java
+++ b/model/src/main/java/org/onosproject/yang/model/YangModel.java
@@ -38,6 +38,13 @@
Set<YangModuleId> getYangModulesId();
/**
+ * Returns model id for requested context.
+ *
+ * @return YANG model identifier
+ */
+ String getYangModelId();
+
+ /**
* Returns YANG module information corresponding to a given module
* identifier.
*
@@ -70,6 +77,14 @@
Builder addModule(YangModuleId id, YangModule module);
/**
+ * Adds model identifier.
+ *
+ * @param modelId model identifier
+ * @return builder
+ */
+ Builder addModelId(String modelId);
+
+ /**
* Builds an instance of YANG model.
*
* @return YANG model
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
index f1ae61b..f7fcb2a 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/RuntimeHelper.java
@@ -24,7 +24,7 @@
import org.onosproject.yang.compiler.utils.io.YangPluginConfig;
import org.onosproject.yang.model.YangModel;
import org.onosproject.yang.model.YangModule;
-import org.onosproject.yang.runtime.helperutils.YangModuleExtendedInfo;
+import org.onosproject.yang.compiler.tool.YangModuleExtendedInfo;
import org.slf4j.Logger;
import java.io.IOException;
@@ -66,7 +66,7 @@
* Returns YANG node for given YANG model.
*
* @param model YANG model
- * @return YANG node for given model
+ * @return YANG nodes for given model
*/
public static Set<YangNode> getNodes(YangModel model) {
Set<YangNode> nodes = new HashSet<>();
@@ -82,6 +82,7 @@
* Adds linker and translator info for each data model tree.
*
* @param nodes YANG node
+ * @return YANG nodes for given model
*/
public static Set<YangNode> addLinkerAndJavaInfo(Set<YangNode> nodes) {
YangLinker yangLinker = new YangLinkerManager();
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
index 98930b6..a7971d3 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/YangModelRegistry.java
@@ -17,6 +17,8 @@
package org.onosproject.yang.runtime;
import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
import java.util.Set;
@@ -29,15 +31,18 @@
* Registers a new model.
*
* @param param parameters having model to be registered with additional
- * informations provided by app
+ * information provided by app
+ * @throws IllegalArgumentException when requested model with provided
+ * identifier is already registered
*/
- void registerModel(ModelRegistrationParam param);
+ void registerModel(ModelRegistrationParam param)
+ throws IllegalArgumentException;
/**
* Unregisters the specified model.
*
* @param param parameters having model to be registered with additional
- * informations provided by app
+ * information provided by app
*/
void unregisterModel(ModelRegistrationParam param);
@@ -47,4 +52,20 @@
* @return collection of models
*/
Set<YangModel> getModels();
+
+ /**
+ * Returns YANG model for given model id.
+ *
+ * @param id model identifier
+ * @return YANG model
+ */
+ YangModel getModel(String id);
+
+ /**
+ * Returns YANG module for given YANG module id.
+ *
+ * @param id module identifier
+ * @return YANG module
+ */
+ YangModule getModule(YangModuleId id);
}
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
index 9abf5c0..9e80e8c 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/helperutils/YangApacheUtils.java
@@ -17,22 +17,20 @@
package org.onosproject.yang.runtime.helperutils;
import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.utils.DataModelUtils;
-import org.onosproject.yang.model.DefaultYangModel;
-import org.onosproject.yang.model.DefaultYangModuleId;
import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.model.YangModuleId;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleContext;
import org.slf4j.Logger;
import java.io.File;
import java.io.IOException;
+import java.util.ArrayList;
import java.util.List;
import java.util.regex.Pattern;
-import static java.nio.file.Paths.get;
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.parseJarFile;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
import static org.osgi.framework.FrameworkUtil.getBundle;
import static org.slf4j.LoggerFactory.getLogger;
@@ -66,54 +64,31 @@
BundleContext context = getBundle(modClass).getBundleContext();
if (context != null) {
Bundle bundle = context.getBundle();
- List<YangNode> curNodes;
+ List<YangNode> curNodes = new ArrayList<>();
String jarPath;
String metaPath;
jarPath = getJarPathFromBundleLocation(
bundle.getLocation(), context.getProperty(USER_DIRECTORY));
metaPath = jarPath + SLASH + YANG_RESOURCES + SLASH + YANG_META_DATA;
- curNodes = processJarParsingOperations(jarPath);
- // process model creations.
- if (curNodes != null && !curNodes.isEmpty()) {
- return processYangModel(metaPath, curNodes);
+ YangModel model = processJarParsingOperations(jarPath);
+ if (model != null) {
+ curNodes.addAll(getYangNodes(model));
+ // process model creations.
+ if (!curNodes.isEmpty()) {
+ try {
+ return processYangModel(metaPath, curNodes,
+ model.getYangModelId(), false);
+ } catch (IOException e) {
+ log.error(" failed to create process YANG model " +
+ e.getMessage(), e);
+ }
+ }
}
}
return null;
}
/**
- * Returns YANG model for application.
- *
- * @param path path for metadata file
- * @param curNodes curNodes YANG nodes
- * @return YANG model
- */
- public static YangModel processYangModel(String path,
- List<YangNode> curNodes) {
- YangModel.Builder b = DefaultYangModel.builder();
- YangModuleId id;
- for (YangNode node : curNodes) {
- id = processModuleId(node);
- YangModuleExtendedInfo module =
- new YangModuleExtendedInfo(id, get(node.getFileName()), get(path));
- module.setSchema(node);
- b.addModule(id, module);
- }
- return b.build();
- }
-
- /**
- * Returns YANG module id for a given YANG module node.
- *
- * @param module YANG module
- * @return YANG module id for a given YANG module node
- */
- public static YangModuleId processModuleId(YangNode module) {
- String rev = DataModelUtils.getDateInStringFormat(module);
- return new DefaultYangModuleId(module.getName(), rev);
- }
-
- /**
* Returns jar path from bundle mvnLocationPath.
*
* @param mvnLocationPath mvnLocationPath of bundle
@@ -148,12 +123,12 @@
}
/**
- * Process jar file for fetching YANG nodes.
+ * Process jar file for fetching YANG model.
*
* @param path jar file path
- * @return YANG schema nodes
+ * @return YANG model
*/
- private static List<YangNode> processJarParsingOperations(String path) {
+ private static YangModel processJarParsingOperations(String path) {
//Deserialize data model and get the YANG node set.
String jar = path + JAR;
try {
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
index 7eeee89..bd684e6 100644
--- a/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistry.java
@@ -64,6 +64,9 @@
private static final String AT = "@";
private final Logger log = getLogger(getClass());
private static final String E_NEXIST = "node with {} namespace not found.";
+ private static final String E_MEXIST =
+ "Model with given modelId already exist";
+ private static final String E_NULL = "Model must not be null";
/*
* Map for storing YANG schema nodes. Key will be the schema name of
* module node defined in YANG file.
@@ -97,40 +100,37 @@
private final ConcurrentMap<String, YangSchemaNode> nameSpaceSchemaStore;
/**
- * Set of YANG models.
+ * Map for storing YANG model with respect to model identifier. Will
+ * be used by other application to register and unregister the YANG
+ * models based on model identifier.
*/
- private final Set<YangModel> models;
+ private final ConcurrentMap<String, YangModel> modelIdStore;
/**
* Creates an instance of default YANG schema registry.
*/
public DefaultYangModelRegistry() {
- models = new LinkedHashSet<>();
yangSchemaStore = new ConcurrentHashMap<>();
regClassNameKeyStore = new ConcurrentHashMap<>();
registerClassStore = new ConcurrentHashMap<>();
nameSpaceSchemaStore = new ConcurrentHashMap<>();
qNameKeyStore = new ConcurrentHashMap<>();
+ modelIdStore = new ConcurrentHashMap<>();
}
@Override
- public void registerModel(ModelRegistrationParam param) {
- YangModel model = checkNotNull(param.getYangModel(), "Model must not be null");
+ public void registerModel(ModelRegistrationParam param) throws
+ IllegalArgumentException {
+ YangModel model = checkNotNull(param.getYangModel(), E_NULL);
Set<YangNode> curNodes = getNodes(model);
- models.add(model);
- String name;
- Class<?> service;
- AppModuleInfo info;
+
//adding class info if added by application.
- for (YangModuleId id : model.getYangModulesId()) {
- info = param.getAppModuleInfo(id);
- if (info != null) {
- service = info.getModuleClass();
- name = service.getName();
- if (!registerClassStore.containsKey(name)) {
- registerClassStore.put(name, service);
- }
- }
+ updateRegClassStore(param);
+
+ if (modelIdStore.containsKey(model.getYangModelId())) {
+ throw new IllegalArgumentException(E_MEXIST);
+ } else {
+ modelIdStore.put(model.getYangModelId(), param.getYangModel());
}
//Register all the YANG nodes.
@@ -164,9 +164,8 @@
@Override
public void unregisterModel(ModelRegistrationParam param) {
synchronized (DefaultYangModelRegistry.class) {
- YangModel model = checkNotNull(param.getYangModel(),
- "Model must not be null");
- models.remove(model);
+ YangModel model = checkNotNull(param.getYangModel(), E_NULL);
+ modelIdStore.remove(model.getYangModelId());
//Unregister all yang files
Set<YangNode> curNodes = getNodes(model);
for (YangNode node : curNodes) {
@@ -196,6 +195,10 @@
@Override
public Set<YangModel> getModels() {
+ Set<YangModel> models = new LinkedHashSet<>();
+ for (Map.Entry<String, YangModel> entry : modelIdStore.entrySet()) {
+ models.add(entry.getValue());
+ }
return unmodifiableSet(models);
}
@@ -206,10 +209,28 @@
* @param schemaName schema name
* @return YANG schema node
*/
- YangSchemaNode getForSchemaName(String schemaName) {
+ public YangSchemaNode getForSchemaName(String schemaName) {
return getForNameWithRev(schemaName);
}
+ @Override
+ public YangModel getModel(String id) {
+ return modelIdStore.get(id);
+ }
+
+ @Override
+ public org.onosproject.yang.model.YangModule getModule(YangModuleId id) {
+ for (Map.Entry<String, YangModel> entry : modelIdStore
+ .entrySet()) {
+ org.onosproject.yang.model.YangModule module = entry.getValue()
+ .getYangModule(id);
+ if (module != null) {
+ return module;
+ }
+ }
+ return null;
+ }
+
/**
* Returns schema node for the given name. Name should be generated class
* name. the name provided here should be for registered class.
@@ -454,6 +475,36 @@
return null;
}
+
+ /**
+ * Updates registered class store.
+ *
+ * @param param model registrations param
+ */
+ public void updateRegClassStore(ModelRegistrationParam param) {
+ Class<?> service;
+ AppModuleInfo info;
+ for (YangModuleId id : param.getYangModel().getYangModulesId()) {
+ info = param.getAppModuleInfo(id);
+ if (info != null) {
+ service = info.getModuleClass();
+ addRegClass(service.getName(), service);
+ }
+ }
+ }
+
+ /**
+ * Adds the registered class.
+ *
+ * @param name qualified name of the class
+ * @param service generated class
+ */
+ public void addRegClass(String name, Class<?> service) {
+ if (!registerClassStore.containsKey(name)) {
+ registerClassStore.put(name, service);
+ }
+ }
+
/**
* Updates child's context. It sets itself as a parent context for first
* level child's in module/sub-module.
diff --git a/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java b/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
new file mode 100644
index 0000000..c9a3f75
--- /dev/null
+++ b/runtime/src/main/java/org/onosproject/yang/runtime/impl/MockYangSchemaNodeProvider.java
@@ -0,0 +1,175 @@
+/*
+ * Copyright 2017-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.runtime.impl;
+
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.runtime.ModelRegistrationParam;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.deSerializeDataModel;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.getYangNodes;
+import static org.onosproject.yang.compiler.tool.YangCompilerManager.processYangModel;
+import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
+import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
+import static org.onosproject.yang.runtime.DefaultModelRegistrationParam.builder;
+import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
+
+/**
+ * Represents mock YANG schema node for unit test cases.
+ */
+public final class MockYangSchemaNodeProvider {
+
+ private static final String FS = File.separator;
+ private static final String PATH = System.getProperty("user.dir") +
+ FS + "target" + FS + "classes" + FS;
+ private static final String SER_FILE_PATH = "yang" + FS + "resources" +
+ FS + "YangMetaData.ser";
+ private static final String META_PATH = PATH + SER_FILE_PATH;
+ private static final String TEMP_FOLDER_PATH = PATH + TEMP;
+ private static DefaultYangModelRegistry reg;
+ private static List<YangNode> nodes = new ArrayList<>();
+ private static String id;
+
+ /**
+ * Creates an instance of mock YANG schema for unit test cases.
+ */
+ private MockYangSchemaNodeProvider() {
+ }
+
+ /**
+ * Process YANG schema node for a application.
+ */
+ public static void processSchemaRegistry() {
+ try {
+ reg = new DefaultYangModelRegistry();
+ //Need to deserialize generated meta data file for unit tests.
+ YangModel model = deSerializeDataModel(META_PATH);
+ Set<YangNode> appNode = getYangNodes(model);
+ nodes.addAll(appNode);
+ id = model.getYangModelId();
+ reg.registerModel(param(nodes));
+
+ //now we need to update the registered classes for YOB.
+ addClassInfo(nodes);
+ deleteDirectory(TEMP_FOLDER_PATH);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+
+ /**
+ * Unregister given nodes from runtime service.
+ *
+ * @param nodes list of nodes
+ */
+ public static void unRegister(List<YangNode> nodes) {
+ reg.unregisterModel(param(nodes));
+ }
+
+ /**
+ * Prepares model registration parameter.
+ *
+ * @param nodes list of nodes
+ * @return model registration parameter
+ */
+ private static ModelRegistrationParam param(List<YangNode> nodes) {
+ //Create model registration param.
+ ModelRegistrationParam.Builder b = builder();
+
+ //create a new YANG model
+ YangModel model = null;
+ try {
+ model = processYangModel(META_PATH, nodes, id, true);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ //set YANG model
+ b.setYangModel(model);
+ return b.build();
+ }
+
+ static YangModel processModelTest() {
+ YangModel model = null;
+ try {
+ model = deSerializeDataModel(META_PATH);
+ Set<YangNode> appNode = getYangNodes(model);
+ List<YangNode> nodes = new ArrayList<>();
+ nodes.addAll(appNode);
+ return processYangModel(META_PATH, nodes, id, false);
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return model;
+ }
+
+ /**
+ * Prepares model registration parameter.
+ *
+ * @param nodes list of nodes
+ */
+ private static void addClassInfo(List<YangNode> nodes) {
+ //Process loading class file.
+ String appName;
+ ClassLoader classLoader = MockYangSchemaNodeProvider.class.getClassLoader();
+
+ Iterator<YangNode> it = nodes.iterator();
+ while (it.hasNext()) {
+ YangSchemaNode node = it.next();
+
+ //If service class is not generated then use
+ // interface file to load this class.
+ appName = getInterfaceClassName(node);
+ Class<?> cls;
+ try {
+ cls = classLoader.loadClass(appName);
+ } catch (ClassNotFoundException e) {
+ continue;
+ }
+
+ reg.addRegClass(appName, cls);
+ }
+ }
+
+ /**
+ * Returns schema registry.
+ *
+ * @return schema registry
+ */
+
+ public static DefaultYangModelRegistry registry() {
+ return reg;
+ }
+
+ /**
+ * Adds a mock node in reg.
+ *
+ * @param node schema node
+ * @param name name of node
+ */
+ public static void addMockNode(YangSchemaNode node, String name) {
+ reg.processApplicationContext(node, name);
+ }
+}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
index 171ca85..489d816 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DataTreeContextSwitchTest.java
@@ -81,6 +81,8 @@
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Unit test cases for YANG tree builder for context switch for augment, RPC
@@ -91,8 +93,6 @@
private static final String CHOC = "choc";
private static final String VAL = "val";
private static final String IND = "ind";
- private final TestYangSchemaNodeProvider schemaProvider = new
- TestYangSchemaNodeProvider();
private ResourceData rscData;
private DefaultDataTreeBuilder treeBuilder;
private ResourceId id;
@@ -108,8 +108,8 @@
* Do the prior setup for each UT.
*/
private void setUp() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
+ processSchemaRegistry();
+ DefaultYangModelRegistry registry = registry();
treeBuilder = new DefaultDataTreeBuilder(registry);
}
@@ -705,7 +705,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -748,8 +748,8 @@
data = new DefaultModelObjectData.Builder();
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class)
- .addChild(DefaultOnlyContainer.class).build());
+ .addChild(DefaultFirstLevel.class)
+ .addChild(DefaultOnlyContainer.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -798,7 +798,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -862,7 +862,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -942,7 +942,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -1050,8 +1050,8 @@
con.listLeaf(list);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class)
- .addChild(DefaultContainerList.class).build());
+ .addChild(DefaultFirstLevel.class)
+ .addChild(DefaultContainerList.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -1128,9 +1128,9 @@
ListLeafKeys key = new ListLeafKeys();
key.name("key leaf");
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class)
- .addChild(DefaultContainerList.class)
- .addChild(DefaultListLeaf.class, key).build());
+ .addChild(DefaultFirstLevel.class)
+ .addChild(DefaultContainerList.class)
+ .addChild(DefaultListLeaf.class, key).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -1206,7 +1206,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -1273,7 +1273,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
@@ -1331,7 +1331,7 @@
data = new DefaultModelObjectData.Builder();
data.addModelObject(con);
data.identifier(ModelObjectId.builder()
- .addChild(DefaultFirstLevel.class).build());
+ .addChild(DefaultFirstLevel.class).build());
// Builds YANG tree in YTB.
rscData = treeBuilder.getResourceData(data.build());
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
index 3951a26..8be816f 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultDataTreeBuilderTest.java
@@ -121,6 +121,8 @@
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
import static org.onosproject.yang.runtime.impl.TestUtils.validateLeafDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/*
*
@@ -139,8 +141,6 @@
*/
public class DefaultDataTreeBuilderTest {
- private final TestYangSchemaNodeProvider schemaProvider = new
- TestYangSchemaNodeProvider();
@Rule
public ExpectedException thrown = ExpectedException.none();
private ResourceData rscData;
@@ -159,8 +159,8 @@
* Do the prior setup for each UT.
*/
private void setUp() {
- schemaProvider.processSchemaRegistry();
- registry = schemaProvider.registry();
+ processSchemaRegistry();
+ registry = registry();
treeBuilder = new DefaultDataTreeBuilder(registry);
}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
index ff8bd82..d509e3a 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/DefaultYangModelRegistryTest.java
@@ -16,18 +16,31 @@
package org.onosproject.yang.runtime.impl;
+import com.google.common.collect.ImmutableSet;
import org.junit.Test;
import org.onosproject.yang.compiler.datamodel.YangNode;
import org.onosproject.yang.compiler.datamodel.YangRevision;
import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
import java.io.IOException;
+import java.io.InputStream;
+import java.io.ObjectInputStream;
import java.util.ArrayList;
+import java.util.LinkedHashSet;
import java.util.List;
+import java.util.Set;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.core.Is.is;
import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.getDateInStringFormat;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processModelTest;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.unRegister;
/**
* Unit test for model registry.
@@ -58,9 +71,16 @@
private static final String DATE_NAMESPACE = "2015-12-08";
private static final String NAMESPACE =
"urn:ietf:params:xml:ns:yang:ietf-network4:check:namespace";
+ private static final String MODEL_ID = "onos-yang-runtime";
- private final TestYangSchemaNodeProvider provider =
- new TestYangSchemaNodeProvider();
+
+ /**
+ * Do the prior setup for each UT.
+ */
+ private DefaultYangModelRegistry setUp() {
+ processSchemaRegistry();
+ return registry();
+ }
/**
* Unit test case in which schema node should be present.
@@ -70,11 +90,21 @@
@Test
public void testForGetSchemaNode()
throws IOException {
-
- provider.processSchemaRegistry();
-
List<YangNode> nodes = new ArrayList<>();
- DefaultYangModelRegistry registry = provider.registry();
+ DefaultYangModelRegistry registry = setUp();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+
+ YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+ "2017-12-08");
+
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
@@ -82,12 +112,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_3);
assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
- Class<?> cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_3.equals(cls.getName())));
-
//Unregister service
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
assertThat(true, is(yangNode == null));
@@ -95,24 +122,56 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_3);
assertThat(true, is(yangNode == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls == null));
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
}
/**
- * Unit test case in which schema node should be present with multi
- * revisions.
+ * Unit test case for getting the metadata for a particular module.
*
* @throws IOException when fails to do IO operation
*/
@Test
- public void testForGetSchemaNodeWhenNoRevision()
+ public void testForGetMetaData()
throws IOException {
-
- provider.processSchemaRegistry();
- DefaultYangModelRegistry registry = provider.registry();
-
+ DefaultYangModelRegistry registry = setUp();
+ YangNode node = null;
List<YangNode> nodes = new ArrayList<>();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+ processModelTest();
+ YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+ "2017-12-08");
+
+ // TODO: fix this for yang model test
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+ InputStream stream = module.getMetadata();
+ ObjectInputStream objectInputStream = new ObjectInputStream(stream);
+ try {
+ node = ((YangNode) objectInputStream.readObject());
+ } catch (ClassNotFoundException e) {
+ System.out.println(e);
+ }
+ objectInputStream.close();
+ assertThat(true, is(
+ node.getName().equals(moduleId.moduleName())));
+
//Service with rev.
YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
@@ -120,12 +179,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- Class<?> cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_REV_15.equals(cls.getName())));
-
//unregister SERVICE_NAME_REV_15.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(yangNode != null));
@@ -133,9 +189,6 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
assertThat(true, is(yangNode == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls == null));
-
//Here the yangNode should be the node which does not have revision.
// asset should pass with false.
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
@@ -149,12 +202,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_NO_REV.equals(cls.getName())));
-
//unregister SERVICE_NAME_NO_REV.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
//Here the yangNode should be the node which have different revision.
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
@@ -164,8 +214,17 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
assertThat(true, is(yangNode == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls == null));
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
}
/**
@@ -175,13 +234,27 @@
* @throws IOException when fails to do IO operation
*/
@Test
- public void testForGetSchemaNodeWhenMultiRevision()
+ public void testForGetSchemaNodeWhenNoRevision()
throws IOException {
- provider.processSchemaRegistry();
- DefaultYangModelRegistry registry = provider.registry();
-
+ DefaultYangModelRegistry registry = setUp();
+ YangNode node = null;
List<YangNode> nodes = new ArrayList<>();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+
+ YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+ "2017-12-08");
+
+ // TODO: fix this for yang model test
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
//Service with rev.
YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
@@ -189,12 +262,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- Class<?> cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_REV_15.equals(cls.getName())));
-
- //Unregister SERVICE_NAME_REV_15.
+ //unregister SERVICE_NAME_REV_15.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(yangNode != null));
@@ -207,8 +277,96 @@
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(((YangNode) yangNode).getRevision() == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls != null));
+ //---------------------------------------------------------------//
+
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ //unregister SERVICE_NAME_NO_REV.
+ nodes.add((YangNode) yangNode);
+ unRegister(nodes);
+
+ //Here the yangNode should be the node which have different revision.
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(yangNode != null));
+ assertThat(true, is(((YangNode) yangNode).getRevision() != null));
+
+ yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
+ assertThat(true, is(yangNode == null));
+
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
+ }
+
+ private Set<YangModule> getYangModules(YangModel model, String modelId) {
+ Set<org.onosproject.yang.model.YangModule> modules =
+ new LinkedHashSet<>();
+ if (model != null) {
+ modules.addAll(model.getYangModules());
+ }
+ return ImmutableSet.copyOf(modules);
+ }
+
+ /**
+ * Unit test case in which schema node should be present with multi
+ * revisions.
+ *
+ * @throws IOException when fails to do IO operation
+ */
+ @Test
+ public void testForGetSchemaNodeWhenMultiRevision()
+ throws IOException {
+
+ DefaultYangModelRegistry registry = setUp();
+
+ List<YangNode> nodes = new ArrayList<>();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+
+ YangModuleId moduleId = new DefaultYangModuleId("ietf-network4",
+ "2017-12-08");
+
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+ //Service with rev.
+ YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ //Unregister SERVICE_NAME_REV_15.
+ nodes.add((YangNode) yangNode);
+ unRegister(nodes);
+
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(yangNode != null));
+
+ yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_15);
+ assertThat(true, is(yangNode == null));
+
+ //Here the yangNode should be the node which does not have revision.
+ // asset should pass with false.
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(((YangNode) yangNode).getRevision() == null));
//---------------------------------------------------------------//
@@ -223,12 +381,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_16);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_REV_16.equals(cls.getName())));
-
//Unregister SERVICE_NAME_REV_16.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_16);
assertThat(true, is(yangNode == null));
@@ -237,9 +392,6 @@
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(((YangNode) yangNode).getRevision() == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls != null));
-
//---------------------------------------------------------------//
//Service with different revision.
@@ -250,12 +402,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_17);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_REV_17.equals(cls.getName())));
-
//Unregister SERVICE_NAME_REV_17.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_17);
assertThat(true, is(yangNode == null));
@@ -264,9 +413,6 @@
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(((YangNode) yangNode).getRevision() == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls != null));
-
//---------------------------------------------------------------//
//Service no revision.
@@ -277,12 +423,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_NO_REV.equals(cls.getName())));
-
//Unregister SERVICE_NAME_NO_REV.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForRegClassName(INTERFACE_NAME_NO_REV);
assertThat(true, is(yangNode == null));
@@ -292,9 +435,6 @@
assertThat(true, is(yangNode != null));
assertThat(true, is(((YangNode) yangNode).getRevision() != null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls != null));
-
//---------------------------------------------------------------//
//Service with different revision.
@@ -305,12 +445,9 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_14);
assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(INTERFACE_NAME_REV_14.equals(cls.getName())));
-
//Unregister SERVICE_NAME_REV_14.
nodes.add((YangNode) yangNode);
- provider.unRegister(nodes);
+ unRegister(nodes);
yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
assertThat(true, is(yangNode == null));
@@ -318,8 +455,17 @@
yangNode = registry.getForRegClassName(INTERFACE_NAME_REV_14);
assertThat(true, is(yangNode == null));
- cls = registry.getRegisteredClass(yangNode);
- assertThat(true, is(cls == null));
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
}
/**
@@ -327,8 +473,7 @@
*/
@Test
public void testGetNodeWrtNamespace() {
- provider.processSchemaRegistry();
- DefaultYangModelRegistry registry = provider.registry();
+ DefaultYangModelRegistry registry = setUp();
YangSchemaNode yangNode = registry.getForNameSpace(NAMESPACE, false);
assertThat(true, is(CHECK.equals(yangNode.getName())));
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
index 9b1ff75..44b7aab 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/L3vpnModelConverterTest.java
@@ -17,7 +17,6 @@
package org.onosproject.yang.runtime.impl;
import org.junit.Test;
-
import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.AddressAllocationType;
import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.DefaultL3VpnSvc;
import org.onosproject.yang.gen.v1.ietfl3vpnsvc.rev20160730.ietfl3vpnsvc.RoutingProtocolType;
@@ -70,6 +69,8 @@
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_LEAF_VALUE_NODE;
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
import static org.onosproject.yang.runtime.impl.TestUtils.validateDataNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Unit test for l3vpn app. test for conversion of model data to resource data.
@@ -84,8 +85,6 @@
private List<DataNode> dataNodes;
private DataNode node;
private DefaultModelObjectData.Builder data;
- private final TestYangSchemaNodeProvider schemaProvider = new
- TestYangSchemaNodeProvider();
private static final String NAME_SPACE_SVC =
"urn:ietf:params:xml:ns:yang:ietf-l3vpn-svc";
private static final String NAME_SPACE_EXT =
@@ -95,8 +94,8 @@
* Do the prior setup for each UT.
*/
private void setUp() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
+ processSchemaRegistry();
+ DefaultYangModelRegistry registry = registry();
treeBuilder = new DefaultDataTreeBuilder(registry);
}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
index 1e88a85..fb553f7 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/MoIdToRscIdTest.java
@@ -28,7 +28,6 @@
import org.onosproject.yang.compiler.datamodel.YangRpc;
import org.onosproject.yang.compiler.datamodel.YangType;
import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
-
import org.onosproject.yang.gen.v1.check.check.Cont53;
import org.onosproject.yang.gen.v1.check.check.DefaultCont53;
import org.onosproject.yang.gen.v1.check.check.DefaultList56;
@@ -68,6 +67,9 @@
import static org.hamcrest.core.Is.is;
import static org.onosproject.yang.compiler.datamodel.utils.builtindatatype.YangDataTypes.INT32;
import static org.onosproject.yang.gen.v1.ytbtreebuilderforlisthavinglist.rev20160826.ytbtreebuilderforlisthavinglist.carrier.multiplexes.TypesEnum.SPACE_DIVISION;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.addMockNode;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
import static org.slf4j.LoggerFactory.getLogger;
/**
@@ -76,8 +78,6 @@
public class MoIdToRscIdTest {
private final Logger log = getLogger(getClass());
- private final TestYangSchemaNodeProvider provider = new
- TestYangSchemaNodeProvider();
ModIdToRscIdConverter builder;
DefaultYangModelRegistry reg;
private ResourceId rscId;
@@ -89,8 +89,8 @@
* Sets up all prerequisite.
*/
private void setUp() {
- provider.processSchemaRegistry();
- reg = provider.registry();
+ processSchemaRegistry();
+ reg = registry();
builder = new ModIdToRscIdConverter(reg);
}
@@ -105,7 +105,7 @@
} catch (DataModelException e) {
log.info("test error");
}
- provider.addMockNode(mod, getQualifiedName());
+ addMockNode(mod, getQualifiedName());
}
/**
@@ -119,7 +119,7 @@
} catch (DataModelException e) {
log.info("test error");
}
- provider.addMockNode(mod, getQualifiedName());
+ addMockNode(mod, getQualifiedName());
}
/**
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java
deleted file mode 100644
index 41dec1c..0000000
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Copyright 2017-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.runtime.impl;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class TestYangSchemaNodeProvider {
-
- private static final String FS = File.separator;
- private static final String PATH = System.getProperty("user.dir") +
- FS + "target" + FS + "classes" + FS;
- private static final String SER_FILE_PATH = "yang" + FS + "resources" +
- FS + "YangMetaData.ser";
- private static final String META_PATH = PATH + SER_FILE_PATH;
- private static final String TEMP_FOLDER_PATH = PATH + TEMP;
- private DefaultYangModelRegistry reg = new DefaultYangModelRegistry();
- private List<YangNode> nodes = new ArrayList<>();
-
- /**
- * Creates an instance of mock bundle context.
- */
- public TestYangSchemaNodeProvider() {
- }
-
- /**
- * Process YANG schema node for a application.
- */
- public void processSchemaRegistry() {
- try {
- //Need to deserialize generated meta data file for unit tests.
- Set<YangNode> appNode = deSerializeDataModel(META_PATH);
- addLinkerAndJavaInfo(appNode);
- nodes.addAll(appNode);
- reg.registerModel(prepareParam(nodes));
- deleteDirectory(TEMP_FOLDER_PATH);
- } catch (IOException e) {
- }
- }
-
- /**
- * Unregister given nodes from runtime service.
- *
- * @param nodes list of nodes
- */
- public void unRegister(List<YangNode> nodes) {
- reg.unregisterModel(prepareParam(nodes));
- }
-
- /**
- * Prepares model registration parameter.
- *
- * @param nodes list of nodes
- * @return model registration parameter
- */
- private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
- //Process loading class file.
- String appName;
- ClassLoader classLoader = getClass().getClassLoader();
-
- //Create model registration param.
- ModelRegistrationParam.Builder b =
- DefaultModelRegistrationParam.builder();
-
- //create a new YANG model
- YangModel model = processYangModel(META_PATH, nodes);
- //set YANG model
- b.setYangModel(model);
-
- Iterator<YangNode> it = nodes.iterator();
- while (it.hasNext()) {
- YangSchemaNode node = it.next();
-
- //If service class is not generated then use
- // interface file to load this class.
- appName = getInterfaceClassName(node);
- Class<?> cls;
- try {
- cls = classLoader.loadClass(appName);
- } catch (ClassNotFoundException e) {
- continue;
- }
-
- //generate app info.
- AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
- b.addAppModuleInfo(processModuleId((YangNode) node), info);
- }
- return b.build();
- }
-
- /**
- * Returns schema registry.
- *
- * @return schema registry
- */
- public DefaultYangModelRegistry registry() {
- return reg;
- }
-
- /**
- * Adds a mock node in reg.
- *
- * @param node schema node
- * @param name name of node
- */
- public void addMockNode(YangSchemaNode node, String name) {
- reg.processApplicationContext(node, name);
- }
-}
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
index b01b44e..3c55968 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/TestYangSerializerContext.java
@@ -22,20 +22,18 @@
import java.util.List;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
/**
* Tests the default schema context provider methods.
*/
public class TestYangSerializerContext implements YangSerializerContext {
- private static TestYangSchemaNodeProvider schemaProvider =
- new TestYangSchemaNodeProvider();
-
-
@Override
public SchemaContext getContext() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
- return registry;
+ processSchemaRegistry();
+ return registry();
}
@Override
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
index 32b362c..c8b24c4 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/YtbResourceIdTest.java
@@ -64,14 +64,15 @@
import static org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.type.Con1.LeafIdentifier.LL;
import static org.onosproject.yang.gen.v1.modulelistandkey.rev20160826.modulelistandkey.type.Leaf6Enum.ENUM2;
import static org.onosproject.yang.model.ModelObjectId.builder;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Unit test cases for resource id conversion from model object id.
*/
public class YtbResourceIdTest {
- private final TestYangSchemaNodeProvider schemaProvider = new
- TestYangSchemaNodeProvider();
+
@Rule
public ExpectedException thrown = ExpectedException.none();
private ResourceData rscData;
@@ -81,14 +82,15 @@
private SchemaId sid;
private ModelObjectId mid;
private Builder data;
+ DefaultYangModelRegistry reg;
/**
* Prior setup for each UT.
*/
private void setUp() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
- treeBuilder = new DefaultDataTreeBuilder(registry);
+ processSchemaRegistry();
+ reg = registry();
+ treeBuilder = new DefaultDataTreeBuilder(reg);
}
/**
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
index 5c34129..e1faafc 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/CaseSchemaContextTest.java
@@ -25,32 +25,37 @@
import org.onosproject.yang.compiler.datamodel.exceptions.DataModelException;
import org.onosproject.yang.model.SchemaId;
import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
import static org.onosproject.yang.model.DataNode.Type.MULTI_INSTANCE_NODE;
import static org.onosproject.yang.model.DataNode.Type.SINGLE_INSTANCE_NODE;
import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafListSchemaContext;
import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Tests the default schema context methods.
*/
public class CaseSchemaContextTest {
- private static TestYangSchemaNodeProvider schemaProvider =
- new TestYangSchemaNodeProvider();
+ private static final String CASENS = "yrt:choice-case";
+ private DefaultYangModelRegistry registry;
- public static final String CASENS = "yrt:choice-case";
+ /**
+ * Do the prior setup for each UT.
+ */
+ private void setUp() {
+ processSchemaRegistry();
+ registry = registry();
+ }
/**
* Checks module level choice-case data node parent context.
*/
@Test
public void caseSchemaContTest() throws DataModelException {
-
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
+ setUp();
SchemaId id = new SchemaId("pretzel", CASENS);
YangLeaf leaf = (YangLeaf) registry.getChildContext(id);
checkLeafSchemaContext("pretzel", CASENS, "/", null, leaf);
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
index 8915b33..1fac570 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/LeafSchemaContextTest.java
@@ -27,30 +27,35 @@
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.SchemaId;
import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafListSchemaContext;
import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Tests the default schema context methods.
*/
public class LeafSchemaContextTest {
- private static TestYangSchemaNodeProvider schemaProvider =
- new TestYangSchemaNodeProvider();
+ private static final String FOODNS = "yrt:food";
+ private DefaultYangModelRegistry registry;
- public static final String FOODNS = "yrt:food";
+ /**
+ * Do the prior setup for each UT.
+ */
+ private void setUp() {
+ processSchemaRegistry();
+ registry = registry();
+ }
/**
* Checks leaf, leaf-list, choice-case data node parent context.
*/
@Test
public void leafSchemaContTest() throws DataModelException {
-
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
+ setUp();
SchemaId id = new SchemaId("food", FOODNS);
YangNode child = (YangNode) registry.getChildContext(id);
checkSchemaContext("food", FOODNS, "/", null,
diff --git a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
index 99e2e3e..f816ae8 100644
--- a/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
+++ b/runtime/src/test/java/org/onosproject/yang/runtime/impl/schemacontext/SchemaContextTest.java
@@ -25,7 +25,6 @@
import org.onosproject.yang.model.DataNode;
import org.onosproject.yang.model.SchemaId;
import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-import org.onosproject.yang.runtime.impl.TestYangSchemaNodeProvider;
import java.util.List;
@@ -33,23 +32,30 @@
import static org.onosproject.yang.runtime.impl.TestUtils.TOPONS;
import static org.onosproject.yang.runtime.impl.TestUtils.checkLeafSchemaContext;
import static org.onosproject.yang.runtime.impl.TestUtils.checkSchemaContext;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
/**
* Tests the default schema context methods.
*/
public class SchemaContextTest {
- private static TestYangSchemaNodeProvider schemaProvider =
- new TestYangSchemaNodeProvider();
+ private DefaultYangModelRegistry registry;
+
+ /**
+ * Do the prior setup for each UT.
+ */
+ private void setUp() {
+ processSchemaRegistry();
+ registry = registry();
+ }
/**
* Validates the getting schema context by schema Id scenario.
*/
@Test
public void schemaContextBySchemaIdTest() {
-
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
+ setUp();
SchemaId id = new SchemaId("networks", IETFNS);
YangNode child = (YangNode) registry.getChildContext(id);
checkSchemaContext("networks", IETFNS, "/", null,
diff --git a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java
deleted file mode 100644
index 7844625..0000000
--- a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2017-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.serializers.json;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-import org.onosproject.yang.runtime.YangModelRegistry;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class MockYangSchemaNodeProvider {
-
- private static final String FS = File.separator;
- private static final String PATH = System.getProperty("user.dir") +
- FS + "target" + FS + "classes" + FS;
- private static final String SER_FILE_PATH = "yang" + FS + "resources" +
- FS + "YangMetaData.ser";
- private static final String META_PATH = PATH + SER_FILE_PATH;
- private static final String TEMP_FOLDER_PATH = PATH + TEMP;
- private YangModelRegistry reg = new DefaultYangModelRegistry();
- private List<YangNode> nodes = new ArrayList<>();
-
- /**
- * Creates an instance of mock bundle context.
- */
- public MockYangSchemaNodeProvider() {
- }
-
- /**
- * Process YANG schema node for a application.
- */
- public void processSchemaRegistry() {
- try {
- //Need to deserialize generated meta data file for unit tests.
- Set<YangNode> appNode = deSerializeDataModel(META_PATH);
- addLinkerAndJavaInfo(appNode);
- nodes.addAll(appNode);
- reg.registerModel(prepareParam(nodes));
- deleteDirectory(TEMP_FOLDER_PATH);
- } catch (IOException e) {
- }
- }
-
- /**
- * Unregister given nodes from runtime service.
- *
- * @param nodes list of nodes
- */
- public void unRegister(List<YangNode> nodes) {
- reg.unregisterModel(prepareParam(nodes));
- }
-
- /**
- * Prepares model registration parameter.
- *
- * @param nodes list of nodes
- * @return model registration parameter
- */
- private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
- //Process loading class file.
- String appName;
- ClassLoader classLoader = getClass().getClassLoader();
-
- //Create model registration param.
- ModelRegistrationParam.Builder b =
- DefaultModelRegistrationParam.builder();
-
- //create a new YANG model
- YangModel model = processYangModel(META_PATH, nodes);
- //set YANG model
- b.setYangModel(model);
-
- Iterator<YangNode> it = nodes.iterator();
- while (it.hasNext()) {
- YangSchemaNode node = it.next();
-
- //If service class is not generated then use
- // interface file to load this class.
- appName = getInterfaceClassName(node);
- Class<?> cls;
- try {
- cls = classLoader.loadClass(appName);
- } catch (ClassNotFoundException e) {
- continue;
- }
-
- //generate app info.
- AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
- b.addAppModuleInfo(processModuleId((YangNode) node), info);
- }
- return b.build();
- }
-
- /**
- * Returns schema registry.
- *
- * @return schema registry
- */
- public DefaultYangModelRegistry registry() {
- return (DefaultYangModelRegistry) reg;
- }
-}
diff --git a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
index aeb4d8d..da1769d 100644
--- a/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
+++ b/serializers/json/src/test/java/org/onosproject/yang/serializers/json/MockYangSerializerContext.java
@@ -20,18 +20,18 @@
import org.onosproject.yang.runtime.Annotation;
import org.onosproject.yang.runtime.DefaultAnnotation;
import org.onosproject.yang.runtime.YangSerializerContext;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
import java.util.LinkedList;
import java.util.List;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
/**
* Tests the default schema context provider methods.
*/
public class MockYangSerializerContext implements YangSerializerContext {
- private static MockYangSchemaNodeProvider schemaProvider =
- new MockYangSchemaNodeProvider();
private static final String NETCONF_NS =
"urn:ietf:params:xml:ns:netconf:base:1.0";
private static final String XMNLS_NC = "xml:xc";
@@ -39,9 +39,8 @@
@Override
public SchemaContext getContext() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
- return registry;
+ processSchemaRegistry();
+ return registry();
}
@Override
diff --git a/serializers/xml/pom.xml b/serializers/xml/pom.xml
index 7af054f..7d77764 100644
--- a/serializers/xml/pom.xml
+++ b/serializers/xml/pom.xml
@@ -54,6 +54,7 @@
<version>${project.version}</version>
<configuration>
<yangFilesDir>src/test/resources</yangFilesDir>
+ <modelId>xml</modelId>
</configuration>
<executions>
<execution>
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java
new file mode 100644
index 0000000..99a97b4
--- /dev/null
+++ b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/DefaultYangModelRegistryTest.java
@@ -0,0 +1,174 @@
+/*
+ * Copyright 2017-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.serializers.xml;
+
+import com.google.common.collect.ImmutableSet;
+import org.junit.Test;
+import org.onosproject.yang.compiler.datamodel.YangNode;
+import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
+import org.onosproject.yang.model.DefaultYangModuleId;
+import org.onosproject.yang.model.YangModel;
+import org.onosproject.yang.model.YangModule;
+import org.onosproject.yang.model.YangModuleId;
+import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
+
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.LinkedHashSet;
+import java.util.List;
+import java.util.Set;
+
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.core.Is.is;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.unRegister;
+
+/**
+ * Unit test for model registry with model id configured using maven as "xml".
+ */
+public class DefaultYangModelRegistryTest {
+
+ private static final String SCHEMA_NAME_3 = "animal";
+ private static final String SCHEMA_NAME_4_15 = "Logistics-manager@2016-05-24";
+ private static final String SCHEMA_NAME_4 = "Logistics-manager";
+ private static final String SCHEMA_NAME_5 = "attributes";
+ private static final String MODEL_ID = "xml";
+
+ private DefaultYangModelRegistry setUp() {
+ processSchemaRegistry();
+ return registry();
+ }
+
+ /**
+ * Unit test case in which schema node should be present.
+ *
+ * @throws IOException when fails to do IO operation
+ */
+ @Test
+ public void testForGetSchemaNode()
+ throws IOException {
+
+ List<YangNode> nodes = new ArrayList<>();
+ DefaultYangModelRegistry registry = setUp();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+
+ YangModuleId moduleId = new DefaultYangModuleId("animal",
+ "2016-06-24");
+
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+ YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
+ assertThat(true, is(SCHEMA_NAME_3.equals(yangNode.getName())));
+
+ //Unregister service
+ nodes.add((YangNode) yangNode);
+ unRegister(nodes);
+
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_3);
+ assertThat(true, is(yangNode == null));
+
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
+ }
+
+ /**
+ * Unit test case in which schema node should be present with multi
+ * revisions.
+ *
+ * @throws IOException when fails to do IO operation
+ */
+ @Test
+ public void testForGetSchemaNodeWhenNoRevision()
+ throws IOException {
+
+ DefaultYangModelRegistry registry = setUp();
+
+ List<YangNode> nodes = new ArrayList<>();
+
+ YangModel model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model != null));
+
+ Set<YangModule> modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() != 0));
+ assertThat(true, is(modules != null));
+
+ YangModuleId moduleId = new DefaultYangModuleId("Logistics-manager",
+ "2016-05-24");
+
+ YangModule module = registry.getModule(moduleId);
+ assertThat(true, is(moduleId.equals(module.getYangModuleId())));
+
+ //Service with rev.
+ YangSchemaNode yangNode = registry.getForSchemaName(SCHEMA_NAME_4_15);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(SCHEMA_NAME_4.equals(yangNode.getName())));
+
+ //unregister SERVICE_NAME_REV_15.
+ nodes.add((YangNode) yangNode);
+ unRegister(nodes);
+
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_4);
+ assertThat(true, is(yangNode == null));
+
+ //Here the yangNode should be the node which does not have revision.
+ // asset should pass with false.
+ yangNode = registry.getForSchemaName(SCHEMA_NAME_5);
+ assertThat(true, is(((YangNode) yangNode).getRevision() == null));
+
+ //---------------------------------------------------------------//
+
+ module = registry.getModule(moduleId);
+ assertThat(true, is(module == null));
+
+ Set<YangModel> models = registry.getModels();
+ assertThat(true, is(models.size() == 0));
+
+ model = registry.getModel(MODEL_ID);
+ assertThat(true, is(model == null));
+
+ modules = getYangModules(model, MODEL_ID);
+ assertThat(true, is(modules.size() == 0));
+ }
+
+ private Set<YangModule> getYangModules(YangModel model, String modelId) {
+ Set<org.onosproject.yang.model.YangModule> modules =
+ new LinkedHashSet<>();
+ if (model != null) {
+ modules.addAll(model.getYangModules());
+ }
+ return ImmutableSet.copyOf(modules);
+ }
+}
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
deleted file mode 100644
index f71f2c8..0000000
--- a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSchemaNodeProvider.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Copyright 2017-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.serializers.xml;
-
-import org.onosproject.yang.compiler.datamodel.YangNode;
-import org.onosproject.yang.compiler.datamodel.YangSchemaNode;
-import org.onosproject.yang.model.YangModel;
-import org.onosproject.yang.runtime.AppModuleInfo;
-import org.onosproject.yang.runtime.DefaultAppModuleInfo;
-import org.onosproject.yang.runtime.DefaultModelRegistrationParam;
-import org.onosproject.yang.runtime.ModelRegistrationParam;
-import org.onosproject.yang.runtime.YangModelRegistry;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-import java.util.Set;
-
-import static org.onosproject.yang.compiler.datamodel.utils.DataModelUtils.deSerializeDataModel;
-import static org.onosproject.yang.compiler.utils.UtilConstants.TEMP;
-import static org.onosproject.yang.compiler.utils.io.impl.YangIoUtils.deleteDirectory;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processModuleId;
-import static org.onosproject.yang.runtime.helperutils.YangApacheUtils.processYangModel;
-import static org.onosproject.yang.runtime.RuntimeHelper.addLinkerAndJavaInfo;
-import static org.onosproject.yang.runtime.RuntimeHelper.getInterfaceClassName;
-
-/**
- * Represents mock bundle context. provides bundle context for YSR to do unit
- * testing.
- */
-public class MockYangSchemaNodeProvider {
-
- private static final String FS = File.separator;
- private static final String PATH = System.getProperty("user.dir") +
- FS + "target" + FS + "classes" + FS;
- private static final String SER_FILE_PATH = "yang" + FS + "resources" +
- FS + "YangMetaData.ser";
- private static final String META_PATH = PATH + SER_FILE_PATH;
- private static final String TEMP_FOLDER_PATH = PATH + TEMP;
- private YangModelRegistry reg = new DefaultYangModelRegistry();
- private List<YangNode> nodes = new ArrayList<>();
-
- /**
- * Creates an instance of mock bundle context.
- */
- public MockYangSchemaNodeProvider() {
- }
-
- /**
- * Process YANG schema node for a application.
- */
- public void processSchemaRegistry() {
- try {
- //Need to deserialize generated meta data file for unit tests.
- Set<YangNode> appNode = deSerializeDataModel(META_PATH);
- addLinkerAndJavaInfo(appNode);
- nodes.addAll(appNode);
- reg.registerModel(prepareParam(nodes));
- deleteDirectory(TEMP_FOLDER_PATH);
- } catch (IOException e) {
- }
- }
-
- /**
- * Unregister given nodes from runtime service.
- *
- * @param nodes list of nodes
- */
- public void unRegister(List<YangNode> nodes) {
- reg.unregisterModel(prepareParam(nodes));
- }
-
- /**
- * Prepares model registration parameter.
- *
- * @param nodes list of nodes
- * @return model registration parameter
- */
- private ModelRegistrationParam prepareParam(List<YangNode> nodes) {
- //Process loading class file.
- String appName;
- ClassLoader classLoader = getClass().getClassLoader();
-
- //Create model registration param.
- ModelRegistrationParam.Builder b =
- DefaultModelRegistrationParam.builder();
-
- //create a new YANG model
- YangModel model = processYangModel(META_PATH, nodes);
- //set YANG model
- b.setYangModel(model);
-
- Iterator<YangNode> it = nodes.iterator();
- while (it.hasNext()) {
- YangSchemaNode node = it.next();
-
- //If service class is not generated then use
- // interface file to load this class.
- appName = getInterfaceClassName(node);
- Class<?> cls;
- try {
- cls = classLoader.loadClass(appName);
- } catch (ClassNotFoundException e) {
- continue;
- }
-
- //generate app info.
- AppModuleInfo info = new DefaultAppModuleInfo(cls, null);
- b.addAppModuleInfo(processModuleId((YangNode) node), info);
- }
- return b.build();
- }
-
- /**
- * Returns schema registry.
- *
- * @return schema registry
- */
- public DefaultYangModelRegistry registry() {
- return (DefaultYangModelRegistry) reg;
- }
-}
diff --git a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
index c89700b..56125d8 100644
--- a/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
+++ b/serializers/xml/src/test/java/org/onosproject/yang/serializers/xml/MockYangSerializerContext.java
@@ -20,18 +20,18 @@
import org.onosproject.yang.runtime.Annotation;
import org.onosproject.yang.runtime.DefaultAnnotation;
import org.onosproject.yang.runtime.YangSerializerContext;
-import org.onosproject.yang.runtime.impl.DefaultYangModelRegistry;
import java.util.LinkedList;
import java.util.List;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.processSchemaRegistry;
+import static org.onosproject.yang.runtime.impl.MockYangSchemaNodeProvider.registry;
+
/**
* Tests the default schema context provider methods.
*/
public class MockYangSerializerContext implements YangSerializerContext {
- private static MockYangSchemaNodeProvider schemaProvider =
- new MockYangSchemaNodeProvider();
private static final String NETCONF_NS =
"urn:ietf:params:xml:ns:netconf:base:1.0";
private static final String XMNLS_NC = "xmlns:xc";
@@ -39,9 +39,8 @@
@Override
public SchemaContext getContext() {
- schemaProvider.processSchemaRegistry();
- DefaultYangModelRegistry registry = schemaProvider.registry();
- return registry;
+ processSchemaRegistry();
+ return registry();
}
@Override