CORD Subscriber GUI - Plumbed through the parameter change per function per user.

Change-Id: I9b8eb677f606fd75f70366cec7f5b4993d188ab1
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
index 199c8d3..622d0e3 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/Bundle.java
@@ -19,7 +19,8 @@
 
 import com.google.common.collect.ImmutableSet;
 
-import java.util.HashSet;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.Set;
 
 /**
@@ -27,7 +28,8 @@
  */
 public class Bundle {
     private final BundleDescriptor bundleDescriptor;
-    private final Set<XosFunction> functions;
+    private final Map<XosFunctionDescriptor, XosFunction> functionMap =
+        new HashMap<XosFunctionDescriptor, XosFunction>();
 
     /**
      * Constructs a new bundle instance.
@@ -36,7 +38,7 @@
      */
     public Bundle(BundleDescriptor bundleDescriptor) {
         this.bundleDescriptor = bundleDescriptor;
-        this.functions = initFunctions();
+        initFunctions();
     }
 
     /**
@@ -54,20 +56,16 @@
      * @return the functions
      */
     public Set<XosFunction> functions() {
-        return ImmutableSet.copyOf(functions);
+        return ImmutableSet.copyOf(functionMap.values());
     }
 
     /**
      * Creates an initial set of function instances.
-     *
-     * @return initial function instances
      */
-    private Set<XosFunction> initFunctions() {
-        Set<XosFunction> funcs = new HashSet<XosFunction>();
+    private void initFunctions() {
         for (XosFunctionDescriptor xfd: bundleDescriptor.functions()) {
-            funcs.add(createFunction(xfd));
+            functionMap.put(xfd, createFunction(xfd));
         }
-        return funcs;
     }
 
     private XosFunction createFunction(XosFunctionDescriptor xfd) {
@@ -83,4 +81,15 @@
         }
         return func;
     }
+
+    /**
+     * Returns the function instance for the specified descriptor, or returns
+     * null if function is not part of this bundle.
+     *
+     * @param xfd function descrriptor
+     * @return function instance
+     */
+    public XosFunction findFunction(XosFunctionDescriptor xfd) {
+        return functionMap.get(xfd);
+    }
 }
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
index a4787a1..d1f8483 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/UrlFilterFunction.java
@@ -19,6 +19,8 @@
 
 import com.fasterxml.jackson.databind.node.ObjectNode;
 
+import static com.google.common.base.Preconditions.checkNotNull;
+
 /**
  * Specialization of XosFunction for URL filtering.
  */
@@ -41,6 +43,18 @@
     }
 
     @Override
+    public void applyParam(SubscriberUser user, String param, String value) {
+        Memento memo = user.getMemento(descriptor());
+        checkNotNull(memo, "missing memento for " + descriptor());
+        UrlFilterMemento ufMemo = (UrlFilterMemento) memo;
+
+        if (LEVEL.equals(param)) {
+            Level newLevel = Level.valueOf(value.toUpperCase());
+            ufMemo.setLevel(newLevel);
+        }
+    }
+
+    @Override
     public Memento createMemento() {
         return new UrlFilterMemento();
     }
diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
index 93ed831..991b72b 100644
--- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
@@ -58,20 +58,6 @@
     }
 
     /**
-     * Applies a parameter change for the given function, in the context of
-     * the specified user.
-     *
-     * @param xfd function context
-     * @param userId user identifier
-     * @param param parameter name
-     * @param value value to apply
-     */
-    public static void apply(XosFunctionDescriptor xfd, int userId,
-                             String param, String value) {
-        // TODO:
-    }
-
-    /**
      * Creates an object node representation of the profile for the
      * specified user.
      *