Merge "Unit test for RestconfDataServiceImpl class"
[netconf.git] / restconf / sal-rest-connector / src / main / java / org / opendaylight / restconf / restful / services / impl / RestconfStreamsSubscriptionServiceImpl.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.services.impl;
9
10 import java.net.URI;
11 import java.util.Map;
12 import javax.ws.rs.core.Response;
13 import javax.ws.rs.core.Response.Status;
14 import javax.ws.rs.core.UriBuilder;
15 import javax.ws.rs.core.UriInfo;
16 import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope;
17 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
18 import org.opendaylight.netconf.sal.restconf.impl.RestconfDocumentedException;
19 import org.opendaylight.netconf.sal.restconf.impl.RestconfError.ErrorTag;
20 import org.opendaylight.netconf.sal.restconf.impl.RestconfError.ErrorType;
21 import org.opendaylight.netconf.sal.streams.listeners.ListenerAdapter;
22 import org.opendaylight.netconf.sal.streams.listeners.Notificator;
23 import org.opendaylight.restconf.handlers.DOMDataBrokerHandler;
24 import org.opendaylight.restconf.restful.services.api.RestconfStreamsSubscriptionService;
25 import org.opendaylight.restconf.restful.utils.RestconfStreamsConstants;
26 import org.opendaylight.restconf.restful.utils.SubscribeToStreamUtil;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30 /**
31  * Implementation of {@link RestconfStreamsSubscriptionService}
32  *
33  */
34 public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSubscriptionService {
35
36     private static final Logger LOG = LoggerFactory.getLogger(RestconfStreamsSubscriptionServiceImpl.class);
37
38     private final DOMDataBrokerHandler domDataBrokerHandler;
39
40     public RestconfStreamsSubscriptionServiceImpl(final DOMDataBrokerHandler domDataBrokerHandler) {
41         this.domDataBrokerHandler = domDataBrokerHandler;
42     }
43
44     @Override
45     public Response subscribeToStream(final String identifier, final UriInfo uriInfo) {
46         final Map<String, String> mapOfValues = SubscribeToStreamUtil.mapValuesFromUri(identifier);
47
48         final LogicalDatastoreType ds = SubscribeToStreamUtil.parseURIEnum(LogicalDatastoreType.class,
49                 mapOfValues.get(RestconfStreamsConstants.DATASTORE_PARAM_NAME));
50         if (ds == null) {
51             final String msg = "Stream name doesn't contains datastore value (pattern /datastore=)";
52             LOG.debug(msg);
53             throw new RestconfDocumentedException(msg, ErrorType.APPLICATION, ErrorTag.MISSING_ATTRIBUTE);
54         }
55
56         final DataChangeScope scope = SubscribeToStreamUtil.parseURIEnum(DataChangeScope.class,
57                 mapOfValues.get(RestconfStreamsConstants.SCOPE_PARAM_NAME));
58         if (scope == null) {
59             final String msg = "Stream name doesn't contains datastore value (pattern /scope=)";
60             LOG.warn(msg);
61             throw new RestconfDocumentedException(msg, ErrorType.APPLICATION, ErrorTag.MISSING_ATTRIBUTE);
62         }
63
64         final String streamName = Notificator.createStreamNameFromUri(identifier);
65
66         final ListenerAdapter listener = Notificator.getListenerFor(streamName);
67         SubscribeToStreamUtil.registration(ds, scope, listener, this.domDataBrokerHandler.get());
68
69         final int port = SubscribeToStreamUtil.prepareNotificationPort();
70
71         final UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder();
72         final UriBuilder uriToWebSocketServer = uriBuilder.port(port).scheme(RestconfStreamsConstants.SCHEMA_SUBSCIBRE_URI);
73         final URI uri = uriToWebSocketServer.replacePath(streamName).build();
74
75         return Response.status(Status.OK).location(uri).build();
76     }
77 }