diff options
author | Pamela Dragosh <pdragosh@research.att.com> | 2017-02-14 19:41:00 -0500 |
---|---|---|
committer | Pamela Dragosh <pdragosh@research.att.com> | 2017-02-14 19:41:32 -0500 |
commit | 91d04c64771832a0b8815ffbe1f0f9920320d94d (patch) | |
tree | fb02d5e1c84a3d91def9a7ee95bc87f9c046cc96 /ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java | |
parent | b9d4caa40ef8e3566ac475968bce17b9b64b6939 (diff) |
Initial OpenECOMP policy/engine commit
Change-Id: I7dbff37733b661643dd4d1caefa3d7dccc361b6e
Signed-off-by: Pamela Dragosh <pdragosh@research.att.com>
Diffstat (limited to 'ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java')
-rw-r--r-- | ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java b/ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java new file mode 100644 index 000000000..cff0828e2 --- /dev/null +++ b/ecomp-sdk-app/src/main/java/org/openecomp/policy/admin/PAPNotificationBroadcaster.java @@ -0,0 +1,120 @@ +/*- + * ============LICENSE_START======================================================= + * ECOMP Policy Engine + * ================================================================================ + * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * Licensed 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. + * ============LICENSE_END========================================================= + */ + +package org.openecomp.policy.admin; + + +import java.io.Serializable; +import java.util.LinkedList; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + + +import org.openecomp.policy.common.logging.flexlogger.FlexLogger; +import org.openecomp.policy.common.logging.flexlogger.Logger; + +/** + * Handle Notifications from the PAP that the PDP Groups have been changed. + * We need a Server Push Broadcaster because there may be multiple Vaadin instances (i.e. Users) that need to be told when a change occurs. + * + * Initially we only update the entire set of PDPGroups in one shot. + * + * (Code copied from Book of Vaadin chapter on Server Push + * + */ +public class PAPNotificationBroadcaster implements Serializable { + /** + * + */ + private static final long serialVersionUID = -2539940306348821754L; + + + private static Logger logger = FlexLogger.getLogger(PAPNotificationBroadcaster.class); + + + static ExecutorService executorService = Executors.newSingleThreadExecutor(); + + /** + * Interface used by all classes that need to be notified when PAP sends an update message. + * + * + */ + public interface PAPNotificationBroadcastListener { + void updateAllGroups(); + } + + + + /* + * list of registered listeners + */ + private static LinkedList<PAPNotificationBroadcastListener> listeners = + new LinkedList<PAPNotificationBroadcastListener>(); + + /** + * Listener registers to hear about updates. + * @param listener + */ + public static synchronized void register( + PAPNotificationBroadcastListener listener) { + listeners.add(listener); + } + + + /** + * Listener is going away. + * + * @param listener + */ + public static synchronized void unregister( + PAPNotificationBroadcastListener listener) { + listeners.remove(listener); + } + + + + /** + * Tell all listeners about an update. + * + * @param message + */ + public static synchronized void updateAllGroups() { + for (final PAPNotificationBroadcastListener listener: listeners) { + // Original code copied from example: + // executorService.execute(new Runnable() { + // @Override + // public void run() { + // The problem with this is that the execute starts a new Thread, but the thing we are calling (the listener.updateAllGroups) + // happens in this case to ALSO create a new thread, and it locks up because the shared threadpool queue is already locked by this method. + // On application shutdown that left us with a blocked thread, so the process never goes away. + // Since the listener.updateAllGroups does ALL of its work inside a new Runnable thread, there should be no need for this method to also create a thread. + + /* + * IMPORTANT: + * All listeners MUST either execute with no possibility of blocking + * OR must start their own threads to handle blocking and concurrent operations. + */ + if (logger.isDebugEnabled()) { + logger.debug("updateAllGroups"); + } + listener.updateAllGroups(); + } + } +} |