CORD Subscriber GUI -- More bundle wrangling.

Change-Id: I2fafdb281712d7747399d61611c3d4bb663a39b5
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
new file mode 100644
index 0000000..ea9ec35
--- /dev/null
+++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/model/XosFunctionFactory.java
@@ -0,0 +1,86 @@
+package org.onosproject.cord.gui.model;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.node.ArrayNode;
+import com.fasterxml.jackson.databind.node.ObjectNode;
+
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * Utility factory for operating on XOS functions.
+ */
+public class XosFunctionFactory extends JsonFactory {
+
+    private static final String DESC = "desc";
+    private static final String PARAMS = "params";
+
+    private static final String LEVEL = "level";
+    private static final String LEVELS = "levels";
+
+
+    // URL Filtering Levels...
+    private static final String PG = "PG";
+    private static final String PG13 = "PG-13";
+    private static final String R = "R";
+
+    private static final String[] FILTER_LEVELS = { PG, PG13, R };
+    private static final String DEFAULT_FILTER_LEVEL = PG;
+
+
+    // no instantiation
+    private XosFunctionFactory() {}
+
+    /**
+     * Produces the JSON representation of the given XOS function descriptor.
+     *
+     * @param xfd function descriptor
+     * @return JSON encoding
+     */
+    public static ObjectNode toObjectNode(XosFunctionDescriptor xfd) {
+        ObjectNode root = objectNode()
+                .put(ID, xfd.id())
+                .put(NAME, xfd.displayName())
+                .put(DESC, xfd.description());
+        root.set(PARAMS, paramsForXfd(xfd));
+        return root;
+    }
+
+    private static JsonNode paramsForXfd(XosFunctionDescriptor xfd) {
+        ParamStructFactory psf = PARAM_MAP.get(xfd);
+        if (psf == null) {
+            psf = DEF_PARAMS;
+        }
+        return psf.params();
+    }
+
+    // ==== handling different parameter structures...
+    private static final Map<XosFunctionDescriptor, ParamStructFactory>
+        PARAM_MAP = new HashMap<XosFunctionDescriptor, ParamStructFactory>();
+
+    private static final ParamStructFactory DEF_PARAMS = new ParamStructFactory();
+    static {
+        PARAM_MAP.put(XosFunctionDescriptor.URL_FILTER, new UrlFilterParams());
+    }
+
+    // private parameter structure creator
+    static class ParamStructFactory {
+        ObjectNode params() {
+            return objectNode();
+        }
+    }
+
+    static class UrlFilterParams extends ParamStructFactory {
+        @Override
+        ObjectNode params() {
+            ObjectNode result = objectNode();
+            result.put(LEVEL, DEFAULT_FILTER_LEVEL);
+            ArrayNode levels = arrayNode();
+            for (String lvl: FILTER_LEVELS) {
+                levels.add(lvl);
+            }
+            result.set(LEVELS, levels);
+            return result;
+        }
+    }
+}