diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordModelCache.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordModelCache.java index eeb8e17092..9b787abba8 100644 --- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordModelCache.java +++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordModelCache.java @@ -32,6 +32,8 @@ import org.onosproject.cord.gui.model.XosFunctionDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.TreeMap; @@ -44,12 +46,28 @@ import static org.onosproject.cord.gui.model.XosFunctionDescriptor.URL_FILTER; */ public class CordModelCache extends JsonFactory { + private static final String KEY_SSID_MAP = "ssidmap"; + // FIXME: should not be a colon in the key..... Scott to fix on XOS + private static final String KEY_SSID = "service_specific_id:"; + private static final String KEY_SUB_ID = "subscriber_id"; + + private static final int DEMO_SSID = 1234; + + private static final String EMAIL_0 = "john@smith.org"; + private static final String EMAIL_1 = "john@doe.org"; + + private static final String EMAIL = "email"; + private static final String SSID = "ssid"; + private static final String SUB_ID = "subId"; + private static final String BUNDLE = "bundle"; private static final String USERS = "users"; - private static final String SUB_ID = "subId"; private static final String LEVEL = "level"; + private static final Map LOOKUP = new HashMap<>(); + private int subscriberId; + private int ssid; private Bundle currentBundle; private final Logger log = LoggerFactory.getLogger(getClass()); @@ -59,18 +77,76 @@ public class CordModelCache extends JsonFactory { new TreeMap(); /** - * Constructs a model cache, (retrieving demo subscriber ID), - * initializing it with basic bundle, and fetching the list of users. + * Constructs a model cache, retrieving a mapping of SSID to XOS Subscriber + * IDs from the XOS server. */ CordModelCache() { log.info("Initialize model cache"); - subscriberId = XosManager.INSTANCE.initXosSubscriber(); + ObjectNode map = XosManager.INSTANCE.initXosSubscriberLookups(); + initLookupMap(map); + log.info("{} entries in SSID->SubID lookup map", LOOKUP.size()); + } + + private void initLookupMap(ObjectNode map) { + ArrayNode array = (ArrayNode) map.get(KEY_SSID_MAP); + Iterator iter = array.elements(); + while (iter.hasNext()) { + ObjectNode node = (ObjectNode) iter.next(); + String ssidStr = node.get(KEY_SSID).asText(); + int ssid = Integer.valueOf(ssidStr); + int subId = node.get(KEY_SUB_ID).asInt(); + LOOKUP.put(ssid, subId); + log.info("... binding SSID {} to sub-id {}", ssid, subId); + } + } + + private int lookupSubId(int ssid) { + Integer subId = LOOKUP.get(ssid); + if (subId == null) { + log.error("Unmapped SSID: {}", ssid); + return 0; + } + return subId; + } + + /** + * Initializes the model for the subscriber account associated with + * the given email address. + * + * @param email the email address + */ + void init(String email) { + // defaults to the demo account + int ssid = DEMO_SSID; + + // obviously not scalable, but good enough for demo code... + if (EMAIL_0.equals(email)) { + ssid = 0; + } else if (EMAIL_1.equals(email)) { + ssid = 1; + } + + this.ssid = ssid; + subscriberId = lookupSubId(ssid); + XosManager.INSTANCE.setXosUtilsForSubscriber(subscriberId); + + // if we are using the demo account, tell XOS to reset it... + if (ssid == DEMO_SSID) { + XosManager.INSTANCE.initDemoSubscriber(); + } + + // NOTE: I think the following should work for non-DEMO account... currentBundle = new Bundle(BundleFactory.BASIC_BUNDLE); initUsers(); } private void initUsers() { ArrayNode users = XosManager.INSTANCE.getUserList(); + if (users == null) { + log.warn("no user list for SSID {} (subid {})", ssid, subscriberId); + return; + } + for (JsonNode u: users) { ObjectNode user = (ObjectNode) u; @@ -194,6 +270,25 @@ public class CordModelCache extends JsonFactory { private void addSubId(ObjectNode root) { root.put(SUB_ID, subscriberId); + root.put(SSID, ssid); + } + + + /** + * Returns response JSON for login request. + *

+ * Depending on which email is used, will bind the GUI to the + * appropriate XOS Subscriber ID. + * + * @param email the supplied email + * @return JSON acknowledgement + */ + public String jsonLogin(String email) { + init(email); + ObjectNode root = objectNode(); + root.put(EMAIL, email); + addSubId(root); + return root.toString(); } /** diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordWebResource.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordWebResource.java index 0a27290ed6..ab3f3116c6 100644 --- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordWebResource.java +++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/CordWebResource.java @@ -52,6 +52,13 @@ public class CordWebResource { // =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + @GET + @Produces(MediaType.APPLICATION_JSON) + @Path("login/{email}") + public Response login(@PathParam("email") String email) { + return Response.ok(CordModelCache.INSTANCE.jsonLogin(email)).build(); + } + @GET @Produces(MediaType.APPLICATION_JSON) @Path("bundle/{id}") diff --git a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/XosManager.java b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/XosManager.java index d6bc2d4458..de0ae67d01 100644 --- a/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/XosManager.java +++ b/apps/demo/cord-gui/src/main/java/org/onosproject/cord/gui/XosManager.java @@ -85,35 +85,46 @@ public class XosManager { } /** - * Queries XOS for the Demo Subscriber ID and caches it for future calls. + * Queries XOS for the Subscriber ID lookup data, and returns it. */ - public int initXosSubscriber() { - log.info("intDemoSubscriber() called"); + public ObjectNode initXosSubscriberLookups() { + log.info("intDemoSubscriberLookups() called"); xosServerIp = getXosServerIp(); xosServerPort = getXosServerPort(); log.info("Using XOS server at {}:{}", xosServerIp, xosServerPort); xosUtilsRs = new XosManagerRestUtils(xosServerIp, xosServerPort, URI_RS); - // ask XOS for the subscriber ID of the canned Demo account... - String result = xosUtilsRs.getRest("initdemo/"); - log.info("from XOS: {}", result); + // ask XOS for the subscriber ID lookup info + String result = xosUtilsRs.getRest("subidlookup/"); + log.info("lookup data from XOS: {}", result); JsonNode node; try { node = MAPPER.readTree(result); } catch (IOException e) { - log.error("failed to read demo subscriber JSON", e); - return 0; + log.error("failed to read subscriber lookup JSON data", e); + return null; } + return (ObjectNode) node; + } - ObjectNode obj = (ObjectNode) node; - int demoId = obj.get("id").asInt(); - log.info("Using DEMO subscriber ID {}.", demoId); - - String uri = String.format(URI_SUBSCRIBER, demoId); + /** + * Sets a new XOS utils object to bind URL patterns for the + * given XOS subscriber ID. + * + * @param xosSubId XOS subscriber ID + */ + public void setXosUtilsForSubscriber(int xosSubId) { + String uri = String.format(URI_SUBSCRIBER, xosSubId); xosUtils = new XosManagerRestUtils(xosServerIp, xosServerPort, uri); - return demoId; + } + + + public void initDemoSubscriber() { + log.info("initDemoSubscriber() called"); + String result = xosUtilsRs.getRest("initdemo/"); + log.info("initdemo data from XOS: {}", result); } /**