Bug 6995 - Change event notification subscription usability PART2 47/47747/11
authorJakub Toth <jatoth@cisco.com>
Sat, 29 Oct 2016 01:38:39 +0000 (03:38 +0200)
committerJakub Toth <jatoth@cisco.com>
Mon, 7 Nov 2016 20:23:28 +0000 (20:23 +0000)
  * added new yang for leaf with location for subscribing on stream
  * changed return type of subscribing stream request from Response
    to NormalizedNodeContext
    * implemented leaf with location of stream
  * implemented support of adding new headers on data return
    * added new statement 'headers' to NormalizedNodeContext

Change-Id: I2da57c8b1e22368345ca2dac9ae1a8924f2ecea2
Signed-off-by: Jakub Toth <jatoth@cisco.com>
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/rest/api/RestconfService.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/rest/impl/RestconfCompositeWrapper.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/restconf/impl/NormalizedNodeContext.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/restconf/impl/RestconfImpl.java
restconf/sal-rest-connector/src/main/java/org/opendaylight/netconf/sal/restconf/impl/StatisticsRestconfServiceWrapper.java
restconf/sal-rest-connector/src/main/yang/subscribe-to-notification.yang [new file with mode: 0644]
restconf/sal-rest-connector/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/RestconfImplTest.java
restconf/sal-rest-connector/src/test/resources/full-versions/yangs/subscribe-to-notification.yang [new file with mode: 0644]

index ade5a41d5878729fa9a238ec1989aeb0fed81de7..88dd38df524742b4a1a5a68c9edb2f12cb52f42e 100644 (file)
@@ -212,7 +212,8 @@ public interface RestconfService {
 
     @GET
     @Path("/streams/stream/{identifier:.+}")
-    public Response subscribeToStream(@Encoded @PathParam("identifier") String identifier, @Context UriInfo uriInfo);
+    public NormalizedNodeContext subscribeToStream(@Encoded @PathParam("identifier") String identifier,
+            @Context UriInfo uriInfo);
 
     /**
      * @deprecated do not use this method. It will be replaced by
index e48afa695df1e6d9ad796c63bdc145415125a747..462c1001cd9dff2a162e5f46d9590e6099f42dd0 100644 (file)
@@ -16,6 +16,7 @@ import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
 import java.net.URI;
 import java.nio.charset.StandardCharsets;
+import java.util.Map.Entry;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
 import javax.ws.rs.core.MediaType;
@@ -56,26 +57,32 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter<Normalize
     private static final int DEFAULT_INDENT_SPACES_NUM = 2;
 
     @Override
-    public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
+    public boolean isWriteable(final Class<?> type, final Type genericType, final Annotation[] annotations,
+            final MediaType mediaType) {
         return type.equals(NormalizedNodeContext.class);
     }
 
     @Override
-    public long getSize(final NormalizedNodeContext t, final Class<?> type, final Type genericType, final Annotation[] annotations, final MediaType mediaType) {
+    public long getSize(final NormalizedNodeContext t, final Class<?> type, final Type genericType,
+            final Annotation[] annotations, final MediaType mediaType) {
         return -1;
     }
 
     @Override
-    public void writeTo(final NormalizedNodeContext t, final Class<?> type, final Type genericType, final Annotation[] annotations,
-            final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream)
-                    throws IOException, WebApplicationException {
+    public void writeTo(final NormalizedNodeContext t, final Class<?> type, final Type genericType,
+            final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap<String, Object> httpHeaders,
+            final OutputStream entityStream) throws IOException, WebApplicationException {
+        for (final Entry<String, Object> entry : t.getNewHeaders().entrySet()) {
+            httpHeaders.add(entry.getKey(), entry.getValue());
+        }
         final NormalizedNode<?, ?> data = t.getData();
         if (data == null) {
             return;
         }
 
         @SuppressWarnings("unchecked")
-        final InstanceIdentifierContext<SchemaNode> context = (InstanceIdentifierContext<SchemaNode>) t.getInstanceIdentifierContext();
+        final InstanceIdentifierContext<SchemaNode> context =
+                (InstanceIdentifierContext<SchemaNode>) t.getInstanceIdentifierContext();
 
         final SchemaPath path = context.getSchemaNode().getPath();
         final JsonWriter jsonWriter = createJsonWriter(entityStream, t.getWriterParameters().isPrettyPrint());
@@ -86,8 +93,8 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter<Normalize
     }
 
     private void writeNormalizedNode(final JsonWriter jsonWriter, SchemaPath path,
-            final InstanceIdentifierContext<SchemaNode> context, NormalizedNode<?, ?> data, final Optional<Integer> depth) throws
-            IOException {
+            final InstanceIdentifierContext<SchemaNode> context, NormalizedNode<?, ?> data,
+            final Optional<Integer> depth) throws IOException {
         final RestconfNormalizedNodeWriter nnWriter;
         if (SchemaPath.ROOT.equals(path)) {
             /*
@@ -141,7 +148,8 @@ public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter<Normalize
         } else {
             initialNs = null;
         }
-        final NormalizedNodeStreamWriter streamWriter = JSONNormalizedNodeStreamWriter.createNestedWriter(codecs,path,initialNs,jsonWriter);
+        final NormalizedNodeStreamWriter streamWriter =
+                JSONNormalizedNodeStreamWriter.createNestedWriter(codecs, path, initialNs, jsonWriter);
         if (depth.isPresent()) {
             return DepthAwareNormalizedNodeWriter.forStreamWriter(streamWriter, depth.get());
         } else {
index 827a8d7d08f2a58c8dea8a06f527c0e863889dfa..3d78e952fd55dd17ed12466843e3bbeb6c6acca0 100644 (file)
@@ -13,6 +13,7 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.lang.annotation.Annotation;
 import java.lang.reflect.Type;
+import java.util.Map.Entry;
 import javanet.staxutils.IndentingXMLStreamWriter;
 import javax.ws.rs.Produces;
 import javax.ws.rs.WebApplicationException;
@@ -75,6 +76,9 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
             final Annotation[] annotations, final MediaType mediaType,
             final MultivaluedMap<String, Object> httpHeaders, final OutputStream entityStream) throws IOException,
             WebApplicationException {
+        for (final Entry<String, Object> entry : t.getNewHeaders().entrySet()) {
+            httpHeaders.add(entry.getKey(), entry.getValue());
+        }
         final InstanceIdentifierContext<?> pathContext = t.getInstanceIdentifierContext();
         if (t.getData() == null) {
             return;
@@ -97,8 +101,9 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
         writeNormalizedNode(xmlWriter, schemaPath, pathContext, data, Optional.fromNullable(t.getWriterParameters().getDepth()));
     }
 
-    private void writeNormalizedNode(final XMLStreamWriter xmlWriter, final SchemaPath schemaPath, final InstanceIdentifierContext<?>
-            pathContext, NormalizedNode<?, ?> data, final Optional<Integer> depth) throws IOException {
+    private void writeNormalizedNode(final XMLStreamWriter xmlWriter, final SchemaPath schemaPath,
+            final InstanceIdentifierContext<?> pathContext, NormalizedNode<?, ?> data, final Optional<Integer> depth)
+            throws IOException {
         final RestconfNormalizedNodeWriter nnWriter;
         final SchemaContext schemaCtx = pathContext.getSchemaContext();
         if (SchemaPath.ROOT.equals(schemaPath)) {
@@ -121,8 +126,9 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
     }
 
     private RestconfNormalizedNodeWriter createNormalizedNodeWriter(final XMLStreamWriter xmlWriter,
-                                                                        final SchemaContext schemaContext, final SchemaPath schemaPath, final Optional<Integer> depth) {
-        final NormalizedNodeStreamWriter xmlStreamWriter = XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, schemaContext, schemaPath);
+            final SchemaContext schemaContext, final SchemaPath schemaPath, final Optional<Integer> depth) {
+        final NormalizedNodeStreamWriter xmlStreamWriter =
+                XMLStreamNormalizedNodeStreamWriter.create(xmlWriter, schemaContext, schemaPath);
         if (depth.isPresent()) {
             return DepthAwareNormalizedNodeWriter.forStreamWriter(xmlStreamWriter, depth.get());
         } else {
@@ -135,7 +141,8 @@ public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter<Normalized
             throws IOException {
         try {
             final QName name = data.getNodeType();
-            xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, name.getLocalName(), name.getNamespace().toString());
+            xmlWriter.writeStartElement(XMLConstants.DEFAULT_NS_PREFIX, name.getLocalName(),
+                    name.getNamespace().toString());
             xmlWriter.writeDefaultNamespace(name.getNamespace().toString());
             for(final NormalizedNode<?,?> child : data.getValue()) {
                 nnWriter.write(child);
index 49e79651207627133c282073b0cc7bf4f4447ee2..c7ae242603cf9447254609ac230ea934c031534f 100644 (file)
@@ -102,7 +102,7 @@ public class RestconfCompositeWrapper implements RestconfService, SchemaRetrieva
     }
 
     @Override
-    public Response subscribeToStream(final String identifier, final UriInfo uriInfo) {
+    public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) {
         return this.restconf.subscribeToStream(identifier, uriInfo);
     }
 
index 3bed8d1ad03d74790a13260dbee0a556724398b5..6fc830cd839f562b57b30c7aad6d56052cb90cf3 100644 (file)
@@ -7,6 +7,8 @@
  */
 package org.opendaylight.netconf.sal.restconf.impl;
 
+import java.util.HashMap;
+import java.util.Map;
 import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode;
 import org.opendaylight.yangtools.yang.model.api.SchemaNode;
 
@@ -15,14 +17,24 @@ public class NormalizedNodeContext {
     private final InstanceIdentifierContext<? extends SchemaNode> context;
     private final NormalizedNode<?,?> data;
     private final WriterParameters writerParameters;
+    private Map<String, Object> headers = new HashMap<>();
 
     public NormalizedNodeContext(final InstanceIdentifierContext<? extends SchemaNode> context,
-                                 final NormalizedNode<?, ?> data, WriterParameters writerParameters) {
+                                 final NormalizedNode<?, ?> data, final WriterParameters writerParameters) {
         this.context = context;
         this.data = data;
         this.writerParameters = writerParameters;
     }
 
+    public NormalizedNodeContext(final InstanceIdentifierContext<? extends SchemaNode> context,
+            final NormalizedNode<?, ?> data, final WriterParameters writerParameters,
+            final Map<String, Object> headers) {
+        this.context = context;
+        this.data = data;
+        this.writerParameters = writerParameters;
+        this.headers = headers;
+    }
+
     public NormalizedNodeContext(final InstanceIdentifierContext<? extends SchemaNode> context,
                                  final NormalizedNode<?, ?> data) {
         this.context = context;
@@ -31,15 +43,32 @@ public class NormalizedNodeContext {
         this.writerParameters = new WriterParameters.WriterParametersBuilder().build();
     }
 
+    public NormalizedNodeContext(final InstanceIdentifierContext<? extends SchemaNode> context,
+            final NormalizedNode<?, ?> data, final Map<String, Object> headers) {
+        this.context = context;
+        this.data = data;
+        // default writer parameters
+        this.writerParameters = new WriterParameters.WriterParametersBuilder().build();
+        this.headers = headers;
+    }
+
+
     public InstanceIdentifierContext<? extends SchemaNode> getInstanceIdentifierContext() {
-        return context;
+        return this.context;
     }
 
     public NormalizedNode<?, ?> getData() {
-        return data;
+        return this.data;
     }
 
     public WriterParameters getWriterParameters() {
-        return writerParameters;
+        return this.writerParameters;
+    }
+
+    /**
+     * @return
+     */
+    public Map<String, Object> getNewHeaders() {
+        return this.headers;
     }
 }
index 25d081d73c2e145609ed49c3462a6a0f5d1e302c..7a5d521331fdc4c531edd1d3a3920640145d0f07 100644 (file)
@@ -83,7 +83,9 @@ import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.CollectionNodeBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.ListNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder;
 import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder;
+import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder;
 import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode;
 import org.opendaylight.yangtools.yang.model.api.DataNodeContainer;
 import org.opendaylight.yangtools.yang.model.api.DataSchemaNode;
@@ -1043,17 +1045,52 @@ public class RestconfImpl implements RestconfService {
      * </ul>
      */
     @Override
-    public Response subscribeToStream(final String identifier, final UriInfo uriInfo) {
+    public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) {
+        URI response = null;
         if (identifier.contains(DATA_SUBSCR)) {
-            return dataSubs(identifier, uriInfo);
+            response = dataSubs(identifier, uriInfo);
         } else if (identifier.contains(NOTIFICATION_STREAM)) {
-            return notifStream(identifier, uriInfo);
+            response = notifStream(identifier, uriInfo);
         }
+
+        if(response != null){
+            // prepare node with value of location
+            final InstanceIdentifierContext<?> iid = prepareIIDSubsStreamOutput();
+            final NormalizedNodeAttrBuilder<NodeIdentifier, Object, LeafNode<Object>> builder = ImmutableLeafNodeBuilder
+                    .create().withValue(response.toString());
+            builder.withNodeIdentifier(
+                    NodeIdentifier.create(QName.create("subscribe:to:notification", "2016-10-28", "location")));
+
+            // prepare new header with location
+            final Map<String, Object> headers = new HashMap<>();
+            headers.put("Location", response);
+
+            return new NormalizedNodeContext(iid, builder.build(), headers);
+        }
+
         final String msg = "Bad type of notification of sal-remote";
         LOG.warn(msg);
         throw new RestconfDocumentedException(msg);
     }
 
+    /**
+     * @return {@link InstanceIdentifierContext} of location leaf for
+     *         notification
+     */
+    private InstanceIdentifierContext<?> prepareIIDSubsStreamOutput() {
+        final QName qnameBase = QName.create("subscribe:to:notification", "2016-10-28", "notifi");
+        final SchemaContext schemaCtx = ControllerContext.getInstance().getGlobalSchema();
+        final DataSchemaNode location = ((ContainerSchemaNode) schemaCtx
+                .findModuleByNamespaceAndRevision(qnameBase.getNamespace(), qnameBase.getRevision())
+                .getDataChildByName(qnameBase)).getDataChildByName(QName.create(qnameBase, "location"));
+        final List<PathArgument> path = new ArrayList<>();
+        path.add(NodeIdentifier.create(qnameBase));
+        path.add(NodeIdentifier.create(QName.create(qnameBase, "location")));
+
+        return new InstanceIdentifierContext<SchemaNode>(YangInstanceIdentifier.create(path), location, null,
+                schemaCtx);
+    }
+
     /**
      * Register notification listener by stream name
      *
@@ -1063,7 +1100,7 @@ public class RestconfImpl implements RestconfService {
      *            - uriInfo
      * @return {@link Response}
      */
-    private Response notifStream(final String identifier, final UriInfo uriInfo) {
+    private URI notifStream(final String identifier, final UriInfo uriInfo) {
         final String streamName = Notificator.createStreamNameFromUri(identifier);
         if (Strings.isNullOrEmpty(streamName)) {
             throw new RestconfDocumentedException("Stream name is empty.", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
@@ -1089,7 +1126,7 @@ public class RestconfImpl implements RestconfService {
         final UriBuilder uriToWebsocketServerBuilder = uriBuilder.port(notificationPort).scheme("ws");
         final URI uriToWebsocketServer = uriToWebsocketServerBuilder.replacePath(streamName).build();
 
-        return Response.status(Status.OK).location(uriToWebsocketServer).build();
+        return uriToWebsocketServer;
     }
 
     /**
@@ -1101,7 +1138,7 @@ public class RestconfImpl implements RestconfService {
      *            - uri info
      * @return {@link Response}
      */
-    private Response dataSubs(final String identifier, final UriInfo uriInfo) {
+    private URI dataSubs(final String identifier, final UriInfo uriInfo) {
         final String streamName = Notificator.createStreamNameFromUri(identifier);
         if (Strings.isNullOrEmpty(streamName)) {
             throw new RestconfDocumentedException("Stream name is empty.", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE);
@@ -1138,7 +1175,7 @@ public class RestconfImpl implements RestconfService {
         final UriBuilder uriToWebsocketServerBuilder = uriBuilder.port(notificationPort).scheme("ws");
         final URI uriToWebsocketServer = uriToWebsocketServerBuilder.replacePath(streamName).build();
 
-        return Response.status(Status.OK).location(uriToWebsocketServer).build();
+        return uriToWebsocketServer;
     }
 
     @Override
index 75af8fe32042f9ac49a7567ac8adcf47315fd959..163887870a4f19db182ea45c451359dc110c2e53 100644 (file)
@@ -9,7 +9,6 @@ package org.opendaylight.netconf.sal.restconf.impl;
 
 import java.math.BigInteger;
 import java.util.concurrent.atomic.AtomicLong;
-import javax.ws.rs.core.Context;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
 import javax.ws.rs.core.UriInfo;
@@ -34,7 +33,8 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
     AtomicLong failurePut = new AtomicLong();
     AtomicLong failureDelete = new AtomicLong();
 
-    private static final StatisticsRestconfServiceWrapper INSTANCE = new StatisticsRestconfServiceWrapper(RestconfImpl.getInstance());
+    private static final StatisticsRestconfServiceWrapper INSTANCE =
+            new StatisticsRestconfServiceWrapper(RestconfImpl.getInstance());
 
     final RestconfService delegate;
 
@@ -48,60 +48,61 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
 
     @Override
     public Object getRoot() {
-        return delegate.getRoot();
+        return this.delegate.getRoot();
     }
 
     @Override
     public NormalizedNodeContext getModules(final UriInfo uriInfo) {
-        return delegate.getModules(uriInfo);
+        return this.delegate.getModules(uriInfo);
     }
 
     @Override
     public NormalizedNodeContext getModules(final String identifier, final UriInfo uriInfo) {
-        return delegate.getModules(identifier, uriInfo);
+        return this.delegate.getModules(identifier, uriInfo);
     }
 
     @Override
     public NormalizedNodeContext getModule(final String identifier, final UriInfo uriInfo) {
-        return delegate.getModule(identifier, uriInfo);
+        return this.delegate.getModule(identifier, uriInfo);
     }
 
     @Override
     public NormalizedNodeContext getOperations(final UriInfo uriInfo) {
-        return delegate.getOperations(uriInfo);
+        return this.delegate.getOperations(uriInfo);
     }
 
     @Override
     public NormalizedNodeContext getOperations(final String identifier, final UriInfo uriInfo) {
-        return delegate.getOperations(identifier, uriInfo);
+        return this.delegate.getOperations(identifier, uriInfo);
     }
 
     @Override
-    public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) {
-        rpc.incrementAndGet();
-        return delegate.invokeRpc(identifier, payload, uriInfo);
+    public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload,
+            final UriInfo uriInfo) {
+        this.rpc.incrementAndGet();
+        return this.delegate.invokeRpc(identifier, payload, uriInfo);
     }
 
     @Override
     public NormalizedNodeContext invokeRpc(final String identifier, final String noPayload, final UriInfo uriInfo) {
-        rpc.incrementAndGet();
-        return delegate.invokeRpc(identifier, noPayload, uriInfo);
+        this.rpc.incrementAndGet();
+        return this.delegate.invokeRpc(identifier, noPayload, uriInfo);
     }
 
     @Override
     public NormalizedNodeContext readConfigurationData(final String identifier, final UriInfo uriInfo) {
-        configGet.incrementAndGet();
+        this.configGet.incrementAndGet();
         NormalizedNodeContext normalizedNodeContext = null;
         try {
-            normalizedNodeContext = delegate.readConfigurationData(identifier, uriInfo);
+            normalizedNodeContext = this.delegate.readConfigurationData(identifier, uriInfo);
             if (normalizedNodeContext.getData() != null) {
-                successGetConfig.incrementAndGet();
+                this.successGetConfig.incrementAndGet();
             }
             else {
-                failureGetConfig.incrementAndGet();
+                this.failureGetConfig.incrementAndGet();
             }
-        } catch (Exception e) {
-            failureGetConfig.incrementAndGet();
+        } catch (final Exception e) {
+            this.failureGetConfig.incrementAndGet();
             throw e;
         }
         return normalizedNodeContext;
@@ -109,18 +110,18 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
 
     @Override
     public NormalizedNodeContext readOperationalData(final String identifier, final UriInfo uriInfo) {
-        operationalGet.incrementAndGet();
+        this.operationalGet.incrementAndGet();
         NormalizedNodeContext normalizedNodeContext = null;
         try {
-            normalizedNodeContext = delegate.readOperationalData(identifier, uriInfo);
+            normalizedNodeContext = this.delegate.readOperationalData(identifier, uriInfo);
             if (normalizedNodeContext.getData() != null) {
-                successGetOperational.incrementAndGet();
+                this.successGetOperational.incrementAndGet();
             }
             else {
-                failureGetOperational.incrementAndGet();
+                this.failureGetOperational.incrementAndGet();
             }
-        } catch (Exception e) {
-            failureGetOperational.incrementAndGet();
+        } catch (final Exception e) {
+            this.failureGetOperational.incrementAndGet();
             throw e;
         }
         return normalizedNodeContext;
@@ -128,37 +129,38 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
 
     @Override
     public Response updateConfigurationData(final String identifier, final NormalizedNodeContext payload) {
-        configPut.incrementAndGet();
+        this.configPut.incrementAndGet();
         Response response = null;
         try {
-            response = delegate.updateConfigurationData(identifier, payload);
+            response = this.delegate.updateConfigurationData(identifier, payload);
             if (response.getStatus() == Status.OK.getStatusCode()) {
-                successPut.incrementAndGet();
+                this.successPut.incrementAndGet();
             }
             else {
-                failurePut.incrementAndGet();
+                this.failurePut.incrementAndGet();
             }
-        } catch (Exception e) {
-            failurePut.incrementAndGet();
+        } catch (final Exception e) {
+            this.failurePut.incrementAndGet();
             throw e;
         }
         return response;
     }
 
     @Override
-    public Response createConfigurationData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) {
-        configPost.incrementAndGet();
+    public Response createConfigurationData(final String identifier, final NormalizedNodeContext payload,
+            final UriInfo uriInfo) {
+        this.configPost.incrementAndGet();
         Response response = null;
         try {
-            response = delegate.createConfigurationData(identifier, payload, uriInfo);
+            response = this.delegate.createConfigurationData(identifier, payload, uriInfo);
             if (response.getStatus() == Status.OK.getStatusCode()) {
-                successPost.incrementAndGet();
+                this.successPost.incrementAndGet();
             }
             else {
-                failurePost.incrementAndGet();
+                this.failurePost.incrementAndGet();
             }
-        } catch (Exception e) {
-            failurePost.incrementAndGet();
+        } catch (final Exception e) {
+            this.failurePost.incrementAndGet();
             throw e;
         }
         return response;
@@ -166,18 +168,18 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
 
     @Override
     public Response createConfigurationData(final NormalizedNodeContext payload, final UriInfo uriInfo) {
-        configPost.incrementAndGet();
+        this.configPost.incrementAndGet();
         Response response = null;
         try {
-            response = delegate.createConfigurationData(payload, uriInfo);
+            response = this.delegate.createConfigurationData(payload, uriInfo);
             if (response.getStatus() == Status.OK.getStatusCode()) {
-                successPost.incrementAndGet();
+                this.successPost.incrementAndGet();
             }
             else {
-                failurePost.incrementAndGet();
+                this.failurePost.incrementAndGet();
             }
-        }catch (Exception e) {
-            failurePost.incrementAndGet();
+        }catch (final Exception e) {
+            this.failurePost.incrementAndGet();
             throw e;
         }
         return response;
@@ -185,105 +187,105 @@ public class StatisticsRestconfServiceWrapper implements RestconfService {
 
     @Override
     public Response deleteConfigurationData(final String identifier) {
-        configDelete.incrementAndGet();
+        this.configDelete.incrementAndGet();
         Response response = null;
         try {
-            response = delegate.deleteConfigurationData(identifier);
+            response = this.delegate.deleteConfigurationData(identifier);
             if (response.getStatus() == Status.OK.getStatusCode()) {
-                successDelete.incrementAndGet();
+                this.successDelete.incrementAndGet();
             }
             else {
-                failureDelete.incrementAndGet();
+                this.failureDelete.incrementAndGet();
             }
-        } catch (Exception e) {
-            failureDelete.incrementAndGet();
+        } catch (final Exception e) {
+            this.failureDelete.incrementAndGet();
             throw e;
         }
         return response;
     }
 
     @Override
-    public Response subscribeToStream(final String identifier, final UriInfo uriInfo) {
-        return delegate.subscribeToStream(identifier, uriInfo);
+    public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) {
+        return this.delegate.subscribeToStream(identifier, uriInfo);
     }
 
     @Override
     public NormalizedNodeContext getAvailableStreams(final UriInfo uriInfo) {
-        return delegate.getAvailableStreams(uriInfo);
+        return this.delegate.getAvailableStreams(uriInfo);
     }
 
     @Override
-    public PATCHStatusContext patchConfigurationData(final String identifier, final PATCHContext payload, final UriInfo
-            uriInfo) {
-        return delegate.patchConfigurationData(identifier, payload, uriInfo);
+    public PATCHStatusContext patchConfigurationData(final String identifier, final PATCHContext payload,
+            final UriInfo uriInfo) {
+        return this.delegate.patchConfigurationData(identifier, payload, uriInfo);
     }
 
     @Override
     public PATCHStatusContext patchConfigurationData(final PATCHContext payload, final UriInfo uriInfo) {
-        return delegate.patchConfigurationData(payload, uriInfo);
+        return this.delegate.patchConfigurationData(payload, uriInfo);
     }
 
     public BigInteger getConfigDelete() {
-        return BigInteger.valueOf(configDelete.get());
+        return BigInteger.valueOf(this.configDelete.get());
     }
 
     public BigInteger getConfigGet() {
-        return BigInteger.valueOf(configGet.get());
+        return BigInteger.valueOf(this.configGet.get());
     }
 
     public BigInteger getConfigPost() {
-        return BigInteger.valueOf(configPost.get());
+        return BigInteger.valueOf(this.configPost.get());
     }
 
     public BigInteger getConfigPut() {
-        return BigInteger.valueOf(configPut.get());
+        return BigInteger.valueOf(this.configPut.get());
     }
 
     public BigInteger getOperationalGet() {
-        return BigInteger.valueOf(operationalGet.get());
+        return BigInteger.valueOf(this.operationalGet.get());
     }
 
     public BigInteger getRpc() {
-        return BigInteger.valueOf(rpc.get());
+        return BigInteger.valueOf(this.rpc.get());
     }
 
     public BigInteger getSuccessGetConfig() {
-        return BigInteger.valueOf(successGetConfig.get());
+        return BigInteger.valueOf(this.successGetConfig.get());
     }
 
     public BigInteger getSuccessGetOperational() {
-        return BigInteger.valueOf(successGetOperational.get());
+        return BigInteger.valueOf(this.successGetOperational.get());
     }
 
     public BigInteger getSuccessPost() {
-        return BigInteger.valueOf(successPost.get());
+        return BigInteger.valueOf(this.successPost.get());
     }
 
     public BigInteger getSuccessPut() {
-        return BigInteger.valueOf(successPut.get());
+        return BigInteger.valueOf(this.successPut.get());
     }
 
     public BigInteger getSuccessDelete() {
-        return BigInteger.valueOf(successDelete.get());
+        return BigInteger.valueOf(this.successDelete.get());
     }
 
     public BigInteger getFailureGetConfig() {
-        return BigInteger.valueOf(failureGetConfig.get());
+        return BigInteger.valueOf(this.failureGetConfig.get());
     }
 
     public BigInteger getFailureGetOperational() {
-        return BigInteger.valueOf(failureGetOperational.get());
+        return BigInteger.valueOf(this.failureGetOperational.get());
     }
 
     public BigInteger getFailurePost() {
-        return BigInteger.valueOf(failurePost.get());
+        return BigInteger.valueOf(this.failurePost.get());
     }
 
     public BigInteger getFailurePut() {
-        return BigInteger.valueOf(failurePut.get());
+        return BigInteger.valueOf(this.failurePut.get());
     }
 
     public BigInteger getFailureDelete() {
-        return BigInteger.valueOf(failureDelete.get());
+        return BigInteger.valueOf(this.failureDelete.get());
     }
 }
\ No newline at end of file
diff --git a/restconf/sal-rest-connector/src/main/yang/subscribe-to-notification.yang b/restconf/sal-rest-connector/src/main/yang/subscribe-to-notification.yang
new file mode 100644 (file)
index 0000000..5fe7df7
--- /dev/null
@@ -0,0 +1,18 @@
+module subscribe-to-notification {
+
+    yang-version 1;
+    namespace "subscribe:to:notification";
+    prefix "subs-to-notifi";
+
+    description
+        "Added input parameters to rpc create-data-change-event-subscription and to create-notification-stream";
+
+    revision "2016-10-28" {
+    }
+
+    container "notifi"{
+        leaf "location"{
+            type string;
+        }
+    }
+}
index 7c4b350c6cf622a3259dfe43b0d5c8d051991591..b0996bff5c07f7cf60855fbdbbf833788ec361b7 100644 (file)
@@ -16,7 +16,6 @@ import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.times;
 import static org.mockito.Mockito.verify;
 import static org.mockito.Mockito.when;
-
 import com.google.common.base.Optional;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
@@ -26,7 +25,6 @@ import java.net.URI;
 import java.text.ParseException;
 import java.util.Set;
 import javax.ws.rs.core.MultivaluedHashMap;
-import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 import org.junit.Before;
@@ -111,7 +109,8 @@ public class RestconfImplTest {
         doReturn(mount).when(iiCtx).getMountPoint();
         final DOMRpcService rpcService = mock(DOMRpcService.class);
         doReturn(Optional.of(rpcService)).when(mount).getService(DOMRpcService.class);
-        doReturn(Futures.immediateCheckedFuture(mock(DOMRpcResult.class))).when(rpcService).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class));
+        doReturn(Futures.immediateCheckedFuture(mock(DOMRpcResult.class))).when(rpcService)
+                .invokeRpc(any(SchemaPath.class), any(NormalizedNode.class));
         this.restconfImpl.invokeRpc("randomId", ctx, uriInfo);
         this.restconfImpl.invokeRpc("ietf-netconf", ctx, uriInfo);
         verify(rpcService, times(2)).invokeRpc(any(SchemaPath.class), any(NormalizedNode.class));
@@ -179,8 +178,7 @@ public class RestconfImplTest {
         this.restconfImpl.setBroker(brokerFacade);
 
         // subscribe to stream and verify response
-        final Response response = this.restconfImpl.subscribeToStream(identifier, uriInfo);
-        assertEquals(Response.Status.OK.getStatusCode(), response.getStatus());
+        final NormalizedNodeContext response = this.restconfImpl.subscribeToStream(identifier, uriInfo);
 
         // remove test notification stream
         Notificator.removeAllListeners();
diff --git a/restconf/sal-rest-connector/src/test/resources/full-versions/yangs/subscribe-to-notification.yang b/restconf/sal-rest-connector/src/test/resources/full-versions/yangs/subscribe-to-notification.yang
new file mode 100644 (file)
index 0000000..5fe7df7
--- /dev/null
@@ -0,0 +1,18 @@
+module subscribe-to-notification {
+
+    yang-version 1;
+    namespace "subscribe:to:notification";
+    prefix "subs-to-notifi";
+
+    description
+        "Added input parameters to rpc create-data-change-event-subscription and to create-notification-stream";
+
+    revision "2016-10-28" {
+    }
+
+    container "notifi"{
+        leaf "location"{
+            type string;
+        }
+    }
+}