[ONOS-5632] inter jar linking for buck plugin.
Change-Id: I2270a23622ab7013c661ff34d794ee7152e572fb
diff --git a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
index b138fc1..f2ff214 100644
--- a/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
+++ b/datamodel/src/main/java/org/onosproject/yangutils/datamodel/YangSchemaNode.java
@@ -153,6 +153,7 @@
* node type.
*
* @return true if empty data-type is present, false otherwise
+ * @throws DataModelException when fails to do data model operations
*/
boolean isEmptyDataType() throws DataModelException;
}
diff --git a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
index edf0216..e179903 100644
--- a/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
+++ b/generator/src/main/java/org/onosproject/yangutils/translator/tojava/utils/MethodsGenerator.java
@@ -1191,7 +1191,7 @@
* @return interface of add augmentation
*/
static String getAddAugmentInfoMethodInterface(String className) {
- StringBuilder builder = new StringBuilder(generateForAddAugmentation());
+ StringBuilder builder = new StringBuilder(generateForAddAugmentation(className));
LinkedHashMap<String, String> map = new LinkedHashMap<>();
map.put(VALUE, OBJECT_STRING);
map.put(CLASS + OBJECT_STRING, CLASS_STRING);
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
index ecc70b6..cd359cd 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/UtilConstants.java
@@ -228,6 +228,21 @@
public static final String PERIOD = ".";
/**
+ * Static attribute for lib.
+ */
+ public static final String LIB = "lib__";
+
+ /**
+ * Static attribute for lib path.
+ */
+ public static final String LIB_PATH = "//lib:";
+
+ /**
+ * Static attribute for output.
+ */
+ public static final String OUT = "__output";
+
+ /**
* Static attribute for period.
*/
public static final String ENTRY = "Entry";
diff --git a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
index 5c499db..8c8e794 100644
--- a/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
+++ b/generator/src/main/java/org/onosproject/yangutils/utils/io/impl/JavaDocGen.java
@@ -585,16 +585,17 @@
/**
* Generates javaDocs for add augmentation method.
*
+ * @param name builder class name
* @return javaDocs
*/
- public static String generateForAddAugmentation() {
+ public static String generateForAddAugmentation(String name) {
return getJavaDocStartLine(YANG_AUGMENTED_INFO_LOWER_CASE,
JAVA_DOC_SETTERS_COMMON) +
getJavaDocEmptyAsteriskLine() +
getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, VALUE) +
getJavaDocParamLine(YANG_AUGMENTED_INFO_LOWER_CASE, CLASS +
OBJECT_STRING) +
- getJavaDocEndLine();
+ getJavaDocReturnLine(name) + getJavaDocEndLine();
}
/**
@@ -667,7 +668,9 @@
break;
}
}
- javadoc.append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
+ javadoc.append(getJavaDocParamLine(
+ attribute, ADD_STRING + TO_CAPS))
+ .append(getJavaDocReturnLine(BUILDER_OBJECT + attribute))
.append(getJavaDocEndLine());
return javadoc.toString();
}
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
index 49b583c..b14a54a 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangGenerator.java
@@ -16,6 +16,7 @@
package org.onosproject.yangutils.plugin.buck;
+import org.onosproject.yangutils.datamodel.YangNode;
import org.onosproject.yangutils.tool.CallablePlugin;
import org.onosproject.yangutils.tool.YangToolManager;
import org.onosproject.yangutils.utils.io.YangPluginConfig;
@@ -26,6 +27,7 @@
import java.util.List;
import static java.util.stream.Collectors.toList;
+import static org.onosproject.yangutils.datamodel.utils.DataModelUtils.parseJarFile;
import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
import static org.onosproject.yangutils.utils.UtilConstants.YANG_RESOURCES;
@@ -35,12 +37,14 @@
public class YangGenerator implements CallablePlugin {
private final List<File> models;
+ private final List<String> depJar;
private String outputDirectory;
private final String DEFAULT_JAR_RES_PATH = SLASH + YANG_RESOURCES + SLASH;
- YangGenerator(List<File> models, String outputDirectory) {
+ YangGenerator(List<File> models, String outputDirectory, List<String> depJar) {
this.models = models;
- this.outputDirectory = outputDirectory + "/";
+ this.depJar = depJar;
+ this.outputDirectory = outputDirectory + SLASH;
}
public void execute() throws YangParsingException {
@@ -50,11 +54,15 @@
YangPluginConfig config = new YangPluginConfig();
config.setCodeGenDir(outputDirectory);
config.resourceGenDir(outputDirectory + DEFAULT_JAR_RES_PATH);
-
+ //for inter-jar linking.
+ List<YangNode> dependentSchema = new ArrayList<>();
+ for (String jar : depJar) {
+ dependentSchema.addAll(parseJarFile(jar, outputDirectory));
+ }
//intra jar file linking.
YangToolManager manager = new YangToolManager();
manager.compileYangFiles(manager.createYangFileInfoSet(files),
- null, config, this);
+ dependentSchema, config, this);
} catch (Exception e) {
throw new YangParsingException(e);
}
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
index 8db806b..5d0550c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibrary.java
@@ -16,13 +16,6 @@
package org.onosproject.yangutils.plugin.buck;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.List;
-import java.util.stream.Collectors;
-
-import javax.annotation.Nullable;
-
import com.facebook.buck.jvm.java.JarDirectoryStep;
import com.facebook.buck.model.BuildTargets;
import com.facebook.buck.rules.AbstractBuildRule;
@@ -39,6 +32,16 @@
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSortedSet;
+import javax.annotation.Nullable;
+import java.io.File;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
/**
* Buck rule to define a library built form a Yang model.
*/
@@ -46,7 +49,8 @@
@AddToRuleKey
private final ImmutableSortedSet<SourcePath> srcs;
-
+ private final BuildRuleParams params;
+
private final Path genSrcsDirectory;
private final Path outputDirectory;
private final Path output;
@@ -57,7 +61,7 @@
ImmutableSortedSet<SourcePath> srcs) {
super(params, resolver);
this.srcs = srcs;
-
+ this.params = params;
genSrcsDirectory = BuildTargets.getGenPath(getProjectFilesystem(),
params.getBuildTarget(),
"%s__yang-gen");
@@ -91,7 +95,8 @@
.map(s -> getResolver().getRelativePath(s))
.collect(Collectors.toList());
- steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory));
+ steps.add(new YangStep(getProjectFilesystem(), sourcePaths, genSrcsDirectory,
+ params.getDeps()));
steps.add(new JarDirectoryStep(
getProjectFilesystem(),
@@ -108,4 +113,17 @@
public Path getPathToOutput() {
return output;
}
+
+
+ /**
+ * Returns generated sources directory.
+ *
+ * @return generated sources directory
+ */
+ public Path getGenSrcsDirectory() {
+ File dir = new File(genSrcsDirectory.toString() + SLASH + YANG);
+ dir.mkdirs();
+ return genSrcsDirectory;
+ }
+
}
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
index 29d4225..83b1370 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangLibraryDescription.java
@@ -16,10 +16,6 @@
package org.onosproject.yangutils.plugin.buck;
-import java.nio.file.Path;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
import com.facebook.buck.cli.BuckConfig;
import com.facebook.buck.jvm.java.CalculateAbi;
import com.facebook.buck.jvm.java.DefaultJavaLibrary;
@@ -43,6 +39,7 @@
import com.facebook.buck.rules.BuildRuleType;
import com.facebook.buck.rules.BuildTargetSourcePath;
import com.facebook.buck.rules.Description;
+import com.facebook.buck.rules.PathSourcePath;
import com.facebook.buck.rules.SourcePath;
import com.facebook.buck.rules.SourcePathResolver;
import com.facebook.buck.rules.SourcePaths;
@@ -53,6 +50,14 @@
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.ImmutableSortedSet;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
+import static org.onosproject.yangutils.utils.UtilConstants.YANG;
+
/**
* Description of a Buck Yang Library.
*/
@@ -94,7 +99,6 @@
BuildRuleParams yangParams = params.copyWithBuildTarget(
BuildTargets.createFlavoredBuildTarget(
unflavoredBuildTarget, SOURCES));
-
BuildRule yangLib = resolver.addToIndex(new YangLibrary(yangParams, pathResolver, args.srcs));
if (params.getBuildTarget().getFlavors().contains(SOURCES)) {
@@ -126,13 +130,21 @@
BuildTarget abiJarTarget = params.getBuildTarget().withAppendedFlavors(CalculateAbi.FLAVOR);
+ //Add yang meta data resources to generated jar file resources.
+
+ Path rscRoot = ((YangLibrary) yangLib).getGenSrcsDirectory();
+ Path resPath = Paths.get(rscRoot + SLASH + YANG);
+
+ SourcePath path = new PathSourcePath(params.getProjectFilesystem(),
+ resPath);
+
DefaultJavaLibrary library =
resolver.addToIndex(
new DefaultJavaLibrary(
javaParams,
pathResolver,
ImmutableSet.of(SourcePaths.getToBuildTargetSourcePath().apply(yangLib)),
- /* resources */ ImmutableSet.<SourcePath>of(),
+ /* resources */ImmutableSet.of(path),
javacOptions.getGeneratedSourceFolderName(),
/* proguardConfig */ Optional.<SourcePath>absent(),
/* postprocessClassesCommands */ ImmutableList.<String>of(),
@@ -142,7 +154,7 @@
javacOptions.trackClassUsage(),
/* additionalClasspathEntries */ ImmutableSet.<Path>of(),
new JavacToJarStepFactory(javacOptions, JavacOptionsAmender.IDENTITY),
- /* resourcesRoot */ Optional.<Path>absent(),
+ /* resourcesRoot */ Optional.<Path>of(rscRoot),
/* manifestFile */ Optional.absent(),
/* mavenCoords */ Optional.<String>absent(),
/* tests */ ImmutableSortedSet.<BuildTarget>of(),
@@ -169,4 +181,5 @@
//TODO other params here
}
+
}
diff --git a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
index ae84cc3..d795d8c 100644
--- a/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
+++ b/plugin/buck/src/main/java/org/onosproject/yangutils/plugin/buck/YangStep.java
@@ -15,16 +15,27 @@
*/
package org.onosproject.yangutils.plugin.buck;
-import java.io.File;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.List;
-import java.util.stream.Collectors;
-
import com.facebook.buck.io.ProjectFilesystem;
+import com.facebook.buck.model.UnflavoredBuildTarget;
+import com.facebook.buck.rules.BuildRule;
import com.facebook.buck.step.AbstractExecutionStep;
import com.facebook.buck.step.ExecutionContext;
import com.facebook.buck.step.StepExecutionResult;
+import com.google.common.collect.ImmutableSortedSet;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import static org.onosproject.yangutils.utils.UtilConstants.JAR;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB;
+import static org.onosproject.yangutils.utils.UtilConstants.LIB_PATH;
+import static org.onosproject.yangutils.utils.UtilConstants.OUT;
+import static org.onosproject.yangutils.utils.UtilConstants.PERIOD;
+import static org.onosproject.yangutils.utils.UtilConstants.SLASH;
/**
* Buck build step to trigger Yang Java source file generation.
@@ -32,17 +43,18 @@
public class YangStep extends AbstractExecutionStep {
private static final String DESCRIPTION = "yang-compile";
-
+ private final ImmutableSortedSet<BuildRule> deps;
private final ProjectFilesystem filesystem;
private final List<Path> srcs;
private final Path output;
YangStep(ProjectFilesystem filesystem,
List<Path> srcs,
- Path genSourcesDirectory) {
+ Path genSourcesDirectory, ImmutableSortedSet<BuildRule> deps) {
super(DESCRIPTION);
this.filesystem = filesystem;
this.srcs = srcs;
+ this.deps = deps;
this.output = genSourcesDirectory;
}
@@ -52,13 +64,42 @@
List<File> sourceFiles = srcs.stream().map(Path::toFile)
.collect(Collectors.toList());
-
try {
- new YangGenerator(sourceFiles, output.toString()).execute();
+ new YangGenerator(sourceFiles, output.toString(), getJarPaths())
+ .execute();
return StepExecutionResult.SUCCESS;
- } catch(YangParsingException e) {
+ } catch (YangParsingException e) {
executionContext.getConsole().printErrorText(e.getMessage());
return StepExecutionResult.ERROR;
}
}
+
+ private List<String> getJarPaths() {
+ StringBuilder builder;
+ List<String> depJarPaths = new ArrayList<>();
+ String[] array;
+ UnflavoredBuildTarget uBt;
+ if (deps != null) {
+ for (BuildRule rule : deps) {
+ if (!rule.getBuildTarget().getFullyQualifiedName()
+ .contains(LIB_PATH)) {
+ builder = new StringBuilder();
+ //build absolute path for jar file
+ builder.append(filesystem.getRootPath().toString()).append(SLASH)
+ .append(filesystem.getBuckPaths().getGenDir())
+ .append(SLASH);
+ uBt = rule.getBuildTarget().getUnflavoredBuildTarget();
+ array = uBt.getBaseName().split(SLASH);
+ for (int i = 2; i < array.length; i++) {
+ builder.append(array[i]).append(SLASH);
+ }
+ builder.append(LIB).append(uBt.getShortName())
+ .append(OUT).append(SLASH)
+ .append(uBt.getShortName()).append(PERIOD + JAR);
+ depJarPaths.add(builder.toString());
+ }
+ }
+ }
+ return depJarPaths;
+ }
}
diff --git a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
index 9285edd..33e8f64 100644
--- a/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
+++ b/plugin/maven/src/main/java/org/onosproject/yangutils/plugin/manager/YangUtilManager.java
@@ -230,13 +230,9 @@
List<YangNode> interJarResolvedNodes =
resolveInterJarDependencies(project, localRepository,
remoteRepository, outputDir);
- System.out.println("going to call tool manager");
toolManager.compileYangFiles(yangFileInfoSet,
interJarResolvedNodes, yangPlugin,
this);
- System.out.println("called tool manager");
-
-
} catch (YangToolException e) {
String fileName = EMPTY_STRING;
if (e.getCurYangFile() != null) {
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
index 3f44863..21dd05b 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/CallablePlugin.java
@@ -23,6 +23,7 @@
* will be used in by tool to be plugin agnostic.
*/
public interface CallablePlugin {
+
/**
* Adds generated source directory to the compilation root.
*/
@@ -32,6 +33,7 @@
* serialize the compiled schema and place it in the appropriate location
* so that it will be part of the generated OSGi bundle.
*
+ * @throws IOException when fails to do IO operations
*/
void addCompiledSchemaToBundle()
throws IOException;
@@ -41,6 +43,7 @@
* Add the YANG files in the bundle, to support YANG display in protocols
* like RESTCONF.
*
+ * @throws IOException when fails to do IO operations
*/
void addYangFilesToBundle() throws IOException;
}
diff --git a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
index ac0123b..4e5d44e 100644
--- a/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
+++ b/plugin/tool/src/main/java/org/onosproject/yangutils/tool/YangToolManager.java
@@ -97,6 +97,7 @@
* Creates a YANG file info set.
*
* @param yangFileList YANG files list
+ * @return yang file info set
*/
public Set<YangFileInfo> createYangFileInfoSet(List<String> yangFileList) {
if (yangFileInfoSet == null) {
@@ -114,9 +115,11 @@
* Compile te YANG files and generate the corresponding Java files.
* Update the generated bundle with the schema metadata.
*
- * @param yangFiles Application YANG files
- * @param config tool configuration
- * @param plugin invoking plugin
+ * @param yangFiles Application YANG files
+ * @param dependentSchema inter jar linked schema nodes
+ * @param config tool configuration
+ * @param plugin invoking plugin
+ * @throws IOException when fails to do IO operations
*/
public void compileYangFiles(Set<YangFileInfo> yangFiles,
List<YangNode> dependentSchema,
@@ -126,7 +129,7 @@
synchronized (yangFiles) {
try {
- if (config == null || yangFiles == null) {
+ if (config == null) {
throw new YangToolException(E_MISSING_INPUT);
}
yangFileInfoSet = yangFiles;