--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
+
+ This program and the accompanying materials are made available under the
+ terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ and is available at http://www.eclipse.org/legal/epl-v10.html
+-->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+ <modelVersion>4.0.0</modelVersion>
+ <parent>
+ <groupId>org.opendaylight.odlparent</groupId>
+ <artifactId>odlparent</artifactId>
+ <version>1.5.0-SNAPSHOT</version>
+ </parent>
+
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>features-builder</artifactId>
+ <packaging>pom</packaging>
+ <version>0.7.0-SNAPSHOT</version>
+
+ <properties>
+ <features.file>features.xml</features.file>
+ </properties>
+
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+
+ <pluginManagement>
+ <plugins>
+ <!-- generate dependencies versions -->
+ <plugin>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>generate-resources</phase>
+ <goals><goal>resolve</goal></goals>
+ <configuration>
+ <outputFile>${project.build.directory}/dependencies.txt</outputFile>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>com.alexecollins.maven.plugin</groupId>
+ <artifactId>script-maven-plugin</artifactId>
+ <version>1.0.0</version>
+ <executions>
+ <execution>
+ <id>add-version-to-features</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>execute</goal>
+ </goals>
+ <configuration>
+ <language>groovy</language>
+ <script>
+ /**
+ * Placeholder, which is used in src/feature/features.xml
+ * to mark version which should be inserted from dependencies.
+ * Currently works only for bundle and configfile tags
+ * with mvn: url schema, and needs to be used
+ * as third component of schema.
+ * eg. mvn:group/artefact/{{VERSION}}
+ */
+ def versionPlaceholder = "{{VERSION}}"
+ /**
+ * Path to features.xml which uses versionPlaceholder.
+ * This will be processed by this script.
+ *
+ */
+ def featureFilePath = "src/main/feature/features.xml"
+ // Contains mapping of groupID:artefactID to versoin
+ def versionMap = new HashMap();
+ /* Loads transitive dependency list generated from
+ * maven-dependency-plugin resolve goal
+ * and populates map
+ */
+ def dependencies = new File(project.build.directory,"dependencies.txt")
+ dependencies.eachLine {
+ def cmps = it.trim().split(":")
+ // 0 - groupId
+ // 1 - artifactId
+ // 2 - Type
+ // 3 - Version
+ if(cmps.length >= 4) {
+ def id = cmps[0] + ":" + cmps[1]
+ versionMap[id] = cmps[3]
+ }
+ }
+
+ /*
+ * Takes splitted mvn: URL, looks for placeholder
+ * and returns new mvn: URL with version learned
+ * from dependency plugin.
+ *
+ * If referenced bundle is not dependency (direct or transitive)
+ * throws an exception and fails build.
+ *
+ */
+ def updatedURLFromProject = { args ->
+ // 0 - groupID, 1 - artifactID
+ // 2 - version, 3 - type, 4 - Classifier
+
+ def groupId = args[0];
+ def artifactId = args[1];
+ def id = groupId + ":" + artifactId
+ def dependencyVersion = versionMap[id]
+ if(dependencyVersion != null) {
+ // Overriding version
+ args[2] = dependencyVersion
+ return "mvn:" + args.join("/")
+ }
+ throw new IllegalArgumentException("Feature dependency $groupId:$artifactId is not dependecy of project.")
+ }
+
+
+ def updateMavenDependency = { dep ->
+ def mvnUrl = dep.text()
+ if(mvnUrl.startsWith("mvn:")) {
+ def components = mvnUrl.substring(4).split("/")
+ if(components[2] == versionPlaceholder) {
+ dep.value = updatedURLFromProject(components)
+ }
+ }
+ }
+
+ def featureFile = new File(project.basedir,featureFilePath)
+ def root = new XmlParser().parse(featureFile)
+
+ root.feature.each { feature ->
+ println "[INFO] Processing feature: ${feature.@name}"
+ feature.bundle.each updateMavenDependency
+ feature.configfile.each updateMavenDependency
+ }
+
+ def outDir = new File(project.build.directory,"generated-resources/script")
+ outDir.mkdirs();
+ def outFile = new File(outDir,"features.xml")
+ def outWriter = outFile.newPrintWriter("ASCII");
+ xmlPrinter = new XmlNodePrinter(outWriter);
+ xmlPrinter.preserveWhitespace = true
+ xmlPrinter.print(root)
+ outWriter.close();
+ </script>
+ </configuration>
+ </execution>
+ </executions>
+ <dependencies>
+ <dependency>
+ <groupId>org.codehaus.groovy</groupId>
+ <artifactId>groovy</artifactId>
+ <version>1.8.6</version>
+ </dependency>
+ </dependencies>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.karaf.tooling</groupId>
+ <artifactId>karaf-maven-plugin</artifactId>
+ <version>${karaf.version}</version>
+ <extensions>true</extensions>
+ <executions>
+ <execution>
+ <id>features-create-kar</id>
+ <goals>
+ <goal>features-create-kar</goal>
+ </goals>
+ <configuration>
+ <featuresFile>${project.build.directory}/classes/${features.file}</featuresFile>
+ </configuration>
+ </execution>
+ </executions>
+ <!-- There is no useful configuration for the kar mojo. The features-generate-descriptor mojo configuration may be useful -->
+ </plugin>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>generate-resources</phase>
+ <goals><goal>add-resource</goal></goals>
+ <configuration>
+ <resources>
+ <resource>
+ <directory>${project.build.directory}/generated-resources/script</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ </configuration>
+ </execution>
+ <execution>
+ <id>attach-artifacts</id>
+ <phase>package</phase>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/classes/${features.file}</file>
+ <type>xml</type>
+ <classifier>features</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-resources-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>filter</id>
+ <phase>generate-resources</phase>
+ <goals>
+ <goal>resources</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-surefire-plugin</artifactId>
+ <configuration>
+ <dependenciesToScan>
+ <dependency>org.opendaylight.yangtools:features-test</dependency>
+ </dependenciesToScan>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <dependencies>
+ <!-- test the features.xml -->
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>features-test</artifactId>
+ <version>0.7.0-SNAPSHOT</version>
+ <scope>test</scope>
+ </dependency>
+ </dependencies>
+</project>