Add some javadoc to ServiceConfig.
diff --git a/containers-api/src/main/java/org/apache/aries/containers/ServiceConfig.java b/containers-api/src/main/java/org/apache/aries/containers/ServiceConfig.java
index fe38e50..c7a91ab 100644
--- a/containers-api/src/main/java/org/apache/aries/containers/ServiceConfig.java
+++ b/containers-api/src/main/java/org/apache/aries/containers/ServiceConfig.java
@@ -19,12 +19,22 @@
 package org.apache.aries.containers;
 
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
 import org.osgi.annotation.versioning.ProviderType;
 
+/**
+ * This class defines a service and it's settings. An instance is created via the
+ * {@link Builder} and is immutable. For example to create a service for the Apache
+ * Web Server docker image:
+ * <pre>
+ * ServiceConfig sc = ServiceConfig.builder("myservice", "httpd").
+ *   cpu(0.5).memory(64).port(80).build();
+ * </pre>
+ */
 @ProviderType
 public class ServiceConfig {
     private final String[] commandLine;
@@ -38,49 +48,74 @@
     private final double requestedMemory; // in MiB
     private final String serviceName;
 
-
     private ServiceConfig(String[] commandLine, String containerImage, List<Integer> containerPorts, String entryPoint,
             Map<String, String> envVars, double requestedCPUunits, int requestedInstances, double requestedMemory,
             String serviceName) {
         this.commandLine = commandLine;
         this.containerImage = containerImage;
-        this.containerPorts = containerPorts;
+        this.containerPorts = Collections.unmodifiableList(containerPorts);
         this.entryPoint = entryPoint;
-        this.envVars = envVars;
+        this.envVars = Collections.unmodifiableMap(envVars);
         this.requestedCPUunits = requestedCPUunits;
         this.requestedInstances = requestedInstances;
         this.requestedMemory = requestedMemory;
         this.serviceName = serviceName;
     }
 
+    /**
+     * @return The command line to be used by the container. See also {@link #getEntryPoint()}.
+     */
     public String[] getCommandLine() {
-        return commandLine;
+        return commandLine.clone();
     }
 
+    /**
+     * @return The name of the container image.
+     */
     public String getContainerImage() {
         return containerImage;
     }
 
+    /**
+     * @return A list of the ports exposed externally.
+     */
     public List<Integer> getContainerPorts() {
         return containerPorts;
     }
 
+    /**
+     * @return The entry point to be used with the image. Together with the {@link #getCommandLine()}
+     * this defines the process run in the image.
+     */
     public String getEntryPoint() {
         return entryPoint;
     }
 
+    /**
+     * @return A map containing all the environment variables to be set.
+     */
     public Map<String, String> getEnvVars() {
         return envVars;
     }
 
+    /**
+     * @return The cpu units required for each container running this service.
+     */
     public double getRequestedCpuUnits() {
         return requestedCPUunits;
     }
 
+    /**
+     * @return The number of replica containers requested for the service.
+     */
     public int getRequestedInstances() {
         return requestedInstances;
     }
 
+    /**
+     * @return The amount of memory require for each container running the service.
+     * Specified in million bytes (MiB).
+     */
     public double getRequestedMemory() {
         return requestedMemory;
     }
@@ -93,10 +128,19 @@
         return serviceName;
     }
 
+    /**
+     * Obtain a service configuration builder.
+     * @param serviceName The name for the service. This name should be unique in the
+     * deployment, should be alphanum only and should not exceed 32 characters.
+     * @param containerImage The container image to use. When using docker, this is
+     * the docker image that should be used.
+     * @return A service configuration builder
+     */
     public static Builder builder(String serviceName, String containerImage) {
         return new Builder(serviceName, containerImage);
     }
 
+    /** A builder for service configurations */
     @ProviderType
     public static class Builder {
         private String containerImage;
@@ -114,47 +158,107 @@
             this.containerImage = containerImage;
         }
 
+        /** The command line for the service. Also note that some images may need
+         * an {@link #entryPoint(String)} specified in order to change behaviour.
+         *
+         * @param commandLine The command line to use.
+         * @return the current builder for further building.
+         */
         public Builder commandLine(String ... commandLine) {
             this.commandLine = commandLine;
             return this;
         }
 
+        /**
+         * The requested CPU for the service.
+         *
+         * @param requestedCpuUnits The requested CPU in CPU fractional units.
+         * @return the current builder for further building.
+         */
         public Builder cpu(double requestedCpuUnits) {
             this.requestedCpuUnits = requestedCpuUnits;
             return this;
         }
 
+        /**
+         * The entrypoint to use. Effectively the entrypoint together with the
+         * commandline defines the process launched by the container.
+         *
+         * @param entryPoint The entry point to use.
+         * @return the current builder for further building.
+         */
         public Builder entryPoint(String entryPoint) {
             this.entryPoint = entryPoint;
             return this;
         }
 
+        /**
+         * Specify an environment variable. The variable is added to previously
+         * specified environment variables and this builder method can be called
+         * multiple times.
+         *
+         * @param name The variable name.
+         * @param value The variable value.
+         * @return the current builder for further building.
+         */
         public Builder env(String name, String value) {
             this.envMap.put(name, value);
             return this;
         }
 
+        /**
+         * Set the environment variables to the provided map. This will replace
+         * any previously specified environment variables.
+         *
+         * @param envMap The map of environment variables.
+         * @return the current builder for further building.
+         */
         public Builder env(Map<String, String> envMap) {
             this.envMap.clear();
             this.envMap.putAll(envMap);
             return this;
         }
 
+        /**
+         * Specify the number of container instances required for this service.
+         * The container will be deployed as many times as specified here.
+         *
+         * @param requestedInstances The number of required instances.
+         * @return the current builder for further building.
+         */
         public Builder instances(int requestedInstances) {
             this.requestedInstances = requestedInstances;
             return this;
         }
 
+        /**
+         * Specify the required amount of memory in million bytes (MiB).
+         *
+         * @param requestedMemory The amount of memory required of a container.
+         * @return the current builder for further building.
+         */
         public Builder memory(double requestedMemory) {
             this.requestedMemory = requestedMemory;
             return this;
         }
 
+        /**
+         * Specify an external port to be exposed by the container. When a container
+         * exposes multiple ports, call this builder method multiple times.
+         *
+         * @param port The port to be exposed externally.
+         * @return the current builder for further building.
+         */
         public Builder port(int port) {
             this.ports.add(port);
             return this;
         }
 
+        /**
+         * Build the configuration from the information gathered in the builder.
+         *
+         * @return An immutable service configuration.
+         */
         public ServiceConfig build() {
             return new ServiceConfig(commandLine, containerImage, ports, entryPoint,
                     envMap, requestedCpuUnits, requestedInstances, requestedMemory,