Simon Hunt
Committed by Gerrit Code Review

Apps-- added onos.app.title property to applications.

Change-Id: Id845390ee0bee5b871c0ce9f47b2ce98fbcf26b9
Showing 63 changed files with 194 additions and 57 deletions
...@@ -40,6 +40,7 @@ ...@@ -40,6 +40,7 @@
40 <properties> 40 <properties>
41 <onos.app.name>org.onosproject.acl</onos.app.name> 41 <onos.app.name>org.onosproject.acl</onos.app.name>
42 <onos.app.origin>DLUT</onos.app.origin> 42 <onos.app.origin>DLUT</onos.app.origin>
43 + <onos.app.title>ONOS ACL App</onos.app.title>
43 <onos.app.category>default</onos.app.category> 44 <onos.app.category>default</onos.app.category>
44 <onos.app.url>http://onosproject.org</onos.app.url> 45 <onos.app.url>http://onosproject.org</onos.app.url>
45 <onos.app.readme>ONOS ACL application.</onos.app.readme> 46 <onos.app.readme>ONOS ACL application.</onos.app.readme>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.cip</onos.app.name> 35 <onos.app.name>org.onosproject.cip</onos.app.name>
36 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
37 + <onos.app.title>Cluster IP Alias App</onos.app.title>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Cluster IP alias application.</onos.app.readme> 39 <onos.app.readme>Cluster IP alias application.</onos.app.readme>
39 </properties> 40 </properties>
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.cordfabric</onos.app.name> 34 <onos.app.name>org.onosproject.cordfabric</onos.app.name>
35 + <onos.app.title>CORD Fabric App</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 <onos.app.readme>Simple fabric application for CORD.</onos.app.readme> 38 <onos.app.readme>Simple fabric application for CORD.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.cordvtn</onos.app.name> 35 <onos.app.name>org.onosproject.cordvtn</onos.app.name>
36 + <onos.app.title>CORD Virtual Tenant Network</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Virtual tenant network service for CORD.</onos.app.readme> 39 <onos.app.readme>Virtual tenant network service for CORD.</onos.app.readme>
......
...@@ -33,9 +33,10 @@ ...@@ -33,9 +33,10 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.drivermatrix</onos.app.name> 35 <onos.app.name>org.onosproject.drivermatrix</onos.app.name>
36 + <onos.app.title>Driver Behaviour Support Matrix</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 - <onos.app.readme>Driver behavior support matrix.</onos.app.readme> 39 + <onos.app.readme>Driver behaviour support matrix.</onos.app.readme>
39 </properties> 40 </properties>
40 41
41 </project> 42 </project>
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.events</onos.app.name> 34 <onos.app.name>org.onosproject.events</onos.app.name>
35 + <onos.app.title>ONOS Event History App</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 <onos.app.readme>ONOS event history display application.</onos.app.readme> 38 <onos.app.readme>ONOS event history display application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.flowanalyzer</onos.app.name> 35 <onos.app.name>org.onosproject.flowanalyzer</onos.app.name>
36 + <onos.app.title>Flow Space Analyzer</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Simple flow space analyzer.</onos.app.readme> 39 <onos.app.readme>Simple flow space analyzer.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.fwd</onos.app.name> 35 <onos.app.name>org.onosproject.fwd</onos.app.name>
36 + <onos.app.title>Reactive Forwarding App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Reactive forwarding application using flow subsystem.</onos.app.readme> 39 <onos.app.readme>Reactive forwarding application using flow subsystem.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.igmp</onos.app.name> 35 <onos.app.name>org.onosproject.igmp</onos.app.name>
36 + <onos.app.title>IGMP App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>IGMP implementation.</onos.app.readme> 39 <onos.app.readme>IGMP implementation.</onos.app.readme>
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
30 30
31 <properties> 31 <properties>
32 <onos.app.name>org.onosproject.iptopology-api</onos.app.name> 32 <onos.app.name>org.onosproject.iptopology-api</onos.app.name>
33 + <onos.app.title>IP Layer Topology API</onos.app.title>
33 <onos.app.category>default</onos.app.category> 34 <onos.app.category>default</onos.app.category>
34 <onos.app.url>http://onosproject.org</onos.app.url> 35 <onos.app.url>http://onosproject.org</onos.app.url>
35 <onos.app.readme>IP layer topology API.</onos.app.readme> 36 <onos.app.readme>IP layer topology API.</onos.app.readme>
......
...@@ -33,9 +33,11 @@ ...@@ -33,9 +33,11 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.metrics</onos.app.name> 35 <onos.app.name>org.onosproject.metrics</onos.app.name>
36 + <onos.app.title>Performance Metrics App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 - <onos.app.readme>Performance metrics collection application. 39 + <onos.app.readme>
40 + Performance metrics collection application.
39 </onos.app.readme> 41 </onos.app.readme>
40 </properties> 42 </properties>
41 43
......
...@@ -33,9 +33,11 @@ ...@@ -33,9 +33,11 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.mfwd</onos.app.name> 35 <onos.app.name>org.onosproject.mfwd</onos.app.name>
36 + <onos.app.title>Multicast Forwarding App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 - <onos.app.readme>Multicast forwarding application. 39 + <onos.app.readme>
40 + Multicast forwarding application.
39 </onos.app.readme> 41 </onos.app.readme>
40 </properties> 42 </properties>
41 43
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.mlb</onos.app.name> 35 <onos.app.name>org.onosproject.mlb</onos.app.name>
36 + <onos.app.title>Mastership Load Balancer App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Application that balances mastership among nodes. 39 <onos.app.readme>Application that balances mastership among nodes.
......
...@@ -33,9 +33,11 @@ ...@@ -33,9 +33,11 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.mobility</onos.app.name> 35 <onos.app.name>org.onosproject.mobility</onos.app.name>
36 + <onos.app.title>Host Mobility App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 - <onos.app.readme>Host mobility application. 39 + <onos.app.readme>
40 + Host mobility application.
39 </onos.app.readme> 41 </onos.app.readme>
40 </properties> 42 </properties>
41 43
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.openstackinterface</onos.app.name> 34 <onos.app.name>org.onosproject.openstackinterface</onos.app.name>
35 + <onos.app.title>Openstack Interface App</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 <onos.app.readme>Openstack Interface Application.</onos.app.readme> 38 <onos.app.readme>Openstack Interface Application.</onos.app.readme>
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
31 31
32 <properties> 32 <properties>
33 <onos.app.name>org.onosproject.openstacknetworking</onos.app.name> 33 <onos.app.name>org.onosproject.openstacknetworking</onos.app.name>
34 + <onos.app.title>Openstack Networking App</onos.app.title>
34 <onos.app.category>default</onos.app.category> 35 <onos.app.category>default</onos.app.category>
35 <onos.app.url>http://onosproject.org</onos.app.url> 36 <onos.app.url>http://onosproject.org</onos.app.url>
36 <onos.app.readme>Openstack Networking Application.</onos.app.readme> 37 <onos.app.readme>Openstack Networking Application.</onos.app.readme>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.openstacknode</onos.app.name> 36 <onos.app.name>org.onosproject.openstacknode</onos.app.name>
37 + <onos.app.title>SONA Openstack Node Bootstrap App</onos.app.title>
37 <onos.app.category>default</onos.app.category> 38 <onos.app.category>default</onos.app.category>
38 <onos.app.url>http://onosproject.org</onos.app.url> 39 <onos.app.url>http://onosproject.org</onos.app.url>
39 <onos.app.readme>SONA Openstack Node Bootstrap Application</onos.app.readme> 40 <onos.app.readme>SONA Openstack Node Bootstrap Application</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.optical</onos.app.name> 35 <onos.app.name>org.onosproject.optical</onos.app.name>
36 + <onos.app.title>Packet/Optical Use-Case App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Packet/Optical use-case application. 39 <onos.app.readme>Packet/Optical use-case application.
......
...@@ -33,10 +33,13 @@ ...@@ -33,10 +33,13 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.pathpainter</onos.app.name> 35 <onos.app.name>org.onosproject.pathpainter</onos.app.name>
36 + <onos.app.title>Path Visualization App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>https://wiki.onosproject.org/display/ONOS/Path+Painter+Application+GUI</onos.app.url> 38 <onos.app.url>https://wiki.onosproject.org/display/ONOS/Path+Painter+Application+GUI</onos.app.url>
39 + <onos.app.title>
40 + Path visualization application
41 + </onos.app.title>
38 <onos.app.readme> 42 <onos.app.readme>
39 - Path visualization application.
40 Allows the user to visualize different types of paths between 43 Allows the user to visualize different types of paths between
41 network entities such as switches and hosts. 44 network entities such as switches and hosts.
42 Selectable path types are shortest, disjoint and geographical. 45 Selectable path types are shortest, disjoint and geographical.
......
...@@ -30,6 +30,7 @@ ...@@ -30,6 +30,7 @@
30 30
31 <properties> 31 <properties>
32 <onos.app.name>org.onosproject.pcep-api</onos.app.name> 32 <onos.app.name>org.onosproject.pcep-api</onos.app.name>
33 + <onos.app.title>PCEP Protocol API</onos.app.title>
33 <onos.app.category>default</onos.app.category> 34 <onos.app.category>default</onos.app.category>
34 <onos.app.url>http://onosproject.org</onos.app.url> 35 <onos.app.url>http://onosproject.org</onos.app.url>
35 <onos.app.readme>PCEP protocol API.</onos.app.readme> 36 <onos.app.readme>PCEP protocol API.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.pim</onos.app.name> 35 <onos.app.name>org.onosproject.pim</onos.app.name>
36 + <onos.app.title>Protocol Independent Multicast Emulation</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Protocol independent multicast emulation.</onos.app.readme> 39 <onos.app.readme>Protocol independent multicast emulation.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.proxyarp</onos.app.name> 35 <onos.app.name>org.onosproject.proxyarp</onos.app.name>
36 + <onos.app.title>Proxy ARP/NDP App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Proxy ARP/NDP application.</onos.app.readme> 39 <onos.app.readme>Proxy ARP/NDP application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.reactive.routing</onos.app.name> 35 <onos.app.name>org.onosproject.reactive.routing</onos.app.name>
36 + <onos.app.title>SDN-IP Reactive Routing App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>SDN-IP reactive routing application.</onos.app.readme> 39 <onos.app.readme>SDN-IP reactive routing application.</onos.app.readme>
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.routing-api</onos.app.name> 34 <onos.app.name>org.onosproject.routing-api</onos.app.name>
35 + <onos.app.title>Routing API</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 <onos.app.readme>API for routing applications.</onos.app.readme> 38 <onos.app.readme>API for routing applications.</onos.app.readme>
......
...@@ -32,9 +32,10 @@ ...@@ -32,9 +32,10 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.routing</onos.app.name> 34 <onos.app.name>org.onosproject.routing</onos.app.name>
35 + <onos.app.title>SDN-IP Routing App</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 - <onos.app.readme>SDN-IP reactive routing application.</onos.app.readme> 38 + <onos.app.readme>SDN-IP routing application.</onos.app.readme>
38 </properties> 39 </properties>
39 40
40 <dependencies> 41 <dependencies>
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.segmentrouting</onos.app.name> 34 <onos.app.name>org.onosproject.segmentrouting</onos.app.name>
35 + <onos.app.title>Segment Routing App</onos.app.title>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
37 <onos.app.readme>Segment routing application.</onos.app.readme> 38 <onos.app.readme>Segment routing application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.demo</onos.app.name> 35 <onos.app.name>org.onosproject.demo</onos.app.name>
36 + <onos.app.title>Flow Throughput Demo</onos.app.title>
36 <onos.app.category>test</onos.app.category> 37 <onos.app.category>test</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Flow throughput test application.</onos.app.readme> 39 <onos.app.readme>Flow throughput test application.</onos.app.readme>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.distributedprimitives</onos.app.name> 36 <onos.app.name>org.onosproject.distributedprimitives</onos.app.name>
37 + <onos.app.title>Distributed Primitives Test App</onos.app.title>
37 <onos.app.category>test</onos.app.category> 38 <onos.app.category>test</onos.app.category>
38 <onos.app.url>http://onosproject.org</onos.app.url> 39 <onos.app.url>http://onosproject.org</onos.app.url>
39 <onos.app.readme>ONOS app to test distributed primitives.</onos.app.readme> 40 <onos.app.readme>ONOS app to test distributed primitives.</onos.app.readme>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.election</onos.app.name> 36 <onos.app.name>org.onosproject.election</onos.app.name>
37 + <onos.app.title>Master Election Test App</onos.app.title>
37 <onos.app.category>test</onos.app.category> 38 <onos.app.category>test</onos.app.category>
38 <onos.app.url>http://onosproject.org</onos.app.url> 39 <onos.app.url>http://onosproject.org</onos.app.url>
39 <onos.app.readme>Master election test application.</onos.app.readme> 40 <onos.app.readme>Master election test application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.intentperf</onos.app.name> 35 <onos.app.name>org.onosproject.intentperf</onos.app.name>
36 + <onos.app.title>Intent Performance Test App</onos.app.title>
36 <onos.app.category>test</onos.app.category> 37 <onos.app.category>test</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>intent performance test application.</onos.app.readme> 39 <onos.app.readme>intent performance test application.</onos.app.readme>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.loadtest</onos.app.name> 36 <onos.app.name>org.onosproject.loadtest</onos.app.name>
37 + <onos.app.title>Distributed Load Test App</onos.app.title>
37 <onos.app.category>test</onos.app.category> 38 <onos.app.category>test</onos.app.category>
38 <onos.app.url>http://onosproject.org</onos.app.url> 39 <onos.app.url>http://onosproject.org</onos.app.url>
39 <onos.app.readme>Distributed consensus load test application.</onos.app.readme> 40 <onos.app.readme>Distributed consensus load test application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.messagingperf</onos.app.name> 35 <onos.app.name>org.onosproject.messagingperf</onos.app.name>
36 + <onos.app.title>Messaging Performance Test App</onos.app.title>
36 <onos.app.category>test</onos.app.category> 37 <onos.app.category>test</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Messaging performance test application.</onos.app.readme> 39 <onos.app.readme>Messaging performance test application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.virtualbng</onos.app.name> 35 <onos.app.name>org.onosproject.virtualbng</onos.app.name>
36 + <onos.app.title>Virtual Broadband Gateway App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>Virtual broadband gateway application.</onos.app.readme> 39 <onos.app.readme>Virtual broadband gateway application.</onos.app.readme>
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.xosintegration</onos.app.name> 35 <onos.app.name>org.onosproject.xosintegration</onos.app.name>
36 + <onos.app.title>ONOS XOS Integration App</onos.app.title>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
38 <onos.app.readme>ONOS XOS integration application.</onos.app.readme> 39 <onos.app.readme>ONOS XOS integration application.</onos.app.readme>
......
...@@ -51,6 +51,13 @@ public interface ApplicationDescription { ...@@ -51,6 +51,13 @@ public interface ApplicationDescription {
51 String origin(); 51 String origin();
52 52
53 /** 53 /**
54 + * Returns title of the application.
55 + *
56 + * @return application title text
57 + */
58 + String title();
59 +
60 + /**
54 * Returns description of the application. 61 * Returns description of the application.
55 * 62 *
56 * @return application description text 63 * @return application description text
......
...@@ -35,6 +35,7 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -35,6 +35,7 @@ public class DefaultApplicationDescription implements ApplicationDescription {
35 35
36 private final String name; 36 private final String name;
37 private final Version version; 37 private final Version version;
38 + private final String title;
38 private final String description; 39 private final String description;
39 private final String origin; 40 private final String origin;
40 private final String category; 41 private final String category;
...@@ -52,6 +53,7 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -52,6 +53,7 @@ public class DefaultApplicationDescription implements ApplicationDescription {
52 * 53 *
53 * @param name application name 54 * @param name application name
54 * @param version application version 55 * @param version application version
56 + * @param title application title
55 * @param description application description 57 * @param description application description
56 * @param origin origin company 58 * @param origin origin company
57 * @param category application category 59 * @param category application category
...@@ -64,7 +66,7 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -64,7 +66,7 @@ public class DefaultApplicationDescription implements ApplicationDescription {
64 * @param features application features 66 * @param features application features
65 * @param requiredApps list of required application names 67 * @param requiredApps list of required application names
66 */ 68 */
67 - public DefaultApplicationDescription(String name, Version version, 69 + public DefaultApplicationDescription(String name, Version version, String title,
68 String description, String origin, String category, 70 String description, String origin, String category,
69 String url, String readme, byte[] icon, 71 String url, String readme, byte[] icon,
70 ApplicationRole role, Set<Permission> permissions, 72 ApplicationRole role, Set<Permission> permissions,
...@@ -72,6 +74,7 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -72,6 +74,7 @@ public class DefaultApplicationDescription implements ApplicationDescription {
72 List<String> requiredApps) { 74 List<String> requiredApps) {
73 this.name = checkNotNull(name, "Name cannot be null"); 75 this.name = checkNotNull(name, "Name cannot be null");
74 this.version = checkNotNull(version, "Version cannot be null"); 76 this.version = checkNotNull(version, "Version cannot be null");
77 + this.title = checkNotNull(title, "Title cannot be null");
75 this.description = checkNotNull(description, "Description cannot be null"); 78 this.description = checkNotNull(description, "Description cannot be null");
76 this.origin = checkNotNull(origin, "Origin cannot be null"); 79 this.origin = checkNotNull(origin, "Origin cannot be null");
77 this.category = checkNotNull(category, "Category cannot be null"); 80 this.category = checkNotNull(category, "Category cannot be null");
...@@ -97,6 +100,11 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -97,6 +100,11 @@ public class DefaultApplicationDescription implements ApplicationDescription {
97 } 100 }
98 101
99 @Override 102 @Override
103 + public String title() {
104 + return title;
105 + }
106 +
107 + @Override
100 public String description() { 108 public String description() {
101 return description; 109 return description;
102 } 110 }
...@@ -157,6 +165,7 @@ public class DefaultApplicationDescription implements ApplicationDescription { ...@@ -157,6 +165,7 @@ public class DefaultApplicationDescription implements ApplicationDescription {
157 .add("name", name) 165 .add("name", name)
158 .add("version", version) 166 .add("version", version)
159 .add("description", description) 167 .add("description", description)
168 + .add("title", title)
160 .add("origin", origin) 169 .add("origin", origin)
161 .add("category", category) 170 .add("category", category)
162 .add("url", url) 171 .add("url", url)
......
...@@ -42,6 +42,15 @@ public interface Application { ...@@ -42,6 +42,15 @@ public interface Application {
42 Version version(); 42 Version version();
43 43
44 /** 44 /**
45 + * Returns the title of the application.
46 + * This should be a short, human-readable string, as opposed
47 + * to the unique identifier returned by {@link #id()}.
48 + *
49 + * @return application title text
50 + */
51 + String title();
52 +
53 + /**
45 * Returns description of the application. 54 * Returns description of the application.
46 * 55 *
47 * @return application description text 56 * @return application description text
......
...@@ -36,6 +36,7 @@ public class DefaultApplication implements Application { ...@@ -36,6 +36,7 @@ public class DefaultApplication implements Application {
36 36
37 private final ApplicationId appId; 37 private final ApplicationId appId;
38 private final Version version; 38 private final Version version;
39 + private final String title;
39 private final String description; 40 private final String description;
40 private final String category; 41 private final String category;
41 private final String url; 42 private final String url;
...@@ -53,6 +54,7 @@ public class DefaultApplication implements Application { ...@@ -53,6 +54,7 @@ public class DefaultApplication implements Application {
53 * 54 *
54 * @param appId application identifier 55 * @param appId application identifier
55 * @param version application version 56 * @param version application version
57 + * @param title application title
56 * @param description application description 58 * @param description application description
57 * @param origin origin company 59 * @param origin origin company
58 * @param category application category 60 * @param category application category
...@@ -65,7 +67,7 @@ public class DefaultApplication implements Application { ...@@ -65,7 +67,7 @@ public class DefaultApplication implements Application {
65 * @param features application features 67 * @param features application features
66 * @param requiredApps list of required application names 68 * @param requiredApps list of required application names
67 */ 69 */
68 - public DefaultApplication(ApplicationId appId, Version version, 70 + public DefaultApplication(ApplicationId appId, Version version, String title,
69 String description, String origin, String category, 71 String description, String origin, String category,
70 String url, String readme, byte[] icon, 72 String url, String readme, byte[] icon,
71 ApplicationRole role, Set<Permission> permissions, 73 ApplicationRole role, Set<Permission> permissions,
...@@ -73,6 +75,7 @@ public class DefaultApplication implements Application { ...@@ -73,6 +75,7 @@ public class DefaultApplication implements Application {
73 List<String> requiredApps) { 75 List<String> requiredApps) {
74 this.appId = checkNotNull(appId, "ID cannot be null"); 76 this.appId = checkNotNull(appId, "ID cannot be null");
75 this.version = checkNotNull(version, "Version cannot be null"); 77 this.version = checkNotNull(version, "Version cannot be null");
78 + this.title = checkNotNull(title, "Title cannot be null");
76 this.description = checkNotNull(description, "Description cannot be null"); 79 this.description = checkNotNull(description, "Description cannot be null");
77 this.origin = checkNotNull(origin, "Origin cannot be null"); 80 this.origin = checkNotNull(origin, "Origin cannot be null");
78 this.category = checkNotNull(category, "Category cannot be null"); 81 this.category = checkNotNull(category, "Category cannot be null");
...@@ -104,6 +107,11 @@ public class DefaultApplication implements Application { ...@@ -104,6 +107,11 @@ public class DefaultApplication implements Application {
104 } 107 }
105 108
106 @Override 109 @Override
110 + public String title() {
111 + return title;
112 + }
113 +
114 + @Override
107 public String description() { 115 public String description() {
108 return description; 116 return description;
109 } 117 }
...@@ -160,7 +168,7 @@ public class DefaultApplication implements Application { ...@@ -160,7 +168,7 @@ public class DefaultApplication implements Application {
160 168
161 @Override 169 @Override
162 public int hashCode() { 170 public int hashCode() {
163 - return Objects.hash(appId, version, description, origin, category, url, 171 + return Objects.hash(appId, version, title, description, origin, category, url,
164 readme, role, permissions, featuresRepo, features, requiredApps); 172 readme, role, permissions, featuresRepo, features, requiredApps);
165 } 173 }
166 174
...@@ -173,8 +181,12 @@ public class DefaultApplication implements Application { ...@@ -173,8 +181,12 @@ public class DefaultApplication implements Application {
173 return false; 181 return false;
174 } 182 }
175 final DefaultApplication other = (DefaultApplication) obj; 183 final DefaultApplication other = (DefaultApplication) obj;
184 + // TODO: review -- do ALL the fields need to be included?
185 + // It is debatable whether fields like description, url, and readme,
186 + // need to be included in the notion of equivalence.
176 return Objects.equals(this.appId, other.appId) && 187 return Objects.equals(this.appId, other.appId) &&
177 Objects.equals(this.version, other.version) && 188 Objects.equals(this.version, other.version) &&
189 + Objects.equals(this.title, other.title) &&
178 Objects.equals(this.description, other.description) && 190 Objects.equals(this.description, other.description) &&
179 Objects.equals(this.origin, other.origin) && 191 Objects.equals(this.origin, other.origin) &&
180 Objects.equals(this.category, other.category) && 192 Objects.equals(this.category, other.category) &&
...@@ -192,6 +204,7 @@ public class DefaultApplication implements Application { ...@@ -192,6 +204,7 @@ public class DefaultApplication implements Application {
192 return toStringHelper(this) 204 return toStringHelper(this)
193 .add("appId", appId) 205 .add("appId", appId)
194 .add("version", version) 206 .add("version", version)
207 + .add("title", title)
195 .add("description", description) 208 .add("description", description)
196 .add("origin", origin) 209 .add("origin", origin)
197 .add("category", category) 210 .add("category", category)
......
...@@ -32,7 +32,7 @@ import static org.onosproject.core.DefaultApplicationTest.APP_ID; ...@@ -32,7 +32,7 @@ import static org.onosproject.core.DefaultApplicationTest.APP_ID;
32 public class ApplicationEventTest extends AbstractEventTest { 32 public class ApplicationEventTest extends AbstractEventTest {
33 33
34 private Application createApp() { 34 private Application createApp() {
35 - return new DefaultApplication(APP_ID, VER, DESC, ORIGIN, CATEGORY, 35 + return new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN, CATEGORY,
36 URL, README, ICON, ROLE, PERMS, 36 URL, README, ICON, ROLE, PERMS,
37 Optional.of(FURL), FEATURES, APPS); 37 Optional.of(FURL), FEATURES, APPS);
38 } 38 }
......
...@@ -38,6 +38,7 @@ public class DefaultApplicationDescriptionTest { ...@@ -38,6 +38,7 @@ public class DefaultApplicationDescriptionTest {
38 38
39 public static final String APP_NAME = "org.foo.app"; 39 public static final String APP_NAME = "org.foo.app";
40 public static final Version VER = Version.version(1, 2, "a", null); 40 public static final Version VER = Version.version(1, 2, "a", null);
41 + public static final String TITLE = "Awesome App";
41 public static final String DESC = "Awesome application from Circus, Inc."; 42 public static final String DESC = "Awesome application from Circus, Inc.";
42 public static final String ORIGIN = "Circus"; 43 public static final String ORIGIN = "Circus";
43 public static final String CATEGORY = "other"; 44 public static final String CATEGORY = "other";
...@@ -55,11 +56,12 @@ public class DefaultApplicationDescriptionTest { ...@@ -55,11 +56,12 @@ public class DefaultApplicationDescriptionTest {
55 @Test 56 @Test
56 public void basics() { 57 public void basics() {
57 ApplicationDescription app = 58 ApplicationDescription app =
58 - new DefaultApplicationDescription(APP_NAME, VER, DESC, ORIGIN, 59 + new DefaultApplicationDescription(APP_NAME, VER, TITLE, DESC, ORIGIN,
59 CATEGORY, URL, README, ICON, 60 CATEGORY, URL, README, ICON,
60 ROLE, PERMS, FURL, FEATURES, APPS); 61 ROLE, PERMS, FURL, FEATURES, APPS);
61 assertEquals("incorrect id", APP_NAME, app.name()); 62 assertEquals("incorrect id", APP_NAME, app.name());
62 assertEquals("incorrect version", VER, app.version()); 63 assertEquals("incorrect version", VER, app.version());
64 + assertEquals("incorrect title", TITLE, app.title());
63 assertEquals("incorrect description", DESC, app.description()); 65 assertEquals("incorrect description", DESC, app.description());
64 assertEquals("incorrect origin", ORIGIN, app.origin()); 66 assertEquals("incorrect origin", ORIGIN, app.origin());
65 assertEquals("incorrect category", CATEGORY, app.category()); 67 assertEquals("incorrect category", CATEGORY, app.category());
......
...@@ -43,7 +43,7 @@ public class DefaultApplicationTest { ...@@ -43,7 +43,7 @@ public class DefaultApplicationTest {
43 43
44 @Test 44 @Test
45 public void basics() { 45 public void basics() {
46 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 46 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
47 CATEGORY, URL, README, ICON, ROLE, 47 CATEGORY, URL, README, ICON, ROLE,
48 PERMS, Optional.of(FURL), FEATURES, APPS); 48 PERMS, Optional.of(FURL), FEATURES, APPS);
49 assertEquals("incorrect id", APP_ID, app.id()); 49 assertEquals("incorrect id", APP_ID, app.id());
...@@ -64,16 +64,16 @@ public class DefaultApplicationTest { ...@@ -64,16 +64,16 @@ public class DefaultApplicationTest {
64 64
65 @Test 65 @Test
66 public void testEquality() { 66 public void testEquality() {
67 - Application a1 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 67 + Application a1 = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
68 CATEGORY, URL, README, ICON, ROLE, 68 CATEGORY, URL, README, ICON, ROLE,
69 PERMS, Optional.of(FURL), FEATURES, APPS); 69 PERMS, Optional.of(FURL), FEATURES, APPS);
70 - Application a2 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 70 + Application a2 = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
71 CATEGORY, URL, README, ICON, ROLE, 71 CATEGORY, URL, README, ICON, ROLE,
72 PERMS, Optional.of(FURL), FEATURES, APPS); 72 PERMS, Optional.of(FURL), FEATURES, APPS);
73 - Application a3 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 73 + Application a3 = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
74 CATEGORY, URL, README, ICON, ROLE, 74 CATEGORY, URL, README, ICON, ROLE,
75 PERMS, Optional.empty(), FEATURES, APPS); 75 PERMS, Optional.empty(), FEATURES, APPS);
76 - Application a4 = new DefaultApplication(APP_ID, VER, DESC, ORIGIN + "asd", 76 + Application a4 = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN + "asd",
77 CATEGORY, URL, README, ICON, ROLE, 77 CATEGORY, URL, README, ICON, ROLE,
78 PERMS, Optional.of(FURL), FEATURES, APPS); 78 PERMS, Optional.of(FURL), FEATURES, APPS);
79 new EqualsTester().addEqualityGroup(a1, a2) 79 new EqualsTester().addEqualityGroup(a1, a2)
...@@ -87,7 +87,7 @@ public class DefaultApplicationTest { ...@@ -87,7 +87,7 @@ public class DefaultApplicationTest {
87 public void immutableIcon() { 87 public void immutableIcon() {
88 byte[] iconSourceData = ICON_ORIG.clone(); 88 byte[] iconSourceData = ICON_ORIG.clone();
89 89
90 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 90 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
91 CATEGORY, URL, README, iconSourceData, ROLE, 91 CATEGORY, URL, README, iconSourceData, ROLE,
92 PERMS, Optional.of(FURL), FEATURES, APPS); 92 PERMS, Optional.of(FURL), FEATURES, APPS);
93 93
...@@ -128,7 +128,7 @@ public class DefaultApplicationTest { ...@@ -128,7 +128,7 @@ public class DefaultApplicationTest {
128 // Set<Permission> p = PERMS_ORIG; 128 // Set<Permission> p = PERMS_ORIG;
129 Set<Permission> p = PERMS_UNSAFE; 129 Set<Permission> p = PERMS_UNSAFE;
130 130
131 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 131 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
132 CATEGORY, URL, README, ICON, ROLE, 132 CATEGORY, URL, README, ICON, ROLE,
133 p, Optional.of(FURL), FEATURES, APPS); 133 p, Optional.of(FURL), FEATURES, APPS);
134 134
...@@ -170,7 +170,7 @@ public class DefaultApplicationTest { ...@@ -170,7 +170,7 @@ public class DefaultApplicationTest {
170 // List<String> f = FEATURES_ORIG; 170 // List<String> f = FEATURES_ORIG;
171 List<String> f = FEATURES_UNSAFE; 171 List<String> f = FEATURES_UNSAFE;
172 172
173 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 173 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
174 CATEGORY, URL, README, ICON, ROLE, 174 CATEGORY, URL, README, ICON, ROLE,
175 PERMS, Optional.of(FURL), f, APPS); 175 PERMS, Optional.of(FURL), f, APPS);
176 176
...@@ -190,7 +190,7 @@ public class DefaultApplicationTest { ...@@ -190,7 +190,7 @@ public class DefaultApplicationTest {
190 // List<String> ra = REQ_APPS_ORIG; 190 // List<String> ra = REQ_APPS_ORIG;
191 List<String> ra = REQ_APPS_UNSAFE; 191 List<String> ra = REQ_APPS_UNSAFE;
192 192
193 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 193 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
194 CATEGORY, URL, README, ICON, ROLE, 194 CATEGORY, URL, README, ICON, ROLE,
195 PERMS, Optional.of(FURL), FEATURES, ra); 195 PERMS, Optional.of(FURL), FEATURES, ra);
196 196
...@@ -206,7 +206,7 @@ public class DefaultApplicationTest { ...@@ -206,7 +206,7 @@ public class DefaultApplicationTest {
206 206
207 @Test 207 @Test
208 public void nullIcon() { 208 public void nullIcon() {
209 - Application app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, 209 + Application app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN,
210 CATEGORY, URL, README, null, ROLE, 210 CATEGORY, URL, README, null, ROLE,
211 PERMS, Optional.of(FURL), FEATURES, APPS); 211 PERMS, Optional.of(FURL), FEATURES, APPS);
212 byte[] icon = app.icon(); 212 byte[] icon = app.icon();
......
...@@ -88,6 +88,7 @@ public class ApplicationArchive ...@@ -88,6 +88,7 @@ public class ApplicationArchive
88 88
89 private static final String CATEGORY = "[@category]"; 89 private static final String CATEGORY = "[@category]";
90 private static final String URL = "[@url]"; 90 private static final String URL = "[@url]";
91 + private static final String TITLE = "[@title]";
91 92
92 private static final String ROLE = "security.role"; 93 private static final String ROLE = "security.role";
93 private static final String APP_PERMISSIONS = "security.permissions.app-perm"; 94 private static final String APP_PERMISSIONS = "security.permissions.app-perm";
...@@ -294,6 +295,11 @@ public class ApplicationArchive ...@@ -294,6 +295,11 @@ public class ApplicationArchive
294 String name = cfg.getString(NAME); 295 String name = cfg.getString(NAME);
295 Version version = Version.version(cfg.getString(VERSION)); 296 Version version = Version.version(cfg.getString(VERSION));
296 String origin = cfg.getString(ORIGIN); 297 String origin = cfg.getString(ORIGIN);
298 +
299 + String title = cfg.getString(TITLE);
300 + // FIXME: title should be set as attribute to APP, but fallback for now...
301 + title = title == null ? name : title;
302 +
297 String category = cfg.getString(CATEGORY, UTILITY); 303 String category = cfg.getString(CATEGORY, UTILITY);
298 String url = cfg.getString(URL); 304 String url = cfg.getString(URL);
299 byte[] icon = getApplicationIcon(name); 305 byte[] icon = getApplicationIcon(name);
...@@ -313,7 +319,7 @@ public class ApplicationArchive ...@@ -313,7 +319,7 @@ public class ApplicationArchive
313 // put short description to description field 319 // put short description to description field
314 String desc = compactDescription(readme); 320 String desc = compactDescription(readme);
315 321
316 - return new DefaultApplicationDescription(name, version, desc, origin, 322 + return new DefaultApplicationDescription(name, version, title, desc, origin,
317 category, url, readme, icon, 323 category, url, readme, icon,
318 role, perms, featuresRepo, 324 role, perms, featuresRepo,
319 features, requiredApps); 325 features, requiredApps);
......
...@@ -65,6 +65,7 @@ public class ApplicationArchiveTest { ...@@ -65,6 +65,7 @@ public class ApplicationArchiveTest {
65 assertEquals("incorrect url", URL, app.url()); 65 assertEquals("incorrect url", URL, app.url());
66 assertEquals("incorrect readme", README, app.readme()); 66 assertEquals("incorrect readme", README, app.readme());
67 67
68 + assertEquals("incorrect title", TITLE, app.title());
68 assertEquals("incorrect description", DESC, app.description()); 69 assertEquals("incorrect description", DESC, app.description());
69 assertEquals("incorrect features URI", FURL, app.featuresRepo().get()); 70 assertEquals("incorrect features URI", FURL, app.featuresRepo().get());
70 assertEquals("incorrect permissions", PERMS, app.permissions()); 71 assertEquals("incorrect permissions", PERMS, app.permissions());
......
...@@ -49,14 +49,18 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -49,14 +49,18 @@ import static org.slf4j.LoggerFactory.getLogger;
49 */ 49 */
50 @Component(immediate = true) 50 @Component(immediate = true)
51 @Service 51 @Service
52 -public class SimpleApplicationStore extends ApplicationArchive implements ApplicationStore { 52 +public class SimpleApplicationStore extends ApplicationArchive
53 + implements ApplicationStore {
53 54
54 private final Logger log = getLogger(getClass()); 55 private final Logger log = getLogger(getClass());
55 56
56 // App inventory & states 57 // App inventory & states
57 - private final ConcurrentMap<ApplicationId, DefaultApplication> apps = new ConcurrentHashMap<>(); 58 + private final ConcurrentMap<ApplicationId, DefaultApplication> apps =
58 - private final ConcurrentMap<ApplicationId, ApplicationState> states = new ConcurrentHashMap<>(); 59 + new ConcurrentHashMap<>();
59 - private final ConcurrentMap<ApplicationId, Set<Permission>> permissions = new ConcurrentHashMap<>(); 60 + private final ConcurrentMap<ApplicationId, ApplicationState> states =
61 + new ConcurrentHashMap<>();
62 + private final ConcurrentMap<ApplicationId, Set<Permission>> permissions =
63 + new ConcurrentHashMap<>();
60 64
61 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY) 65 @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
62 protected ApplicationIdStore idStore; 66 protected ApplicationIdStore idStore;
...@@ -72,13 +76,20 @@ public class SimpleApplicationStore extends ApplicationArchive implements Applic ...@@ -72,13 +76,20 @@ public class SimpleApplicationStore extends ApplicationArchive implements Applic
72 ApplicationId appId = idStore.registerApplication(name); 76 ApplicationId appId = idStore.registerApplication(name);
73 ApplicationDescription appDesc = getApplicationDescription(name); 77 ApplicationDescription appDesc = getApplicationDescription(name);
74 DefaultApplication app = 78 DefaultApplication app =
75 - new DefaultApplication(appId, appDesc.version(), 79 + new DefaultApplication(appId,
76 - appDesc.description(), appDesc.origin(), 80 + appDesc.version(),
77 - appDesc.category(), appDesc.url(), 81 + appDesc.title(),
78 - appDesc.readme(), appDesc.icon(), 82 + appDesc.description(),
79 - appDesc.role(), appDesc.permissions(), 83 + appDesc.origin(),
80 - appDesc.featuresRepo(), appDesc.features(), 84 + appDesc.category(),
81 - appDesc.requiredApps()); 85 + appDesc.url(),
86 + appDesc.readme(),
87 + appDesc.icon(),
88 + appDesc.role(),
89 + appDesc.permissions(),
90 + appDesc.featuresRepo(),
91 + appDesc.features(),
92 + appDesc.requiredApps());
82 apps.put(appId, app); 93 apps.put(appId, app);
83 states.put(appId, isActive(name) ? INSTALLED : ACTIVE); 94 states.put(appId, isActive(name) ? INSTALLED : ACTIVE);
84 // load app permissions 95 // load app permissions
...@@ -118,12 +129,20 @@ public class SimpleApplicationStore extends ApplicationArchive implements Applic ...@@ -118,12 +129,20 @@ public class SimpleApplicationStore extends ApplicationArchive implements Applic
118 ApplicationDescription appDesc = saveApplication(appDescStream); 129 ApplicationDescription appDesc = saveApplication(appDescStream);
119 ApplicationId appId = idStore.registerApplication(appDesc.name()); 130 ApplicationId appId = idStore.registerApplication(appDesc.name());
120 DefaultApplication app = 131 DefaultApplication app =
121 - new DefaultApplication(appId, appDesc.version(), appDesc.description(), 132 + new DefaultApplication(appId,
122 - appDesc.origin(), appDesc.category(), appDesc.url(), 133 + appDesc.version(),
123 - appDesc.readme(), appDesc.icon(), 134 + appDesc.title(),
124 - appDesc.role(), appDesc.permissions(), 135 + appDesc.description(),
125 - appDesc.featuresRepo(), appDesc.features(), 136 + appDesc.origin(),
126 - appDesc.requiredApps()); 137 + appDesc.category(),
138 + appDesc.url(),
139 + appDesc.readme(),
140 + appDesc.icon(),
141 + appDesc.role(),
142 + appDesc.permissions(),
143 + appDesc.featuresRepo(),
144 + appDesc.features(),
145 + appDesc.requiredApps());
127 apps.put(appId, app); 146 apps.put(appId, app);
128 states.put(appId, INSTALLED); 147 states.put(appId, INSTALLED);
129 delegate.notify(new ApplicationEvent(APP_INSTALLED, app)); 148 delegate.notify(new ApplicationEvent(APP_INSTALLED, app));
......
...@@ -13,8 +13,10 @@ ...@@ -13,8 +13,10 @@
13 ~ See the License for the specific language governing permissions and 13 ~ See the License for the specific language governing permissions and
14 ~ limitations under the License. 14 ~ limitations under the License.
15 --> 15 -->
16 -<app name="org.foo.app" origin="Circus" version="1.2.a" category="other" 16 +<app name="org.foo.app" origin="Circus" version="1.2.a"
17 - url="http://www.onosproject.org" featuresRepo="mvn:org.foo-features/1.2a/xml/features" 17 + title="Awesome App" category="other"
18 + url="http://www.onosproject.org"
19 + featuresRepo="mvn:org.foo-features/1.2a/xml/features"
18 features="foo,bar"> 20 features="foo,bar">
19 <description>Awesome application from Circus, Inc.</description> 21 <description>Awesome application from Circus, Inc.</description>
20 <security> 22 <security>
......
...@@ -138,7 +138,7 @@ public class ApplicationManagerTest { ...@@ -138,7 +138,7 @@ public class ApplicationManagerTest {
138 138
139 @Override 139 @Override
140 public Application create(InputStream appDescStream) { 140 public Application create(InputStream appDescStream) {
141 - app = new DefaultApplication(APP_ID, VER, DESC, ORIGIN, CATEGORY, 141 + app = new DefaultApplication(APP_ID, VER, TITLE, DESC, ORIGIN, CATEGORY,
142 URL, README, ICON, ROLE, PERMS, 142 URL, README, ICON, ROLE, PERMS,
143 Optional.of(FURL), FEATURES, ImmutableList.of()); 143 Optional.of(FURL), FEATURES, ImmutableList.of());
144 state = INSTALLED; 144 state = INSTALLED;
......
...@@ -507,10 +507,19 @@ public class GossipApplicationStore extends ApplicationArchive ...@@ -507,10 +507,19 @@ public class GossipApplicationStore extends ApplicationArchive
507 */ 507 */
508 private Application registerApp(ApplicationDescription appDesc) { 508 private Application registerApp(ApplicationDescription appDesc) {
509 ApplicationId appId = idStore.registerApplication(appDesc.name()); 509 ApplicationId appId = idStore.registerApplication(appDesc.name());
510 - return new DefaultApplication(appId, appDesc.version(), appDesc.description(), 510 + return new DefaultApplication(appId,
511 - appDesc.origin(), appDesc.category(), appDesc.url(), 511 + appDesc.version(),
512 - appDesc.readme(), appDesc.icon(), appDesc.role(), 512 + appDesc.title(),
513 - appDesc.permissions(), appDesc.featuresRepo(), 513 + appDesc.description(),
514 - appDesc.features(), appDesc.requiredApps()); 514 + appDesc.origin(),
515 + appDesc.category(),
516 + appDesc.url(),
517 + appDesc.readme(),
518 + appDesc.icon(),
519 + appDesc.role(),
520 + appDesc.permissions(),
521 + appDesc.featuresRepo(),
522 + appDesc.features(),
523 + appDesc.requiredApps());
515 } 524 }
516 } 525 }
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
31 31
32 <properties> 32 <properties>
33 <onos.app.name>org.onosproject.hostprovider</onos.app.name> 33 <onos.app.name>org.onosproject.hostprovider</onos.app.name>
34 + <onos.app.title>Host Location Provider</onos.app.title>
34 <onos.app.origin>ON.Lab</onos.app.origin> 35 <onos.app.origin>ON.Lab</onos.app.origin>
35 <onos.app.category>default</onos.app.category> 36 <onos.app.category>default</onos.app.category>
36 <onos.app.url>http://onosproject.org</onos.app.url> 37 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -32,6 +32,7 @@ ...@@ -32,6 +32,7 @@
32 32
33 <properties> 33 <properties>
34 <onos.app.name>org.onosproject.lldpprovider</onos.app.name> 34 <onos.app.name>org.onosproject.lldpprovider</onos.app.name>
35 + <onos.app.title>LLDP Link Provider</onos.app.title>
35 <onos.app.origin>ON.Lab</onos.app.origin> 36 <onos.app.origin>ON.Lab</onos.app.origin>
36 <onos.app.category>default</onos.app.category> 37 <onos.app.category>default</onos.app.category>
37 <onos.app.url>http://onosproject.org</onos.app.url> 38 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.netcfghostprovider</onos.app.name> 36 <onos.app.name>org.onosproject.netcfghostprovider</onos.app.name>
37 + <onos.app.title>Network Config host Provider</onos.app.title>
37 <onos.app.origin>ON.Lab</onos.app.origin> 38 <onos.app.origin>ON.Lab</onos.app.origin>
38 <onos.app.category>default</onos.app.category> 39 <onos.app.category>default</onos.app.category>
39 <onos.app.url>http://onosproject.org</onos.app.url> 40 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
34 34
35 <properties> 35 <properties>
36 <onos.app.name>org.onosproject.netcfglinksprovider</onos.app.name> 36 <onos.app.name>org.onosproject.netcfglinksprovider</onos.app.name>
37 + <onos.app.title>Network Config Link Provider</onos.app.title>
37 <onos.app.origin>ON.Lab</onos.app.origin> 38 <onos.app.origin>ON.Lab</onos.app.origin>
38 </properties> 39 </properties>
39 40
......
...@@ -33,6 +33,7 @@ ...@@ -33,6 +33,7 @@
33 33
34 <properties> 34 <properties>
35 <onos.app.name>org.onosproject.null</onos.app.name> 35 <onos.app.name>org.onosproject.null</onos.app.name>
36 + <onos.app.title>Null Southbound Provider</onos.app.title>
36 <onos.app.origin>ON.Lab</onos.app.origin> 37 <onos.app.origin>ON.Lab</onos.app.origin>
37 <onos.app.category>default</onos.app.category> 38 <onos.app.category>default</onos.app.category>
38 <onos.app.url>http://onosproject.org</onos.app.url> 39 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
31 31
32 <properties> 32 <properties>
33 <onos.app.name>org.onosproject.openflow</onos.app.name> 33 <onos.app.name>org.onosproject.openflow</onos.app.name>
34 + <onos.app.title>OpenFlow Southbound Meta App</onos.app.title>
34 <onos.app.requires> 35 <onos.app.requires>
35 org.onosproject.openflow-base, 36 org.onosproject.openflow-base,
36 org.onosproject.hostprovider, 37 org.onosproject.hostprovider,
......
...@@ -31,6 +31,7 @@ ...@@ -31,6 +31,7 @@
31 31
32 <properties> 32 <properties>
33 <onos.app.name>org.onosproject.ovsdb</onos.app.name> 33 <onos.app.name>org.onosproject.ovsdb</onos.app.name>
34 + <onos.app.title>OVSDB Southbound Meta App</onos.app.title>
34 <onos.app.requires> 35 <onos.app.requires>
35 org.onosproject.ovsdb-base, 36 org.onosproject.ovsdb-base,
36 org.onosproject.ovsdbhostprovider 37 org.onosproject.ovsdbhostprovider
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
35 <onos.version>1.5.0-SNAPSHOT</onos.version> 35 <onos.version>1.5.0-SNAPSHOT</onos.version>
36 <!-- Uncomment to generate ONOS app from this module. 36 <!-- Uncomment to generate ONOS app from this module.
37 <onos.app.name>org.foo.app</onos.app.name> 37 <onos.app.name>org.foo.app</onos.app.name>
38 + <onos.app.title>Foo App</onos.app.title>
38 <onos.app.origin>Foo, Inc.</onos.app.origin> 39 <onos.app.origin>Foo, Inc.</onos.app.origin>
39 <onos.app.category>default</onos.app.category> 40 <onos.app.category>default</onos.app.category>
40 <onos.app.url>http://onosproject.org</onos.app.url> 41 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
35 <onos.version>1.5.0-SNAPSHOT</onos.version> 35 <onos.version>1.5.0-SNAPSHOT</onos.version>
36 <!-- Uncomment to generate ONOS app from this module. 36 <!-- Uncomment to generate ONOS app from this module.
37 <onos.app.name>org.foo.app</onos.app.name> 37 <onos.app.name>org.foo.app</onos.app.name>
38 + <onos.app.title>Foo App</onos.app.title>
38 <onos.app.origin>Foo, Inc.</onos.app.origin> 39 <onos.app.origin>Foo, Inc.</onos.app.origin>
39 <onos.app.category>UI</onos.app.category> 40 <onos.app.category>UI</onos.app.category>
40 <onos.app.url>http://onosproject.org</onos.app.url> 41 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
36 <onos.version>1.5.0-SNAPSHOT</onos.version> 36 <onos.version>1.5.0-SNAPSHOT</onos.version>
37 <!-- Uncomment to generate ONOS app from this module. 37 <!-- Uncomment to generate ONOS app from this module.
38 <onos.app.name>org.foo.app</onos.app.name> 38 <onos.app.name>org.foo.app</onos.app.name>
39 + <onos.app.title>Foo App</onos.app.title>
39 <onos.app.origin>Foo, Inc.</onos.app.origin> 40 <onos.app.origin>Foo, Inc.</onos.app.origin>
40 <onos.app.category>UI</onos.app.category> 41 <onos.app.category>UI</onos.app.category>
41 <onos.app.url>http://onosproject.org</onos.app.url> 42 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -36,6 +36,7 @@ ...@@ -36,6 +36,7 @@
36 <onos.version>1.5.0-SNAPSHOT</onos.version> 36 <onos.version>1.5.0-SNAPSHOT</onos.version>
37 <!-- Uncomment to generate ONOS app from this module. 37 <!-- Uncomment to generate ONOS app from this module.
38 <onos.app.name>org.foo.app</onos.app.name> 38 <onos.app.name>org.foo.app</onos.app.name>
39 + <onos.app.title>Foo App</onos.app.title>
39 <onos.app.origin>Foo, Inc.</onos.app.origin> 40 <onos.app.origin>Foo, Inc.</onos.app.origin>
40 <onos.app.category>UI</onos.app.category> 41 <onos.app.category>UI</onos.app.category>
41 <onos.app.url>http://onosproject.org</onos.app.url> 42 <onos.app.url>http://onosproject.org</onos.app.url>
......
...@@ -74,6 +74,7 @@ public class OnosAppMojo extends AbstractMojo { ...@@ -74,6 +74,7 @@ public class OnosAppMojo extends AbstractMojo {
74 74
75 private static final String ONOS_APP_CATEGORY = "onos.app.category"; 75 private static final String ONOS_APP_CATEGORY = "onos.app.category";
76 private static final String ONOS_APP_URL = "onos.app.url"; 76 private static final String ONOS_APP_URL = "onos.app.url";
77 + private static final String ONOS_APP_TITLE = "onos.app.title";
77 private static final String ONOS_APP_README = "onos.app.readme"; 78 private static final String ONOS_APP_README = "onos.app.readme";
78 79
79 private static final String JAR = "jar"; 80 private static final String JAR = "jar";
...@@ -99,6 +100,7 @@ public class OnosAppMojo extends AbstractMojo { ...@@ -99,6 +100,7 @@ public class OnosAppMojo extends AbstractMojo {
99 private String requiredApps; 100 private String requiredApps;
100 private String category; 101 private String category;
101 private String url; 102 private String url;
103 + private String title;
102 private String readme; 104 private String readme;
103 private String version = DEFAULT_VERSION; 105 private String version = DEFAULT_VERSION;
104 private String featuresRepo = DEFAULT_FEATURES_REPO; 106 private String featuresRepo = DEFAULT_FEATURES_REPO;
...@@ -189,6 +191,10 @@ public class OnosAppMojo extends AbstractMojo { ...@@ -189,6 +191,10 @@ public class OnosAppMojo extends AbstractMojo {
189 url = (String) project.getProperties().get(ONOS_APP_URL); 191 url = (String) project.getProperties().get(ONOS_APP_URL);
190 url = url != null ? url : DEFAULT_URL; 192 url = url != null ? url : DEFAULT_URL;
191 193
194 + // if title does not exist, fall back to the name
195 + title = (String) project.getProperties().get(ONOS_APP_TITLE);
196 + title = title != null ? title : name;
197 +
192 // if readme does not exist, we simply fallback to use description 198 // if readme does not exist, we simply fallback to use description
193 readme = (String) project.getProperties().get(ONOS_APP_README); 199 readme = (String) project.getProperties().get(ONOS_APP_README);
194 readme = readme != null ? readme : projectDescription; 200 readme = readme != null ? readme : projectDescription;
...@@ -387,6 +393,7 @@ public class OnosAppMojo extends AbstractMojo { ...@@ -387,6 +393,7 @@ public class OnosAppMojo extends AbstractMojo {
387 .replaceAll("\\$\\{onos.app.origin\\}", origin) 393 .replaceAll("\\$\\{onos.app.origin\\}", origin)
388 .replaceAll("\\$\\{onos.app.requires\\}", requiredApps) 394 .replaceAll("\\$\\{onos.app.requires\\}", requiredApps)
389 .replaceAll("\\$\\{onos.app.category\\}", category) 395 .replaceAll("\\$\\{onos.app.category\\}", category)
396 + .replaceAll("\\$\\{onos.app.title\\}", title)
390 .replaceAll("\\$\\{onos.app.url\\}", url) 397 .replaceAll("\\$\\{onos.app.url\\}", url)
391 .replaceAll("\\$\\{project.groupId\\}", projectGroupId) 398 .replaceAll("\\$\\{project.groupId\\}", projectGroupId)
392 .replaceAll("\\$\\{project.artifactId\\}", projectArtifactId) 399 .replaceAll("\\$\\{project.artifactId\\}", projectArtifactId)
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
15 ~ limitations under the License. 15 ~ limitations under the License.
16 --> 16 -->
17 <app name="${onos.app.name}" origin="${onos.app.origin}" version="${project.version}" 17 <app name="${onos.app.name}" origin="${onos.app.origin}" version="${project.version}"
18 - category="${onos.app.category}" url="${onos.app.url}" 18 + title="${onos.app.title}" category="${onos.app.category}" url="${onos.app.url}"
19 featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features" 19 featuresRepo="mvn:${project.groupId}/${project.artifactId}/${project.version}/xml/features"
20 features="${project.artifactId}" apps="${onos.app.requires}"> 20 features="${project.artifactId}" apps="${onos.app.requires}">
21 <description>${project.description}</description> 21 <description>${project.description}</description>
......
...@@ -84,26 +84,26 @@ public class ApplicationsResourceTest extends ResourceTest { ...@@ -84,26 +84,26 @@ public class ApplicationsResourceTest extends ResourceTest {
84 private static final Version VER = Version.version(1, 2, "a", null); 84 private static final Version VER = Version.version(1, 2, "a", null);
85 85
86 private Application app1 = 86 private Application app1 =
87 - new DefaultApplication(id1, VER, 87 + new DefaultApplication(id1, VER, "title1",
88 - "app1", "origin1", "category1", "url1", 88 + "desc1", "origin1", "category1", "url1",
89 "readme1", new byte[0], ApplicationRole.ADMIN, 89 "readme1", new byte[0], ApplicationRole.ADMIN,
90 ImmutableSet.of(), Optional.of(FURL), 90 ImmutableSet.of(), Optional.of(FURL),
91 ImmutableList.of("My Feature"), ImmutableList.of()); 91 ImmutableList.of("My Feature"), ImmutableList.of());
92 private Application app2 = 92 private Application app2 =
93 - new DefaultApplication(id2, VER, 93 + new DefaultApplication(id2, VER, "title2",
94 - "app2", "origin2", "category2", "url2", 94 + "desc2", "origin2", "category2", "url2",
95 "readme2", new byte[0], ApplicationRole.ADMIN, 95 "readme2", new byte[0], ApplicationRole.ADMIN,
96 ImmutableSet.of(), Optional.of(FURL), 96 ImmutableSet.of(), Optional.of(FURL),
97 ImmutableList.of("My Feature"), ImmutableList.of()); 97 ImmutableList.of("My Feature"), ImmutableList.of());
98 private Application app3 = 98 private Application app3 =
99 - new DefaultApplication(id3, VER, 99 + new DefaultApplication(id3, VER, "title3",
100 - "app3", "origin3", "category3", "url3", 100 + "desc3", "origin3", "category3", "url3",
101 "readme3", new byte[0], ApplicationRole.ADMIN, 101 "readme3", new byte[0], ApplicationRole.ADMIN,
102 ImmutableSet.of(), Optional.of(FURL), 102 ImmutableSet.of(), Optional.of(FURL),
103 ImmutableList.of("My Feature"), ImmutableList.of()); 103 ImmutableList.of("My Feature"), ImmutableList.of());
104 private Application app4 = 104 private Application app4 =
105 - new DefaultApplication(id4, VER, 105 + new DefaultApplication(id4, VER, "title4",
106 - "app4", "origin4", "category4", "url4", 106 + "desc4", "origin4", "category4", "url4",
107 "readme4", new byte[0], ApplicationRole.ADMIN, 107 "readme4", new byte[0], ApplicationRole.ADMIN,
108 ImmutableSet.of(), Optional.of(FURL), 108 ImmutableSet.of(), Optional.of(FURL),
109 ImmutableList.of("My Feature"), ImmutableList.of()); 109 ImmutableList.of("My Feature"), ImmutableList.of());
......
...@@ -54,6 +54,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { ...@@ -54,6 +54,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler {
54 private static final String VERSION = "version"; 54 private static final String VERSION = "version";
55 private static final String CATEGORY = "category"; 55 private static final String CATEGORY = "category";
56 private static final String ORIGIN = "origin"; 56 private static final String ORIGIN = "origin";
57 + private static final String TITLE = "title";
57 private static final String DESC = "desc"; 58 private static final String DESC = "desc";
58 private static final String URL = "url"; 59 private static final String URL = "url";
59 private static final String README = "readme"; 60 private static final String README = "readme";
...@@ -66,7 +67,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { ...@@ -66,7 +67,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler {
66 private static final String ICON_ID_INACTIVE = "appInactive"; 67 private static final String ICON_ID_INACTIVE = "appInactive";
67 68
68 private static final String[] COL_IDS = { 69 private static final String[] COL_IDS = {
69 - STATE, STATE_IID, ID, ICON, VERSION, CATEGORY, ORIGIN, DESC, 70 + STATE, STATE_IID, ID, ICON, VERSION, CATEGORY, ORIGIN, TITLE, DESC,
70 URL, README, ROLE, REQUIRED_APPS, FEATURES, PERMISSIONS 71 URL, README, ROLE, REQUIRED_APPS, FEATURES, PERMISSIONS
71 }; 72 };
72 73
...@@ -118,6 +119,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { ...@@ -118,6 +119,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler {
118 .cell(VERSION, app.version()) 119 .cell(VERSION, app.version())
119 .cell(CATEGORY, app.category()) 120 .cell(CATEGORY, app.category())
120 .cell(ORIGIN, app.origin()) 121 .cell(ORIGIN, app.origin())
122 + .cell(TITLE, app.title())
121 .cell(DESC, app.description()) 123 .cell(DESC, app.description())
122 .cell(URL, app.url()); 124 .cell(URL, app.url());
123 } 125 }
...@@ -168,6 +170,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler { ...@@ -168,6 +170,7 @@ public class ApplicationViewMessageHandler extends UiMessageHandler {
168 data.put(VERSION, app.version().toString()); 170 data.put(VERSION, app.version().toString());
169 data.put(ROLE, app.role().toString()); 171 data.put(ROLE, app.role().toString());
170 data.put(CATEGORY, app.category()); 172 data.put(CATEGORY, app.category());
173 + data.put(TITLE, app.title());
171 data.put(ORIGIN, app.origin()); 174 data.put(ORIGIN, app.origin());
172 data.put(README, app.readme()); 175 data.put(README, app.readme());
173 data.put(DESC, app.description()); 176 data.put(DESC, app.description());
......