Bug 5528 - Subscribing to stream impl
[netconf.git] / restconf / sal-rest-connector / src / main / java / org / opendaylight / restconf / restful / utils / SubscribeToStreamUtil.java
1 /*
2  * Copyright (c) 2016 Cisco Systems, Inc. and others.  All rights reserved.
3  *
4  * This program and the accompanying materials are made available under the
5  * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6  * and is available at http://www.eclipse.org/legal/epl-v10.html
7  */
8 package org.opendaylight.restconf.restful.utils;
9
10 import java.util.HashMap;
11 import java.util.Map;
12 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
13 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
14 import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker;
15 import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener;
16 import org.opendaylight.netconf.sal.streams.listeners.ListenerAdapter;
17 import org.opendaylight.netconf.sal.streams.websockets.WebSocketServer;
18 import org.opendaylight.restconf.utils.RestconfConstants;
19 import org.opendaylight.yangtools.concepts.ListenerRegistration;
20 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
21
22 /**
23  * Subscribe to stream util class
24  *
25  */
26 public final class SubscribeToStreamUtil {
27
28     private SubscribeToStreamUtil() {
29         throw new UnsupportedOperationException("Util class");
30     }
31
32     /**
33      * Parse enum from URI
34      *
35      * @param clazz
36      *            - enum type
37      * @param value
38      *            - string of enum value
39      * @return enum
40      */
41     public static <T> T parseURIEnum(final Class<T> clazz, final String value) {
42         if ((value == null) || value.equals("")) {
43             return null;
44         }
45         return StreamUtil.resolveEnum(clazz, value);
46     }
47
48     /**
49      * Prepare map of values from URI
50      *
51      * @param identifier
52      *            - URI
53      * @return {@link Map}
54      */
55     public static Map<String, String> mapValuesFromUri(final String identifier) {
56         final HashMap<String, String> result = new HashMap<>();
57         final String[] tokens = identifier.split(String.valueOf(RestconfConstants.SLASH));
58         for (final String token : tokens) {
59             final String[] paramToken = token.split(String.valueOf(RestconfStreamsConstants.EQUAL));
60             if (paramToken.length == 2) {
61                 result.put(paramToken[0], paramToken[1]);
62             }
63         }
64         return result;
65     }
66
67     /**
68      * Register data change listener in dom data broker and set it to listener
69      * on stream
70      *
71      * @param ds
72      *            - {@link LogicalDatastoreType}
73      * @param scope
74      *            - {@link DataChangeScope}
75      * @param listener
76      *            - listener on specific stream
77      * @param domDataBroker
78      *            - data broker for register data change listener
79      */
80     public static void registration(final LogicalDatastoreType ds, final DataChangeScope scope,
81             final ListenerAdapter listener, final DOMDataBroker domDataBroker) {
82         if (listener.isListening()) {
83             return;
84         }
85
86         final YangInstanceIdentifier path = listener.getPath();
87         final ListenerRegistration<DOMDataChangeListener> registration = domDataBroker.registerDataChangeListener(ds,
88                 path, listener, scope);
89
90         listener.setRegistration(registration);
91     }
92
93     /**
94      * Get port from web socket server. If doesn't exit, create it.
95      *
96      * @return port
97      */
98     public static int prepareNotificationPort() {
99         int port = RestconfStreamsConstants.NOTIFICATION_PORT;
100         try {
101             final WebSocketServer webSocketServer = WebSocketServer.getInstance();
102             port = webSocketServer.getPort();
103         } catch (final NullPointerException e) {
104             WebSocketServer.createInstance(RestconfStreamsConstants.NOTIFICATION_PORT);
105         }
106         return port;
107     }
108
109 }