--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>opendaylight-configfile-archetype</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ <packaging>maven-archetype</packaging>
+
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.2</version>
+ </extension>
+ </extensions>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <description>Configuration files for md-sal</description>
+
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git/md-sal-config</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git/md-sal-config</developerConnection>
+ <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:MD-SAL/md-sal-config</url>
+ </scm>
+
+ <distributionManagement>
+ <repository>
+ <id>opendaylight-release</id>
+ <url>http://nexus.opendaylight.org/content/repositories/opendaylight.release/</url>
+ </repository>
+ <snapshotRepository>
+ <id>opendaylight-snapshot</id>
+ <url>http://nexus.opendaylight.org/content/repositories/opendaylight.snapshot/</url>
+ </snapshotRepository>
+ <site>
+ <id>website</id>
+ <url>dav:http://nexus.opendaylight.org/content/sites/site/sal-parent</url>
+ </site>
+ </distributionManagement>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" name="md-sal-config"
+ xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <requiredProperties>
+ <requiredProperty key="repoName"/>
+ </requiredProperties>
+ <fileSets>
+ <fileSet filtered="true" encoding="UTF-8">
+ <directory>src/main/resources</directory>
+ <includes>
+ <include>**/*.xml</include>
+ </includes>
+ </fileSet>
+ </fileSets>
+</archetype-descriptor>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ 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>
+ <!--
+ Necessary TODO: Hookup your parent pom here, else you will not get necessary versions,
+ maven repos etc. If you run this archetype in a subdirectory of your project, it
+ will pick the pom.xml from the parent directory as the parent pom, which may or may
+ not be correct.
+ -->
+ <artifactId>${artifactId}</artifactId>
+ <groupId>${groupId}</groupId>
+ <description>Configuration files for md-sal</description>
+ <!-- Optional TODO: Uncomment version if you are not using a parent pom.xml
+ <version>${version}</version>
+ -->
+ <packaging>jar</packaging>
+ <properties>
+ <!-- Optional TODO: Rename your configfile to taste -->
+ <configfile>80-configfile.xml</configfile>
+ </properties>
+ <build>
+ <plugins>
+ <plugin>
+ <groupId>org.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <execution>
+ <id>attach-artifacts</id>
+ <goals>
+ <goal>attach-artifact</goal>
+ </goals>
+ <phase>package</phase>
+ <configuration>
+ <artifacts>
+ <artifact>
+ <file>${project.build.directory}/classes/${configfile}</file>
+ <type>xml</type>
+ <classifier>config</classifier>
+ </artifact>
+ </artifacts>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</developerConnection>
+ <tag>HEAD</tag>
+ <url>https://git.opendaylight.org/gerrit/gitweb?p=${repoName}.git;a=summary</url>
+ </scm>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Copyright (c) 2013 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
+-->
+<snapshot>
+ <required-capabilities>
+ <!-- Necessary TODO put your required capabilities here
+
+ Examples:
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:netty?module=netty&revision=2013-11-19</capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor?module=netty-event-executor&revision=2013-11-12</capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:netty:threadgroup?module=threadgroup&revision=2013-11-07</capability>
+ <capability>urn:opendaylight:params:xml:ns:yang:controller:netty:timer?module=netty-timer&revision=2013-11-19</capability>
+ -->
+ </required-capabilities>
+ <configuration>
+
+ <data xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
+ <modules xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <!-- Optional TODO: Add your modules definitions here
+ Examples:
+ <module>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty:threadgroup">netty:netty-threadgroup-fixed</type>
+ <name>global-boss-group</name>
+ </module>
+ <module>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty:threadgroup">netty:netty-threadgroup-fixed</type>
+ <name>global-worker-group</name>
+ </module>
+ <module>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty:timer">netty:netty-hashed-wheel-timer</type>
+ <name>global-timer</name>
+ </module>
+ <module>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty:eventexecutor">netty:netty-global-event-executor</type>
+ <name>singleton</name>
+ </module>
+ -->
+ </modules>
+
+ <services xmlns="urn:opendaylight:params:xml:ns:yang:controller:config">
+ <!-- Optional TODO: Put your service instance definitions here
+ Examples:
+ <service>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty">netty:netty-threadgroup</type>
+ <instance>
+ <name>global-boss-group</name>
+ <provider>/modules/module[type='netty-threadgroup-fixed'][name='global-boss-group']</provider>
+ </instance>
+ <instance>
+ <name>global-worker-group</name>
+ <provider>/modules/module[type='netty-threadgroup-fixed'][name='global-worker-group']</provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty">netty:netty-event-executor</type>
+ <instance>
+ <name>global-event-executor</name>
+ <provider>/modules/module[type='netty-global-event-executor'][name='singleton']</provider>
+ </instance>
+ </service>
+ <service>
+ <type xmlns:netty="urn:opendaylight:params:xml:ns:yang:controller:netty">netty:netty-timer</type>
+ <instance>
+ <name>global-timer</name>
+ <provider>/modules/module[type='netty-hashed-wheel-timer'][name='global-timer']</provider>
+ </instance>
+ </service>
+ -->
+ </services>
+ </data>
+
+ </configuration>
+</snapshot>
--- /dev/null
+#Mon Aug 25 05:45:18 CDT 2014
+package=it.pkg
+version=0.1-SNAPSHOT
+groupId=archetype.it
+artifactId=basic
+repoName=foo
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>opendaylight-karaf-distro-archetype</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>maven-archetype</packaging>
+
+ <name>distribution-karaf-archetype</name>
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.2</version>
+ </extension>
+ </extensions>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <url>https://wiki.opendaylight.org/view/CrossProject:Integration_Group/distribution-karaf</url>
+
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git</developerConnection>
+ <url>https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main</url>
+ </scm>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd"
+ xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <requiredProperties>
+ <requiredProperty key="repoName"/>
+ </requiredProperties>
+</archetype-descriptor>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+ <!--
+ Necessary TODO: Hookup your parent pom here, else you will not get necessary versions,
+ maven repos etc. If you run this archetype in a subdirectory of your project, it
+ will pick the pom.xml from the parent directory as the parent pom, which may or may
+ not be correct.
+ -->
+ <artifactId>${artifactId}</artifactId>
+ <groupId>${groupId}</groupId>
+ <!-- Optional TODO: Uncomment version if you are not using a parent pom.xml
+ <version>${version}</version>
+ -->
+ <packaging>pom</packaging>
+ <prerequisites>
+ <maven>3.0</maven>
+ </prerequisites>
+ <properties>
+ <!-- Optional TODO: Move these properties to your parent pom and possibly
+ DependencyManagement section of your parent pom -->
+ <branding.version>1.0.0-SNAPSHOT</branding.version>
+ <karaf.resources.version>1.4.2-SNAPSHOT</karaf.resources.version>
+ <karaf.version>3.0.1</karaf.version>
+ </properties>
+
+ <dependencies>
+ <!-- Basic Karaf dependencies -->
+ <dependency>
+ <groupId>org.apache.karaf.features</groupId>
+ <artifactId>framework</artifactId>
+ <version>${karaf.version}</version>
+ <type>kar</type>
+ </dependency>
+ <dependency>
+ <groupId>org.apache.karaf.features</groupId>
+ <artifactId>standard</artifactId>
+ <version>${karaf.version}</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <scope>runtime</scope>
+ </dependency>
+
+ <!-- ODL Branding -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>karaf.branding</artifactId>
+ <version>${branding.version}</version>
+ <scope>compile</scope>
+ </dependency>
+
+ <!-- ODL Resources needed for karaf -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>opendaylight-karaf-resources</artifactId>
+ <version>${karaf.resources.version}</version>
+ </dependency>
+
+ <!-- Project local feautures -->
+ <!--
+ Necessary TODO put your features here.
+
+ Note: they will need to be <type>xml</xml>
+ and <classifier>features</classifier>.
+
+ Note: they must be <scope>runtime</scope>
+
+ Note: usually you would only need to depend
+ on your own feature file here for your local distro,
+ and possible the features-mdsal for odl-restconf
+ (although, strange situations do exist :) )
+
+ Example:
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>features-mdsal</artifactId>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <scope>runtime</scope>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.openflowplugin</groupId>
+ <artifactId>features-openflowplugin</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ <scope>runtime</scope>
+ </dependency>
+ -->
+ </dependencies>
+
+ <build>
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.eclipse.m2e</groupId>
+ <artifactId>lifecycle-mapping</artifactId>
+ <version>1.0.0</version>
+ <configuration>
+ <lifecycleMappingMetadata>
+ <pluginExecutions>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.apache.felix</groupId>
+ <artifactId>maven-bundle-plugin</artifactId>
+ <versionRange>[0,)</versionRange>
+ <goals>
+ <goal>cleanVersions</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <versionRange>[0,)</versionRange>
+ <goals>
+ <goal>copy</goal>
+ <goal>unpack</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.apache.karaf.tooling</groupId>
+ <artifactId>karaf-maven-plugin</artifactId>
+ <versionRange>[0,)</versionRange>
+ <goals>
+ <goal>commands-generate-help</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.fusesource.scalate</groupId>
+ <artifactId>maven-scalate-plugin</artifactId>
+ <versionRange>[0,)</versionRange>
+ <goals>
+ <goal>sitegen</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ <pluginExecution>
+ <pluginExecutionFilter>
+ <groupId>org.apache.servicemix.tooling</groupId>
+ <artifactId>depends-maven-plugin</artifactId>
+ <versionRange>[0,)</versionRange>
+ <goals>
+ <goal>generate-depends-file</goal>
+ </goals>
+ </pluginExecutionFilter>
+ <action>
+ <ignore></ignore>
+ </action>
+ </pluginExecution>
+ </pluginExecutions>
+ </lifecycleMappingMetadata>
+ </configuration>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ <plugins>
+ <plugin>
+ <groupId>org.apache.karaf.tooling</groupId>
+ <artifactId>karaf-maven-plugin</artifactId>
+ <version>${karaf.version}</version>
+ <extensions>true</extensions>
+ <configuration>
+ <bootFeatures>
+ <feature>standard</feature>
+ <!--
+ Optional TODO: Add entries here for the features you want in your local distro
+ Note: odl-restconf is a separate feature from odl-mdsal-broker. If you want
+ restconf, you need to list it here explicitely.
+ Examples:
+ <feature>odl-openflowplugin-flow-services</feature>
+ <feature>odl-restconf</feature>
+ -->
+ <!-- Final TODO: Remove TODO Comments ;) -->
+ </bootFeatures>
+ </configuration>
+ <executions>
+ <execution>
+ <id>process-resources</id>
+ <goals>
+ <goal>install-kars</goal>
+ </goals>
+ <phase>process-resources</phase>
+ </execution>
+ <execution>
+ <id>package</id>
+ <goals>
+ <goal>instance-create-archive</goal>
+ </goals>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-dependency-plugin</artifactId>
+ <version>2.6</version>
+ <executions>
+ <execution>
+ <id>copy</id>
+ <goals>
+ <goal>copy</goal>
+ </goals>
+ <phase>generate-resources</phase>
+ <configuration>
+ <artifactItems>
+ <artifactItem>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>karaf.branding</artifactId>
+ <version>${karaf.branding.version}</version>
+ <outputDirectory>target/assembly/lib</outputDirectory>
+ <destFileName>karaf.branding-${branding.version}.jar</destFileName>
+ </artifactItem>
+ </artifactItems>
+ </configuration>
+ </execution>
+ <execution>
+ <id>unpack-karaf-resources</id>
+ <goals>
+ <goal>unpack-dependencies</goal>
+ </goals>
+ <phase>prepare-package</phase>
+ <configuration>
+ <outputDirectory>${project.build.directory}/assembly</outputDirectory>
+ <groupId>org.opendaylight.controller</groupId>
+ <includeArtifactIds>opendaylight-karaf-resources</includeArtifactIds>
+ <excludes>META-INF\/**</excludes>
+ <excludeTransitive>true</excludeTransitive>
+ <ignorePermissions>false</ignorePermissions>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ <plugin>
+ <groupId>org.apache.maven.plugins</groupId>
+ <artifactId>maven-antrun-plugin</artifactId>
+ <executions>
+ <execution>
+ <phase>prepare-package</phase>
+ <goals>
+ <goal>run</goal>
+ </goals>
+ <configuration>
+ <tasks>
+ <chmod perm="755">
+ <fileset dir="${project.build.directory}/assembly/bin">
+ <include name="karaf" />
+ <include name="instance" />
+ <include name="start"/>
+ <include name="stop"/>
+ <include name="status"/>
+ <include name="client"/>
+ <include name="shell"/>
+ </fileset>
+ </chmod>
+ </tasks>
+ </configuration>
+ </execution>
+ </executions>
+ </plugin>
+ </plugins>
+ </build>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</developerConnection>
+ <tag>HEAD</tag>
+ <url>https://git.opendaylight.org/gerrit/gitweb?p=${repoName}.git;a=summary</url>
+ </scm>
+</project>
--- /dev/null
+#Thu Aug 21 14:44:29 CDT 2014
+package=it.pkg
+version=0.1-SNAPSHOT
+groupId=archetype.it
+artifactId=basic
+repoName=foo
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<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>
+
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>opendaylight-karaf-features-archetype</artifactId>
+ <version>1.0.0-SNAPSHOT</version>
+ <packaging>maven-archetype</packaging>
+
+ <name>opendaylight-karaf-features-archetype</name>
+
+ <build>
+ <extensions>
+ <extension>
+ <groupId>org.apache.maven.archetype</groupId>
+ <artifactId>archetype-packaging</artifactId>
+ <version>2.2</version>
+ </extension>
+ </extensions>
+
+ <pluginManagement>
+ <plugins>
+ <plugin>
+ <artifactId>maven-archetype-plugin</artifactId>
+ <version>2.2</version>
+ </plugin>
+ </plugins>
+ </pluginManagement>
+ </build>
+
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/controller.git/</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/controller.git/</developerConnection>
+ <url>https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=summary</url>
+ </scm>
+</project>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<archetype-descriptor xsi:schemaLocation="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0 http://maven.apache.org/xsd/archetype-descriptor-1.0.0.xsd" name="features-integration"
+ xmlns="http://maven.apache.org/plugins/maven-archetype-plugin/archetype-descriptor/1.0.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+ <requiredProperties>
+ <requiredProperty key="repoName"/>
+ </requiredProperties>
+ <fileSets>
+ <fileSet filtered="true" encoding="UTF-8">
+ <directory>src/main/resources</directory>
+ <include>**/*.xml</include>
+ </fileSet>
+ </fileSets>
+</archetype-descriptor>
--- /dev/null
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+ Necessary TODO: Put your copyright here.
+
+ 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>
+ <!--
+ Necessary TODO: Hookup your parent pom here, else you will not get necessary versions,
+ maven repos etc. If you run this archetype in a subdirectory of your project, it
+ will pick the pom.xml from the parent directory as the parent pom, which may or may
+ not be correct.
+ -->
+ <artifactId>features-${repoName}</artifactId>
+ <groupId>${groupId}</groupId>
+ <!-- Optional TODO: Uncomment version if you are not using a parent pom.xml
+ <version>${version}</version>
+ -->
+ <packaging>jar</packaging>
+ <properties>
+ <features.file>features.xml</features.file>
+ <!-- Optional TODO: Move these properties to your parent pom and possibly
+ DependencyManagement section of your parent pom -->
+ <branding.version>1.0.0-SNAPSHOT</branding.version>
+ <karaf.resources.version>1.4.2-SNAPSHOT</karaf.resources.version>
+ <karaf.version>3.0.1</karaf.version>
+ <feature.test.version>0.6.2-SNAPSHOT</feature.test.version>
+ <karaf.empty.version>1.4.2-SNAPSHOT</karaf.empty.version>
+ <surefire.version>2.16</surefire.version>
+ </properties>
+ <dependencies>
+ <!--
+ Necessary TODO: Put dependencies on any feature repos
+ you use in your features.xml file.
+
+ Note: they will need to be <type>xml</xml>
+ and <classifier>features</classifier>.
+ One other thing to watch for is to make sure they are
+ <scope>compile</compile>, which they should be by default,
+ but be cautious lest they be at a different scope in a parent pom.
+
+ Examples:
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>features-yangtools</artifactId>
+ <version>0.6.2-SNAPSHOT</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>features-mdsal</artifactId>
+ <version>1.1-SNAPSHOT</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ <dependency>
+ <groupId>org.opendaylight.openflowplugin</groupId>
+ <artifactId>features-openflowplugin</artifactId>
+ <version>0.0.3-SNAPSHOT</version>
+ <classifier>features</classifier>
+ <type>xml</type>
+ </dependency>
+ -->
+
+ <!--
+ Necessary TODO: Put dependencies for bundles directly referenced
+ in your features.xml file. For every <bundle> reference in your
+ features.xml file, you need a corresponding dependency here.
+
+ Examples:
+ <dependency>
+ <groupId>${groupId}</groupId>
+ <artifactId>${repoName}-provider</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ <dependency>
+ <groupId>${groupId}</groupId>
+ <artifactId>${repoName}-model</artifactId>
+ <version>${project.version}</version>
+ </dependency>
+ -->
+
+ <!--
+ Necessary TODO: Put dependencies for configfiles directly referenced
+ in your features.xml file. For every <configfile> reference in your
+ features.xml file, you need a corresponding dependency here.
+
+ Example (presuming here version is coming from the parent pom):
+ <dependency>
+ <groupId>${groupId}</groupId>
+ <artifactId>${repoName}-config</artifactId>
+ <version>${project.version}</version>
+ <type>xml</type>
+ <classifier>config</classifier>
+ </dependency>
+ -->
+
+ <!--
+ Optional TODO: Remove TODO comments.
+ -->
+ <!-- test to validate features.xml -->
+ <dependency>
+ <groupId>org.opendaylight.yangtools</groupId>
+ <artifactId>features-test</artifactId>
+ <version>${feature.test.version}</version>
+ <scope>test</scope>
+ </dependency>
+ <!-- dependency for opendaylight-karaf-empty for use by testing -->
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>opendaylight-karaf-empty</artifactId>
+ <version>${karaf.empty.version}</version>
+ <type>zip</type>
+ </dependency>
+ <!-- Uncomment this if you get an error : java.lang.NoSuchMethodError: org.slf4j.helpers.MessageFormatter.format(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)Lorg/slf4j/helpers/FormattingTuple;
+ <dependency>
+ <groupId>org.slf4j</groupId>
+ <artifactId>slf4j-simple</artifactId>
+ <version>1.7.2</version>
+ </dependency>
+ -->
+
+ </dependencies>
+ <build>
+ <resources>
+ <resource>
+ <directory>src/main/resources</directory>
+ <filtering>true</filtering>
+ </resource>
+ </resources>
+ <plugins>
+ <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.codehaus.mojo</groupId>
+ <artifactId>build-helper-maven-plugin</artifactId>
+ <executions>
+ <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-surefire-plugin</artifactId>
+ <version>${surefire.version}</version>
+ <configuration>
+ <systemPropertyVariables>
+ <karaf.distro.groupId>org.opendaylight.controller</karaf.distro.groupId>
+ <karaf.distro.artifactId>opendaylight-karaf-empty</karaf.distro.artifactId>
+ <karaf.distro.version>${karaf.empty.version}</karaf.distro.version>
+ </systemPropertyVariables>
+ <dependenciesToScan>
+ <dependency>org.opendaylight.yangtools:features-test</dependency>
+ </dependenciesToScan>
+ </configuration>
+ </plugin>
+ </plugins>
+ </build>
+ <scm>
+ <connection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</connection>
+ <developerConnection>scm:git:ssh://git.opendaylight.org:29418/${repoName}.git</developerConnection>
+ <tag>HEAD</tag>
+ <url>https://git.opendaylight.org/gerrit/gitweb?p=${repoName}.git;a=summary</url>
+ </scm>
+</project>
--- /dev/null
+#set( $symbol_pound = '#' )
+#set( $symbol_dollar = '$' )
+#set( $symbol_escape = '\' )
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- vi: set et smarttab sw=4 tabstop=4: -->
+<!--
+ Necessary TODO: Put your copyright statement here
+
+ 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
+-->
+<features name="odl-${repoName}-${symbol_dollar}{project.version}" xmlns="http://karaf.apache.org/xmlns/features/v1.2.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://karaf.apache.org/xmlns/features/v1.2.0 http://karaf.apache.org/xmlns/features/v1.2.0">
+ <!--
+ Necessary TODO: Please read the features guidelines:
+ https://wiki.opendaylight.org/view/Runtime:Karaf_Features_Guidelines#Feature_Best_Practices
+ -->
+ <!--
+ Necessary TODO: Add repo entries for the repositories of features you refer to
+ in this feature file but do not define here.
+ Examples:
+ <repository>mvn:org.opendaylight.yangtools/features-yangtools/0.6.2-SNAPSHOT/xml/features</repository>
+ <repository>mvn:org.opendaylight.controller/features-mdsal/1.1-SNAPSHOT/xml/features</repository>
+ <repository>mvn:org.opendaylight.openflowplugin/features-openflowplugin/0.0.3-SNAPSHOT/xml/features</repository>
+ -->
+ <feature name='odl-${repoName}-all' version='${symbol_dollar}{project.version}' description='OpenDaylight :: ${repoName} :: All'>
+ <!--
+ Necessary TODO:
+ List all of the user consumable features you define in this feature file here.
+ Generally you would *not* list individual bundles here, but only features defined in *this* file.
+ It is useful to list them in the same order they occur in the file.
+
+ Examples:
+ <feature version='${symbol_dollar}{project.version}'>odl-${repoName}-provider</feature>
+ <feature version='${symbol_dollar}{project.version}'>odl-${repoName}-model</feature>
+ -->
+ </feature>
+ <!--
+ Necessary TODO: Define your features. It is useful to list then in order of dependency. So if A depends on B, list A first.
+ When naming your features please be mindful of the guidelines:
+ https://wiki.opendaylight.org/view/Runtime:Karaf_Features_Guidelines
+ Particularly:
+ a) Prefixing names with 'odl-': https://wiki.opendaylight.org/view/Runtime:Karaf_Features_Guidelines#Feature_Naming
+ b) Descriptions: https://wiki.opendaylight.org/view/Runtime:Karaf_Features_Guidelines#Description
+ c) Avoid start-levels: https://wiki.opendaylight.org/view/Runtime:Karaf_Features_Guidelines#Avoid_start-levels
+
+ It's also nice to list inside a feature, first the features it needs, then the bundles it needs, then the configfiles.
+ Examples:
+
+ * Basic MD-SAL Provider
+ <feature name='odl-${repoName}-provider' version='${symbol_dollar}{project.version}' description='OpenDaylight :: ${repoName} :: Provider '>
+ <feature version='1.1-SNAPSHOT'>odl-mdsal-broker</feature>
+ <feature version='${symbol_dollar}{project.version}'>odl-${repoName}-model</feature>
+ <bundle>mvn:${groupId}/${repoName}-provider/${symbol_dollar}{project.version}</bundle>
+ ... whatever other bundles you need
+ </feature>
+
+ * Basic MD-SAL Model feature
+ <feature name='odl-${repoName}-model' version='${symbol_dollar}{project.version}' description='OpenDaylight :: ${repoName} :: Model'>
+ <feature version='0.6.2-SNAPSHOT'>odl-yangtools-binding</feature>
+ <feature version='0.6.2-SNAPSHOT'>odl-yangtools-models</feature>
+ <bundle>mvn:${groupId}/${repoName}-model/${symbol_dollar}{project.version}</bundle>
+ ... whatever other bundles you need
+ </feature>
+
+ * Config Subsystem example - the config file is your config subsystem configuration
+ <feature name='odl-${repoName}-provider' version='${symbol_dollar}{project.version}' description='OpenDaylight :: ${repoName} :: Provider'>
+ <feature version='1.1-SNAPSHOT'>odl-mdsal-broker</feature>
+ <bundle>mvn:${groupId}/${repoName}-provider/${symbol_dollar}{project.version}</bundle>
+ <configfile finalname="etc/opendaylight/karaf/80-${repoName}.xml">mvn:${groupId}/${repoName}-config/${symbol_dollar}{project.version}/xml/config</configfile>
+ ... whatever other bundles you need
+ </feature>
+
+ * Basic MD-SAL Provider that uses openflowplugin-flow-services (which brings along odl-mdsal-broker)
+ <feature name='odl-${repoName}-provider' version='${symbol_dollar}{project.version}' description='OpenDaylight :: ${repoName} :: Provider'>
+ <feature version='0.0.3-SNAPSHOT'>odl-openflowplugin-flow-services</feature>
+ <bundle>mvn:${groupId}/${repoName}-provider/${symbol_dollar}{project.version}</bundle>
+ ... whatever other bundles you need
+ </feature>
+
+ -->
+ <!-- Optional TODO: Remove TODO Comments -->
+
+</features>
--- /dev/null
+#Thu Aug 21 23:46:25 CDT 2014
+package=it.pkg
+version=0.1-SNAPSHOT
+groupId=archetype.it
+artifactId=basic
+repoName=foo
</prerequisites>
<parent>
<groupId>org.opendaylight.controller</groupId>
- <artifactId>commons.parent</artifactId>
- <version>1.0.1-SNAPSHOT</version>
- <relativePath>../commons/parent</relativePath>
+ <artifactId>commons.opendaylight</artifactId>
+ <version>1.4.2-SNAPSHOT</version>
+ <relativePath>../commons/opendaylight</relativePath>
</parent>
<scm>
<connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>
</distributionManagement>
<modules>
<module>odl-model-project</module>
+ <module>opendaylight-configfile-archetype</module>
+ <module>opendaylight-karaf-distro-archetype</module>
+ <module>opendaylight-karaf-features</module>
</modules>
</project>
implements DOMStoreReadTransaction {
private static final Logger LOG = LoggerFactory.getLogger(SnapshotBackedReadTransaction.class);
- private DataTreeSnapshot stableSnapshot;
+ private volatile DataTreeSnapshot stableSnapshot;
public SnapshotBackedReadTransaction(final Object identifier, final DataTreeSnapshot snapshot) {
super(identifier);
LOG.debug("Tx: {} Read: {}", getIdentifier(), path);
checkNotNull(path, "Path must not be null.");
- if(stableSnapshot == null) {
+ final DataTreeSnapshot snapshot = stableSnapshot;
+ if (snapshot == null) {
return Futures.immediateFailedCheckedFuture(new ReadFailedException("Transaction is closed"));
}
try {
- return Futures.immediateCheckedFuture(stableSnapshot.readNode(path));
+ return Futures.immediateCheckedFuture(snapshot.readNode(path));
} catch (Exception e) {
LOG.error("Tx: {} Failed Read of {}", getIdentifier(), path, e);
return Futures.immediateFailedCheckedFuture(new ReadFailedException("Read failed",e));
}
}
- @Override public CheckedFuture<Boolean, ReadFailedException> exists(YangInstanceIdentifier path) {
+ @Override
+ public CheckedFuture<Boolean, ReadFailedException> exists(YangInstanceIdentifier path) {
LOG.debug("Tx: {} Exists: {}", getIdentifier(), path);
checkNotNull(path, "Path must not be null.");
/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2013-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,
protected static final Logger logger = LoggerFactory
.getLogger(Activator.class);
+ /**
+ * Priority to determine whether to override existing protocol service.
+ */
+ private static final int PLUGIN_PRIORITY = 10;
/**
* Function that is used to communicate to dependency manager the list of
// Set the protocolPluginType property which will be used
// by SAL
props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW);
+ props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(),
+ Integer.valueOf(PLUGIN_PRIORITY));
c.setInterface(IPluginInDataPacketService.class.getName(), props);
// Hook the services coming in from SAL, as optional in
// case SAL is not yet there, could happen
// Set the protocolPluginType property which will be used
// by SAL
props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW);
+ props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(),
+ Integer.valueOf(PLUGIN_PRIORITY));
c.setInterface(new String[] {
IReadFilterInternalListener.class.getName(),
IPluginInReadService.class.getName() }, props);
// Set the protocolPluginType property which will be used
// by SAL
props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), Node.NodeIDType.OPENFLOW);
+ props.put(GlobalConstants.PROTOCOLPLUGINPRIORITY.toString(),
+ Integer.valueOf(PLUGIN_PRIORITY));
c.setInterface(
new String[] { IPluginInFlowProgrammerService.class.getName(), IMessageListener.class.getName(),
IContainerListener.class.getName(), IInventoryShimExternalListener.class.getName(),
-
/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2013-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,
STATICVLAN("staticvlan"),
CLUSTERINGSERVICES("clusteringservices"),
STARTUPHOME("configuration/startup/"),
- PROTOCOLPLUGINTYPE("protocolPluginType");
+ PROTOCOLPLUGINTYPE("protocolPluginType"),
+ PROTOCOLPLUGINPRIORITY("protocolPluginPriority");
private GlobalConstants(String name) {
this.name = name;
public String toString() {
return name;
}
-}
\ No newline at end of file
+}
-
/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2013-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,
import org.opendaylight.controller.sal.packet.Packet;
import org.opendaylight.controller.sal.packet.PacketResult;
import org.opendaylight.controller.sal.packet.RawPacket;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
import org.opendaylight.controller.sal.utils.NetUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
* adding a new service, removing a service, going through all of
* them maybe different.
*/
- private ConcurrentHashMap<String, IPluginInDataPacketService>
+ private ConcurrentHashMap<String, ProtocolService<IPluginInDataPacketService>>
pluginInDataService =
- new ConcurrentHashMap<String, IPluginInDataPacketService>();
+ new ConcurrentHashMap<String, ProtocolService<IPluginInDataPacketService>>();
private Map<String, AtomicInteger> statistics = new HashMap<String, AtomicInteger>();
/**
String t = p.getNode()
.getType();
// Now locate the TX dispatcher
- IPluginInDataPacketService s = pluginInDataService
- .get(t);
- if (s != null) {
+ ProtocolService<IPluginInDataPacketService> service =
+ pluginInDataService.get(t);
+ if (service != null) {
try {
- s.transmitDataPacket(pkt);
+ service.getService().transmitDataPacket(pkt);
increaseStat("TXPacketSuccess");
} catch (Exception e) {
increaseStat("TXPacketFailedForException");
}
void setPluginInDataService(Map props, IPluginInDataPacketService s) {
- if (this.pluginInDataService == null) {
- logger.error("pluginInDataService store null");
- return;
- }
- String type = null;
- logger.trace("Received setPluginInDataService request");
- for (Object e : props.entrySet()) {
- Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
- }
-
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a PluginInDataService without any "
- + "protocolPluginType provided");
- } else {
- this.pluginInDataService.put(type, s);
- logger.debug("Stored the PluginInDataService for type: {}", type);
- }
+ ProtocolService.set(this.pluginInDataService, props, s, logger);
}
void unsetPluginInDataService(Map props, IPluginInDataPacketService s) {
- if (this.pluginInDataService == null) {
- logger.error("pluginInDataService store null");
- return;
- }
-
- String type = null;
- logger.trace("Received unsetPluginInDataService request");
- for (Object e : props.entrySet()) {
- Map.Entry entry = (Map.Entry) e;
- logger.trace("Prop key:({}) value:({})",entry.getKey(), entry.getValue());
- }
-
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a PluginInDataService without any "
- + "protocolPluginType provided");
- } else if (this.pluginInDataService.get(type).equals(s)) {
- this.pluginInDataService.remove(type);
- logger.debug("Removed the PluginInDataService for type: {}", type);
- }
+ ProtocolService.unset(this.pluginInDataService, props, s, logger);
}
void setListenDataPacket(Map props, IListenDataPacket s) {
/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2013-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,
import org.opendaylight.controller.sal.match.Match;
import org.opendaylight.controller.sal.match.MatchType;
import org.opendaylight.controller.sal.utils.EtherTypes;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
import org.opendaylight.controller.sal.utils.IPProtocols;
import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
import org.opendaylight.controller.sal.utils.Status;
protected static final Logger logger = LoggerFactory
.getLogger(FlowProgrammerService.class);
- private ConcurrentHashMap<String, IPluginInFlowProgrammerService> pluginFlowProgrammer;
+ private ConcurrentHashMap<String, ProtocolService<IPluginInFlowProgrammerService>> pluginFlowProgrammer;
private Set<IFlowProgrammerListener> listener;
private AtomicLong seq;
public FlowProgrammerService() {
- pluginFlowProgrammer = new ConcurrentHashMap<String, IPluginInFlowProgrammerService>();
+ pluginFlowProgrammer = new ConcurrentHashMap<String, ProtocolService<IPluginInFlowProgrammerService>>();
listener = new HashSet<IFlowProgrammerListener>();
seq = new AtomicLong();
/*
// Set the reference to the plugin flow programmer
public void setService(Map<String, Object> props, IPluginInFlowProgrammerService s) {
- if (this.pluginFlowProgrammer == null) {
- logger.error("pluginFlowProgrammer store null");
- return;
- }
-
- if (logger.isTraceEnabled()) {
- logger.trace("Got a service set request {}", s);
- for (Map.Entry<String, Object> entry : props.entrySet()) {
- logger.trace("Prop key:({}) value:({})", entry.getKey(), entry.getValue());
- }
- }
-
- String type = null;
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a pluginFlowProgrammer without any "
- + "protocolPluginType provided");
- } else {
- this.pluginFlowProgrammer.put(type, s);
- logger.debug("Stored the pluginFlowProgrammer for type: {}", type);
- }
+ ProtocolService.set(this.pluginFlowProgrammer, props, s, logger);
}
public void unsetService(Map<String, Object> props, IPluginInFlowProgrammerService s) {
- if (this.pluginFlowProgrammer == null) {
- logger.error("pluginFlowProgrammer store null");
- return;
- }
-
- logger.debug("Received unsetpluginFlowProgrammer request");
- if (logger.isTraceEnabled()) {
- logger.trace("Got a service set request {}", s);
- for (Map.Entry<String, Object> entry : props.entrySet()) {
- logger.trace("Prop key:({}) value:({})", entry.getKey(), entry.getValue());
- }
- }
-
- String type = null;
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a pluginFlowProgrammer without any "
- + "protocolPluginType provided");
- } else if (this.pluginFlowProgrammer.get(type).equals(s)) {
- this.pluginFlowProgrammer.remove(type);
- logger.debug("Removed the pluginFlowProgrammer for type: {}", type);
- }
+ ProtocolService.unset(this.pluginFlowProgrammer, props, s, logger);
}
public void setListener(IFlowProgrammerListener s) {
@Override
public Status addFlow(Node node, Flow flow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType()).addFlow(
- node, flow);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().addFlow(node, flow);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status removeFlow(Node node, Flow flow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .removeFlow(node, flow);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().removeFlow(node, flow);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status removeAllFlows(Node node) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .removeAllFlows(node);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().removeAllFlows(node);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status modifyFlow(Node node, Flow oldFlow, Flow newFlow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .modifyFlow(node, oldFlow, newFlow);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().modifyFlow(node, oldFlow, newFlow);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status addFlowAsync(Node node, Flow flow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType()).addFlowAsync(
- node, flow, getNextRid());
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().addFlowAsync(node, flow, getNextRid());
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status removeFlowAsync(Node node, Flow flow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .removeFlowAsync(node, flow, getNextRid());
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().removeFlowAsync(node, flow, getNextRid());
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status modifyFlowAsync(Node node, Flow oldFlow, Flow newFlow) {
if (pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .modifyFlowAsync(node, oldFlow, newFlow, getNextRid());
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().modifyFlowAsync(node, oldFlow, newFlow, getNextRid());
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status syncSendBarrierMessage(Node node) {
if (this.pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .syncSendBarrierMessage(node);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().syncSendBarrierMessage(node);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
@Override
public Status asyncSendBarrierMessage(Node node) {
if (this.pluginFlowProgrammer != null) {
- if (this.pluginFlowProgrammer.get(node.getType()) != null) {
- return this.pluginFlowProgrammer.get(node.getType())
- .asyncSendBarrierMessage(node);
+ ProtocolService<IPluginInFlowProgrammerService> service =
+ this.pluginFlowProgrammer.get(node.getType());
+ if (service != null) {
+ return service.getService().asyncSendBarrierMessage(node);
}
}
return new Status(StatusCode.NOSERVICE, "Plugin unuvailable");
--- /dev/null
+/*
+ * Copyright (c) 2014 NEC Corporation 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
+ */
+
+package org.opendaylight.controller.sal.implementation.internal;
+
+import java.util.Map;
+import java.util.concurrent.ConcurrentMap;
+
+import org.slf4j.Logger;
+
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+
+/**
+ * An instance of this class keeps a protocol plugin service handler.
+ *
+ * @param <T> Type of protocol plugin service.
+ */
+public final class ProtocolService<T> {
+ /**
+ * Default priority value.
+ */
+ private static final int DEFAULT_PRIORITY = 0;
+
+ /**
+ * A protocol plugin service handler.
+ */
+ private final T service;
+
+ /**
+ * A priority value assigned to this protocol plugin.
+ */
+ private final int priority;
+
+ /**
+ * Set protocol plugin service.
+ *
+ * @param map A map that keeps protocol plugin services.
+ * @param props Service properties.
+ * @param s Protocol plugin service.
+ * @param logger A logger instance.
+ * @param <S> Type of protocol plugin service.
+ */
+ public static <S> void set(ConcurrentMap<String, ProtocolService<S>> map,
+ Map<?, ?> props, S s, Logger logger) {
+ if (map == null) {
+ logger.error("Protocol plugin service store is null.");
+ return;
+ }
+ if (s == null) {
+ logger.error("Protocol plugin service is null.");
+ return;
+ }
+ if (props == null) {
+ logger.error("Service property is null.");
+ return;
+ }
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Received set service request: {}", s);
+ for (Map.Entry<?, ?> entry: props.entrySet()) {
+ logger.trace("Prop key:({}) value:({})", entry.getKey(),
+ entry.getValue());
+ }
+ }
+
+ Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
+ if (!(value instanceof String)) {
+ logger.error("Unexpected protocol type: {}", value);
+ return;
+ }
+
+ String type = (String)value;
+ ProtocolService<S> service = new ProtocolService<S>(props, s);
+ ProtocolService<S> old = map.putIfAbsent(type, service);
+ while (old != null) {
+ // Compare priority value.
+ if (old.getPriority() >= service.getPriority()) {
+ logger.trace("Protocol plugin service for {} is already set: " +
+ "current={}, requested={}", type, old, service);
+ return;
+ }
+
+ if (map.replace(type, old, service)) {
+ break;
+ }
+ old = map.putIfAbsent(type, service);
+ }
+
+ logger.debug("Stored protocol plugin service for {}: {}",
+ type, service);
+ }
+
+ /**
+ * Unset protocol plugin service.
+ *
+ * @param map A map that keeps protocol plugin services.
+ * @param props Service properties.
+ * @param s Protocol plugin service.
+ * @param logger A logger instance.
+ * @param <S> Type of protocol plugin service.
+ */
+ public static <S> void unset(ConcurrentMap<String, ProtocolService<S>> map,
+ Map<?, ?> props, S s, Logger logger) {
+ if (map == null) {
+ logger.error("Protocol plugin service store is null.");
+ return;
+ }
+ if (s == null) {
+ logger.error("Protocol plugin service is null.");
+ return;
+ }
+ if (props == null) {
+ logger.error("Service property is null.");
+ return;
+ }
+
+ if (logger.isTraceEnabled()) {
+ logger.trace("Received unset service request: {}", s);
+ for (Map.Entry<?, ?> entry: props.entrySet()) {
+ logger.trace("Prop key:({}) value:({})",
+ entry.getKey(), entry.getValue());
+ }
+ }
+
+ Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
+ if (!(value instanceof String)) {
+ logger.error("Unexpected protocol type {}: service={}", value, s);
+ return;
+ }
+
+ String type = (String)value;
+ ProtocolService<S> plugin = new ProtocolService<S>(props, s);
+ if (map.remove(type, plugin)) {
+ logger.debug("Removed protocol plugin service for {}: {}",
+ type, plugin);
+ } else {
+ logger.trace("Ignore unset service request for {}: {}",
+ type, plugin);
+ }
+ }
+
+ /**
+ * Constructor.
+ *
+ * @param props Protocol plugin service properties.
+ * @param s A protocol plugin service handler.
+ */
+ public ProtocolService(Map<?, ?> props, T s) {
+ service = s;
+
+ String key = GlobalConstants.PROTOCOLPLUGINPRIORITY.toString();
+ Object value = props.get(key);
+ if (value instanceof Integer) {
+ priority = ((Integer)value).intValue();
+ } else {
+ priority = DEFAULT_PRIORITY;
+ }
+ }
+
+ /**
+ * Return a protocol plugin service handler.
+ *
+ * @return A protocol plugin service handler.
+ */
+ public T getService() {
+ return service;
+ }
+
+ /**
+ * Return a priority value assigned to this protocol plugin.
+ *
+ * @return A priority value.
+ */
+ public int getPriority() {
+ return priority;
+ }
+
+ /**
+ * Determine whether the given object is identical to this object.
+ *
+ * @param o An object to be compared.
+ * @return {@code true} if identical. Otherwise {@code false}.
+ */
+ @Override
+ public boolean equals(Object o) {
+ if (o == this) {
+ return true;
+ }
+ if (o == null || o.getClass() != getClass()) {
+ return false;
+ }
+
+ ProtocolService plugin = (ProtocolService)o;
+ return (service.equals(plugin.service) && priority == plugin.priority);
+ }
+
+ /**
+ * Return the hash code of this object.
+ *
+ * @return The hash code.
+ */
+ @Override
+ public int hashCode() {
+ return service.hashCode() + (priority * 31);
+ }
+
+ /**
+ * Return a string representation of this instance.
+ *
+ * @return A string representation of this instance.
+ */
+ @Override
+ public String toString() {
+ StringBuilder builder = new StringBuilder("[service=");
+ return builder.append(service).append(", priority=").append(priority).
+ append(']').toString();
+ }
+}
-
/*
- * Copyright (c) 2013 Cisco Systems, Inc. and others. All rights reserved.
+ * Copyright (c) 2013-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,
import org.opendaylight.controller.sal.reader.NodeDescription;
import org.opendaylight.controller.sal.reader.NodeTableStatistics;
import org.opendaylight.controller.sal.utils.EtherTypes;
-import org.opendaylight.controller.sal.utils.GlobalConstants;
import org.opendaylight.controller.sal.utils.IPProtocols;
import org.opendaylight.controller.sal.utils.NodeConnectorCreator;
import org.opendaylight.controller.sal.utils.NodeCreator;
public class ReadService implements IReadService, CommandProvider, IPluginOutReadService {
protected static final Logger logger = LoggerFactory.getLogger(ReadService.class);
- private ConcurrentHashMap<String, IPluginInReadService> pluginReader =
- new ConcurrentHashMap<String, IPluginInReadService>();
+ private ConcurrentHashMap<String, ProtocolService<IPluginInReadService>> pluginReader =
+ new ConcurrentHashMap<String, ProtocolService<IPluginInReadService>>();
private Set<IReadServiceListener> readerListeners =
new CopyOnWriteArraySet<IReadServiceListener>();
// Set the reference to the plugin flow Reader service
public void setService(Map<?, ?> props, IPluginInReadService s) {
- if (this.pluginReader == null) {
- logger.error("pluginReader store null");
- return;
- }
-
- logger.trace("Got a service set request {}", s);
- String type = null;
- for (Object e : props.entrySet()) {
- Map.Entry<?, ?> entry = (Map.Entry<?, ?>) e;
- logger.trace("Prop key:({}) value:({})", entry.getKey(),
- entry.getValue());
- }
-
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a pluginReader without any "
- + "protocolPluginType provided");
- } else {
- this.pluginReader.put(type, s);
- logger.debug("Stored the pluginReader for type: {}", type);
- }
+ ProtocolService.set(this.pluginReader, props, s, logger);
}
public void unsetService(Map<?, ?> props, IPluginInReadService s) {
- if (this.pluginReader == null) {
- logger.error("pluginReader store null");
- return;
- }
-
- String type = null;
- logger.debug("Received unsetpluginReader request");
- for (Object e : props.entrySet()) {
- Map.Entry<?, ?> entry = (Map.Entry<?, ?>) e;
- logger.trace("Prop key:({}) value:({})", entry.getKey(),
- entry.getValue());
- }
-
- Object value = props.get(GlobalConstants.PROTOCOLPLUGINTYPE.toString());
- if (value instanceof String) {
- type = (String) value;
- }
- if (type == null) {
- logger.error("Received a pluginReader without any "
- + "protocolPluginType provided");
- } else if (this.pluginReader.get(type).equals(s)) {
- this.pluginReader.remove(type);
- logger.debug("Removed the pluginReader for type: {}", type);
- }
+ ProtocolService.unset(this.pluginReader, props, s, logger);
}
+
public void setReaderListener(IReadServiceListener service) {
logger.trace("Got a listener set request {}", service);
this.readerListeners.add(service);
@Override
public FlowOnNode readFlow(Node node, Flow flow) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readFlow(node, flow, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readFlow(node, flow, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public FlowOnNode nonCachedReadFlow(Node node, Flow flow) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readFlow(node, flow, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readFlow(node, flow, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public List<FlowOnNode> readAllFlows(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readAllFlow(node, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readAllFlow(node, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public List<FlowOnNode> nonCachedReadAllFlows(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readAllFlow(node, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readAllFlow(node, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public NodeDescription readDescription(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readDescription(node, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readDescription(node, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public NodeDescription nonCachedReadDescription(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readDescription(node, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readDescription(node, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
public NodeConnectorStatistics readNodeConnector(NodeConnector connector) {
Node node = connector.getNode();
if (pluginReader != null && node != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readNodeConnector(connector, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readNodeConnector(connector, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
NodeConnector connector) {
Node node = connector.getNode();
if (pluginReader != null && node != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readNodeConnector(connector, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readNodeConnector(connector, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public List<NodeConnectorStatistics> readNodeConnectors(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readAllNodeConnector(node, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readAllNodeConnector(node, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public List<NodeTableStatistics> readNodeTable(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readAllNodeTable(node, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readAllNodeTable(node, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
public NodeTableStatistics nonCachedReadNodeTable(NodeTable table) {
Node node = table.getNode();
if (pluginReader != null && node != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readNodeTable(table, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readNodeTable(table, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
public NodeTableStatistics readNodeTable(NodeTable table) {
Node node = table.getNode();
if (pluginReader != null && node != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readNodeTable(table, true);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readNodeTable(table, true);
}
}
logger.warn("Plugin {} unavailable", node.getType());
@Override
public List<NodeConnectorStatistics> nonCachedReadNodeConnectors(Node node) {
if (pluginReader != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .readAllNodeConnector(node, false);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().readAllNodeConnector(node, false);
}
}
logger.warn("Plugin {} unavailable", node.getType());
public long getTransmitRate(NodeConnector connector) {
Node node = connector.getNode();
if (pluginReader != null && node != null) {
- if (this.pluginReader.get(node.getType()) != null) {
- return this.pluginReader.get(node.getType())
- .getTransmitRate(connector);
+ ProtocolService<IPluginInReadService> service =
+ this.pluginReader.get(node.getType());
+ if (service != null) {
+ return service.getService().getTransmitRate(connector);
}
}
logger.warn("Plugin {} unavailable", node.getType());
--- /dev/null
+/*
+ * Copyright (c) 2014 NEC Corporation 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
+ */
+
+package org.opendaylight.controller.sal.implementation;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentMap;
+
+import org.junit.Test;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.opendaylight.controller.sal.implementation.internal.ProtocolService;
+import org.opendaylight.controller.sal.utils.GlobalConstants;
+
+/**
+ * Unit test for {@link ProtocolService}.
+ */
+public class ProtocolServiceTest {
+ private static final Logger LOG =
+ LoggerFactory.getLogger(ProtocolServiceTest.class);
+
+ @Test
+ public void testInstance() {
+ HashSet<ProtocolService<ITestService>> set = new HashSet<>();
+ TestService sv1 = new TestService();
+ HashMap<String, Object> prop1 = new HashMap<>();
+
+ ProtocolService<ITestService> ps1 =
+ new ProtocolService<ITestService>(prop1, sv1);
+ assertEquals(sv1, ps1.getService());
+ // Default priority is 0.
+ assertEquals(0, ps1.getPriority());
+ assertTrue(set.add(ps1));
+ assertFalse(set.add(ps1));
+
+ // Specify the same service and priority.
+ String priKey = GlobalConstants.PROTOCOLPLUGINPRIORITY.toString();
+ prop1.put(priKey, Integer.valueOf(0));
+ ProtocolService<ITestService> ps2 =
+ new ProtocolService<ITestService>(prop1, sv1);
+ assertEquals(sv1, ps2.getService());
+ assertEquals(0, ps2.getPriority());
+ assertEquals(ps1, ps2);
+ assertFalse(set.add(ps1));
+
+ // Specify different priority.
+ prop1.put(priKey, Integer.valueOf(Integer.MAX_VALUE));
+ ps2 = new ProtocolService<ITestService>(prop1, sv1);
+ assertEquals(sv1, ps2.getService());
+ assertEquals(Integer.MAX_VALUE, ps2.getPriority());
+ assertFalse(ps1.equals(ps2));
+ assertTrue(set.add(ps2));
+ assertFalse(set.add(ps2));
+
+ // Specify another service.
+ TestService sv2 = new TestService();
+ prop1.put(priKey, Integer.valueOf(0));
+ ps2 = new ProtocolService<ITestService>(prop1, sv2);
+ assertEquals(sv2, ps2.getService());
+ assertEquals(0, ps2.getPriority());
+ assertFalse(ps1.equals(ps2));
+ assertTrue(set.add(ps2));
+ assertFalse(set.add(ps2));
+ }
+
+ @Test
+ public void testSetUnsetError() {
+ ConcurrentMap<String, ProtocolService<ITestService>> services =
+ new ConcurrentHashMap<>();
+ TestService sv = new TestService();
+ Map<String, Object> props = new HashMap<>();
+
+ // null service.
+ ProtocolService.set(services, props, null, LOG);
+ assertTrue(services.isEmpty());
+
+ ProtocolService.unset(services, props, null, LOG);
+ assertTrue(services.isEmpty());
+
+ // null service property.
+ ProtocolService.set(services, null, sv, LOG);
+ assertTrue(services.isEmpty());
+
+ ProtocolService.unset(services, null, sv, LOG);
+ assertTrue(services.isEmpty());
+
+ // Type is not specified.
+ ProtocolService.set(services, props, sv, LOG);
+ assertTrue(services.isEmpty());
+
+ ProtocolService.unset(services, props, sv, LOG);
+ assertTrue(services.isEmpty());
+
+ // null service map.
+ final String typeKey = GlobalConstants.PROTOCOLPLUGINTYPE.toString();
+ assertEquals(null, props.put(typeKey, "OF"));
+ ProtocolService.set(null, props, sv, LOG);
+ assertTrue(services.isEmpty());
+
+ ProtocolService.unset(null, props, sv, LOG);
+ assertTrue(services.isEmpty());
+ }
+
+ @Test
+ public void testSetUnset() {
+ ConcurrentMap<String, ProtocolService<ITestService>> serviceMap =
+ new ConcurrentHashMap<>();
+ ConcurrentMap<String, ProtocolService<ITestService>> expected =
+ new ConcurrentHashMap<>();
+
+ final String typeKey = GlobalConstants.PROTOCOLPLUGINTYPE.toString();
+ final String priKey = GlobalConstants.PROTOCOLPLUGINPRIORITY.toString();
+ final String[] protocols = {"OF", "PE", "PK"};
+ final int basePri = 0;
+ final int loop = 5;
+
+ // Should override the service if higher priority is specified.
+ for (String proto: protocols) {
+ for (int pri = basePri - loop + 1; pri <= basePri; pri++) {
+ TestService sv = new TestService();
+ Map<String, Object> props = new HashMap<>();
+ assertEquals(null, props.put(typeKey, proto));
+ assertEquals(null, props.put(priKey, Integer.valueOf(pri)));
+ ProtocolService.set(serviceMap, props, sv, LOG);
+
+ ProtocolService<ITestService> service = serviceMap.get(proto);
+ assertNotNull(service);
+ assertEquals(sv, service.getService());
+ assertEquals(pri, service.getPriority());
+
+ ProtocolService<ITestService> service1 =
+ new ProtocolService<ITestService>(props, sv);
+ expected.put(proto, service1);
+ assertEquals(expected, serviceMap);
+
+ // Unset service request should be ignored if different
+ // parameters are specified.
+ TestService another = new TestService();
+ ProtocolService.unset(serviceMap, props, another, LOG);
+ assertEquals(expected, serviceMap);
+
+ props.put(priKey, Integer.valueOf(Integer.MAX_VALUE));
+ ProtocolService.unset(serviceMap, props, sv, LOG);
+ assertEquals(expected, serviceMap);
+ }
+ }
+
+ // Should reject the set service request if lower priority is specified.
+ for (String proto: protocols) {
+ for (int pri = basePri - loop; pri < basePri; pri++) {
+ TestService sv = new TestService();
+ Map<String, Object> props = new HashMap<>();
+ assertEquals(null, props.put(typeKey, proto));
+ assertEquals(null, props.put(priKey, Integer.valueOf(pri)));
+ ProtocolService.set(serviceMap, props, sv, LOG);
+ assertEquals(expected, serviceMap);
+ }
+ }
+
+ // Unset protocol services.
+ for (String proto: protocols) {
+ ProtocolService<ITestService> service = expected.remove(proto);
+ assertNotNull(service);
+
+ ITestService sv = service.getService();
+ Map<String, Object> props = new HashMap<>();
+ assertEquals(null, props.put(typeKey, proto));
+ assertEquals(null, props.put(priKey, Integer.valueOf(basePri)));
+ ProtocolService.unset(serviceMap, props, sv, LOG);
+ assertEquals(expected, serviceMap);
+
+ // Should be ignored if the specified service does not exist.
+ ProtocolService.unset(serviceMap, props, sv, LOG);
+ assertEquals(expected, serviceMap);
+ }
+
+ assertTrue(serviceMap.isEmpty());
+ }
+}
+
+interface ITestService {
+}
+
+class TestService implements ITestService {
+}
<module>opendaylight/distribution/opendaylight-karaf</module>
<module>opendaylight/distribution/opendaylight-karaf-resources</module>
<module>features</module>
+
+ <!-- archetypes -->
+ <module>opendaylight/archetypes</module>
</modules>
<scm>
<connection>scm:git:ssh://git.opendaylight.org:29418/controller.git</connection>