You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@syncope.apache.org by md...@apache.org on 2015/08/19 11:20:07 UTC

[3/4] syncope git commit: [SYNCOPE-156] websocket behavior improvement

[SYNCOPE-156] websocket behavior improvement


Project: http://git-wip-us.apache.org/repos/asf/syncope/repo
Commit: http://git-wip-us.apache.org/repos/asf/syncope/commit/9abd35a2
Tree: http://git-wip-us.apache.org/repos/asf/syncope/tree/9abd35a2
Diff: http://git-wip-us.apache.org/repos/asf/syncope/diff/9abd35a2

Branch: refs/heads/SYNCOPE-156
Commit: 9abd35a29dc8616e6268e6c525e421f02d026f66
Parents: 310b34a
Author: fmartelli <fa...@gmail.com>
Authored: Tue Aug 18 18:48:51 2015 +0200
Committer: fmartelli <fa...@gmail.com>
Committed: Tue Aug 18 18:48:51 2015 +0200

----------------------------------------------------------------------
 .../client/console/topology/Topology.java       | 180 +---------------
 .../console/topology/WebSocketBehavior.java     | 209 +++++++++++++++++++
 .../provision/ProvisionWizardBuilder.java       |   2 +-
 3 files changed, 213 insertions(+), 178 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/syncope/blob/9abd35a2/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
index c991a44..81ef360 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/Topology.java
@@ -18,25 +18,13 @@
  */
 package org.apache.syncope.client.console.topology;
 
-import static org.apache.syncope.client.console.topology.TopologyNode.Status.FAILURE;
-import static org.apache.syncope.client.console.topology.TopologyNode.Status.REACHABLE;
-import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNKNOWN;
-import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNREACHABLE;
-
-import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import java.io.IOException;
 import java.io.Serializable;
 import java.net.URI;
 import java.util.ArrayList;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Locale;
 import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.tuple.Pair;
 import org.apache.cxf.jaxrs.client.WebClient;
@@ -49,10 +37,7 @@ import org.apache.syncope.common.lib.to.ConnInstanceTO;
 import org.apache.syncope.common.lib.to.ResourceTO;
 import org.apache.syncope.common.lib.types.Entitlement;
 import org.apache.syncope.common.rest.api.service.SyncopeService;
-import org.apache.wicket.Application;
 import org.apache.wicket.Component;
-import org.apache.wicket.Session;
-import org.apache.wicket.ThreadContext;
 import org.apache.wicket.ajax.AbstractAjaxTimerBehavior;
 import org.apache.wicket.ajax.AjaxRequestTarget;
 import org.apache.wicket.ajax.IAjaxIndicatorAware;
@@ -65,9 +50,6 @@ import org.apache.wicket.markup.html.WebMarkupContainer;
 import org.apache.wicket.markup.html.list.ListItem;
 import org.apache.wicket.markup.html.list.ListView;
 import org.apache.wicket.model.LoadableDetachableModel;
-import org.apache.wicket.protocol.ws.api.WebSocketBehavior;
-import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
-import org.apache.wicket.protocol.ws.api.message.TextMessage;
 import org.apache.wicket.util.time.Duration;
 
 public class Topology extends BasePage {
@@ -149,7 +131,7 @@ public class Topology extends BasePage {
                 }
             };
 
-    private enum SupportedOperation {
+    protected enum SupportedOperation {
 
         CHECK_RESOURCE,
         CHECK_CONNECTOR,
@@ -166,163 +148,7 @@ public class Topology extends BasePage {
         modal.setInitialWidth(RESOURCE_MODAL_WIN_WIDTH);
         modal.setCookieName("resource-modal");
 
-        add(new WebSocketBehavior() {
-
-            private static final long serialVersionUID = 1L;
-
-            final Map<String, String> resources = new HashMap<String, String>();
-
-            final Set<String> runningResCheck = new HashSet<>();
-
-            final Map<Long, String> connectors = new HashMap<Long, String>();
-
-            final Set<Long> runningConnCheck = new HashSet<>();
-
-            @Override
-            protected void onMessage(final WebSocketRequestHandler handler, final TextMessage message) {
-                try {
-                    final ObjectMapper mapper = new ObjectMapper();
-                    final JsonNode obj = mapper.readTree(message.getText());
-
-                    final ExecutorService executorService = Executors.newFixedThreadPool(1);
-
-                    switch (SupportedOperation.valueOf(obj.get("kind").asText())) {
-                        case CHECK_CONNECTOR:
-                            final Long ckey = obj.get("target").asLong();
-
-                            if (connectors.containsKey(ckey)) {
-                                handler.push(connectors.get(ckey));
-                            } else {
-                                handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, ckey));
-                            }
-
-                            synchronized (runningConnCheck) {
-                                if (runningConnCheck.contains(ckey)) {
-                                    LOG.debug("Running connection check for connector {}", ckey);
-                                } else {
-                                    runningConnCheck.add(ckey);
-                                }
-                            }
-
-                            executorService.execute(new ConnCheck(ckey));
-
-                            break;
-                        case CHECK_RESOURCE:
-                            final String rkey = obj.get("target").asText();
-
-                            if (resources.containsKey(rkey)) {
-                                handler.push(resources.get(rkey));
-                            } else {
-                                handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, rkey));
-                            }
-
-                            synchronized (runningResCheck) {
-                                if (runningResCheck.contains(rkey)) {
-                                    LOG.debug("Running connection check for resource {}", rkey);
-                                } else {
-                                    runningResCheck.add(rkey);
-                                }
-                            }
-
-                            executorService.execute(new ResCheck(rkey));
-
-                            break;
-                        case ADD_ENDPOINT:
-                            handler.appendJavaScript(String.format("addEndpoint('%s', '%s', '%s');",
-                                    obj.get("source").asText(),
-                                    obj.get("target").asText(),
-                                    obj.get("scope").asText()));
-                            break;
-                        default:
-                    }
-
-                    executorService.shutdown();
-
-                } catch (IOException e) {
-                    LOG.error("Eror managing websocket message", e);
-                }
-            }
-
-            class ConnCheck implements Runnable {
-
-                final Long key;
-
-                private final Application application;
-
-                private final Session session;
-
-                public ConnCheck(final Long key) {
-                    this.key = key;
-                    this.application = Application.get();
-                    this.session = Session.exists() ? Session.get() : null;
-                }
-
-                @Override
-                public void run() {
-                    try {
-                        ThreadContext.setApplication(application);
-                        ThreadContext.setSession(session);
-
-                        String res;
-                        try {
-                            final ConnInstanceTO connector = connectorRestClient.read(key);
-                            res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
-                                    connectorRestClient.check(connector) ? REACHABLE : UNREACHABLE, key);
-                        } catch (Exception e) {
-                            LOG.warn("Error checking connection for {}", key, e);
-                            res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
-                        }
-
-                        synchronized (runningConnCheck) {
-                            connectors.put(key, res);
-                            runningConnCheck.remove(key);
-                        }
-                    } finally {
-                        ThreadContext.detach();
-                    }
-                }
-            }
-
-            class ResCheck implements Runnable {
-
-                final String key;
-
-                private final Application application;
-
-                private final Session session;
-
-                public ResCheck(final String key) {
-                    this.key = key;
-                    this.application = Application.get();
-                    this.session = Session.exists() ? Session.get() : null;
-                }
-
-                @Override
-                public void run() {
-                    try {
-                        ThreadContext.setApplication(application);
-                        ThreadContext.setSession(session);
-
-                        String res;
-                        try {
-                            final ResourceTO resource = resourceRestClient.read(key);
-                            res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
-                                    connectorRestClient.check(resource) ? REACHABLE : UNREACHABLE, key);
-                        } catch (Exception e) {
-                            LOG.warn("Error checking connection for {}", key, e);
-                            res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
-                        }
-
-                        synchronized (runningResCheck) {
-                            resources.put(key, res);
-                            runningResCheck.remove(key);
-                        }
-                    } finally {
-                        ThreadContext.detach();
-                    }
-                }
-            }
-        });
+        add(new WebSocketBehavior());
 
         // -----------------------------------------
         // Add Zoom panel
@@ -713,7 +539,7 @@ public class Topology extends BasePage {
                     resourceCreateEvent.getDisplayName(),
                     resourceCreateEvent.getKind());
 
-            ((List<TopologyNode>) newlyCreated.getModelObject()).add(node);
+            newlyCreated.getModelObject().add(node);
             resourceCreateEvent.getTarget().add(newlyCreatedContainer);
 
             resourceCreateEvent.getTarget().appendJavaScript(String.format(

http://git-wip-us.apache.org/repos/asf/syncope/blob/9abd35a2/client/console/src/main/java/org/apache/syncope/client/console/topology/WebSocketBehavior.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/topology/WebSocketBehavior.java b/client/console/src/main/java/org/apache/syncope/client/console/topology/WebSocketBehavior.java
new file mode 100644
index 0000000..7cd0ff5
--- /dev/null
+++ b/client/console/src/main/java/org/apache/syncope/client/console/topology/WebSocketBehavior.java
@@ -0,0 +1,209 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.syncope.client.console.topology;
+
+import static org.apache.syncope.client.console.topology.TopologyNode.Status.FAILURE;
+import static org.apache.syncope.client.console.topology.TopologyNode.Status.REACHABLE;
+import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNKNOWN;
+import static org.apache.syncope.client.console.topology.TopologyNode.Status.UNREACHABLE;
+
+import com.fasterxml.jackson.databind.JsonNode;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import java.io.IOException;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import org.apache.syncope.client.console.rest.ConnectorRestClient;
+import org.apache.syncope.client.console.rest.ResourceRestClient;
+import org.apache.syncope.common.lib.to.ConnInstanceTO;
+import org.apache.syncope.common.lib.to.ResourceTO;
+import org.apache.wicket.Application;
+import org.apache.wicket.Session;
+import org.apache.wicket.ThreadContext;
+import org.apache.wicket.protocol.ws.api.WebSocketRequestHandler;
+import org.apache.wicket.protocol.ws.api.message.TextMessage;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class WebSocketBehavior extends org.apache.wicket.protocol.ws.api.WebSocketBehavior {
+
+    private static final long serialVersionUID = 1L;
+
+    protected static final Logger LOG = LoggerFactory.getLogger(WebSocketBehavior.class);
+
+    private final Map<String, String> resources = new HashMap<String, String>();
+
+    private final Set<String> runningResCheck = new HashSet<>();
+
+    private final Map<Long, String> connectors = new HashMap<Long, String>();
+
+    private final Set<Long> runningConnCheck = new HashSet<>();
+
+    private final ConnectorRestClient connectorRestClient = new ConnectorRestClient();
+
+    private final ResourceRestClient resourceRestClient = new ResourceRestClient();
+
+    @Override
+    protected void onMessage(final WebSocketRequestHandler handler, final TextMessage message) {
+        try {
+            final ObjectMapper mapper = new ObjectMapper();
+            final JsonNode obj = mapper.readTree(message.getText());
+
+            final ExecutorService executorService = Executors.newFixedThreadPool(1);
+
+            switch (Topology.SupportedOperation.valueOf(obj.get("kind").asText())) {
+                case CHECK_CONNECTOR:
+                    final Long ckey = obj.get("target").asLong();
+
+                    if (connectors.containsKey(ckey)) {
+                        handler.push(connectors.get(ckey));
+                    } else {
+                        handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, ckey));
+                    }
+
+                    synchronized (runningConnCheck) {
+                        if (runningConnCheck.contains(ckey)) {
+                            LOG.debug("Running connection check for connector {}", ckey);
+                        } else {
+                            runningConnCheck.add(ckey);
+                        }
+                    }
+
+                    executorService.execute(new ConnCheck(ckey));
+
+                    break;
+                case CHECK_RESOURCE:
+                    final String rkey = obj.get("target").asText();
+
+                    if (resources.containsKey(rkey)) {
+                        handler.push(resources.get(rkey));
+                    } else {
+                        handler.push(String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", UNKNOWN, rkey));
+                    }
+
+                    synchronized (runningResCheck) {
+                        if (runningResCheck.contains(rkey)) {
+                            LOG.debug("Running connection check for resource {}", rkey);
+                        } else {
+                            runningResCheck.add(rkey);
+                        }
+                    }
+
+                    executorService.execute(new ResCheck(rkey));
+
+                    break;
+                case ADD_ENDPOINT:
+                    handler.appendJavaScript(String.format("addEndpoint('%s', '%s', '%s');",
+                            obj.get("source").asText(),
+                            obj.get("target").asText(),
+                            obj.get("scope").asText()));
+                    break;
+                default:
+            }
+
+            executorService.shutdown();
+
+        } catch (IOException e) {
+            LOG.error("Eror managing websocket message", e);
+        }
+    }
+
+    class ConnCheck implements Runnable {
+
+        private final Long key;
+
+        private final Application application;
+
+        private final Session session;
+
+        public ConnCheck(final Long key) {
+            this.key = key;
+            this.application = Application.get();
+            this.session = Session.exists() ? Session.get() : null;
+        }
+
+        @Override
+        public void run() {
+            try {
+                ThreadContext.setApplication(application);
+                ThreadContext.setSession(session);
+
+                String res;
+                try {
+                    final ConnInstanceTO connector = connectorRestClient.read(key);
+                    res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
+                            connectorRestClient.check(connector) ? REACHABLE : UNREACHABLE, key);
+                } catch (Exception e) {
+                    LOG.warn("Error checking connection for {}", key, e);
+                    res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
+                }
+
+                synchronized (runningConnCheck) {
+                    connectors.put(key, res);
+                    runningConnCheck.remove(key);
+                }
+            } finally {
+                ThreadContext.detach();
+            }
+        }
+    }
+
+    class ResCheck implements Runnable {
+
+        private final String key;
+
+        private final Application application;
+
+        private final Session session;
+
+        public ResCheck(final String key) {
+            this.key = key;
+            this.application = Application.get();
+            this.session = Session.exists() ? Session.get() : null;
+        }
+
+        @Override
+        public void run() {
+            try {
+                ThreadContext.setApplication(application);
+                ThreadContext.setSession(session);
+
+                String res;
+                try {
+                    final ResourceTO resource = resourceRestClient.read(key);
+                    res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}",
+                            connectorRestClient.check(resource) ? REACHABLE : UNREACHABLE, key);
+                } catch (Exception e) {
+                    LOG.warn("Error checking connection for {}", key, e);
+                    res = String.format("{ \"status\": \"%s\", \"target\": \"%s\"}", FAILURE, key);
+                }
+
+                synchronized (runningResCheck) {
+                    resources.put(key, res);
+                    runningResCheck.remove(key);
+                }
+            } finally {
+                ThreadContext.detach();
+            }
+        }
+    }
+}

http://git-wip-us.apache.org/repos/asf/syncope/blob/9abd35a2/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
----------------------------------------------------------------------
diff --git a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
index 364bdb2..30a7bbc 100644
--- a/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
+++ b/client/console/src/main/java/org/apache/syncope/client/console/wizards/provision/ProvisionWizardBuilder.java
@@ -79,7 +79,7 @@ public class ProvisionWizardBuilder extends AjaxWizardBuilder<ProvisionTO> imple
                     }, res), new Predicate<String>() {
 
                         @Override
-                        public boolean evaluate(String key) {
+                        public boolean evaluate(final String key) {
                             return !currentlyAdded.contains(key);
                         }
                     });