Improvements for XOS integration app

- Add a default value for the tenant provider service
  id and don't require callers to set it when creating
  a tenant.
- Add javadocs to the volt tenant object.

Change-Id: I1144820eb3e311cffc87ecefaccf689127730dcf
diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java
index d62cbde..9950c33 100644
--- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java
+++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/OnosXOSIntegrationManager.java
@@ -56,24 +56,39 @@
 @Component(immediate = true)
 @Service
 public class OnosXOSIntegrationManager implements VoltTenantService {
+    private static final String XOS_SERVER_ADDRESS_PROPERTY_NAME =
+            "xosServerAddress";
+    private static final String XOS_SERVER_PORT_PROPERTY_NAME =
+            "xosServerPort";
+    private static final String XOS_PROVIDER_SERVICE_PROPERTY_NAME =
+            "xosProviderService";
 
     private static final String TEST_XOS_SERVER_ADDRESS = "10.254.1.22";
     private static final int TEST_XOS_SERVER_PORT = 8000;
     private static final String XOS_TENANT_BASE_URI = "/xoslib/volttenant/";
+    private static final int TEST_XOS_PROVIDER_SERVICE = 1;
 
     private final Logger log = getLogger(getClass());
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected CoreService coreService;
     @Reference(cardinality = ReferenceCardinality.MANDATORY_UNARY)
     protected ComponentConfigService cfgService;
-    @Property(name = "XOSServerAddress",
+
+    @Property(name = XOS_SERVER_ADDRESS_PROPERTY_NAME,
               value = TEST_XOS_SERVER_ADDRESS,
               label = "XOS Server address")
     protected String xosServerAddress = TEST_XOS_SERVER_ADDRESS;
-    @Property(name = "XOSServerPort",
+
+    @Property(name = XOS_SERVER_PORT_PROPERTY_NAME,
               intValue = TEST_XOS_SERVER_PORT,
               label = "XOS Server port")
     protected int xosServerPort = TEST_XOS_SERVER_PORT;
+
+    @Property(name = XOS_PROVIDER_SERVICE_PROPERTY_NAME,
+            intValue = TEST_XOS_PROVIDER_SERVICE,
+            label = "XOS Provider Service")
+    protected int xosProviderService = TEST_XOS_PROVIDER_SERVICE;
+
     private ApplicationId appId;
 
     @Activate
@@ -244,7 +259,16 @@
 
     @Override
     public VoltTenant addTenant(VoltTenant newTenant) {
-        String json = tenantToJson(newTenant);
+        long providerServiceId = newTenant.providerService();
+        if (providerServiceId == -1) {
+            providerServiceId = xosProviderService;
+        }
+        VoltTenant tenantToCreate = VoltTenant.builder()
+                .withProviderService(providerServiceId)
+                .withServiceSpecificId(newTenant.serviceSpecificId())
+                .withVlanId(newTenant.vlanId())
+                .build();
+        String json = tenantToJson(tenantToCreate);
         postRest(json);
         return newTenant;
     }
@@ -268,16 +292,23 @@
     private void readComponentConfiguration(ComponentContext context) {
         Dictionary<?, ?> properties = context.getProperties();
 
-        String newXosServerAddress = Tools.get(properties, "XOSServerAddress");
+        String newXosServerAddress =
+                Tools.get(properties, XOS_SERVER_ADDRESS_PROPERTY_NAME);
         if (!isNullOrEmpty(newXosServerAddress)) {
             xosServerAddress = newXosServerAddress;
         }
 
-        String newXosServerPortString = Tools.get(properties, "XOSServerPort");
+        String newXosServerPortString =
+                Tools.get(properties, XOS_SERVER_PORT_PROPERTY_NAME);
         if (!isNullOrEmpty(newXosServerPortString)) {
             xosServerPort = Integer.parseInt(newXosServerPortString);
         }
-        log.info("XOS URL is now http://{}:{}", xosServerAddress, xosServerPort);
+
+        String newXosProviderServiceString =
+                Tools.get(properties, XOS_PROVIDER_SERVICE_PROPERTY_NAME);
+        if (!isNullOrEmpty(newXosProviderServiceString)) {
+            xosProviderService = Integer.parseInt(newXosProviderServiceString);
+        }
     }
 }
 
diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java
index e35a630..18b24e1 100644
--- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java
+++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/VoltTenant.java
@@ -15,7 +15,6 @@
  */
 package org.onosproject.xosintegration;
 
-
 import com.google.common.base.MoreObjects;
 
 public final class VoltTenant {
@@ -26,6 +25,15 @@
     private final String serviceSpecificId;
     private final String vlanId;
 
+    /**
+     * Constructs a vOLT tenant object.
+     *
+     * @param humanReadableName name string
+     * @param id identifier for the tenant
+     * @param providerService provider service ID
+     * @param serviceSpecificId id for the user
+     * @param vlanId vlan id for the user
+     */
     private VoltTenant(String humanReadableName, long id, long providerService,
                        String serviceSpecificId, String vlanId) {
         this.humanReadableName = humanReadableName;
@@ -35,62 +43,131 @@
         this.vlanId = vlanId;
     }
 
+    /**
+     * Fetches a builder to make a tenant.
+     *
+     * @return tenant builder
+     */
     public static Builder builder() {
         return new Builder();
     }
 
+    /**
+     * Fetches the name of the tenant.
+     *
+     * @return human readable name
+     */
     public String humanReadableName() {
         return humanReadableName;
     }
 
+    /**
+     * Fetches the ID of the tenant object.
+     *
+     * @return ID of tenant object.
+     */
     public long id() {
         return id;
     }
 
+    /**
+     * Fetches the identifier for the provider service.
+     *
+     * @return provider service ID
+     */
     public long providerService() {
         return providerService;
     }
 
+    /**
+     * Fetches the server specific ID (user id).
+     *
+     * @return server specific ID
+     */
     public String serviceSpecificId() {
         return serviceSpecificId;
     }
 
+    /**
+     * Fetches the vlan id for this tenant.
+     *
+     * @return VLAN ID
+     */
     public String vlanId() {
         return vlanId;
     }
 
+    /**
+     * Builder class to allow callers to assemble tenants.
+     */
+
     public static final class Builder {
         private String humanReadableName = "unknown";
         private long id = 0;
-        private long providerService = 0;
+        private long providerService = -1;
         private String serviceSpecificId = "unknown";
         private String vlanId = "unknown";
 
+        /**
+         * Sets the name string for the tenant.
+         *
+         * @param humanReadableName name
+         * @return self
+         */
         public Builder withHumanReadableName(String humanReadableName) {
             this.humanReadableName = humanReadableName;
             return this;
         }
 
+        /**
+         * Sets the identifier for the tenant.
+         *
+         * @param id identifier for the tenant
+         * @return self
+         */
         public Builder withId(long id) {
             this.id = id;
             return this;
         }
 
-        public Builder withProviderService(long providerService) {
-            this.providerService = providerService;
-            return this;
-        }
-
+        /**
+         * Sets the server specific id (user id) for the tenant.
+         *
+         * @param serviceSpecificId server specific (user) id
+         * @return self
+         */
         public Builder withServiceSpecificId(String serviceSpecificId) {
             this.serviceSpecificId = serviceSpecificId;
             return this;
         }
 
+        /**
+         * Sets the VLAN ID for the tenant.
+         *
+         * @param vlanId VLAN ID
+         * @return self
+         */
         public Builder withVlanId(String vlanId) {
             this.vlanId = vlanId;
             return this;
         }
 
+        /**
+         * Sets the provider service ID.
+         *
+         * @param providerService provider service ID
+         * @return self
+         */
+        public Builder withProviderService(long providerService) {
+            this.providerService = providerService;
+            return this;
+        }
+
+        /**
+         * Constructs a VoltTenant from the assembled data.
+         *
+         * @return constructed tenant object
+         */
         public VoltTenant build() {
             return new VoltTenant(humanReadableName, id, providerService,
                     serviceSpecificId, vlanId);
diff --git a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java
index 76605df..611446d 100644
--- a/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java
+++ b/apps/xos-integration/src/main/java/org/onosproject/xosintegration/cli/VoltTenantsCreateCommand.java
@@ -27,17 +27,13 @@
 @Command(scope = "onos", name = "add-tenant",
         description = "Lists the inventory of VOLT tenants and their contents")
 public class VoltTenantsCreateCommand extends AbstractShellCommand {
-    @Argument(index = 0, name = "provider service",
-            description = "Tenant ID",
-            required = true, multiValued = false)
-    long providerService;
 
-    @Argument(index = 1, name = "service specific ID",
+    @Argument(index = 0, name = "service specific ID",
             description = "service specific ID",
             required = true, multiValued = false)
     String serviceSpecificId;
 
-    @Argument(index = 2, name = "vlan ID",
+    @Argument(index = 1, name = "vlan ID",
             description = "vlan ID",
             required = true, multiValued = false)
     String vlanId;
@@ -47,7 +43,6 @@
         VoltTenantService service = get(VoltTenantService.class);
 
         VoltTenant newTenant = VoltTenant.builder()
-                .withProviderService(providerService)
                 .withServiceSpecificId(serviceSpecificId)
                 .withVlanId(vlanId)
                 .build();