CORD Subscriber GUI - Plumbed through the parameter change per function per user.
Change-Id: I9b8eb677f606fd75f70366cec7f5b4993d188ab1
Showing
5 changed files
with
85 additions
and
38 deletions
... | @@ -28,10 +28,12 @@ import org.onosproject.cord.gui.model.SubscriberUser; | ... | @@ -28,10 +28,12 @@ import org.onosproject.cord.gui.model.SubscriberUser; |
28 | import org.onosproject.cord.gui.model.UserFactory; | 28 | import org.onosproject.cord.gui.model.UserFactory; |
29 | import org.onosproject.cord.gui.model.XosFunction; | 29 | import org.onosproject.cord.gui.model.XosFunction; |
30 | import org.onosproject.cord.gui.model.XosFunctionDescriptor; | 30 | import org.onosproject.cord.gui.model.XosFunctionDescriptor; |
31 | -import org.onosproject.cord.gui.model.XosFunctionFactory; | ||
32 | 31 | ||
33 | -import java.util.ArrayList; | ||
34 | import java.util.List; | 32 | import java.util.List; |
33 | +import java.util.Map; | ||
34 | +import java.util.TreeMap; | ||
35 | + | ||
36 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
35 | 37 | ||
36 | /** | 38 | /** |
37 | * In memory cache of the model of the subscriber's account. | 39 | * In memory cache of the model of the subscriber's account. |
... | @@ -50,14 +52,16 @@ public class CordModelCache extends JsonFactory { | ... | @@ -50,14 +52,16 @@ public class CordModelCache extends JsonFactory { |
50 | private static final String MAC_4 = "010203040509"; | 52 | private static final String MAC_4 = "010203040509"; |
51 | 53 | ||
52 | private Bundle currentBundle; | 54 | private Bundle currentBundle; |
53 | - private final List<SubscriberUser> users; | 55 | + |
56 | + // NOTE: use a tree map to maintain sorted order by user ID | ||
57 | + private final Map<Integer, SubscriberUser> userMap = | ||
58 | + new TreeMap<Integer, SubscriberUser>(); | ||
54 | 59 | ||
55 | /** | 60 | /** |
56 | * Constructs a model cache, initializing it with basic bundle. | 61 | * Constructs a model cache, initializing it with basic bundle. |
57 | */ | 62 | */ |
58 | CordModelCache() { | 63 | CordModelCache() { |
59 | currentBundle = new Bundle(BundleFactory.BASIC_BUNDLE); | 64 | currentBundle = new Bundle(BundleFactory.BASIC_BUNDLE); |
60 | - users = new ArrayList<SubscriberUser>(); | ||
61 | initUsers(); | 65 | initUsers(); |
62 | } | 66 | } |
63 | 67 | ||
... | @@ -65,10 +69,10 @@ public class CordModelCache extends JsonFactory { | ... | @@ -65,10 +69,10 @@ public class CordModelCache extends JsonFactory { |
65 | * Used to initialize users for the demo. These are currently fake. | 69 | * Used to initialize users for the demo. These are currently fake. |
66 | */ | 70 | */ |
67 | public void initUsers() { | 71 | public void initUsers() { |
68 | - users.add(createUser(1, "Mom's MacBook", MAC_1)); | 72 | + userMap.put(1, createUser(1, "Mom's MacBook", MAC_1)); |
69 | - users.add(createUser(2, "Dad's iPad", MAC_2)); | 73 | + userMap.put(2, createUser(2, "Dad's iPad", MAC_2)); |
70 | - users.add(createUser(3, "Dick's laptop", MAC_3)); | 74 | + userMap.put(3, createUser(3, "Dick's laptop", MAC_3)); |
71 | - users.add(createUser(4, "Jane's laptop", MAC_4)); | 75 | + userMap.put(4, createUser(4, "Jane's laptop", MAC_4)); |
72 | } | 76 | } |
73 | 77 | ||
74 | private SubscriberUser createUser(int uid, String name, String mac) { | 78 | private SubscriberUser createUser(int uid, String name, String mac) { |
... | @@ -79,7 +83,6 @@ public class CordModelCache extends JsonFactory { | ... | @@ -79,7 +83,6 @@ public class CordModelCache extends JsonFactory { |
79 | return user; | 83 | return user; |
80 | } | 84 | } |
81 | 85 | ||
82 | - | ||
83 | /** | 86 | /** |
84 | * Returns the currently selected bundle. | 87 | * Returns the currently selected bundle. |
85 | * | 88 | * |
... | @@ -99,7 +102,7 @@ public class CordModelCache extends JsonFactory { | ... | @@ -99,7 +102,7 @@ public class CordModelCache extends JsonFactory { |
99 | BundleDescriptor bd = BundleFactory.bundleFromId(bundleId); | 102 | BundleDescriptor bd = BundleFactory.bundleFromId(bundleId); |
100 | currentBundle = new Bundle(bd); | 103 | currentBundle = new Bundle(bd); |
101 | // update the user mementos | 104 | // update the user mementos |
102 | - for (SubscriberUser user: users) { | 105 | + for (SubscriberUser user: userMap.values()) { |
103 | user.clearMementos(); | 106 | user.clearMementos(); |
104 | for (XosFunction f: currentBundle.functions()) { | 107 | for (XosFunction f: currentBundle.functions()) { |
105 | user.setMemento(f.descriptor(), f.createMemento()); | 108 | user.setMemento(f.descriptor(), f.createMemento()); |
... | @@ -116,7 +119,7 @@ public class CordModelCache extends JsonFactory { | ... | @@ -116,7 +119,7 @@ public class CordModelCache extends JsonFactory { |
116 | * @return the list of users | 119 | * @return the list of users |
117 | */ | 120 | */ |
118 | public List<SubscriberUser> getUsers() { | 121 | public List<SubscriberUser> getUsers() { |
119 | - return ImmutableList.copyOf(users); | 122 | + return ImmutableList.copyOf(userMap.values()); |
120 | } | 123 | } |
121 | 124 | ||
122 | /** | 125 | /** |
... | @@ -129,18 +132,25 @@ public class CordModelCache extends JsonFactory { | ... | @@ -129,18 +132,25 @@ public class CordModelCache extends JsonFactory { |
129 | */ | 132 | */ |
130 | public void applyPerUserParam(String userId, String funcId, | 133 | public void applyPerUserParam(String userId, String funcId, |
131 | String param, String value) { | 134 | String param, String value) { |
132 | - // FIXME: this is not right yet... | 135 | + |
133 | int uid = Integer.parseInt(userId); | 136 | int uid = Integer.parseInt(userId); |
137 | + SubscriberUser user = userMap.get(uid); | ||
138 | + checkNotNull(user, "unknown user id: " + uid); | ||
139 | + | ||
134 | XosFunctionDescriptor xfd = | 140 | XosFunctionDescriptor xfd = |
135 | XosFunctionDescriptor.valueOf(funcId.toUpperCase()); | 141 | XosFunctionDescriptor.valueOf(funcId.toUpperCase()); |
136 | - XosFunctionFactory.apply(xfd, uid, param, value); | 142 | + |
143 | + XosFunction func = currentBundle.findFunction(xfd); | ||
144 | + checkNotNull(func, "function not part of bundle: " + funcId); | ||
145 | + | ||
146 | + func.applyParam(user, param, value); | ||
137 | } | 147 | } |
138 | 148 | ||
139 | // ============= | 149 | // ============= |
140 | 150 | ||
141 | private ArrayNode userJsonArray() { | 151 | private ArrayNode userJsonArray() { |
142 | ArrayNode userList = arrayNode(); | 152 | ArrayNode userList = arrayNode(); |
143 | - for (SubscriberUser user: users) { | 153 | + for (SubscriberUser user: userMap.values()) { |
144 | userList.add(UserFactory.toObjectNode(user)); | 154 | userList.add(UserFactory.toObjectNode(user)); |
145 | } | 155 | } |
146 | return userList; | 156 | return userList; | ... | ... |
... | @@ -19,7 +19,8 @@ package org.onosproject.cord.gui.model; | ... | @@ -19,7 +19,8 @@ package org.onosproject.cord.gui.model; |
19 | 19 | ||
20 | import com.google.common.collect.ImmutableSet; | 20 | import com.google.common.collect.ImmutableSet; |
21 | 21 | ||
22 | -import java.util.HashSet; | 22 | +import java.util.HashMap; |
23 | +import java.util.Map; | ||
23 | import java.util.Set; | 24 | import java.util.Set; |
24 | 25 | ||
25 | /** | 26 | /** |
... | @@ -27,7 +28,8 @@ import java.util.Set; | ... | @@ -27,7 +28,8 @@ import java.util.Set; |
27 | */ | 28 | */ |
28 | public class Bundle { | 29 | public class Bundle { |
29 | private final BundleDescriptor bundleDescriptor; | 30 | private final BundleDescriptor bundleDescriptor; |
30 | - private final Set<XosFunction> functions; | 31 | + private final Map<XosFunctionDescriptor, XosFunction> functionMap = |
32 | + new HashMap<XosFunctionDescriptor, XosFunction>(); | ||
31 | 33 | ||
32 | /** | 34 | /** |
33 | * Constructs a new bundle instance. | 35 | * Constructs a new bundle instance. |
... | @@ -36,7 +38,7 @@ public class Bundle { | ... | @@ -36,7 +38,7 @@ public class Bundle { |
36 | */ | 38 | */ |
37 | public Bundle(BundleDescriptor bundleDescriptor) { | 39 | public Bundle(BundleDescriptor bundleDescriptor) { |
38 | this.bundleDescriptor = bundleDescriptor; | 40 | this.bundleDescriptor = bundleDescriptor; |
39 | - this.functions = initFunctions(); | 41 | + initFunctions(); |
40 | } | 42 | } |
41 | 43 | ||
42 | /** | 44 | /** |
... | @@ -54,20 +56,16 @@ public class Bundle { | ... | @@ -54,20 +56,16 @@ public class Bundle { |
54 | * @return the functions | 56 | * @return the functions |
55 | */ | 57 | */ |
56 | public Set<XosFunction> functions() { | 58 | public Set<XosFunction> functions() { |
57 | - return ImmutableSet.copyOf(functions); | 59 | + return ImmutableSet.copyOf(functionMap.values()); |
58 | } | 60 | } |
59 | 61 | ||
60 | /** | 62 | /** |
61 | * Creates an initial set of function instances. | 63 | * Creates an initial set of function instances. |
62 | - * | ||
63 | - * @return initial function instances | ||
64 | */ | 64 | */ |
65 | - private Set<XosFunction> initFunctions() { | 65 | + private void initFunctions() { |
66 | - Set<XosFunction> funcs = new HashSet<XosFunction>(); | ||
67 | for (XosFunctionDescriptor xfd: bundleDescriptor.functions()) { | 66 | for (XosFunctionDescriptor xfd: bundleDescriptor.functions()) { |
68 | - funcs.add(createFunction(xfd)); | 67 | + functionMap.put(xfd, createFunction(xfd)); |
69 | } | 68 | } |
70 | - return funcs; | ||
71 | } | 69 | } |
72 | 70 | ||
73 | private XosFunction createFunction(XosFunctionDescriptor xfd) { | 71 | private XosFunction createFunction(XosFunctionDescriptor xfd) { |
... | @@ -83,4 +81,15 @@ public class Bundle { | ... | @@ -83,4 +81,15 @@ public class Bundle { |
83 | } | 81 | } |
84 | return func; | 82 | return func; |
85 | } | 83 | } |
84 | + | ||
85 | + /** | ||
86 | + * Returns the function instance for the specified descriptor, or returns | ||
87 | + * null if function is not part of this bundle. | ||
88 | + * | ||
89 | + * @param xfd function descrriptor | ||
90 | + * @return function instance | ||
91 | + */ | ||
92 | + public XosFunction findFunction(XosFunctionDescriptor xfd) { | ||
93 | + return functionMap.get(xfd); | ||
94 | + } | ||
86 | } | 95 | } | ... | ... |
... | @@ -19,6 +19,8 @@ package org.onosproject.cord.gui.model; | ... | @@ -19,6 +19,8 @@ package org.onosproject.cord.gui.model; |
19 | 19 | ||
20 | import com.fasterxml.jackson.databind.node.ObjectNode; | 20 | import com.fasterxml.jackson.databind.node.ObjectNode; |
21 | 21 | ||
22 | +import static com.google.common.base.Preconditions.checkNotNull; | ||
23 | + | ||
22 | /** | 24 | /** |
23 | * Specialization of XosFunction for URL filtering. | 25 | * Specialization of XosFunction for URL filtering. |
24 | */ | 26 | */ |
... | @@ -41,6 +43,18 @@ public class UrlFilterFunction extends DefaultXosFunction { | ... | @@ -41,6 +43,18 @@ public class UrlFilterFunction extends DefaultXosFunction { |
41 | } | 43 | } |
42 | 44 | ||
43 | @Override | 45 | @Override |
46 | + public void applyParam(SubscriberUser user, String param, String value) { | ||
47 | + Memento memo = user.getMemento(descriptor()); | ||
48 | + checkNotNull(memo, "missing memento for " + descriptor()); | ||
49 | + UrlFilterMemento ufMemo = (UrlFilterMemento) memo; | ||
50 | + | ||
51 | + if (LEVEL.equals(param)) { | ||
52 | + Level newLevel = Level.valueOf(value.toUpperCase()); | ||
53 | + ufMemo.setLevel(newLevel); | ||
54 | + } | ||
55 | + } | ||
56 | + | ||
57 | + @Override | ||
44 | public Memento createMemento() { | 58 | public Memento createMemento() { |
45 | return new UrlFilterMemento(); | 59 | return new UrlFilterMemento(); |
46 | } | 60 | } | ... | ... |
... | @@ -58,20 +58,6 @@ public class XosFunctionFactory extends JsonFactory { | ... | @@ -58,20 +58,6 @@ public class XosFunctionFactory extends JsonFactory { |
58 | } | 58 | } |
59 | 59 | ||
60 | /** | 60 | /** |
61 | - * Applies a parameter change for the given function, in the context of | ||
62 | - * the specified user. | ||
63 | - * | ||
64 | - * @param xfd function context | ||
65 | - * @param userId user identifier | ||
66 | - * @param param parameter name | ||
67 | - * @param value value to apply | ||
68 | - */ | ||
69 | - public static void apply(XosFunctionDescriptor xfd, int userId, | ||
70 | - String param, String value) { | ||
71 | - // TODO: | ||
72 | - } | ||
73 | - | ||
74 | - /** | ||
75 | * Creates an object node representation of the profile for the | 61 | * Creates an object node representation of the profile for the |
76 | * specified user. | 62 | * specified user. |
77 | * | 63 | * | ... | ... |
... | @@ -91,8 +91,36 @@ public class CoreModelCacheTest { | ... | @@ -91,8 +91,36 @@ public class CoreModelCacheTest { |
91 | assertTrue("bad users family json", sameJson(USERS_FAMILY, json)); | 91 | assertTrue("bad users family json", sameJson(USERS_FAMILY, json)); |
92 | } | 92 | } |
93 | 93 | ||
94 | + @Test | ||
95 | + public void setNewLevel() { | ||
96 | + cache.setCurrentBundle("family"); | ||
97 | + JsonNode node = fromString(cache.jsonUsers()); | ||
98 | + assertEquals("wrong level", "PG", getMomsLevel(node)); | ||
99 | + | ||
100 | + cache.applyPerUserParam("1", "url_filter", "level", "R"); | ||
101 | + | ||
102 | + node = fromString(cache.jsonUsers()); | ||
103 | + assertEquals("wrong level", "R", getMomsLevel(node)); | ||
104 | + } | ||
105 | + | ||
106 | + private String getMomsLevel(JsonNode node) { | ||
107 | + JsonNode mom = node.get("users").elements().next(); | ||
108 | + assertEquals("wrong ID", 1, mom.get("id").asInt()); | ||
109 | + return mom.get("profile").get("url_filter").get("level").asText(); | ||
110 | + } | ||
111 | + | ||
112 | + | ||
94 | // ============= | 113 | // ============= |
95 | 114 | ||
115 | + private JsonNode fromString(String s) { | ||
116 | + try { | ||
117 | + return MAPPER.readTree(s); | ||
118 | + } catch (IOException e) { | ||
119 | + System.out.println("Exception: " + e); | ||
120 | + } | ||
121 | + return null; | ||
122 | + } | ||
123 | + | ||
96 | private boolean sameJson(String s1, String s2) { | 124 | private boolean sameJson(String s1, String s2) { |
97 | try { | 125 | try { |
98 | JsonNode tree1 = MAPPER.readTree(s1); | 126 | JsonNode tree1 = MAPPER.readTree(s1); | ... | ... |
-
Please register or login to post a comment