From: Jakub Toth Date: Fri, 8 Sep 2017 16:27:32 +0000 (+0200) Subject: Split Restconf implementations (draft02 and RFC) - features X-Git-Tag: release/oxygen~73 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;h=7e47f4213d56d36fd83c0de1b1e317ee105a6048;hp=352559891fbfd6cd3ae9cacbc788b1a821b2a49e;p=netconf.git Split Restconf implementations (draft02 and RFC) - features * remove restconf rfc8040 implemetation from bierman02 * add features for restconf-nb-rfc8040 Change-Id: I96110d0721c39acdc88332e748f81de07fd5663d Signed-off-by: Jakub Toth --- diff --git a/features/restconf/features-restconf/pom.xml b/features/restconf/features-restconf/pom.xml index f7dfec3896..3309e3f0e0 100644 --- a/features/restconf/features-restconf/pom.xml +++ b/features/restconf/features-restconf/pom.xml @@ -52,5 +52,26 @@ xml features + + ${project.groupId} + odl-restconf-nb-rfc8040-noauth + ${project.version} + xml + features + + + ${project.groupId} + odl-restconf-nb-rfc8040 + ${project.version} + xml + features + + + ${project.groupId} + odl-restconf-nb-rfc8040-all + ${project.version} + xml + features + diff --git a/features/restconf/odl-restconf-nb-rfc8040-all/pom.xml b/features/restconf/odl-restconf-nb-rfc8040-all/pom.xml new file mode 100644 index 0000000000..245ffa88dc --- /dev/null +++ b/features/restconf/odl-restconf-nb-rfc8040-all/pom.xml @@ -0,0 +1,44 @@ + + + + 4.0.0 + + + org.opendaylight.odlparent + single-feature-parent + 2.0.4 + + + + org.opendaylight.netconf + odl-restconf-nb-rfc8040-all + 1.7.0-SNAPSHOT + feature + + OpenDaylight :: Restconf NB - RFC8040:: All + + + + ${project.groupId} + odl-restconf-nb-rfc8040 + ${project.version} + xml + features + + + ${project.groupId} + odl-mdsal-apidocs + ${project.version} + xml + features + + + diff --git a/features/restconf/odl-restconf-nb-rfc8040-noauth/pom.xml b/features/restconf/odl-restconf-nb-rfc8040-noauth/pom.xml new file mode 100644 index 0000000000..70429fcfa6 --- /dev/null +++ b/features/restconf/odl-restconf-nb-rfc8040-noauth/pom.xml @@ -0,0 +1,113 @@ + + + + 4.0.0 + + + org.opendaylight.odlparent + single-feature-parent + 2.0.4 + + + + org.opendaylight.netconf + odl-restconf-nb-rfc8040-noauth + 1.7.0-SNAPSHOT + feature + + OpenDaylight :: Restconf NB - RFC8040 + + + + + org.opendaylight.odlparent + odlparent-artifacts + 2.0.4 + pom + import + + + org.opendaylight.yangtools + yangtools-artifacts + 2.0.0-SNAPSHOT + pom + import + + + org.opendaylight.aaa + aaa-artifacts + 0.7.0-SNAPSHOT + pom + import + + + org.opendaylight.netconf + netconf-artifacts + 1.4.0-SNAPSHOT + pom + import + + + org.opendaylight.netconf + restconf-artifacts + 1.7.0-SNAPSHOT + pom + import + + + + + + + org.opendaylight.aaa + odl-aaa-shiro + 0.7.0-SNAPSHOT + xml + features + + + org.opendaylight.controller + odl-mdsal-broker + 1.7.0-SNAPSHOT + xml + features + + + org.opendaylight.odlparent + odl-netty-4 + xml + features + + + org.opendaylight.odlparent + odl-karaf-feat-jetty + xml + features + + + org.opendaylight.netconf + ietf-restconf + + + org.opendaylight.netconf + ietf-yang-library + + + org.opendaylight.netconf + ietf-restconf-monitoring + + + org.opendaylight.netconf + restconf-nb-rfc8040 + ${project.version} + + + diff --git a/features/restconf/odl-restconf-nb-rfc8040/pom.xml b/features/restconf/odl-restconf-nb-rfc8040/pom.xml new file mode 100644 index 0000000000..21a6690654 --- /dev/null +++ b/features/restconf/odl-restconf-nb-rfc8040/pom.xml @@ -0,0 +1,44 @@ + + + + 4.0.0 + + + org.opendaylight.odlparent + single-feature-parent + 2.0.4 + + + + org.opendaylight.netconf + odl-restconf-nb-rfc8040 + 1.7.0-SNAPSHOT + feature + + OpenDaylight :: Restconf NB - RFC8040 + + + + + + org.opendaylight.aaa + aaa-shiro-act + 0.7.0-SNAPSHOT + + + org.opendaylight.netconf + odl-restconf-nb-rfc8040-noauth + ${project.version} + xml + features + + + diff --git a/features/restconf/pom.xml b/features/restconf/pom.xml index b8ad535c5b..876f465a5e 100644 --- a/features/restconf/pom.xml +++ b/features/restconf/pom.xml @@ -26,6 +26,9 @@ odl-restconf odl-restconf-all odl-restconf-noauth + odl-restconf-nb-rfc8040-noauth + odl-restconf-nb-rfc8040 + odl-restconf-nb-rfc8040-all diff --git a/restconf/restconf-nb-bierman02/pom.xml b/restconf/restconf-nb-bierman02/pom.xml index b718970d74..168bcc2c42 100644 --- a/restconf/restconf-nb-bierman02/pom.xml +++ b/restconf/restconf-nb-bierman02/pom.xml @@ -235,7 +235,6 @@ MD SAL Restconf Connector org.opendaylight.netconf.sal.rest.*, - org.opendaylight.restconf.*, org.opendaylight.netconf.sal.restconf.rpc.*, org.opendaylight.netconf.sal.restconf.impl.*, org.opendaylight.netconf.md.sal.rest.common.*, diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaExportContentYangBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaExportContentYangBodyWriter.java index e9f77d1808..182224fb05 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaExportContentYangBodyWriter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaExportContentYangBodyWriter.java @@ -18,11 +18,10 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MultivaluedMap; import javax.ws.rs.ext.MessageBodyWriter; import javax.ws.rs.ext.Provider; -import org.opendaylight.restconf.Rfc8040; import org.opendaylight.restconf.common.schema.SchemaExportContext; @Provider -@Produces({ SchemaRetrievalService.YANG_MEDIA_TYPE, Rfc8040.MediaTypes.YANG }) +@Produces({ SchemaRetrievalService.YANG_MEDIA_TYPE }) public class SchemaExportContentYangBodyWriter implements MessageBodyWriter { @Override diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaRetrievalService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaRetrievalService.java index 88211411c2..660cbf0d32 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaRetrievalService.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/md/sal/rest/schema/SchemaRetrievalService.java @@ -12,14 +12,12 @@ import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.PathParam; import javax.ws.rs.Produces; -import org.opendaylight.restconf.base.services.api.RestconfSchemaService; import org.opendaylight.restconf.common.schema.SchemaExportContext; /** * Retrieval of the YANG modules which server supports. * - * @deprecated do not use this api. It is replaced by - * {@link RestconfSchemaService} + * @deprecated do not use this api. It is replaced by RestconfSchemaService */ @Deprecated @Beta diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/Draft02.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/Draft02.java index b860ef2d92..d36cad9ab9 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/Draft02.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/Draft02.java @@ -7,14 +7,12 @@ */ package org.opendaylight.netconf.sal.rest.api; -import org.opendaylight.restconf.Rfc8040; import org.opendaylight.yangtools.yang.common.QName; /** * Base Draft for Restconf project. * - * @deprecated Do not use old implementation of restconf draft. It will be - * replaced by {@link Rfc8040}. + * @deprecated Do not use old implementation of restconf draft. It will be replaced by Rfc8040. */ @Deprecated public class Draft02 { diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/RestconfService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/RestconfService.java index 43059042d0..cb72d328c8 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/RestconfService.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/api/RestconfService.java @@ -22,14 +22,10 @@ import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.opendaylight.netconf.sal.rest.api.Draft02.MediaTypes; -import org.opendaylight.restconf.base.services.api.RestconfOperationsService; import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.common.patch.Patch; import org.opendaylight.restconf.common.patch.PatchContext; import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.restful.services.api.RestconfDataService; -import org.opendaylight.restconf.restful.services.api.RestconfInvokeOperationsService; -import org.opendaylight.restconf.restful.services.api.RestconfStreamsSubscriptionService; /** * The URI hierarchy for the RESTCONF resources consists of an entry point @@ -66,10 +62,10 @@ public interface RestconfService { /** * Get all modules supported by controller. * - * @param uriInfo URI info + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(UriInfo) */ @Deprecated @GET @@ -81,11 +77,13 @@ public interface RestconfService { /** * Get all modules supported by mount point. * - * @param identifier mount point identifier - * @param uriInfo URI info + * @param identifier + * mount point identifier + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(String, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(String, + * UriInfo) */ @Deprecated @GET @@ -97,11 +95,13 @@ public interface RestconfService { /** * Get module. * - * @param identifier path to target - * @param uriInfo URI info + * @param identifier + * path to target + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(String, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(String, + * UriInfo) */ @Deprecated @GET @@ -113,10 +113,11 @@ public interface RestconfService { /** * List of rpc or action operations supported by the server. * - * @param uriInfo URI information + * @param uriInfo + * URI information * @return {@link NormalizedNodeContext} * @deprecated do not use this method. It will be replaced by - * {@link RestconfOperationsService#getOperations(UriInfo)} + * RestconfOperationsService#getOperations(UriInfo) */ @Deprecated @GET @@ -128,11 +129,13 @@ public interface RestconfService { /** * Valid for mount points. List of operations supported by the server. * - * @param identifier path parameter - * @param uriInfo URI information + * @param identifier + * path parameter + * @param uriInfo + * URI information * @return {@link NormalizedNodeContext} * @deprecated do not use this method. It will be replaced by - * {@link RestconfOperationsService#getOperations(String, UriInfo)} + * RestconfOperationsService#getOperations(String, UriInfo) */ @Deprecated @GET @@ -144,12 +147,15 @@ public interface RestconfService { /** * Invoke RPC operation. * - * @param identifier module name and rpc identifier string for the desired operation - * @param payload {@link NormalizedNodeContext} - the body of the operation - * @param uriInfo URI info + * @param identifier + * module name and rpc identifier string for the desired operation + * @param payload + * {@link NormalizedNodeContext} - the body of the operation + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} * @deprecated do not use this method. It will be replaced by - * {@link RestconfInvokeOperationsService#invokeRpc(String, NormalizedNodeContext, UriInfo)} + * RestconfInvokeOperationsService#invokeRpc(String, NormalizedNodeContext, UriInfo) */ @Deprecated @POST @@ -184,11 +190,13 @@ public interface RestconfService { /** * Get target data resource from config data store. * - * @param identifier path to target - * @param uriInfo URI info + * @param identifier + * path to target + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(String, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(String, + * UriInfo) */ @Deprecated @GET @@ -201,11 +209,13 @@ public interface RestconfService { /** * Get target data resource from operational data store. * - * @param identifier path to target - * @param uriInfo URI info + * @param identifier + * path to target + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(String, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(String, + * UriInfo) */ @Deprecated @GET @@ -218,11 +228,13 @@ public interface RestconfService { /** * Create or replace the target data resource. * - * @param identifier path to target - * @param payload data node for put to config DS + * @param identifier + * path to target + * @param payload + * data node for put to config DS * @return {@link Response} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#putData(String, NormalizedNodeContext, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#putData(String, + * NormalizedNodeContext, UriInfo) */ @Deprecated @PUT @@ -235,12 +247,15 @@ public interface RestconfService { /** * Create a data resource in target. * - * @param identifier path to target - * @param payload new data - * @param uriInfo URI info + * @param identifier + * path to target + * @param payload + * new data + * @param uriInfo + * URI info * @return {@link Response} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#postData(String, NormalizedNodeContext, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#postData(String, + * NormalizedNodeContext, UriInfo) */ @Deprecated @POST @@ -253,11 +268,13 @@ public interface RestconfService { /** * Create a data resource. * - * @param payload new data - * @param uriInfo URI info + * @param payload + * new data + * @param uriInfo + * URI info * @return {@link Response} * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#postData(NormalizedNodeContext, UriInfo)} + * RestconfDataService#postData(NormalizedNodeContext, UriInfo) */ @Deprecated @POST @@ -269,10 +286,10 @@ public interface RestconfService { /** * Delete the target data resource. * - * @param identifier path to target + * @param identifier + * path to target * @return {@link Response} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#deleteData(String)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#deleteData(String) */ @Deprecated @DELETE @@ -282,11 +299,13 @@ public interface RestconfService { /** * Subscribe to stream. * - * @param identifier stream identifier - * @param uriInfo URI info + * @param identifier + * stream identifier + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} * @deprecated do not use this method. It will be replaced by - * {@link RestconfStreamsSubscriptionService#subscribeToStream(String, UriInfo)} + * RestconfStreamsSubscriptionService#subscribeToStream(String, UriInfo) */ @Deprecated @GET @@ -297,10 +316,11 @@ public interface RestconfService { /** * Get list of all streams. * - * @param uriInfo URI info + * @param uriInfo + * URI info * @return {@link NormalizedNodeContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#readData(String, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#readData(String, + * UriInfo) **/ @Deprecated @GET @@ -312,12 +332,15 @@ public interface RestconfService { /** * Ordered list of edits that are applied to the target datastore by the server. * - * @param identifier path to target - * @param context edits - * @param uriInfo URI info + * @param identifier + * path to target + * @param context + * edits + * @param uriInfo + * URI info * @return {@link PatchStatusContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#patchData(String, PatchContext, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#patchData(String, + * PatchContext, UriInfo) */ @Deprecated @Patch @@ -330,11 +353,13 @@ public interface RestconfService { /** * Ordered list of edits that are applied to the datastore by the server. * - * @param context edits - * @param uriInfo URI info + * @param context + * edits + * @param uriInfo + * URI info * @return {@link PatchStatusContext} - * @deprecated do not use this method. It will be replaced by - * {@link RestconfDataService#patchData(PatchContext, UriInfo)} + * @deprecated do not use this method. It will be replaced by RestconfDataService#patchData(PatchContext, + * UriInfo) */ @Deprecated @Patch diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/AbstractIdentifierAwareJaxRsProvider.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/AbstractIdentifierAwareJaxRsProvider.java index e5b8cc9738..095e73c952 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/AbstractIdentifierAwareJaxRsProvider.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/AbstractIdentifierAwareJaxRsProvider.java @@ -18,8 +18,7 @@ import org.opendaylight.restconf.common.context.InstanceIdentifierContext; /** * JAX-RS Provider. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.AbstractIdentifierAwareJaxRsProvider} + * @deprecated This class will be replaced by AbstractIdentifierAwareJaxRsProvider in restconf-nb-rfc8040 */ @Deprecated public class AbstractIdentifierAwareJaxRsProvider { diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/DepthAwareNormalizedNodeWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/DepthAwareNormalizedNodeWriter.java index 37f6cea601..7b088f69e7 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/DepthAwareNormalizedNodeWriter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/DepthAwareNormalizedNodeWriter.java @@ -39,13 +39,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * This is an experimental iterator over a {@link NormalizedNode}. This is essentially - * the opposite of a {@link javax.xml.stream.XMLStreamReader} -- unlike instantiating an iterator over - * the backing data, this encapsulates a {@link NormalizedNodeStreamWriter} and allows - * us to write multiple nodes. + * This is an experimental iterator over a {@link NormalizedNode}. This is essentially the opposite of a + * {@link javax.xml.stream.XMLStreamReader} -- unlike instantiating an iterator over the backing data, this + * encapsulates a {@link NormalizedNodeStreamWriter} and allows us to write multiple nodes. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.ParameterAwareNormalizedNodeWriter} + * @deprecated This class will be replaced by ParameterAwareNormalizedNodeWriter in restconf-nb-rfc8040 */ @Deprecated public class DepthAwareNormalizedNodeWriter implements RestconfNormalizedNodeWriter { @@ -177,7 +175,7 @@ public class DepthAwareNormalizedNodeWriter implements RestconfNormalizedNodeWri */ protected final boolean writeChildren(final Iterable> children) throws IOException { if (currentDepth < maxDepth) { - for (NormalizedNode child : children) { + for (final NormalizedNode child : children) { write(child); } } @@ -195,7 +193,7 @@ public class DepthAwareNormalizedNodeWriter implements RestconfNormalizedNodeWri } private void writeOnlyKeys(final Map keyValues) throws IllegalArgumentException, IOException { - for (Map.Entry entry : keyValues.entrySet()) { + for (final Map.Entry entry : keyValues.entrySet()) { writer.leafNode(new NodeIdentifier(entry.getKey()), entry.getValue()); } writer.endNode(); @@ -290,7 +288,7 @@ public class DepthAwareNormalizedNodeWriter implements RestconfNormalizedNodeWri final Set qnames = node.getIdentifier().getKeyValues().keySet(); // Write out all the key children - for (QName qname : qnames) { + for (final QName qname : qnames) { final Optional> child = node.getChild(new NodeIdentifier(qname)); if (child.isPresent()) { write(child.get()); @@ -301,7 +299,7 @@ public class DepthAwareNormalizedNodeWriter implements RestconfNormalizedNodeWri // Write all the rest currentDepth++; - boolean result = writeChildren(Iterables.filter(node.getValue(), input -> { + final boolean result = writeChildren(Iterables.filter(node.getValue(), input -> { if (input instanceof AugmentationNode) { return true; } diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java index e520043882..f02de61459 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonNormalizedNodeBodyReader.java @@ -30,7 +30,6 @@ import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.RestconfConstants; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; @@ -71,13 +70,6 @@ public class JsonNormalizedNodeBodyReader final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException { try { - if (getUriInfo().getAbsolutePath().getPath().contains(RestconfConstants.DRAFT_PATTERN)) { - final org.opendaylight.restconf.jersey.providers.JsonNormalizedNodeBodyReader jsonReaderNewRest = - new org.opendaylight.restconf.jersey.providers.JsonNormalizedNodeBodyReader(); - jsonReaderNewRest.injectParams(getUriInfo(), getRequest()); - return jsonReaderNewRest.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream); - } - return readFrom(getInstanceIdentifierContext(), entityStream, isPost()); } catch (final Exception e) { propagateExceptionAs(e); diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonToPatchBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonToPatchBodyReader.java index 326a06b8f4..da36eefeb1 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonToPatchBodyReader.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/JsonToPatchBodyReader.java @@ -52,8 +52,7 @@ import org.slf4j.LoggerFactory; /** * Patch reader for JSON. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.JsonToPatchBodyReader} + * @deprecated This class will be replaced by JsonToPatchBodyReader in restconf-nb-rfc8040 */ @Deprecated @Provider diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java index f2fd7153c3..434233caf7 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeJsonBodyWriter.java @@ -47,8 +47,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; /** * Normalized node writer for JSON. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.NormalizedNodeJsonBodyWriter} + * @deprecated This class will be replaced by NormalizedNodeJsonBodyWriter from restconf-nb-rfc8040 */ @Deprecated @Provider diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java index 6cd90934ac..7db0081ca5 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/NormalizedNodeXmlBodyWriter.java @@ -46,8 +46,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath; /** * Normalized node writer for XML. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.NormalizedNodeXmlBodyWriter} + * @deprecated This class will be replaced by NormalizedNodeXmlBodyWriter from restconf-nb-rfc8040 */ @Deprecated @Provider diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/StringModuleInstanceIdentifierCodec.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/StringModuleInstanceIdentifierCodec.java index f119a148e3..f4833c07c6 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/StringModuleInstanceIdentifierCodec.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/StringModuleInstanceIdentifierCodec.java @@ -20,8 +20,7 @@ import org.opendaylight.yangtools.yang.model.api.SchemaContext; /** * Codec for module instance identifiers. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.StringModuleInstanceIdentifierCodec} + * @deprecated This class will be replaced by StringModuleInstanceIdentifierCodec from restconf-nb-rfc8040 */ @Deprecated public final class StringModuleInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec { diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java index b4f81b0239..e4f114f0ea 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlNormalizedNodeBodyReader.java @@ -35,7 +35,6 @@ import org.opendaylight.restconf.common.context.NormalizedNodeContext; import org.opendaylight.restconf.common.errors.RestconfDocumentedException; import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.RestconfConstants; import org.opendaylight.yangtools.util.xml.UntrustedXML; import org.opendaylight.yangtools.yang.common.QName; import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; @@ -83,14 +82,7 @@ public class XmlNormalizedNodeBodyReader extends AbstractIdentifierAwareJaxRsPro final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, WebApplicationException { try { - if (getUriInfo().getAbsolutePath().getPath().contains(RestconfConstants.DRAFT_PATTERN)) { - final org.opendaylight.restconf.jersey.providers.XmlNormalizedNodeBodyReader xmlReaderNewRest = - new org.opendaylight.restconf.jersey.providers.XmlNormalizedNodeBodyReader(); - xmlReaderNewRest.injectParams(getUriInfo(), getRequest()); - return xmlReaderNewRest.readFrom(type, genericType, annotations, mediaType, httpHeaders, entityStream); - } else { - return readFrom(entityStream); - } + return readFrom(entityStream); } catch (final RestconfDocumentedException e) { throw e; } catch (final Exception e) { diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlToPatchBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlToPatchBodyReader.java index f3841a90f6..56e3733fa0 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlToPatchBodyReader.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/rest/impl/XmlToPatchBodyReader.java @@ -65,8 +65,7 @@ import org.xml.sax.SAXException; /** * Yang PATCH Reader for XML. * - * @deprecated This class will be replaced by - * {@link org.opendaylight.restconf.jersey.providers.XmlToPatchBodyReader} + * @deprecated This class will be replaced by XmlToPatchBodyReader from restconf-nb-rfc8040 */ @Deprecated @Provider diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceDraft18.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceDraft18.java deleted file mode 100644 index c833402745..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceDraft18.java +++ /dev/null @@ -1,364 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.netconf.sal.restconf.impl; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import java.io.ByteArrayInputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.lang.annotation.Annotation; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.Collections; -import java.util.List; -import javax.annotation.Nullable; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedHashMap; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.PathSegment; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.netconf.sal.restconf.api.JSONRestconfService; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.jersey.providers.JsonNormalizedNodeBodyReader; -import org.opendaylight.restconf.jersey.providers.NormalizedNodeJsonBodyWriter; -import org.opendaylight.restconf.restful.services.api.TransactionServicesWrapper; -import org.opendaylight.restconf.restful.utils.RestconfDataServiceConstant; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.common.OperationFailedException; -import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcError.ErrorType; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of the JSONRestconfService interface using the restconf Draft18 implementation. - * - * @author Thomas Pantelis - */ -public class JSONRestconfServiceDraft18 implements JSONRestconfService, AutoCloseable { - private static final Logger LOG = LoggerFactory.getLogger(JSONRestconfServiceDraft18.class); - - private static final Annotation[] EMPTY_ANNOTATIONS = new Annotation[0]; - - private final TransactionServicesWrapper services; - private final DOMMountPointServiceHandler mountPointServiceHandler; - - public JSONRestconfServiceDraft18(final TransactionServicesWrapper services, - final DOMMountPointServiceHandler mountPointServiceHandler) { - this.services = services; - this.mountPointServiceHandler = mountPointServiceHandler; - } - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - public void put(final String uriPath, final String payload) throws OperationFailedException { - Preconditions.checkNotNull(payload, "payload can't be null"); - - LOG.debug("put: uriPath: {}, payload: {}", uriPath, payload); - - final NormalizedNodeContext context = toNormalizedNodeContext(uriPath, payload, false); - - LOG.debug("Parsed YangInstanceIdentifier: {}", context.getInstanceIdentifierContext().getInstanceIdentifier()); - LOG.debug("Parsed NormalizedNode: {}", context.getData()); - - try { - services.putData(uriPath, context, new SimpleUriInfo(uriPath)); - } catch (final Exception e) { - propagateExceptionAs(uriPath, e, "PUT"); - } - } - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - public void post(final String uriPath, final String payload) - throws OperationFailedException { - Preconditions.checkNotNull(payload, "payload can't be null"); - - LOG.debug("post: uriPath: {}, payload: {}", uriPath, payload); - - final NormalizedNodeContext context = toNormalizedNodeContext(uriPath, payload, true); - - LOG.debug("Parsed YangInstanceIdentifier: {}", context.getInstanceIdentifierContext().getInstanceIdentifier()); - LOG.debug("Parsed NormalizedNode: {}", context.getData()); - - try { - services.postData(uriPath, context, new SimpleUriInfo(uriPath)); - } catch (final Exception e) { - propagateExceptionAs(uriPath, e, "POST"); - } - } - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - public void delete(final String uriPath) throws OperationFailedException { - LOG.debug("delete: uriPath: {}", uriPath); - - try { - services.deleteData(uriPath); - } catch (final Exception e) { - propagateExceptionAs(uriPath, e, "DELETE"); - } - } - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - public Optional get(final String uriPath, final LogicalDatastoreType datastoreType) - throws OperationFailedException { - LOG.debug("get: uriPath: {}", uriPath); - - try { - final MultivaluedMap queryParams = new MultivaluedHashMap<>(); - queryParams.putSingle(RestconfDataServiceConstant.ReadData.CONTENT, - datastoreType == LogicalDatastoreType.CONFIGURATION ? RestconfDataServiceConstant.ReadData.CONFIG : - RestconfDataServiceConstant.ReadData.NONCONFIG); - - final Response response = services.readData(uriPath, new SimpleUriInfo(uriPath, queryParams)); - NormalizedNodeContext readData = (NormalizedNodeContext) response.getEntity(); - - final Optional result = Optional.of(toJson(readData)); - - LOG.debug("get returning: {}", result.get()); - - return result; - } catch (final Exception e) { - if (!isDataMissing(e)) { - propagateExceptionAs(uriPath, e, "GET"); - } - - LOG.debug("Data missing - returning absent"); - return Optional.absent(); - } - } - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - public Optional invokeRpc(final String uriPath, final Optional input) - throws OperationFailedException { - Preconditions.checkNotNull(uriPath, "uriPath can't be null"); - - final String actualInput = input.isPresent() ? input.get() : null; - - LOG.debug("invokeRpc: uriPath: {}, input: {}", uriPath, actualInput); - - String output = null; - try { - final NormalizedNodeContext inputContext = toNormalizedNodeContext(uriPath, actualInput, true); - - LOG.debug("Parsed YangInstanceIdentifier: {}", inputContext.getInstanceIdentifierContext() - .getInstanceIdentifier()); - LOG.debug("Parsed NormalizedNode: {}", inputContext.getData()); - - NormalizedNodeContext outputContext = services.invokeRpc(uriPath, inputContext, new SimpleUriInfo(uriPath)); - - if (outputContext.getData() != null) { - output = toJson(outputContext); - } - } catch (final Exception e) { - propagateExceptionAs(uriPath, e, "RPC"); - } - - return Optional.fromNullable(output); - } - - @Override - public void close() { - } - - private NormalizedNodeContext toNormalizedNodeContext(final String uriPath, @Nullable final String payload, - final boolean isPost) throws OperationFailedException { - final InstanceIdentifierContext instanceIdentifierContext = ParserIdentifier.toInstanceIdentifier( - uriPath, ControllerContext.getInstance().getGlobalSchema(), - Optional.of(mountPointServiceHandler.get())); - - if (payload == null) { - return new NormalizedNodeContext(instanceIdentifierContext, null); - } - - final InputStream entityStream = new ByteArrayInputStream(payload.getBytes(StandardCharsets.UTF_8)); - try { - return JsonNormalizedNodeBodyReader.readFrom(instanceIdentifierContext, entityStream, isPost); - } catch (IOException e) { - propagateExceptionAs(uriPath, e, "GET"); - return null; - } - } - - private static String toJson(final NormalizedNodeContext readData) throws IOException { - final NormalizedNodeJsonBodyWriter writer = new NormalizedNodeJsonBodyWriter(); - final ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); - writer.writeTo(readData, NormalizedNodeContext.class, null, EMPTY_ANNOTATIONS, - MediaType.APPLICATION_JSON_TYPE, null, outputStream); - return outputStream.toString(StandardCharsets.UTF_8.name()); - } - - private static boolean isDataMissing(final Exception exception) { - if (exception instanceof RestconfDocumentedException) { - final RestconfDocumentedException rde = (RestconfDocumentedException)exception; - return !rde.getErrors().isEmpty() && rde.getErrors().get(0).getErrorTag() == ErrorTag.DATA_MISSING; - } - - return false; - } - - private static void propagateExceptionAs(final String uriPath, final Exception exception, final String operation) - throws OperationFailedException { - LOG.debug("Error for uriPath: {}", uriPath, exception); - - if (exception instanceof RestconfDocumentedException) { - throw new OperationFailedException(String.format( - "%s failed for URI %s", operation, uriPath), exception.getCause(), - toRpcErrors(((RestconfDocumentedException)exception).getErrors())); - } - - throw new OperationFailedException(String.format("%s failed for URI %s", operation, uriPath), exception); - } - - private static RpcError[] toRpcErrors(final List from) { - final RpcError[] to = new RpcError[from.size()]; - int index = 0; - for (final RestconfError e: from) { - to[index++] = RpcResultBuilder.newError(toRpcErrorType(e.getErrorType()), e.getErrorTag().getTagValue(), - e.getErrorMessage()); - } - - return to; - } - - private static ErrorType toRpcErrorType(final RestconfError.ErrorType errorType) { - switch (errorType) { - case TRANSPORT: - return ErrorType.TRANSPORT; - case RPC: - return ErrorType.RPC; - case PROTOCOL: - return ErrorType.PROTOCOL; - default: - return ErrorType.APPLICATION; - } - } - - private static class SimpleUriInfo implements UriInfo { - private final String path; - private final MultivaluedMap queryParams; - - SimpleUriInfo(String path) { - this(path, new MultivaluedHashMap<>()); - } - - SimpleUriInfo(String path, MultivaluedMap queryParams) { - this.path = path; - this.queryParams = queryParams; - } - - @Override - public String getPath() { - return path; - } - - @Override - public String getPath(boolean decode) { - return path; - } - - @Override - public List getPathSegments() { - throw new UnsupportedOperationException(); - } - - @Override - public List getPathSegments(boolean decode) { - throw new UnsupportedOperationException(); - } - - @Override - public URI getRequestUri() { - return URI.create(path); - } - - @Override - public UriBuilder getRequestUriBuilder() { - return UriBuilder.fromUri(getRequestUri()); - } - - @Override - public URI getAbsolutePath() { - return getRequestUri(); - } - - @Override - public UriBuilder getAbsolutePathBuilder() { - return UriBuilder.fromUri(getAbsolutePath()); - } - - @Override - public URI getBaseUri() { - return URI.create(""); - } - - @Override - public UriBuilder getBaseUriBuilder() { - return UriBuilder.fromUri(getBaseUri()); - } - - @Override - public MultivaluedMap getPathParameters() { - return new MultivaluedHashMap<>(); - } - - @Override - public MultivaluedMap getPathParameters(boolean decode) { - return getPathParameters(); - } - - @Override - public MultivaluedMap getQueryParameters() { - return queryParams; - } - - @Override - public MultivaluedMap getQueryParameters(boolean decode) { - return getQueryParameters(); - } - - @Override - public List getMatchedURIs() { - return Collections.emptyList(); - } - - @Override - public List getMatchedURIs(boolean decode) { - return getMatchedURIs(); - } - - @Override - public List getMatchedResources() { - return Collections.emptyList(); - } - - @Override - public URI resolve(URI uri) { - return uri; - } - - @Override - public URI relativize(URI uri) { - return uri; - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceImpl.java index 5ad10f0d1a..178166a6cd 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceImpl.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/restconf/impl/JSONRestconfServiceImpl.java @@ -43,7 +43,7 @@ import org.slf4j.LoggerFactory; * Implementation of the JSONRestconfService interface using the restconf Draft02 implementation. * * @author Thomas Pantelis - * @deprecated Replaced by {@link JSONRestconfServiceDraft18} + * @deprecated Replaced by {JSONRestconfServiceDraft18 from restconf-nb-rfc8040 */ @Deprecated public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseable { @@ -242,11 +242,11 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab private final String path; private final MultivaluedMap queryParams; - SimpleUriInfo(String path) { + SimpleUriInfo(final String path) { this(path, new MultivaluedHashMap<>()); } - SimpleUriInfo(String path, MultivaluedMap queryParams) { + SimpleUriInfo(final String path, final MultivaluedMap queryParams) { this.path = path; this.queryParams = queryParams; } @@ -257,7 +257,7 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public String getPath(boolean decode) { + public String getPath(final boolean decode) { return path; } @@ -267,7 +267,7 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public List getPathSegments(boolean decode) { + public List getPathSegments(final boolean decode) { throw new UnsupportedOperationException(); } @@ -307,7 +307,7 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public MultivaluedMap getPathParameters(boolean decode) { + public MultivaluedMap getPathParameters(final boolean decode) { return getPathParameters(); } @@ -317,7 +317,7 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public MultivaluedMap getQueryParameters(boolean decode) { + public MultivaluedMap getQueryParameters(final boolean decode) { return getQueryParameters(); } @@ -327,7 +327,7 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public List getMatchedURIs(boolean decode) { + public List getMatchedURIs(final boolean decode) { return getMatchedURIs(); } @@ -337,12 +337,12 @@ public class JSONRestconfServiceImpl implements JSONRestconfService, AutoCloseab } @Override - public URI resolve(URI uri) { + public URI resolve(final URI uri) { return uri; } @Override - public URI relativize(URI uri) { + public URI relativize(final URI uri) { return uri; } } diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractCommonSubscriber.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractCommonSubscriber.java index 67cffe212a..55ea16db73 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractCommonSubscriber.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractCommonSubscriber.java @@ -53,8 +53,6 @@ abstract class AbstractCommonSubscriber extends AbstractQueryParams implements B public final void close() throws Exception { this.registration.close(); this.registration = null; - - deleteDataInDS(); unregister(); } diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractNotificationsData.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractNotificationsData.java index 8b548ade59..02f537066e 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractNotificationsData.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/AbstractNotificationsData.java @@ -24,14 +24,7 @@ import javax.xml.transform.TransformerFactory; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.dom.DOMSource; import javax.xml.transform.stream.StreamResult; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.restconf.Rfc8040.MonitoringModule; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.restconf.parser.IdentifierCodec; import org.opendaylight.yangtools.util.xml.UntrustedXML; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeWriter; @@ -52,46 +45,6 @@ abstract class AbstractNotificationsData { private static final TransformerFactory TF = TransformerFactory.newInstance(); private static final XMLOutputFactory OF = XMLOutputFactory.newFactory(); - private TransactionChainHandler transactionChainHandler; - private SchemaContextHandler schemaHandler; - private String localName; - - /** - * Transaction chain for delete data in DS on close(). - * - * @param transactionChainHandler - * creating new write transaction for delete data on close - * @param schemaHandler - * for getting schema to deserialize - * {@link MonitoringModule#PATH_TO_STREAM_WITHOUT_KEY} to - * {@link YangInstanceIdentifier} - */ - public void setCloseVars(final TransactionChainHandler transactionChainHandler, - final SchemaContextHandler schemaHandler) { - this.transactionChainHandler = transactionChainHandler; - this.schemaHandler = schemaHandler; - } - - /** - * Delete data in DS. - */ - protected void deleteDataInDS() throws Exception { - final DOMDataWriteTransaction wTx = this.transactionChainHandler.get().newWriteOnlyTransaction(); - wTx.delete(LogicalDatastoreType.OPERATIONAL, IdentifierCodec - .deserialize(MonitoringModule.PATH_TO_STREAM_WITHOUT_KEY + this.localName, this.schemaHandler.get())); - wTx.submit().checkedGet(); - } - - /** - * Set localName of last path element of specific listener. - * - * @param localName - * local name - */ - protected void setLocalNameOfPath(final String localName) { - this.localName = localName; - } - /** * Formats data specified by RFC3339. * @@ -191,7 +144,7 @@ abstract class AbstractNotificationsData { transformer.setOutputProperty(OutputKeys.ENCODING, "UTF-8"); transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "4"); transformer.transform(new DOMSource(doc), new StreamResult(out)); - } catch (TransformerException e) { + } catch (final TransformerException e) { // FIXME: this should raise an exception final String msg = "Error during transformation of Document into String"; LOG.error(msg, e); diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/ListenerAdapter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/ListenerAdapter.java index 44f6a06924..e6e27ccb70 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/ListenerAdapter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/ListenerAdapter.java @@ -67,8 +67,6 @@ public class ListenerAdapter extends AbstractCommonSubscriber implements DOMData final NotificationOutputType outputType) { super(); register(this); - setLocalNameOfPath(path.getLastPathArgument().getNodeType().getLocalName()); - this.outputType = Preconditions.checkNotNull(outputType); this.path = Preconditions.checkNotNull(path); Preconditions.checkArgument((streamName != null) && !streamName.isEmpty()); diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/NotificationListenerAdapter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/NotificationListenerAdapter.java index 81405e1f73..eda5b84f94 100644 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/NotificationListenerAdapter.java +++ b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/netconf/sal/streams/listeners/NotificationListenerAdapter.java @@ -68,8 +68,6 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem NotificationListenerAdapter(final SchemaPath path, final String streamName, final String outputType) { super(); register(this); - setLocalNameOfPath(path.getLastComponent().getLocalName()); - this.outputType = Preconditions.checkNotNull(outputType); this.path = Preconditions.checkNotNull(path); Preconditions.checkArgument(streamName != null && !streamName.isEmpty()); @@ -138,8 +136,8 @@ public class NotificationListenerAdapter extends AbstractCommonSubscriber implem */ @VisibleForTesting String prepareJson() { - JsonParser jsonParser = new JsonParser(); - JsonObject json = new JsonObject(); + final JsonParser jsonParser = new JsonParser(); + final JsonObject json = new JsonObject(); json.add("ietf-restconf:notification", jsonParser.parse(writeBodyToString())); json.addProperty("event-time", ListenerAdapter.toRFC3339(Instant.now())); return json.toString(); diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestConnectorProvider.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestConnectorProvider.java deleted file mode 100644 index 171d89bf2d..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestConnectorProvider.java +++ /dev/null @@ -1,148 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf; - -import com.google.common.base.Preconditions; -import org.opendaylight.controller.md.sal.common.api.data.AsyncTransaction; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChain; -import org.opendaylight.controller.md.sal.common.api.data.TransactionChainListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; -import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.sal.core.api.model.SchemaService; -import org.opendaylight.netconf.sal.rest.api.RestConnector; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.wrapper.services.ServicesWrapperImpl; -import org.opendaylight.restconf.handlers.DOMDataBrokerHandler; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.NotificationServiceHandler; -import org.opendaylight.restconf.handlers.RpcServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Provider for restconf draft18. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestConnectorProvider implements RestConnector, AutoCloseable { - - private static final Logger LOG = LoggerFactory.getLogger(RestConnectorProvider.class); - - public static final TransactionChainListener TRANSACTION_CHAIN_LISTENER = new TransactionChainListener() { - @Override - public void onTransactionChainFailed(final TransactionChain chain, - final AsyncTransaction transaction, final Throwable cause) { - LOG.warn("TransactionChain({}) {} FAILED!", chain, transaction.getIdentifier(), cause); - resetTransactionChainForAdapaters(chain); - throw new RestconfDocumentedException("TransactionChain(" + chain + ") not committed correctly", cause); - } - - @Override - public void onTransactionChainSuccessful(final TransactionChain chain) { - LOG.trace("TransactionChain({}) {} SUCCESSFUL", chain); - } - }; - - private static TransactionChainHandler transactionChainHandler; - private static DOMDataBroker dataBroker; - private static DOMMountPointServiceHandler mountPointServiceHandler; - - private final SchemaService schemaService; - private final DOMRpcService rpcService; - private final DOMNotificationService notificationService; - private final DOMMountPointService mountPointService; - private ListenerRegistration listenerRegistration; - - private SchemaContextHandler schemaCtxHandler; - - public RestConnectorProvider(final DOMDataBroker domDataBroker, final SchemaService schemaService, - final DOMRpcService rpcService, final DOMNotificationService notificationService, - final DOMMountPointService mountPointService) { - this.schemaService = Preconditions.checkNotNull(schemaService); - this.rpcService = Preconditions.checkNotNull(rpcService); - this.notificationService = Preconditions.checkNotNull(notificationService); - this.mountPointService = Preconditions.checkNotNull(mountPointService); - - RestConnectorProvider.dataBroker = Preconditions.checkNotNull(domDataBroker); - } - - public void start() { - final ServicesWrapperImpl wrapperServices = ServicesWrapperImpl.getInstance(); - - mountPointServiceHandler = new DOMMountPointServiceHandler(mountPointService); - - final DOMDataBrokerHandler brokerHandler = new DOMDataBrokerHandler(dataBroker); - - RestConnectorProvider.transactionChainHandler = new TransactionChainHandler(dataBroker - .createTransactionChain(RestConnectorProvider.TRANSACTION_CHAIN_LISTENER)); - - this.schemaCtxHandler = new SchemaContextHandler(transactionChainHandler); - this.listenerRegistration = schemaService.registerSchemaContextListener(this.schemaCtxHandler); - - final RpcServiceHandler rpcServiceHandler = new RpcServiceHandler(rpcService); - - final NotificationServiceHandler notificationServiceHandler = - new NotificationServiceHandler(notificationService); - - wrapperServices.setHandlers(this.schemaCtxHandler, RestConnectorProvider.mountPointServiceHandler, - RestConnectorProvider.transactionChainHandler, brokerHandler, rpcServiceHandler, - notificationServiceHandler); - } - - public DOMMountPointServiceHandler getMountPointServiceHandler() { - return mountPointServiceHandler; - } - - /** - * After {@link TransactionChain} failed, this updates {@link TransactionChainHandler} with new transaction chain. - * - * @param chain - * old {@link TransactionChain} - */ - public static void resetTransactionChainForAdapaters(final TransactionChain chain) { - LOG.trace("Resetting TransactionChain({})", chain); - chain.close(); - RestConnectorProvider.transactionChainHandler.update( - Preconditions.checkNotNull(dataBroker).createTransactionChain( - RestConnectorProvider.TRANSACTION_CHAIN_LISTENER) - ); - } - - /** - * Get current {@link DOMMountPointService} from {@link DOMMountPointServiceHandler}. - * @return {@link DOMMountPointService} - */ - public static DOMMountPointService getMountPointService() { - return mountPointServiceHandler.get(); - } - - @Override - public void close() throws Exception { - // close registration - if (this.listenerRegistration != null) { - this.listenerRegistration.close(); - } - - // close transaction chain - if (transactionChainHandler != null && transactionChainHandler.get() != null) { - transactionChainHandler.get().close(); - } - - transactionChainHandler = null; - mountPointServiceHandler = null; - dataBroker = null; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestconfApplication.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestconfApplication.java deleted file mode 100644 index 47a8e01761..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/RestconfApplication.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf; - -import com.google.common.collect.ImmutableSet; -import java.util.HashSet; -import java.util.Set; -import javax.ws.rs.core.Application; -import org.opendaylight.netconf.md.sal.rest.schema.SchemaExportContentYangBodyWriter; -import org.opendaylight.netconf.md.sal.rest.schema.SchemaExportContentYinBodyWriter; -import org.opendaylight.netconf.sal.rest.impl.PatchJsonBodyWriter; -import org.opendaylight.netconf.sal.rest.impl.PatchXmlBodyWriter; -import org.opendaylight.netconf.sal.rest.impl.RestconfDocumentedExceptionMapper; -import org.opendaylight.restconf.common.wrapper.services.ServicesWrapperImpl; -import org.opendaylight.restconf.jersey.providers.JsonNormalizedNodeBodyReader; -import org.opendaylight.restconf.jersey.providers.JsonToPatchBodyReader; -import org.opendaylight.restconf.jersey.providers.NormalizedNodeJsonBodyWriter; -import org.opendaylight.restconf.jersey.providers.NormalizedNodeXmlBodyWriter; -import org.opendaylight.restconf.jersey.providers.XmlNormalizedNodeBodyReader; -import org.opendaylight.restconf.jersey.providers.XmlToPatchBodyReader; - -public class RestconfApplication extends Application { - - @Override - public Set> getClasses() { - return ImmutableSet.>builder() - .add(NormalizedNodeJsonBodyWriter.class).add(NormalizedNodeXmlBodyWriter.class) - .add(JsonNormalizedNodeBodyReader.class).add(XmlNormalizedNodeBodyReader.class) - .add(SchemaExportContentYinBodyWriter.class) - .add(JsonToPatchBodyReader.class).add(XmlToPatchBodyReader.class) - .add(PatchJsonBodyWriter.class).add(PatchXmlBodyWriter.class) - .add(SchemaExportContentYangBodyWriter.class).add(RestconfDocumentedExceptionMapper.class) - .build(); - } - - @Override - public Set getSingletons() { - final Set singletons = new HashSet<>(); - singletons.add(ServicesWrapperImpl.getInstance()); - return singletons; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/Rfc8040.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/Rfc8040.java deleted file mode 100644 index 76c03b3972..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/Rfc8040.java +++ /dev/null @@ -1,278 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf; - -import java.net.URI; -import java.text.ParseException; -import java.util.Date; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; - -/** - * Base Draft for Restconf project. - *
    - *
  • Supported {@link MediaTypes} - *
  • Constants for modules - *
      - *
    • {@link RestconfModule} - *
    • {@link MonitoringModule} - *
    - *
- * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class Rfc8040 { - - private Rfc8040() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Set of application specific media types to identify each of the available - * resource types. - */ - public static final class MediaTypes { - - private MediaTypes() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String DATA = "application/yang-data"; - public static final String PATCH = "application/yang.patch"; - public static final String PATCH_STATUS = "application/yang.patch-status"; - public static final String YIN = "application/yin"; - public static final String YANG = "application/yang"; - } - - /** - * Constants for restconf module. - * - */ - public static final class RestconfModule { - private RestconfModule() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String REVISION = "2017-01-26"; - public static final String NAME = "ietf-restconf"; - public static final String NAMESPACE = "urn:ietf:params:xml:ns:yang:ietf-restconf"; - - public static final QName IETF_RESTCONF_QNAME = QName.create(Rfc8040.RestconfModule.NAMESPACE, - Rfc8040.RestconfModule.REVISION, Rfc8040.RestconfModule.NAME).intern(); - - public static final Date DATE; - - static { - try { - DATE = SimpleDateFormatUtil.getRevisionFormat().parse(REVISION); - } catch (final ParseException e) { - throw new ExceptionInInitializerError(e); - } - } - - public static final URI URI_MODULE = URI.create(NAMESPACE); - - // RESTCONF - public static final String RESTCONF_GROUPING_SCHEMA_NODE = "restconf"; - public static final String RESTCONF_CONTAINER_SCHEMA_NODE = "restconf"; - public static final String OPERATIONS_CONTAINER_SCHEMA_NODE = "operations"; - public static final String DATA_CONTAINER_SCHEMA_NODE = "data"; - public static final String LIB_VER_LEAF_SCHEMA_NODE = "yang-library-version"; - - public static final QName RESTCONF_GROUPING_QNAME = - QName.create(IETF_RESTCONF_QNAME, RESTCONF_GROUPING_SCHEMA_NODE).intern(); - public static final QName RESTCONF_CONTAINER_QNAME = - QName.create(IETF_RESTCONF_QNAME, RESTCONF_CONTAINER_SCHEMA_NODE).intern(); - public static final QName LIB_VER_LEAF_QNAME = QName.create(IETF_RESTCONF_QNAME, LIB_VER_LEAF_SCHEMA_NODE) - .intern(); - - // ERRORS - public static final String ERRORS_GROUPING_SCHEMA_NODE = "errors"; - public static final String ERRORS_CONTAINER_SCHEMA_NODE = "errors"; - public static final String ERROR_LIST_SCHEMA_NODE = "error"; - - public static final QName ERRORS_CONTAINER_QNAME = - QName.create(IETF_RESTCONF_QNAME, ERRORS_CONTAINER_SCHEMA_NODE); - public static final QName ERROR_LIST_QNAME = QName.create(IETF_RESTCONF_QNAME, ERROR_LIST_SCHEMA_NODE).intern(); - public static final QName ERROR_TYPE_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-type").intern(); - public static final QName ERROR_TAG_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-tag".intern()); - public static final QName ERROR_APP_TAG_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-app-tag").intern(); - public static final QName ERROR_MESSAGE_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-message").intern(); - public static final QName ERROR_INFO_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-info").intern(); - public static final QName ERROR_PATH_QNAME = QName.create(IETF_RESTCONF_QNAME, "error-path").intern(); - } - - /** - * Constants for ietf-yang-library model. - * - */ - public static final class IetfYangLibrary { - private IetfYangLibrary() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String NAME = "ietf-yang-library"; - public static final String NAMESPACE = "urn:ietf:params:xml:ns:yang:ietf-yang-library"; - public static final String REVISION = "2016-06-21"; - - public static final Date DATE; - - static { - try { - DATE = SimpleDateFormatUtil.getRevisionFormat().parse(REVISION); - } catch (final ParseException e) { - throw new ExceptionInInitializerError(e); - } - } - - public static final URI URI_MODULE = URI.create(NAMESPACE); - - public static final QNameModule MODULE_QNAME = QNameModule.create(URI_MODULE, DATE).intern(); - - public static final String MODULE_SET_ID_LEAF = "module-set-id"; - public static final QName MODULE_SET_ID_LEAF_QNAME = QName.create(MODULE_QNAME, MODULE_SET_ID_LEAF).intern(); - - public static final String GROUPING_MODULE_LIST = "module-list"; - public static final QName GROUPING_MODULE_LIST_QNAME = QName.create(MODULE_QNAME, GROUPING_MODULE_LIST) - .intern(); - - public static final String MODULES_STATE_CONT = "modules-state"; - public static final QName MODUELS_STATE_CONT_QNAME = QName.create(MODULE_QNAME, MODULES_STATE_CONT).intern(); - - public static final String MODULE_LIST = "module"; - public static final QName MODULE_QNAME_LIST = QName.create(MODULE_QNAME, MODULE_LIST).intern(); - - public static final String SPECIFIC_MODULE_NAME_LEAF = "name"; - public static final QName SPECIFIC_MODULE_NAME_LEAF_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_NAME_LEAF).intern(); - - public static final String SPECIFIC_MODULE_REVISION_LEAF = "revision"; - public static final QName SPECIFIC_MODULE_REVISION_LEAF_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_REVISION_LEAF).intern(); - - public static final String BASE_URI_OF_SCHEMA = "/modules/"; - public static final String SPECIFIC_MODULE_SCHEMA_LEAF = "schema"; - public static final QName SPECIFIC_MODULE_SCHEMA_LEAF_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_SCHEMA_LEAF).intern(); - - public static final String SPECIFIC_MODULE_NAMESPACE_LEAF = "namespace"; - public static final QName SPECIFIC_MODULE_NAMESPACE_LEAF_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_NAMESPACE_LEAF).intern(); - - public static final String SPECIFIC_MODULE_FEATURE_LEAF_LIST = "feature"; - public static final QName SPECIFIC_MODULE_FEATURE_LEAF_LIST_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_FEATURE_LEAF_LIST).intern(); - - public static final String SPECIFIC_MODULE_DEVIATION_LIST = "deviation"; - public static final QName SPECIFIC_MODULE_DEVIATION_LIST_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_DEVIATION_LIST).intern(); - - public static final String SPECIFIC_MODULE_CONFORMANCE_LEAF = "conformance-type"; - public static final QName SPECIFIC_MODULE_CONFORMANCE_LEAF_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_CONFORMANCE_LEAF).intern(); - - public static final String SPECIFIC_MODULE_SUBMODULE_LIST = "submodule"; - public static final QName SPECIFIC_MODULE_SUBMODULE_LIST_QNAME = - QName.create(MODULE_QNAME, SPECIFIC_MODULE_SUBMODULE_LIST).intern(); - } - - /** - * Constants for ietf-restconf-monitoring module. - * - */ - public static final class MonitoringModule { - - private MonitoringModule() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String NAME = "ietf-restconf-monitoring"; - public static final String NAMESPACE = "urn:ietf:params:xml:ns:yang:ietf-restconf-monitoring"; - public static final String REVISION = "2017-01-26"; - public static final String PATH_TO_STREAM_WITHOUT_KEY = - "ietf-restconf-monitoring:restconf-state/streams/stream="; - public static final String PATH_TO_STREAMS = "ietf-restconf-monitoring:restconf-state/streams"; - - public static final Date DATE; - - static { - try { - DATE = SimpleDateFormatUtil.getRevisionFormat().parse(REVISION); - } catch (final ParseException e) { - throw new ExceptionInInitializerError(e); - } - } - - public static final URI URI_MODULE = URI.create(NAMESPACE); - - public static final QNameModule MODULE_QNAME = QNameModule.create(URI_MODULE, DATE).intern(); - - public static final String CONT_RESTCONF_STATE_NAME = "restconf-state"; - public static final QName CONT_RESTCONF_STATE_QNAME = QName.create(MODULE_QNAME, CONT_RESTCONF_STATE_NAME) - .intern(); - - public static final String CONT_CAPABILITIES_NAME = "capabilities"; - public static final QName CONT_CAPABILITES_QNAME = QName.create(MODULE_QNAME, CONT_CAPABILITIES_NAME).intern(); - - public static final String LEAF_LIST_CAPABILITY_NAME = "capability"; - public static final QName LEAF_LIST_CAPABILITY_QNAME = QName.create(MODULE_QNAME, LEAF_LIST_CAPABILITY_NAME) - .intern(); - - public static final String CONT_STREAMS_NAME = "streams"; - public static final QName CONT_STREAMS_QNAME = QName.create(MODULE_QNAME, CONT_STREAMS_NAME).intern(); - - public static final String LIST_STREAM_NAME = "stream"; - public static final QName LIST_STREAM_QNAME = QName.create(MODULE_QNAME, LIST_STREAM_NAME).intern(); - - public static final String LEAF_NAME_STREAM_NAME = "name"; - public static final QName LEAF_NAME_STREAM_QNAME = QName.create(MODULE_QNAME, LEAF_NAME_STREAM_NAME).intern(); - - public static final String LEAF_DESCR_STREAM_NAME = "description"; - public static final QName LEAF_DESCR_STREAM_QNAME = QName.create(MODULE_QNAME, LEAF_DESCR_STREAM_NAME).intern(); - - public static final String LEAF_REPLAY_SUPP_STREAM_NAME = "replay-support"; - public static final QName LEAF_REPLAY_SUPP_STREAM_QNAME = - QName.create(MODULE_QNAME, LEAF_REPLAY_SUPP_STREAM_NAME).intern(); - - public static final String LEAF_START_TIME_STREAM_NAME = "replay-log-creation-time"; - public static final QName LEAF_START_TIME_STREAM_QNAME = - QName.create(MODULE_QNAME, LEAF_START_TIME_STREAM_NAME).intern(); - - public static final String LIST_ACCESS_STREAM_NAME = "access"; - public static final QName LIST_ACCESS_STREAM_QNAME = QName.create(MODULE_QNAME, LIST_ACCESS_STREAM_NAME) - .intern(); - - public static final String LEAF_ENCODING_ACCESS_NAME = "encoding"; - public static final QName LEAF_ENCODING_ACCESS_QNAME = QName.create(MODULE_QNAME, LEAF_ENCODING_ACCESS_NAME) - .intern(); - - public static final String LEAF_LOCATION_ACCESS_NAME = "location"; - public static final QName LEAF_LOCATION_ACCESS_QNAME = QName.create(MODULE_QNAME, LEAF_LOCATION_ACCESS_NAME) - .intern(); - - /** - * Constants for capabilities. - */ - public static final class QueryParams { - - private QueryParams() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String URI_BASE = "urn:ietf:params:restconf:capability:"; - - public static final String DEPTH = URI_BASE + "depth:1.0"; - public static final String FIELDS = URI_BASE + "fields:1.0"; - public static final String FILTER = URI_BASE + "filter:1.0"; - public static final String REPLAY = URI_BASE + "replay:1.0"; - public static final String WITH_DEFAULTS = URI_BASE + "with-defaults:1.0"; - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/BaseServicesWrapper.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/BaseServicesWrapper.java deleted file mode 100644 index b002d2b768..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/BaseServicesWrapper.java +++ /dev/null @@ -1,20 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.api; - -/** - * Wrapper for all base services. - *
    - *
  • {@link RestconfOperationsService} - *
  • {@link RestconfSchemaService} - *
- * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface BaseServicesWrapper extends RestconfOperationsService, RestconfSchemaService, RestconfService { -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfOperationsService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfOperationsService.java deleted file mode 100644 index 354c505edb..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfOperationsService.java +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.api; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.utils.RestconfConstants; - -/** - * Container that provides access to the - * data-model specific operations supported by the server. - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface RestconfOperationsService { - - /** - * List of rpc or action operations supported by the server. - * - * @param uriInfo - * URI information - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("/operations") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - NormalizedNodeContext getOperations(@Context UriInfo uriInfo); - - /** - * Valid for mount points. List of operations supported by the server. - * - * @param identifier - * path parameter - * @param uriInfo - * URI information - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("/operations/{identifier:.+}") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - NormalizedNodeContext getOperations(@PathParam("identifier") String identifier, @Context UriInfo uriInfo); -} \ No newline at end of file diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfSchemaService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfSchemaService.java deleted file mode 100644 index 963bc36ec7..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfSchemaService.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.api; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.schema.SchemaExportContext; -import org.opendaylight.restconf.utils.RestconfConstants; - -/** - * Retrieval of the YANG modules which server - * supports. - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Path("/") -public interface RestconfSchemaService { - - /** - * Get schema of specific module. - * - * @param identifier - * path parameter - * @return {@link SchemaExportContext} - */ - @GET - @Produces({ Rfc8040.MediaTypes.YIN + RestconfConstants.XML, Rfc8040.MediaTypes.YANG }) - @Path("modules/{identifier:.+}") - SchemaExportContext getSchema(@PathParam("identifier") String identifier); -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfService.java deleted file mode 100644 index 6e356300ec..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/api/RestconfService.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.api; - -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.Produces; -import javax.ws.rs.core.MediaType; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.utils.RestconfConstants; - -/** - * Service for getting yang library version. - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface RestconfService { - - /** - * Get yang library version. - * - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("/yang-library-version") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - NormalizedNodeContext getLibraryVersion(); -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeContainerSchemaNode.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeContainerSchemaNode.java deleted file mode 100644 index 1ee6cb86c3..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeContainerSchemaNode.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import com.google.common.collect.ImmutableList; -import java.util.Collection; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.Status; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.UsesNode; - -/** - * Special case only use by GET restconf/operations (since moment of old Yang parser and old yang model API - * removal) to build and use fake container for module. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -class FakeContainerSchemaNode implements ContainerSchemaNode { - static final SchemaPath PATH = - SchemaPath.create(true, QName.create(FakeRestconfModule.QNAME, "operations").intern()); - - private final Collection children; - - FakeContainerSchemaNode(final Collection children) { - this.children = ImmutableList.copyOf(children); - } - - @Override - public Set> getTypeDefinitions() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public Collection getChildNodes() { - return this.children; - } - - @Override - public Set getGroupings() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public DataSchemaNode getDataChildByName(final QName name) { - for (final DataSchemaNode node : this.children) { - if (node.getQName().equals(name)) { - return node; - } - } - throw new RestconfDocumentedException(name + " is not in child of " + PATH.getLastComponent()); - } - - @Override - public Set getUses() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public Set getAvailableAugmentations() { - return new HashSet<>(); - } - - @Override - public boolean isAugmenting() { - return false; - } - - @Override - public boolean isAddedByUses() { - return false; - } - - @Override - public boolean isConfiguration() { - return false; - } - - @Override - public ConstraintDefinition getConstraints() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public QName getQName() { - return PATH.getLastComponent(); - } - - @Override - public SchemaPath getPath() { - return PATH; - } - - @Override - public List getUnknownSchemaNodes() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public String getDescription() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public String getReference() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public Status getStatus() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public boolean isPresenceContainer() { - throw new UnsupportedOperationException("Not supported."); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeImportedModule.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeImportedModule.java deleted file mode 100644 index 4bde6ccaa3..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeImportedModule.java +++ /dev/null @@ -1,184 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ForwardingObject; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import java.net.URI; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Set; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Deviation; -import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; -import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.ModuleImport; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.UsesNode; - -/** - * Special case only use by GET restconf/operations (since moment of old Yang parser and old yang model API - * removal) to build and use fake container for module. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -final class FakeImportedModule extends ForwardingObject implements Module { - - private final Module delegate; - - FakeImportedModule(final Module delegate) { - this.delegate = Preconditions.checkNotNull(delegate); - } - - @Override - protected Module delegate() { - return delegate; - } - - @Override - public Set> getTypeDefinitions() { - return ImmutableSet.of(); - } - - @Override - public Collection getChildNodes() { - return ImmutableList.of(); - } - - @Override - public Set getGroupings() { - return ImmutableSet.of(); - } - - @Override - public DataSchemaNode getDataChildByName(final QName name) { - return null; - } - - @Override - public Set getUses() { - return ImmutableSet.of(); - } - - @Override - public String getModuleSourcePath() { - return null; - } - - @Override - public QNameModule getQNameModule() { - return delegate.getQNameModule(); - } - - @Override - public String getName() { - return delegate.getName(); - } - - @Override - public URI getNamespace() { - return delegate.getNamespace(); - } - - @Override - public Date getRevision() { - return delegate.getRevision(); - } - - @Override - public String getPrefix() { - return delegate.getPrefix(); - } - - @Override - public String getYangVersion() { - return delegate.getYangVersion(); - } - - @Override - public String getDescription() { - return delegate.getDescription(); - } - - @Override - public String getReference() { - return delegate.getReference(); - } - - @Override - public String getOrganization() { - return delegate.getOrganization(); - } - - @Override - public String getContact() { - return delegate.getContact(); - } - - @Override - public Set getImports() { - return ImmutableSet.of(); - } - - @Override - public Set getSubmodules() { - return ImmutableSet.of(); - } - - @Override - public Set getFeatures() { - return ImmutableSet.of(); - } - - @Override - public Set getAugmentations() { - return ImmutableSet.of(); - } - - @Override - public Set getRpcs() { - return ImmutableSet.of(); - } - - @Override - public Set getDeviations() { - return ImmutableSet.of(); - } - - @Override - public Set getIdentities() { - return ImmutableSet.of(); - } - - @Override - public List getExtensionSchemaNodes() { - return ImmutableList.of(); - } - - @Override - public List getUnknownSchemaNodes() { - return ImmutableList.of(); - } - - @Override - public String getSource() { - return null; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeLeafSchemaNode.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeLeafSchemaNode.java deleted file mode 100644 index 6d5ab4296b..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeLeafSchemaNode.java +++ /dev/null @@ -1,106 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import java.util.List; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.ConstraintDefinition; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.api.Status; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.util.type.BaseTypes; - -/** - * Special case only use by GET restconf/operations (since moment of old Yang parser and old yang model API - * removal) to build and use fake leaf like child in container. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -final class FakeLeafSchemaNode implements LeafSchemaNode { - - private final SchemaPath path; - - /** - * Base values for fake leaf schema node. - * - * @param qname - * qname - */ - FakeLeafSchemaNode(final QName qname) { - this.path = FakeContainerSchemaNode.PATH.createChild(qname); - } - - @Override - public boolean isAugmenting() { - return true; - } - - @Override - public boolean isAddedByUses() { - return false; - } - - @Override - public boolean isConfiguration() { - return false; - } - - @Override - public ConstraintDefinition getConstraints() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public QName getQName() { - return path.getLastComponent(); - } - - @Override - public SchemaPath getPath() { - return path; - } - - @Override - public List getUnknownSchemaNodes() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public String getDescription() { - throw new UnsupportedOperationException("Not supported operations."); - } - - @Override - public String getReference() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public Status getStatus() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public TypeDefinition getType() { - return BaseTypes.emptyType(); - } - - @Override - public String getDefault() { - throw new UnsupportedOperationException("Not supported."); - } - - @Override - public String getUnits() { - throw new UnsupportedOperationException("Not supported."); - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeModuleImport.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeModuleImport.java deleted file mode 100644 index e952c671bb..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeModuleImport.java +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import com.google.common.base.Preconditions; -import java.util.Date; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.ModuleImport; - -/** - * Fake {@link ModuleImport} implementation used to attach corrent prefix mapping to fake RPCs. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - * @author Robert Varga - */ -@Deprecated -final class FakeModuleImport implements ModuleImport { - private final Module module; - - FakeModuleImport(final Module module) { - this.module = Preconditions.checkNotNull(module); - } - - @Override - public String getModuleName() { - return module.getName(); - } - - @Override - public Date getRevision() { - return module.getRevision(); - } - - @Override - public String getPrefix() { - return module.getName(); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeRestconfModule.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeRestconfModule.java deleted file mode 100644 index dde3e5d428..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/FakeRestconfModule.java +++ /dev/null @@ -1,214 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import com.google.common.collect.Collections2; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableSet; -import java.net.URI; -import java.text.ParseException; -import java.util.Collection; -import java.util.Date; -import java.util.List; -import java.util.Set; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; -import org.opendaylight.yangtools.yang.common.YangVersion; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Deviation; -import org.opendaylight.yangtools.yang.model.api.ExtensionDefinition; -import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.ModuleImport; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.UnknownSchemaNode; -import org.opendaylight.yangtools.yang.model.api.UsesNode; - -/** - * Special case only use by GET restconf/operations (since moment of old Yang parser and old yang model API - * removal) to build and use fake module to create new schema context. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -final class FakeRestconfModule implements Module { - - static final QNameModule QNAME; - - static { - Date date; - try { - date = SimpleDateFormatUtil.getRevisionFormat().parse("2016-06-28"); - } catch (final ParseException e) { - throw new ExceptionInInitializerError(e); - } - QNAME = QNameModule.create(URI.create("urn:ietf:params:xml:ns:yang:ietf-restconf"), date).intern(); - } - - private final Collection children; - private final ImmutableSet imports; - - /** - * Instantiate a new fake module. - * - * @param neededModules needed import statements - * @param child fake child container - */ - FakeRestconfModule(final Collection neededModules, final ContainerSchemaNode child) { - this.children = ImmutableList.of(child); - this.imports = ImmutableSet.copyOf(Collections2.transform(neededModules, FakeModuleImport::new)); - } - - @Override - public Set> getTypeDefinitions() { - throw new UnsupportedOperationException("Not supported operations."); - } - - @Override - public Collection getChildNodes() { - return this.children; - } - - @Override - public Set getGroupings() { - throw new UnsupportedOperationException("Not supported operations."); - } - - @Override - public DataSchemaNode getDataChildByName(final QName name) { - for (final DataSchemaNode node : this.children) { - if (node.getQName().equals(name)) { - return node; - } - } - throw new RestconfDocumentedException(name + " is not in child of " + FakeRestconfModule.QNAME); - } - - @Override - public Set getUses() { - throw new UnsupportedOperationException("Not supported operations."); - } - - @Override - public String getModuleSourcePath() { - throw new UnsupportedOperationException("Not supported operations."); - } - - @Override - public QNameModule getQNameModule() { - return QNAME; - } - - @Override - public String getName() { - return "ietf-restconf"; - } - - @Override - public URI getNamespace() { - return QNAME.getNamespace(); - } - - @Override - public Date getRevision() { - return QNAME.getRevision(); - } - - @Override - public String getPrefix() { - return "restconf"; - } - - @Override - public String getYangVersion() { - return YangVersion.VERSION_1.toString(); - } - - @Override - public String getDescription() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public String getReference() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public String getOrganization() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public String getContact() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getImports() { - return imports; - } - - @Override - public Set getSubmodules() { - return ImmutableSet.of(); - } - - @Override - public Set getFeatures() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getNotifications() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getAugmentations() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getRpcs() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getDeviations() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public Set getIdentities() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public List getExtensionSchemaNodes() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public List getUnknownSchemaNodes() { - throw new UnsupportedOperationException("Operation not implemented."); - } - - @Override - public String getSource() { - throw new UnsupportedOperationException("Operation not implemented."); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfImpl.java deleted file mode 100644 index 572636ddd1..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfImpl.java +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import org.opendaylight.restconf.Rfc8040.IetfYangLibrary; -import org.opendaylight.restconf.Rfc8040.RestconfModule; -import org.opendaylight.restconf.base.services.api.RestconfService; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; - -/** - * Implementation of RestconfService. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfImpl implements RestconfService { - - private final SchemaContextHandler schemaContextHandler; - - public RestconfImpl(final SchemaContextHandler schemaContextHandler) { - this.schemaContextHandler = schemaContextHandler; - } - - @Override - public NormalizedNodeContext getLibraryVersion() { - final SchemaContext context = this.schemaContextHandler.get(); - SchemaNode schemaNode = null; - for (final GroupingDefinition groupingDefinition : context - .findModuleByNamespaceAndRevision(RestconfModule.URI_MODULE, RestconfModule.DATE).getGroupings()) { - if (groupingDefinition.getQName().equals(RestconfModule.RESTCONF_GROUPING_QNAME)) { - schemaNode = ((ContainerSchemaNode) groupingDefinition - .getDataChildByName(RestconfModule.RESTCONF_CONTAINER_QNAME)) - .getDataChildByName(RestconfModule.LIB_VER_LEAF_QNAME); - } - } - final YangInstanceIdentifier yangIId = YangInstanceIdentifier.of( - QName.create(RestconfModule.NAME, RestconfModule.REVISION, RestconfModule.LIB_VER_LEAF_SCHEMA_NODE)); - final InstanceIdentifierContext iid = - new InstanceIdentifierContext(yangIId, schemaNode, null, context); - final NormalizedNode data = - Builders.leafBuilder((LeafSchemaNode) schemaNode).withValue(IetfYangLibrary.REVISION).build(); - return new NormalizedNodeContext(iid, data); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfOperationsServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfOperationsServiceImpl.java deleted file mode 100644 index 5ff0a089b6..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfOperationsServiceImpl.java +++ /dev/null @@ -1,140 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import com.google.common.base.Optional; -import com.google.common.collect.ImmutableSet; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Set; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; -import org.opendaylight.restconf.base.services.api.RestconfOperationsService; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.DataContainerNodeAttrBuilder; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.util.SimpleSchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link RestconfOperationsService}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfOperationsServiceImpl implements RestconfOperationsService { - - private static final Logger LOG = LoggerFactory.getLogger(RestconfOperationsServiceImpl.class); - - private final SchemaContextHandler schemaContextHandler; - private final DOMMountPointServiceHandler domMountPointServiceHandler; - - /** - * Set {@link SchemaContextHandler} for getting actual {@link SchemaContext}. - * - * @param schemaContextHandler - * handling schema context - * @param domMountPointServiceHandler - * handling dom mount point service - */ - public RestconfOperationsServiceImpl(final SchemaContextHandler schemaContextHandler, - final DOMMountPointServiceHandler domMountPointServiceHandler) { - this.schemaContextHandler = schemaContextHandler; - this.domMountPointServiceHandler = domMountPointServiceHandler; - } - - @Override - public NormalizedNodeContext getOperations(final UriInfo uriInfo) { - final SchemaContextRef ref = new SchemaContextRef(this.schemaContextHandler.get()); - return getOperations(ref.getModules(), null); - } - - @Override - public NormalizedNodeContext getOperations(final String identifier, final UriInfo uriInfo) { - final Set modules; - final DOMMountPoint mountPoint; - final SchemaContextRef ref = new SchemaContextRef(this.schemaContextHandler.get()); - if (identifier.contains(RestconfConstants.MOUNT)) { - final InstanceIdentifierContext mountPointIdentifier = ParserIdentifier.toInstanceIdentifier(identifier, - ref.get(), Optional.of(this.domMountPointServiceHandler.get())); - mountPoint = mountPointIdentifier.getMountPoint(); - modules = ref.getModules(mountPoint); - } else { - final String errMsg = - "URI has bad format. If operations behind mount point should be showed, URI has to end with "; - LOG.debug(errMsg + ControllerContext.MOUNT + " for " + identifier); - throw new RestconfDocumentedException(errMsg + ControllerContext.MOUNT, ErrorType.PROTOCOL, - ErrorTag.INVALID_VALUE); - } - - return getOperations(modules, mountPoint); - } - - /** - * Special case only for GET restconf/operations use (since moment of old - * Yang parser and old Yang model API removal). The method is creating fake - * schema context with fake module and fake data by use own implementations - * of schema nodes and module. - * - * @param modules - * set of modules for get RPCs from every module - * @param mountPoint - * mount point, if in use otherwise null - * @return {@link NormalizedNodeContext} - */ - private static NormalizedNodeContext getOperations(final Set modules, final DOMMountPoint mountPoint) { - final Collection neededModules = new ArrayList<>(modules.size()); - final ArrayList fakeRpcSchema = new ArrayList<>(); - - for (final Module m : modules) { - final Set rpcs = m.getRpcs(); - if (!rpcs.isEmpty()) { - neededModules.add(m); - - fakeRpcSchema.ensureCapacity(fakeRpcSchema.size() + rpcs.size()); - rpcs.forEach(rpc -> fakeRpcSchema.add(new FakeLeafSchemaNode(rpc.getQName()))); - } - } - - final ContainerSchemaNode fakeCont = new FakeContainerSchemaNode(fakeRpcSchema); - final DataContainerNodeAttrBuilder containerBuilder = - Builders.containerBuilder(fakeCont); - - for (final LeafSchemaNode leaf : fakeRpcSchema) { - containerBuilder.withChild(Builders.leafBuilder(leaf).build()); - } - - final Collection fakeModules = new ArrayList<>(neededModules.size() + 1); - neededModules.forEach(imp -> fakeModules.add(new FakeImportedModule(imp))); - fakeModules.add(new FakeRestconfModule(neededModules, fakeCont)); - - final SchemaContext fakeSchemaCtx = SimpleSchemaContext.forModules(ImmutableSet.copyOf(fakeModules)); - final InstanceIdentifierContext instanceIdentifierContext = - new InstanceIdentifierContext<>(null, fakeCont, mountPoint, fakeSchemaCtx); - return new NormalizedNodeContext(instanceIdentifierContext, containerBuilder.build()); - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfSchemaServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfSchemaServiceImpl.java deleted file mode 100644 index c9caeccadb..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/base/services/impl/RestconfSchemaServiceImpl.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.base.services.impl; - -import org.opendaylight.restconf.base.services.api.RestconfSchemaService; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.common.schema.SchemaExportContext; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Implementation of {@link RestconfSchemaService}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfSchemaServiceImpl implements RestconfSchemaService { - - private final SchemaContextHandler schemaContextHandler; - private final DOMMountPointServiceHandler domMountPointServiceHandler; - - /** - * Set {@link SchemaContextHandler} for getting actual {@link SchemaContext} - * . - * - * @param schemaContextHandler - * handling schema context - * @param domMountPointServiceHandler - * handling dom mount point service - */ - public RestconfSchemaServiceImpl(final SchemaContextHandler schemaContextHandler, - final DOMMountPointServiceHandler domMountPointServiceHandler) { - this.schemaContextHandler = schemaContextHandler; - this.domMountPointServiceHandler = domMountPointServiceHandler; - } - - @Override - public SchemaExportContext getSchema(final String identifier) { - final SchemaContextRef schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get()); - return ParserIdentifier.toSchemaExportContextFromIdentifier(schemaContextRef.get(), identifier, - this.domMountPointServiceHandler.get()); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/references/SchemaContextRef.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/references/SchemaContextRef.java deleted file mode 100644 index c6c1296a1f..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/references/SchemaContextRef.java +++ /dev/null @@ -1,141 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.common.references; - -import java.lang.ref.SoftReference; -import java.net.URI; -import java.util.Date; -import java.util.Set; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * This class creates {@link SoftReference} of actual {@link SchemaContext} object and even if the - * {@link SchemaContext} changes, this will be sticks reference to the old {@link SchemaContext} and provides - * work with the old {@link SchemaContext}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class SchemaContextRef { - - private final SoftReference schemaContextRef; - - /** - * Create {@link SoftReference} of actual {@link SchemaContext}. - * - * @param schemaContext - * actual {@link SchemaContext} - */ - public SchemaContextRef(final SchemaContext schemaContext) { - this.schemaContextRef = new SoftReference(schemaContext); - } - - /** - * Get {@link SchemaContext} from reference. - * - * @return {@link SchemaContext} - */ - public SchemaContext get() { - return this.schemaContextRef.get(); - } - - /** - * Get all modules like {@link Set} of {@link Module} from - * {@link SchemaContext}. - * - * @return {@link Set} of {@link Module} - */ - public Set getModules() { - return get().getModules(); - } - - /** - * Get all modules like {@link Set} of {@link Module} from - * {@link SchemaContext} of {@link DOMMountPoint}. - * - * @param mountPoint - * mount point - * - * @return {@link Set} of {@link Module} - */ - public Set getModules(final DOMMountPoint mountPoint) { - final SchemaContext schemaContext = mountPoint == null ? null : mountPoint.getSchemaContext(); - return schemaContext == null ? null : schemaContext.getModules(); - } - - /** - * Get {@link Module} by ietf-restconf qname from - * {@link Rfc8040.RestconfModule}. - * - * @return {@link Module} - */ - public Module getRestconfModule() { - return this.findModuleByNamespaceAndRevision(Rfc8040.RestconfModule.IETF_RESTCONF_QNAME.getNamespace(), - Rfc8040.RestconfModule.IETF_RESTCONF_QNAME.getRevision()); - } - - /** - * Find {@link Module} in {@link SchemaContext} by {@link URI} and - * {@link Date}. - * - * @param namespace - * namespace of module - * @param revision - * revision of module - * @return {@link Module} - */ - public Module findModuleByNamespaceAndRevision(final URI namespace, final Date revision) { - return this.get().findModuleByNamespaceAndRevision(namespace, revision); - } - - - /** - * Find {@link Module} in {@link SchemaContext} of {@link DOMMountPoint} by - * {@link QName} of {@link Module}. - * - * @param mountPoint - * mount point - * @param moduleQname - * {@link QName} of module - * @return {@link Module} - */ - public Module findModuleInMountPointByQName(final DOMMountPoint mountPoint, final QName moduleQname) { - final SchemaContext schemaContext = mountPoint == null ? null : mountPoint.getSchemaContext(); - return schemaContext == null ? null - : schemaContext.findModuleByName(moduleQname.getLocalName(), moduleQname.getRevision()); - } - - /** - * Find {@link Module} in {@link SchemaContext} by {@link QName}. - * - * @param moduleQname - * {@link QName} of module - * @return {@link Module} - */ - public Module findModuleByQName(final QName moduleQname) { - return this.findModuleByNameAndRevision(moduleQname.getLocalName(), moduleQname.getRevision()); - } - - /** - * Find {@link Module} in {@link SchemaContext} by {@link String} localName - * and {@link Date} revision. - * - * @param localName - * local name of module - * @param revision - * revision of module - * @return {@link Module} - */ - public Module findModuleByNameAndRevision(final String localName, final Date revision) { - return this.get().findModuleByName(localName, revision); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/wrapper/services/ServicesWrapperImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/wrapper/services/ServicesWrapperImpl.java deleted file mode 100644 index 0ab0d122a5..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/common/wrapper/services/ServicesWrapperImpl.java +++ /dev/null @@ -1,155 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.common.wrapper.services; - -import javax.ws.rs.Path; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.base.services.api.BaseServicesWrapper; -import org.opendaylight.restconf.base.services.api.RestconfOperationsService; -import org.opendaylight.restconf.base.services.api.RestconfSchemaService; -import org.opendaylight.restconf.base.services.api.RestconfService; -import org.opendaylight.restconf.base.services.impl.RestconfImpl; -import org.opendaylight.restconf.base.services.impl.RestconfOperationsServiceImpl; -import org.opendaylight.restconf.base.services.impl.RestconfSchemaServiceImpl; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.common.schema.SchemaExportContext; -import org.opendaylight.restconf.handlers.DOMDataBrokerHandler; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.NotificationServiceHandler; -import org.opendaylight.restconf.handlers.RpcServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.restconf.restful.services.api.RestconfDataService; -import org.opendaylight.restconf.restful.services.api.RestconfInvokeOperationsService; -import org.opendaylight.restconf.restful.services.api.RestconfStreamsSubscriptionService; -import org.opendaylight.restconf.restful.services.api.TransactionServicesWrapper; -import org.opendaylight.restconf.restful.services.impl.RestconfDataServiceImpl; -import org.opendaylight.restconf.restful.services.impl.RestconfInvokeOperationsServiceImpl; -import org.opendaylight.restconf.restful.services.impl.RestconfStreamsSubscriptionServiceImpl; - -/** - * Wrapper for services. - *
    - *
  • {@link BaseServicesWrapper} - *
  • {@link TransactionServicesWrapper} - *
- * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Path("/") -public class ServicesWrapperImpl implements BaseServicesWrapper, TransactionServicesWrapper { - - private RestconfDataService delegRestconfDataService; - private RestconfInvokeOperationsService delegRestconfInvokeOpsService; - private RestconfStreamsSubscriptionService delegRestconfSubscrService; - private RestconfOperationsService delegRestOpsService; - private RestconfSchemaService delegRestSchService; - private RestconfService delegRestService; - - private ServicesWrapperImpl() { - } - - private static class InstanceHolder { - public static final ServicesWrapperImpl INSTANCE = new ServicesWrapperImpl(); - } - - public static ServicesWrapperImpl getInstance() { - return InstanceHolder.INSTANCE; - } - - @Override - public NormalizedNodeContext getOperations(final UriInfo uriInfo) { - return this.delegRestOpsService.getOperations(uriInfo); - } - - @Override - public NormalizedNodeContext getOperations(final String identifier, final UriInfo uriInfo) { - return this.delegRestOpsService.getOperations(identifier, uriInfo); - } - - @Override - public SchemaExportContext getSchema(final String mountAndModuleId) { - return this.delegRestSchService.getSchema(mountAndModuleId); - } - - @Override - public Response readData(final UriInfo uriInfo) { - return this.delegRestconfDataService.readData(uriInfo); - } - - @Override - public Response readData(final String identifier, final UriInfo uriInfo) { - return this.delegRestconfDataService.readData(identifier, uriInfo); - } - - @Override - public Response putData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { - return this.delegRestconfDataService.putData(identifier, payload, uriInfo); - } - - @Override - public Response postData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { - return this.delegRestconfDataService.postData(identifier, payload, uriInfo); - } - - @Override - public Response postData(final NormalizedNodeContext payload, final UriInfo uriInfo) { - return this.delegRestconfDataService.postData(payload, uriInfo); - } - - @Override - public Response deleteData(final String identifier) { - return this.delegRestconfDataService.deleteData(identifier); - } - - @Override - public PatchStatusContext patchData(final String identifier, final PatchContext context, final UriInfo uriInfo) { - return this.delegRestconfDataService.patchData(identifier, context, uriInfo); - } - - @Override - public PatchStatusContext patchData(final PatchContext context, final UriInfo uriInfo) { - return this.delegRestconfDataService.patchData(context, uriInfo); - } - - @Override - public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload, - final UriInfo uriInfo) { - return this.delegRestconfInvokeOpsService.invokeRpc(identifier, payload, uriInfo); - } - - @Override - public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) { - return this.delegRestconfSubscrService.subscribeToStream(identifier, uriInfo); - } - - @Override - public NormalizedNodeContext getLibraryVersion() { - return this.delegRestService.getLibraryVersion(); - } - - public void setHandlers(final SchemaContextHandler schemaCtxHandler, - final DOMMountPointServiceHandler domMountPointServiceHandler, - final TransactionChainHandler transactionChainHandler, final DOMDataBrokerHandler domDataBrokerHandler, - final RpcServiceHandler rpcServiceHandler, final NotificationServiceHandler notificationServiceHandler) { - this.delegRestOpsService = new RestconfOperationsServiceImpl(schemaCtxHandler, domMountPointServiceHandler); - this.delegRestSchService = new RestconfSchemaServiceImpl(schemaCtxHandler, domMountPointServiceHandler); - this.delegRestconfSubscrService = new RestconfStreamsSubscriptionServiceImpl(domDataBrokerHandler, - notificationServiceHandler, schemaCtxHandler, transactionChainHandler); - this.delegRestconfDataService = - new RestconfDataServiceImpl(schemaCtxHandler, transactionChainHandler, domMountPointServiceHandler, - this.delegRestconfSubscrService); - this.delegRestconfInvokeOpsService = - new RestconfInvokeOperationsServiceImpl(rpcServiceHandler, schemaCtxHandler); - this.delegRestService = new RestconfImpl(schemaCtxHandler); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMDataBrokerHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMDataBrokerHandler.java deleted file mode 100644 index c48504d95e..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMDataBrokerHandler.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; - -/** - * Implementation of {@link DOMDataBrokerHandler}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - * - */ -@Deprecated -public class DOMDataBrokerHandler implements Handler { - - private final DOMDataBroker broker; - - public DOMDataBrokerHandler(final DOMDataBroker broker) { - this.broker = broker; - } - - @Override - public DOMDataBroker get() { - return this.broker; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMMountPointServiceHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMMountPointServiceHandler.java deleted file mode 100644 index 4c56039b5f..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/DOMMountPointServiceHandler.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import com.google.common.base.Preconditions; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; - -/** - * Implementation of {@link DOMMountPointServiceHandler}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class DOMMountPointServiceHandler implements Handler { - - private final DOMMountPointService domMountPointService; - - /** - * Prepare mount point service for Restconf services. - * - * @param domMountPointService - * mount point service - */ - public DOMMountPointServiceHandler(final DOMMountPointService domMountPointService) { - Preconditions.checkNotNull(domMountPointService); - this.domMountPointService = domMountPointService; - } - - @Override - public DOMMountPointService get() { - return this.domMountPointService; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/Handler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/Handler.java deleted file mode 100644 index ea311021c3..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/Handler.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.handlers; - -/** - * Handler for handling object prepared by provider for Restconf services. - * - * @param - * specific type go object for handling it - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -interface Handler { - - /** - * Get prepared object. - * - * @return T - */ - T get(); - - /** - * Update object. - * - * @param object - * new object to update old object - */ - default void update(final T object) {} -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/NotificationServiceHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/NotificationServiceHandler.java deleted file mode 100644 index d251dd71d4..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/NotificationServiceHandler.java +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; - -/** - * Handling DOMNotificationService. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class NotificationServiceHandler implements Handler { - - private final DOMNotificationService notificationService; - - /** - * Set DOMNotificationService. - * - * @param notificationService - * DOMNotificationService - */ - public NotificationServiceHandler(final DOMNotificationService notificationService) { - this.notificationService = notificationService; - } - - @Override - public DOMNotificationService get() { - return this.notificationService; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/RpcServiceHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/RpcServiceHandler.java deleted file mode 100644 index 70547e86fb..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/RpcServiceHandler.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; - -/** - * Implementation of {@link RpcServiceHandler}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RpcServiceHandler implements Handler { - - private final DOMRpcService rpcService; - - public RpcServiceHandler(final DOMRpcService rpcService) { - this.rpcService = rpcService; - } - - @Override - public DOMRpcService get() { - return this.rpcService; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextHandler.java deleted file mode 100644 index 4b1349b390..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextHandler.java +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import com.google.common.base.Preconditions; -import java.util.Collection; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.restconf.RestConnectorProvider; -import org.opendaylight.restconf.Rfc8040.IetfYangLibrary; -import org.opendaylight.restconf.Rfc8040.MonitoringModule; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.utils.mapping.RestconfMappingNodeUtil; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.tree.ConflictingModificationAppliedException; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link SchemaContextHandler}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class SchemaContextHandler implements SchemaContextListenerHandler { - - private static final Logger LOG = LoggerFactory.getLogger(SchemaContextHandler.class); - - private final TransactionChainHandler transactionChainHandler; - private SchemaContext context; - - private int moduleSetId; - - /** - * Set module-set-id on initial value - 0. - * - * @param transactionChainHandler Transaction chain handler - */ - public SchemaContextHandler(final TransactionChainHandler transactionChainHandler) { - this.transactionChainHandler = transactionChainHandler; - this.moduleSetId = 0; - } - - @Override - public void onGlobalContextUpdated(final SchemaContext context) { - Preconditions.checkNotNull(context); - this.context = null; - this.context = context; - this.moduleSetId++; - final Module ietfYangLibraryModule = - context.findModuleByNamespaceAndRevision(IetfYangLibrary.URI_MODULE, IetfYangLibrary.DATE); - NormalizedNode>> normNode = - RestconfMappingNodeUtil.mapModulesByIetfYangLibraryYang(context.getModules(), ietfYangLibraryModule, - context, String.valueOf(this.moduleSetId)); - putData(normNode); - - final Module monitoringModule = - this.context.findModuleByNamespaceAndRevision(MonitoringModule.URI_MODULE, MonitoringModule.DATE); - normNode = RestconfMappingNodeUtil.mapCapabilites(monitoringModule); - putData(normNode); - } - - @Override - public SchemaContext get() { - return this.context; - } - - private void putData( - final NormalizedNode>> normNode) { - final DOMDataWriteTransaction wTx = this.transactionChainHandler.get().newWriteOnlyTransaction(); - wTx.put(LogicalDatastoreType.OPERATIONAL, - YangInstanceIdentifier.create(NodeIdentifier.create(normNode.getNodeType())), normNode); - try { - wTx.submit().checkedGet(); - } catch (final TransactionCommitFailedException e) { - if (!(e.getCause() instanceof ConflictingModificationAppliedException)) { - throw new RestconfDocumentedException("Problem occurred while putting data to DS.", e); - } - - /* - Ignore error when another cluster node is already putting the same data to DS. - We expect that cluster is homogeneous and that node was going to write the same data - (that means no retry is needed). Transaction chain reset must be invoked to be able - to continue writing data with another transaction after failed transaction. - This is workaround for bug: - https://bugs.opendaylight.org/show_bug.cgi?id=7728 - */ - LOG.warn("Ignoring that another cluster node is already putting the same data to DS.", e); - RestConnectorProvider.resetTransactionChainForAdapaters(this.transactionChainHandler.get()); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextListenerHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextListenerHandler.java deleted file mode 100644 index 41f6055015..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/SchemaContextListenerHandler.java +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.handlers; - -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaContextListener; - -/** - * SchemaContextListener handler. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -interface SchemaContextListenerHandler extends Handler, SchemaContextListener { - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/TransactionChainHandler.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/TransactionChainHandler.java deleted file mode 100644 index 9da6c1885a..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/handlers/TransactionChainHandler.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.handlers; - -import com.google.common.base.Preconditions; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; - - -/** - * Implementation of {@link TransactionChainHandler}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class TransactionChainHandler implements Handler { - - private DOMTransactionChain transactionChain; - - /** - * Prepare transaction chain service for Restconf services. - * - * @param transactionChain Transaction chain - */ - public TransactionChainHandler(final DOMTransactionChain transactionChain) { - Preconditions.checkNotNull(transactionChain); - this.transactionChain = transactionChain; - } - - @Override - public void update(final DOMTransactionChain transactionChain) { - Preconditions.checkNotNull(transactionChain); - this.transactionChain = transactionChain; - } - - @Override - public DOMTransactionChain get() { - return this.transactionChain; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractIdentifierAwareJaxRsProvider.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractIdentifierAwareJaxRsProvider.java deleted file mode 100644 index b313911df7..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractIdentifierAwareJaxRsProvider.java +++ /dev/null @@ -1,101 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Optional; -import java.io.IOException; -import java.io.InputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; -import javax.ws.rs.HttpMethod; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.core.Request; -import javax.ws.rs.core.UriInfo; -import javax.ws.rs.ext.MessageBodyReader; -import org.opendaylight.netconf.sal.rest.api.RestconfConstants; -import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; -import org.opendaylight.restconf.RestConnectorProvider; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; - -/** - * JaxRd identifier aware provider. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public abstract class AbstractIdentifierAwareJaxRsProvider implements MessageBodyReader { - - @Context - private UriInfo uriInfo; - - @Context - private Request request; - - @Override - public final boolean isReadable(final Class type, final Type genericType, final Annotation[] annotations, - final MediaType mediaType) { - return true; - } - - @Override - public final T readFrom(final Class type, final Type genericType, - final Annotation[] annotations, final MediaType mediaType, - final MultivaluedMap httpHeaders, final InputStream entityStream) throws IOException, - WebApplicationException { - final InstanceIdentifierContext path = getInstanceIdentifierContext(); - if (entityStream.available() < 1) { - return emptyBody(path); - } - - return readBody(path, entityStream); - } - - /** - * Create a type corresponding to an empty body. - * - * @param path Request path - * @return empty body type - */ - protected abstract T emptyBody(InstanceIdentifierContext path); - - protected abstract T readBody(InstanceIdentifierContext path, InputStream entityStream) - throws IOException, WebApplicationException; - - - private String getIdentifier() { - return this.uriInfo.getPathParameters(false).getFirst(RestconfConstants.IDENTIFIER); - } - - private InstanceIdentifierContext getInstanceIdentifierContext() { - return ParserIdentifier.toInstanceIdentifier( - getIdentifier(), - ControllerContext.getInstance().getGlobalSchema(), - Optional.of(RestConnectorProvider.getMountPointService())); - } - - protected UriInfo getUriInfo() { - return this.uriInfo; - } - - protected boolean isPost() { - return HttpMethod.POST.equals(this.request.getMethod()); - } - - void setUriInfo(final UriInfo uriInfo) { - this.uriInfo = uriInfo; - } - - void setRequest(final Request request) { - this.request = request; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractNormalizedNodeBodyReader.java deleted file mode 100644 index 4614b48ef4..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractNormalizedNodeBodyReader.java +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.annotations.Beta; -import javax.ws.rs.core.Request; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; - -/** - * Common superclass for readers producing {@link NormalizedNodeContext}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - * @author Robert Varga - */ -@Deprecated -@Beta -public abstract class AbstractNormalizedNodeBodyReader - extends AbstractIdentifierAwareJaxRsProvider { - - public final void injectParams(final UriInfo uriInfo, final Request request) { - setUriInfo(uriInfo); - setRequest(request); - } - - @Override - protected final NormalizedNodeContext emptyBody(final InstanceIdentifierContext path) { - return new NormalizedNodeContext(path, null); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractToPatchBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractToPatchBodyReader.java deleted file mode 100644 index c2a24b6000..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/AbstractToPatchBodyReader.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2017 Pantheon Technologies, s.r.o. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.jersey.providers; - -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.patch.PatchContext; - -/** - * Common superclass for readers producing {@link PatchContext}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - * @author Robert Varga - */ -@Deprecated -abstract class AbstractToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider { - - @Override - protected final PatchContext emptyBody(final InstanceIdentifierContext path) { - return new PatchContext(path, null, null); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonNormalizedNodeBodyReader.java deleted file mode 100644 index f234a55092..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonNormalizedNodeBodyReader.java +++ /dev/null @@ -1,146 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.collect.Iterables; -import com.google.gson.stream.JsonReader; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.util.ArrayList; -import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.Provider; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; -import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.data.impl.schema.ResultAlreadySetException; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Reader of Json to NormalizedNode. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, MediaType.APPLICATION_JSON }) -public class JsonNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReader { - - private static final Logger LOG = LoggerFactory.getLogger(JsonNormalizedNodeBodyReader.class); - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - protected NormalizedNodeContext readBody(final InstanceIdentifierContext path, final InputStream entityStream) - throws IOException, WebApplicationException { - try { - return readFrom(path, entityStream, isPost()); - } catch (final Exception e) { - propagateExceptionAs(e); - return null; - } - } - - public static NormalizedNodeContext readFrom( - final InstanceIdentifierContext path, final InputStream entityStream, final boolean isPost) - throws IOException { - final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); - final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - - final SchemaNode parentSchema; - if (isPost) { - parentSchema = path.getSchemaNode(); - } else if (path.getSchemaNode() instanceof SchemaContext) { - parentSchema = path.getSchemaContext(); - } else { - if (SchemaPath.ROOT.equals(path.getSchemaNode().getPath().getParent())) { - parentSchema = path.getSchemaContext(); - } else { - parentSchema = SchemaContextUtil - .findDataSchemaNode(path.getSchemaContext(), path.getSchemaNode().getPath().getParent()); - } - } - - final JsonParserStream jsonParser = JsonParserStream.create(writer, path.getSchemaContext(), parentSchema); - final JsonReader reader = new JsonReader(new InputStreamReader(entityStream)); - jsonParser.parse(reader); - - NormalizedNode result = resultHolder.getResult(); - final List iiToDataList = new ArrayList<>(); - InstanceIdentifierContext newIIContext; - - while (result instanceof AugmentationNode || result instanceof ChoiceNode) { - final Object childNode = ((DataContainerNode) result).getValue().iterator().next(); - if (isPost) { - iiToDataList.add(result.getIdentifier()); - } - result = (NormalizedNode) childNode; - } - - if (isPost) { - if (result instanceof MapEntryNode) { - iiToDataList.add(new YangInstanceIdentifier.NodeIdentifier(result.getNodeType())); - iiToDataList.add(result.getIdentifier()); - } else { - iiToDataList.add(result.getIdentifier()); - } - } else { - if (result instanceof MapNode) { - result = Iterables.getOnlyElement(((MapNode) result).getValue()); - } - } - - final YangInstanceIdentifier fullIIToData = YangInstanceIdentifier.create(Iterables.concat( - path.getInstanceIdentifier().getPathArguments(), iiToDataList)); - - newIIContext = new InstanceIdentifierContext<>(fullIIToData, path.getSchemaNode(), path.getMountPoint(), - path.getSchemaContext()); - - return new NormalizedNodeContext(newIIContext, result); - } - - private static void propagateExceptionAs(final Exception exception) throws RestconfDocumentedException { - if (exception instanceof RestconfDocumentedException) { - throw (RestconfDocumentedException)exception; - } - - if (exception instanceof ResultAlreadySetException) { - LOG.debug("Error parsing json input:", exception); - - throw new RestconfDocumentedException("Error parsing json input: Failed to create new parse result data. " - + "Are you creating multiple resources/subresources in POST request?", exception); - } - - LOG.debug("Error parsing json input", exception); - - throw new RestconfDocumentedException("Error parsing input: " + exception.getMessage(), ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE, exception); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonToPatchBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonToPatchBodyReader.java deleted file mode 100644 index 8f0ea15a5f..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/JsonToPatchBodyReader.java +++ /dev/null @@ -1,464 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.gson.stream.JsonReader; -import com.google.gson.stream.JsonToken; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.StringReader; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nonnull; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.ext.Provider; -import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchEditOperation; -import org.opendaylight.restconf.common.patch.PatchEntity; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.gson.JsonParserStream; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.data.impl.schema.ResultAlreadySetException; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Patch reader. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Consumes({Rfc8040.MediaTypes.PATCH + RestconfConstants.JSON}) -public class JsonToPatchBodyReader extends AbstractToPatchBodyReader { - private static final Logger LOG = LoggerFactory.getLogger(JsonToPatchBodyReader.class); - - private String patchId; - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - protected PatchContext readBody(final InstanceIdentifierContext path, final InputStream entityStream) - throws IOException, WebApplicationException { - try { - return readFrom(path, entityStream); - } catch (final Exception e) { - throw propagateExceptionAs(e); - } - } - - private PatchContext readFrom(final InstanceIdentifierContext path, final InputStream entityStream) - throws IOException { - final JsonReader jsonReader = new JsonReader(new InputStreamReader(entityStream)); - final List resultList = read(jsonReader, path); - jsonReader.close(); - - return new PatchContext(path, resultList, patchId); - } - - @SuppressWarnings("checkstyle:IllegalCatch") - public PatchContext readFrom(final String uriPath, final InputStream entityStream) throws - RestconfDocumentedException { - try { - return readFrom(ControllerContext.getInstance().toInstanceIdentifier(uriPath), entityStream); - } catch (final Exception e) { - propagateExceptionAs(e); - return null; // no-op - } - } - - private static RuntimeException propagateExceptionAs(final Exception exception) throws RestconfDocumentedException { - if (exception instanceof RestconfDocumentedException) { - throw (RestconfDocumentedException)exception; - } - - if (exception instanceof ResultAlreadySetException) { - LOG.debug("Error parsing json input:", exception); - throw new RestconfDocumentedException("Error parsing json input: Failed to create new parse result data. "); - } - - throw new RestconfDocumentedException("Error parsing json input: " + exception.getMessage(), ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE, exception); - } - - private List read(final JsonReader in, final InstanceIdentifierContext path) throws IOException { - final List resultCollection = new ArrayList<>(); - final StringModuleInstanceIdentifierCodec codec = new StringModuleInstanceIdentifierCodec( - path.getSchemaContext()); - final JsonToPatchBodyReader.PatchEdit edit = new JsonToPatchBodyReader.PatchEdit(); - - while (in.hasNext()) { - switch (in.peek()) { - case STRING: - case NUMBER: - in.nextString(); - break; - case BOOLEAN: - Boolean.toString(in.nextBoolean()); - break; - case NULL: - in.nextNull(); - break; - case BEGIN_ARRAY: - in.beginArray(); - break; - case BEGIN_OBJECT: - in.beginObject(); - break; - case END_DOCUMENT: - break; - case NAME: - parseByName(in.nextName(), edit, in, path, codec, resultCollection); - break; - case END_OBJECT: - in.endObject(); - break; - case END_ARRAY: - in.endArray(); - break; - - default: - break; - } - } - - return ImmutableList.copyOf(resultCollection); - } - - /** - * Switch value of parsed JsonToken.NAME and read edit definition or patch id. - * - * @param name value of token - * @param edit PatchEdit instance - * @param in JsonReader reader - * @param path InstanceIdentifierContext context - * @param codec Draft11StringModuleInstanceIdentifierCodec codec - * @param resultCollection collection of parsed edits - * @throws IOException if operation fails - */ - private void parseByName(@Nonnull final String name, @Nonnull final PatchEdit edit, - @Nonnull final JsonReader in, @Nonnull final InstanceIdentifierContext path, - @Nonnull final StringModuleInstanceIdentifierCodec codec, - @Nonnull final List resultCollection) throws IOException { - switch (name) { - case "edit": - if (in.peek() == JsonToken.BEGIN_ARRAY) { - in.beginArray(); - - while (in.hasNext()) { - readEditDefinition(edit, in, path, codec); - resultCollection.add(prepareEditOperation(edit)); - edit.clear(); - } - - in.endArray(); - } else { - readEditDefinition(edit, in, path, codec); - resultCollection.add(prepareEditOperation(edit)); - edit.clear(); - } - - break; - case "patch-id": - this.patchId = in.nextString(); - break; - default: - break; - } - } - - /** - * Read one patch edit object from Json input. - * - * @param edit PatchEdit instance to be filled with read data - * @param in JsonReader reader - * @param path InstanceIdentifierContext path context - * @param codec Draft11StringModuleInstanceIdentifierCodec codec - * @throws IOException if operation fails - */ - private void readEditDefinition(@Nonnull final PatchEdit edit, @Nonnull final JsonReader in, - @Nonnull final InstanceIdentifierContext path, - @Nonnull final StringModuleInstanceIdentifierCodec codec) throws IOException { - String deferredValue = null; - in.beginObject(); - - while (in.hasNext()) { - final String editDefinition = in.nextName(); - switch (editDefinition) { - case "edit-id": - edit.setId(in.nextString()); - break; - case "operation": - edit.setOperation(PatchEditOperation.valueOf(in.nextString().toUpperCase())); - break; - case "target": - // target can be specified completely in request URI - final String target = in.nextString(); - if (target.equals("/")) { - edit.setTarget(path.getInstanceIdentifier()); - edit.setTargetSchemaNode(path.getSchemaContext()); - } else { - edit.setTarget(codec.deserialize(codec.serialize(path.getInstanceIdentifier()).concat(target))); - edit.setTargetSchemaNode(SchemaContextUtil.findDataSchemaNode(path.getSchemaContext(), - codec.getDataContextTree().getChild(edit.getTarget()).getDataSchemaNode().getPath() - .getParent())); - } - - break; - case "value": - Preconditions.checkArgument(edit.getData() == null && deferredValue == null, - "Multiple value entries found"); - - if (edit.getTargetSchemaNode() == null) { - final StringBuilder sb = new StringBuilder(); - - // save data defined in value node for next (later) processing, because target needs to be read - // always first and there is no ordering in Json input - readValueNode(sb, in); - deferredValue = sb.toString(); - } else { - // We have a target schema node, reuse this reader without buffering the value. - edit.setData(readEditData(in, edit.getTargetSchemaNode(), path)); - } - break; - default: - // FIXME: this does not look right, as it can wreck our logic - break; - } - } - - in.endObject(); - - if (deferredValue != null) { - // read saved data to normalized node when target schema is already known - edit.setData(readEditData(new JsonReader(new StringReader(deferredValue)), edit.getTargetSchemaNode(), - path)); - } - } - - /** - * Parse data defined in value node and saves it to buffer. - * @param sb Buffer to read value node - * @param in JsonReader reader - * @throws IOException if operation fails - */ - private void readValueNode(@Nonnull final StringBuilder sb, @Nonnull final JsonReader in) throws IOException { - in.beginObject(); - - sb.append("{\"").append(in.nextName()).append("\":"); - - switch (in.peek()) { - case BEGIN_ARRAY: - in.beginArray(); - sb.append('['); - - while (in.hasNext()) { - if (in.peek() == JsonToken.STRING) { - sb.append('"').append(in.nextString()).append('"'); - } else { - readValueObject(sb, in); - } - if (in.peek() != JsonToken.END_ARRAY) { - sb.append(','); - } - } - - in.endArray(); - sb.append(']'); - break; - default: - readValueObject(sb, in); - break; - } - - in.endObject(); - sb.append('}'); - } - - /** - * Parse one value object of data and saves it to buffer. - * @param sb Buffer to read value object - * @param in JsonReader reader - * @throws IOException if operation fails - */ - private void readValueObject(@Nonnull final StringBuilder sb, @Nonnull final JsonReader in) throws IOException { - // read simple leaf value - if (in.peek() == JsonToken.STRING) { - sb.append('"').append(in.nextString()).append('"'); - return; - } - - in.beginObject(); - sb.append('{'); - - while (in.hasNext()) { - sb.append('"').append(in.nextName()).append("\":"); - - switch (in.peek()) { - case STRING: - sb.append('"').append(in.nextString()).append('"'); - break; - case BEGIN_ARRAY: - in.beginArray(); - sb.append('['); - - while (in.hasNext()) { - if (in.peek() == JsonToken.STRING) { - sb.append('"').append(in.nextString()).append('"'); - } else { - readValueObject(sb, in); - } - - if (in.peek() != JsonToken.END_ARRAY) { - sb.append(','); - } - } - - in.endArray(); - sb.append(']'); - break; - default: - readValueObject(sb, in); - } - - if (in.peek() != JsonToken.END_OBJECT) { - sb.append(','); - } - } - - in.endObject(); - sb.append('}'); - } - - /** - * Read patch edit data defined in value node to NormalizedNode. - * @param in reader JsonReader reader - * @return NormalizedNode representing data - */ - private static NormalizedNode readEditData(@Nonnull final JsonReader in, - @Nonnull final SchemaNode targetSchemaNode, @Nonnull final InstanceIdentifierContext path) { - final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); - final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - JsonParserStream.create(writer, path.getSchemaContext(), targetSchemaNode).parse(in); - - return resultHolder.getResult(); - } - - /** - * Prepare PatchEntity from PatchEdit instance when it satisfies conditions, otherwise throws exception. - * @param edit Instance of PatchEdit - * @return PatchEntity Patch entity - */ - private static PatchEntity prepareEditOperation(@Nonnull final PatchEdit edit) { - if (edit.getOperation() != null && edit.getTargetSchemaNode() != null - && checkDataPresence(edit.getOperation(), edit.getData() != null)) { - if (!edit.getOperation().isWithValue()) { - return new PatchEntity(edit.getId(), edit.getOperation(), edit.getTarget()); - } - - // for lists allow to manipulate with list items through their parent - final YangInstanceIdentifier targetNode; - if (edit.getTarget().getLastPathArgument() instanceof NodeIdentifierWithPredicates) { - targetNode = edit.getTarget().getParent(); - } else { - targetNode = edit.getTarget(); - } - - return new PatchEntity(edit.getId(), edit.getOperation(), targetNode, edit.getData()); - } - - throw new RestconfDocumentedException("Error parsing input", ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - - /** - * Check if data is present when operation requires it and not present when operation data is not allowed. - * @param operation Name of operation - * @param hasData Data in edit are present/not present - * @return true if data is present when operation requires it or if there are no data when operation does not - * allow it, false otherwise - */ - private static boolean checkDataPresence(@Nonnull final PatchEditOperation operation, final boolean hasData) { - return operation.isWithValue() == hasData; - } - - /** - * Helper class representing one patch edit. - */ - private static final class PatchEdit { - private String id; - private PatchEditOperation operation; - private YangInstanceIdentifier target; - private SchemaNode targetSchemaNode; - private NormalizedNode data; - - String getId() { - return id; - } - - void setId(final String id) { - this.id = Preconditions.checkNotNull(id); - } - - PatchEditOperation getOperation() { - return operation; - } - - void setOperation(final PatchEditOperation operation) { - this.operation = Preconditions.checkNotNull(operation); - } - - YangInstanceIdentifier getTarget() { - return target; - } - - void setTarget(final YangInstanceIdentifier target) { - this.target = Preconditions.checkNotNull(target); - } - - SchemaNode getTargetSchemaNode() { - return targetSchemaNode; - } - - void setTargetSchemaNode(final SchemaNode targetSchemaNode) { - this.targetSchemaNode = Preconditions.checkNotNull(targetSchemaNode); - } - - NormalizedNode getData() { - return data; - } - - void setData(final NormalizedNode data) { - this.data = Preconditions.checkNotNull(data); - } - - void clear() { - id = null; - operation = null; - target = null; - targetSchemaNode = null; - data = null; - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeJsonBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeJsonBodyWriter.java deleted file mode 100644 index d5f23f72a4..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeJsonBodyWriter.java +++ /dev/null @@ -1,186 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.gson.stream.JsonWriter; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; -import java.net.URI; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Set; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; -import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.gson.JSONCodecFactory; -import org.opendaylight.yangtools.yang.data.codec.gson.JSONNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.gson.JsonWriterFactory; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; - -/** - * Writer NormalizedNode to Json. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, MediaType.APPLICATION_JSON }) -public class NormalizedNodeJsonBodyWriter implements MessageBodyWriter { - - 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) { - return type.equals(NormalizedNodeContext.class); - } - - @Override - public long getSize(final NormalizedNodeContext context, - final Class type, - final Type genericType, - final Annotation[] annotations, - final MediaType mediaType) { - return -1; - } - - @Override - public void writeTo(final NormalizedNodeContext context, - final Class type, - final Type genericType, - final Annotation[] annotations, - final MediaType mediaType, - final MultivaluedMap httpHeaders, - final OutputStream entityStream) throws IOException, WebApplicationException { - final NormalizedNode data = context.getData(); - if (data == null) { - return; - } - - @SuppressWarnings("unchecked") - final InstanceIdentifierContext identifierCtx = - (InstanceIdentifierContext) context.getInstanceIdentifierContext(); - final SchemaPath path = identifierCtx.getSchemaNode().getPath(); - final JsonWriter jsonWriter = createJsonWriter(entityStream, - context.getWriterParameters().isPrettyPrint()); - - jsonWriter.beginObject(); - writeNormalizedNode(jsonWriter, path, identifierCtx, data, - context.getWriterParameters().getDepth(), context.getWriterParameters().getFields()); - jsonWriter.endObject(); - jsonWriter.flush(); - } - - private static void writeNormalizedNode(final JsonWriter jsonWriter, - final SchemaPath path, final InstanceIdentifierContext context, final NormalizedNode data, - final Integer depth, final List> fields) throws IOException { - final RestconfNormalizedNodeWriter nnWriter; - - if (context.getSchemaNode() instanceof RpcDefinition) { - /* - * RpcDefinition is not supported as initial codec in JSONStreamWriter, - * so we need to emit initial output declaration.. - */ - nnWriter = createNormalizedNodeWriter( - context, - ((RpcDefinition) context.getSchemaNode()).getOutput().getPath(), - jsonWriter, - depth, - fields); - jsonWriter.name("output"); - jsonWriter.beginObject(); - writeChildren(nnWriter, (ContainerNode) data); - jsonWriter.endObject(); - } else { - if (SchemaPath.ROOT.equals(path)) { - nnWriter = createNormalizedNodeWriter(context, path, jsonWriter, depth, fields); - } else { - nnWriter = createNormalizedNodeWriter(context, path.getParent(), jsonWriter, depth, fields); - } - - if (data instanceof MapEntryNode) { - // Restconf allows returning one list item. We need to wrap it - // in map node in order to serialize it properly - nnWriter.write( - ImmutableNodes.mapNodeBuilder(data.getNodeType()).withChild((MapEntryNode) data).build()); - } else { - nnWriter.write(data); - } - } - - nnWriter.flush(); - } - - private static void writeChildren(final RestconfNormalizedNodeWriter nnWriter, - final ContainerNode data) throws IOException { - for (final DataContainerChild child : data.getValue()) { - nnWriter.write(child); - } - } - - private static RestconfNormalizedNodeWriter createNormalizedNodeWriter( - final InstanceIdentifierContext context, final SchemaPath path, final JsonWriter jsonWriter, - final Integer depth, final List> fields) { - - final SchemaNode schema = context.getSchemaNode(); - final JSONCodecFactory codecs = getCodecFactory(context); - - final URI initialNs; - if (schema instanceof DataSchemaNode - && !((DataSchemaNode)schema).isAugmenting() - && !(schema instanceof SchemaContext)) { - initialNs = schema.getQName().getNamespace(); - } else if (schema instanceof RpcDefinition) { - initialNs = schema.getQName().getNamespace(); - } else { - initialNs = null; - } - final NormalizedNodeStreamWriter streamWriter = JSONNormalizedNodeStreamWriter.createNestedWriter( - codecs, path, initialNs, jsonWriter); - return ParameterAwareNormalizedNodeWriter.forStreamWriter(streamWriter, depth, fields); - } - - private static JsonWriter createJsonWriter(final OutputStream entityStream, final boolean prettyPrint) { - if (prettyPrint) { - return JsonWriterFactory.createJsonWriter( - new OutputStreamWriter(entityStream, StandardCharsets.UTF_8), DEFAULT_INDENT_SPACES_NUM); - } - return JsonWriterFactory.createJsonWriter(new OutputStreamWriter(entityStream, StandardCharsets.UTF_8)); - } - - private static JSONCodecFactory getCodecFactory(final InstanceIdentifierContext context) { - // TODO: Performance: Cache JSON Codec factory and schema context - return JSONCodecFactory.getShared(context.getSchemaContext()); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeXmlBodyWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeXmlBodyWriter.java deleted file mode 100644 index bf8eb6a986..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/NormalizedNodeXmlBodyWriter.java +++ /dev/null @@ -1,172 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Throwables; -import java.io.IOException; -import java.io.OutputStream; -import java.lang.annotation.Annotation; -import java.lang.reflect.Type; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Set; -import javanet.staxutils.IndentingXMLStreamWriter; -import javax.ws.rs.Produces; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.MultivaluedMap; -import javax.ws.rs.ext.MessageBodyWriter; -import javax.ws.rs.ext.Provider; -import javax.xml.XMLConstants; -import javax.xml.stream.FactoryConfigurationError; -import javax.xml.stream.XMLOutputFactory; -import javax.xml.stream.XMLStreamException; -import javax.xml.stream.XMLStreamWriter; -import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.xml.XMLStreamNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; - -/** - * Writer of NormalizedNode to XML. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.XML, MediaType.APPLICATION_XML, MediaType.TEXT_XML }) -public class NormalizedNodeXmlBodyWriter implements MessageBodyWriter { - - private static final XMLOutputFactory XML_FACTORY; - - static { - XML_FACTORY = XMLOutputFactory.newFactory(); - XML_FACTORY.setProperty(XMLOutputFactory.IS_REPAIRING_NAMESPACES, true); - } - - @Override - 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 context, - final Class type, - final Type genericType, - final Annotation[] annotations, - final MediaType mediaType) { - return -1; - } - - @Override - public void writeTo(final NormalizedNodeContext context, - final Class type, - final Type genericType, - final Annotation[] annotations, - final MediaType mediaType, - final MultivaluedMap httpHeaders, - final OutputStream entityStream) throws IOException, WebApplicationException { - final InstanceIdentifierContext pathContext = context.getInstanceIdentifierContext(); - if (context.getData() == null) { - return; - } - - XMLStreamWriter xmlWriter; - try { - xmlWriter = XML_FACTORY.createXMLStreamWriter(entityStream, StandardCharsets.UTF_8.name()); - if (context.getWriterParameters().isPrettyPrint()) { - xmlWriter = new IndentingXMLStreamWriter(xmlWriter); - } - } catch (final XMLStreamException | FactoryConfigurationError e) { - throw new IllegalStateException(e); - } - final NormalizedNode data = context.getData(); - final SchemaPath schemaPath = pathContext.getSchemaNode().getPath(); - - writeNormalizedNode(xmlWriter, schemaPath, pathContext, data, context.getWriterParameters().getDepth(), - context.getWriterParameters().getFields()); - } - - private static void writeNormalizedNode(final XMLStreamWriter xmlWriter, - final SchemaPath path, final InstanceIdentifierContext pathContext, final NormalizedNode data, - final Integer depth, final List> fields) throws IOException { - final RestconfNormalizedNodeWriter nnWriter; - final SchemaContext schemaCtx = pathContext.getSchemaContext(); - - if (pathContext.getSchemaNode() instanceof RpcDefinition) { - /* - * RpcDefinition is not supported as initial codec in XMLStreamWriter, - * so we need to emit initial output declaration.. - */ - nnWriter = createNormalizedNodeWriter( - xmlWriter, - schemaCtx, - ((RpcDefinition) pathContext.getSchemaNode()).getOutput().getPath(), - depth, - fields); - writeElements(xmlWriter, nnWriter, (ContainerNode) data); - } else { - if (SchemaPath.ROOT.equals(path)) { - nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path, depth, fields); - } else { - nnWriter = createNormalizedNodeWriter(xmlWriter, schemaCtx, path.getParent(), depth, fields); - } - - if (data instanceof MapEntryNode) { - // Restconf allows returning one list item. We need to wrap it - // in map node in order to serialize it properly - nnWriter.write(ImmutableNodes.mapNodeBuilder(data.getNodeType()).addChild((MapEntryNode) data).build()); - } else { - nnWriter.write(data); - } - } - - nnWriter.flush(); - } - - private static RestconfNormalizedNodeWriter createNormalizedNodeWriter(final XMLStreamWriter xmlWriter, - final SchemaContext schemaContext, final SchemaPath schemaPath, final Integer depth, - final List> fields) { - final NormalizedNodeStreamWriter xmlStreamWriter = XMLStreamNormalizedNodeStreamWriter - .create(xmlWriter, schemaContext, schemaPath); - return ParameterAwareNormalizedNodeWriter.forStreamWriter(xmlStreamWriter, depth, fields); - } - - private static void writeElements(final XMLStreamWriter xmlWriter, final RestconfNormalizedNodeWriter nnWriter, - final ContainerNode data) throws IOException { - try { - final QName name = data.getNodeType(); - 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); - } - nnWriter.flush(); - xmlWriter.writeEndElement(); - xmlWriter.flush(); - } catch (final XMLStreamException e) { - Throwables.propagate(e); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/ParameterAwareNormalizedNodeWriter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/ParameterAwareNormalizedNodeWriter.java deleted file mode 100644 index 7b0592fb0e..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/ParameterAwareNormalizedNodeWriter.java +++ /dev/null @@ -1,383 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import static org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter.UNKNOWN_SIZE; - -import com.google.common.annotations.Beta; -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; -import java.io.IOException; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.Set; -import org.opendaylight.netconf.sal.rest.api.RestconfNormalizedNodeWriter; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.AnyXmlNode; -import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; -import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; -import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.UnkeyedListNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamAttributeWriter; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * This is an experimental iterator over a {@link NormalizedNode}. This is essentially the opposite of a - * {@link javax.xml.stream.XMLStreamReader} -- unlike instantiating an iterator over the backing data, this - * encapsulates a {@link NormalizedNodeStreamWriter} and allows us to write multiple nodes. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Beta -public class ParameterAwareNormalizedNodeWriter implements RestconfNormalizedNodeWriter { - private static final QName ROOT_DATA_QNAME = QName.create("urn:ietf:params:xml:ns:netconf:base:1.0", "data"); - - private final NormalizedNodeStreamWriter writer; - private final Integer maxDepth; - protected final List> fields; - protected int currentDepth = 0; - - private ParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final Integer maxDepth, - final List> fields) { - this.writer = Preconditions.checkNotNull(writer); - this.maxDepth = maxDepth; - this.fields = fields; - } - - protected final NormalizedNodeStreamWriter getWriter() { - return writer; - } - - /** - * Create a new writer backed by a {@link NormalizedNodeStreamWriter}. - * - * @param writer Back-end writer - * @param maxDepth Maximal depth to write - * @param fields Selected child nodes to write - * @return A new instance. - */ - public static ParameterAwareNormalizedNodeWriter forStreamWriter( - final NormalizedNodeStreamWriter writer, final Integer maxDepth, final List> fields) { - return forStreamWriter(writer, true, maxDepth, fields); - } - - /** - * Create a new writer backed by a {@link NormalizedNodeStreamWriter}. Unlike the simple - * {@link #forStreamWriter(NormalizedNodeStreamWriter, Integer, List)} - * method, this allows the caller to switch off RFC6020 XML compliance, providing better - * throughput. The reason is that the XML mapping rules in RFC6020 require the encoding - * to emit leaf nodes which participate in a list's key first and in the order in which - * they are defined in the key. For JSON, this requirement is completely relaxed and leaves - * can be ordered in any way we see fit. The former requires a bit of work: first a lookup - * for each key and then for each emitted node we need to check whether it was already - * emitted. - * - * @param writer Back-end writer - * @param orderKeyLeaves whether the returned instance should be RFC6020 XML compliant. - * @param maxDepth Maximal depth to write - * @param fields Selected child nodes to write - * @return A new instance. - */ - public static ParameterAwareNormalizedNodeWriter forStreamWriter(final NormalizedNodeStreamWriter writer, - final boolean orderKeyLeaves, - final Integer maxDepth, - final List> fields) { - return orderKeyLeaves ? new OrderedParameterAwareNormalizedNodeWriter(writer, maxDepth, fields) - : new ParameterAwareNormalizedNodeWriter(writer, maxDepth, fields); - } - - /** - * Iterate over the provided {@link NormalizedNode} and emit write - * events to the encapsulated {@link NormalizedNodeStreamWriter}. - * - * @param node Node - * @return {@code ParameterAwareNormalizedNodeWriter} - * @throws IOException when thrown from the backing writer. - */ - @Override - public final ParameterAwareNormalizedNodeWriter write(final NormalizedNode node) throws IOException { - if (wasProcessedAsCompositeNode(node)) { - return this; - } - - if (wasProcessAsSimpleNode(node)) { - return this; - } - - throw new IllegalStateException("It wasn't possible to serialize node " + node); - } - - @Override - public void flush() throws IOException { - writer.flush(); - } - - @Override - public void close() throws IOException { - writer.flush(); - writer.close(); - } - - /** - * Emit a best guess of a hint for a particular set of children. It evaluates the - * iterable to see if the size can be easily gotten to. If it is, we hint at the - * real number of child nodes. Otherwise we emit UNKNOWN_SIZE. - * - * @param children Child nodes - * @return Best estimate of the collection size required to hold all the children. - */ - static final int childSizeHint(final Iterable children) { - return children instanceof Collection ? ((Collection) children).size() : UNKNOWN_SIZE; - } - - private boolean wasProcessAsSimpleNode(final NormalizedNode node) throws IOException { - if (node instanceof LeafSetEntryNode) { - if (selectedByParameters(node, false)) { - final LeafSetEntryNode nodeAsLeafList = (LeafSetEntryNode) node; - if (writer instanceof NormalizedNodeStreamAttributeWriter) { - ((NormalizedNodeStreamAttributeWriter) writer).leafSetEntryNode(nodeAsLeafList.getNodeType(), - nodeAsLeafList.getValue(), nodeAsLeafList.getAttributes()); - } else { - writer.leafSetEntryNode(nodeAsLeafList.getNodeType(), nodeAsLeafList.getValue()); - } - } - return true; - } else if (node instanceof LeafNode) { - final LeafNode nodeAsLeaf = (LeafNode)node; - if (writer instanceof NormalizedNodeStreamAttributeWriter) { - ((NormalizedNodeStreamAttributeWriter) writer).leafNode( - nodeAsLeaf.getIdentifier(), nodeAsLeaf.getValue(), nodeAsLeaf.getAttributes()); - } else { - writer.leafNode(nodeAsLeaf.getIdentifier(), nodeAsLeaf.getValue()); - } - return true; - } else if (node instanceof AnyXmlNode) { - final AnyXmlNode anyXmlNode = (AnyXmlNode)node; - writer.anyxmlNode(anyXmlNode.getIdentifier(), anyXmlNode.getValue()); - return true; - } - - return false; - } - - /** - * Check if node should be written according to parameters fields and depth. - * See Restconf draft. - * @param node Node to be written - * @param mixinParent {@code true} if parent is mixin, {@code false} otherwise - * @return {@code true} if node will be written, {@code false} otherwise - */ - protected boolean selectedByParameters(final NormalizedNode node, final boolean mixinParent) { - // nodes to be written are not limited by fields, only by depth - if (fields == null) { - return maxDepth == null || currentDepth < maxDepth; - } - - // children of mixin nodes are never selected in fields but must be written if they are first in selected target - if (mixinParent && currentDepth == 0) { - return true; - } - - // always write augmentation nodes - if (node instanceof AugmentationNode) { - return true; - } - - // write only selected nodes - if (currentDepth > 0 && currentDepth <= fields.size()) { - return fields.get(currentDepth - 1).contains(node.getNodeType()); - } - - // after this depth only depth parameter is used to determine when to write node - return maxDepth == null || currentDepth < maxDepth; - } - - /** - * Emit events for all children and then emit an endNode() event. - * - * @param children Child iterable - * @param mixinParent {@code true} if parent is mixin, {@code false} otherwise - * @return True - * @throws IOException when the writer reports it - */ - protected final boolean writeChildren(final Iterable> children, - final boolean mixinParent) throws IOException { - for (final NormalizedNode child : children) { - if (selectedByParameters(child, mixinParent)) { - write(child); - } - } - writer.endNode(); - return true; - } - - protected boolean writeMapEntryChildren(final MapEntryNode mapEntryNode) throws IOException { - if (selectedByParameters(mapEntryNode, false)) { - writeChildren(mapEntryNode.getValue(), false); - } else if (fields == null && maxDepth != null && currentDepth == maxDepth) { - writeOnlyKeys(mapEntryNode.getIdentifier().getKeyValues()); - } - return true; - } - - private void writeOnlyKeys(final Map keyValues) throws IllegalArgumentException, IOException { - for (final Map.Entry entry : keyValues.entrySet()) { - writer.leafNode(new NodeIdentifier(entry.getKey()), entry.getValue()); - } - writer.endNode(); - } - - protected boolean writeMapEntryNode(final MapEntryNode node) throws IOException { - if (writer instanceof NormalizedNodeStreamAttributeWriter) { - ((NormalizedNodeStreamAttributeWriter) writer) - .startMapEntryNode(node.getIdentifier(), childSizeHint(node.getValue()), node.getAttributes()); - } else { - writer.startMapEntryNode(node.getIdentifier(), childSizeHint(node.getValue())); - } - currentDepth++; - writeMapEntryChildren(node); - currentDepth--; - return true; - } - - private boolean wasProcessedAsCompositeNode(final NormalizedNode node) throws IOException { - boolean processedAsCompositeNode = false; - if (node instanceof ContainerNode) { - final ContainerNode n = (ContainerNode) node; - if (!n.getNodeType().equals(ROOT_DATA_QNAME)) { - if (writer instanceof NormalizedNodeStreamAttributeWriter) { - ((NormalizedNodeStreamAttributeWriter) writer).startContainerNode( - n.getIdentifier(), childSizeHint(n.getValue()), n.getAttributes()); - } else { - writer.startContainerNode(n.getIdentifier(), childSizeHint(n.getValue())); - } - currentDepth++; - processedAsCompositeNode = writeChildren(n.getValue(), false); - currentDepth--; - } else { - // write child nodes of data root container - for (final NormalizedNode child : n.getValue()) { - currentDepth++; - if (selectedByParameters(child, false)) { - write(child); - } - currentDepth--; - processedAsCompositeNode = true; - } - } - } else if (node instanceof MapEntryNode) { - processedAsCompositeNode = writeMapEntryNode((MapEntryNode) node); - } else if (node instanceof UnkeyedListEntryNode) { - final UnkeyedListEntryNode n = (UnkeyedListEntryNode) node; - writer.startUnkeyedListItem(n.getIdentifier(), childSizeHint(n.getValue())); - currentDepth++; - processedAsCompositeNode = writeChildren(n.getValue(), false); - currentDepth--; - } else if (node instanceof ChoiceNode) { - final ChoiceNode n = (ChoiceNode) node; - writer.startChoiceNode(n.getIdentifier(), childSizeHint(n.getValue())); - processedAsCompositeNode = writeChildren(n.getValue(), true); - } else if (node instanceof AugmentationNode) { - final AugmentationNode n = (AugmentationNode) node; - writer.startAugmentationNode(n.getIdentifier()); - processedAsCompositeNode = writeChildren(n.getValue(), true); - } else if (node instanceof UnkeyedListNode) { - final UnkeyedListNode n = (UnkeyedListNode) node; - writer.startUnkeyedList(n.getIdentifier(), childSizeHint(n.getValue())); - processedAsCompositeNode = writeChildren(n.getValue(), false); - } else if (node instanceof OrderedMapNode) { - final OrderedMapNode n = (OrderedMapNode) node; - writer.startOrderedMapNode(n.getIdentifier(), childSizeHint(n.getValue())); - processedAsCompositeNode = writeChildren(n.getValue(), true); - } else if (node instanceof MapNode) { - final MapNode n = (MapNode) node; - writer.startMapNode(n.getIdentifier(), childSizeHint(n.getValue())); - processedAsCompositeNode = writeChildren(n.getValue(), true); - } else if (node instanceof LeafSetNode) { - final LeafSetNode n = (LeafSetNode) node; - if (node instanceof OrderedLeafSetNode) { - writer.startOrderedLeafSet(n.getIdentifier(), childSizeHint(n.getValue())); - } else { - writer.startLeafSet(n.getIdentifier(), childSizeHint(n.getValue())); - } - currentDepth++; - processedAsCompositeNode = writeChildren(n.getValue(), true); - currentDepth--; - } - - return processedAsCompositeNode; - } - - private static final class OrderedParameterAwareNormalizedNodeWriter extends ParameterAwareNormalizedNodeWriter { - private static final Logger LOG = LoggerFactory.getLogger(OrderedParameterAwareNormalizedNodeWriter.class); - - OrderedParameterAwareNormalizedNodeWriter(final NormalizedNodeStreamWriter writer, final Integer maxDepth, - final List> fields) { - super(writer, maxDepth, fields); - } - - @Override - protected boolean writeMapEntryNode(final MapEntryNode node) throws IOException { - final NormalizedNodeStreamWriter writer = getWriter(); - if (writer instanceof NormalizedNodeStreamAttributeWriter) { - ((NormalizedNodeStreamAttributeWriter) writer).startMapEntryNode( - node.getIdentifier(), childSizeHint(node.getValue()), node.getAttributes()); - } else { - writer.startMapEntryNode(node.getIdentifier(), childSizeHint(node.getValue())); - } - - final Set qnames = node.getIdentifier().getKeyValues().keySet(); - // Write out all the key children - currentDepth++; - for (final QName qname : qnames) { - final Optional> child = node.getChild(new NodeIdentifier(qname)); - if (child.isPresent()) { - if (selectedByParameters(child.get(), false)) { - write(child.get()); - } - } else { - LOG.info("No child for key element {} found", qname); - } - } - currentDepth--; - - currentDepth++; - // Write all the rest - final boolean result = - writeChildren(Iterables.filter(node.getValue(), input -> { - if (input instanceof AugmentationNode) { - return true; - } - if (!qnames.contains(input.getNodeType())) { - return true; - } - - LOG.debug("Skipping key child {}", input); - return false; - }), false); - currentDepth--; - return result; - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/StringModuleInstanceIdentifierCodec.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/StringModuleInstanceIdentifierCodec.java deleted file mode 100644 index b58a623a80..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/StringModuleInstanceIdentifierCodec.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Preconditions; -import java.net.URI; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.opendaylight.yangtools.yang.data.util.AbstractModuleStringInstanceIdentifierCodec; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Module instance identifier codec. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class StringModuleInstanceIdentifierCodec extends AbstractModuleStringInstanceIdentifierCodec { - - private final DataSchemaContextTree dataContextTree; - private final SchemaContext context; - private final String defaultPrefix; - - public StringModuleInstanceIdentifierCodec(final SchemaContext context) { - this.context = Preconditions.checkNotNull(context); - this.dataContextTree = DataSchemaContextTree.from(context); - this.defaultPrefix = ""; - } - - StringModuleInstanceIdentifierCodec(final SchemaContext context, @Nonnull final String defaultPrefix) { - this.context = Preconditions.checkNotNull(context); - this.dataContextTree = DataSchemaContextTree.from(context); - this.defaultPrefix = defaultPrefix; - } - - @Override - protected Module moduleForPrefix(@Nonnull final String prefix) { - if (prefix.isEmpty() && !this.defaultPrefix.isEmpty()) { - return this.context.findModuleByName(this.defaultPrefix, null); - } else { - return this.context.findModuleByName(prefix, null); - } - } - - @Nonnull - @Override - protected DataSchemaContextTree getDataContextTree() { - return this.dataContextTree; - } - - @Nullable - @Override - protected String prefixForNamespace(@Nonnull final URI namespace) { - final Module module = this.context.findModuleByNamespaceAndRevision(namespace, null); - return module == null ? null : module.getName(); - } -} \ No newline at end of file diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlNormalizedNodeBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlNormalizedNodeBodyReader.java deleted file mode 100644 index 1345b37e30..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlNormalizedNodeBodyReader.java +++ /dev/null @@ -1,227 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Preconditions; -import com.google.common.collect.Iterables; -import java.io.IOException; -import java.io.InputStream; -import java.net.URISyntaxException; -import java.util.ArrayDeque; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Deque; -import java.util.List; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.ext.Provider; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.stream.XMLStreamException; -import javax.xml.transform.dom.DOMSource; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.util.xml.UntrustedXML; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.data.impl.schema.SchemaUtils; -import org.opendaylight.yangtools.yang.model.api.AugmentationSchema; -import org.opendaylight.yangtools.yang.model.api.AugmentationTarget; -import org.opendaylight.yangtools.yang.model.api.ChoiceCaseNode; -import org.opendaylight.yangtools.yang.model.api.ChoiceSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.xml.sax.SAXException; - -/** - * Reader of XML to NormalizedNode. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.XML, MediaType.APPLICATION_XML, MediaType.TEXT_XML }) -public class XmlNormalizedNodeBodyReader extends AbstractNormalizedNodeBodyReader { - private static final Logger LOG = LoggerFactory.getLogger(XmlNormalizedNodeBodyReader.class); - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - protected NormalizedNodeContext readBody(final InstanceIdentifierContext path, final InputStream entityStream) - throws IOException, WebApplicationException { - try { - final Document doc = UntrustedXML.newDocumentBuilder().parse(entityStream); - return parse(path,doc); - } catch (final RestconfDocumentedException e) { - throw e; - } catch (final Exception e) { - LOG.debug("Error parsing xml input", e); - - throw new RestconfDocumentedException("Error parsing input: " + e.getMessage(), ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE, e); - } - } - - private NormalizedNodeContext parse(final InstanceIdentifierContext pathContext, final Document doc) - throws XMLStreamException, IOException, ParserConfigurationException, SAXException, URISyntaxException { - final SchemaNode schemaNodeContext = pathContext.getSchemaNode(); - DataSchemaNode schemaNode; - boolean isRpc = false; - if (schemaNodeContext instanceof RpcDefinition) { - schemaNode = ((RpcDefinition) schemaNodeContext).getInput(); - isRpc = true; - } else if (schemaNodeContext instanceof DataSchemaNode) { - schemaNode = (DataSchemaNode) schemaNodeContext; - } else { - throw new IllegalStateException("Unknown SchemaNode"); - } - - final String docRootElm = doc.getDocumentElement().getLocalName(); - final String docRootNamespace = doc.getDocumentElement().getNamespaceURI(); - final List iiToDataList = new ArrayList<>(); - - if (isPost() && !isRpc) { - final Deque foundSchemaNodes = findPathToSchemaNodeByName(schemaNode, docRootElm, docRootNamespace); - if (foundSchemaNodes.isEmpty()) { - throw new IllegalStateException(String.format("Child \"%s\" was not found in parent schema node \"%s\"", - docRootElm, schemaNode.getQName())); - } - while (!foundSchemaNodes.isEmpty()) { - final Object child = foundSchemaNodes.pop(); - if (child instanceof AugmentationSchema) { - final AugmentationSchema augmentSchemaNode = (AugmentationSchema) child; - iiToDataList.add(SchemaUtils.getNodeIdentifierForAugmentation(augmentSchemaNode)); - } else if (child instanceof DataSchemaNode) { - schemaNode = (DataSchemaNode) child; - iiToDataList.add(new YangInstanceIdentifier.NodeIdentifier(schemaNode.getQName())); - } - } - // PUT - } else if (!isRpc) { - final QName scQName = schemaNode.getQName(); - Preconditions.checkState( - docRootElm.equals(scQName.getLocalName()) - && docRootNamespace.equals(scQName.getNamespace().toASCIIString()), - String.format("Not correct message root element \"%s\", should be \"%s\"", - docRootElm, scQName)); - } - - NormalizedNode parsed; - final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); - final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - - if (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode - || schemaNode instanceof LeafSchemaNode) { - final XmlParserStream xmlParser = XmlParserStream.create(writer, pathContext.getSchemaContext(), - schemaNode); - xmlParser.traverse(new DOMSource(doc.getDocumentElement())); - parsed = resultHolder.getResult(); - - // When parsing an XML source with a list root node - // the new XML parser always returns a MapNode with one MapEntryNode inside. - // However, the old XML parser returned a MapEntryNode directly in this place. - // Therefore we now have to extract the MapEntryNode from the parsed MapNode. - if (parsed instanceof MapNode) { - final MapNode mapNode = (MapNode) parsed; - // extracting the MapEntryNode - parsed = mapNode.getValue().iterator().next(); - } - - if (schemaNode instanceof ListSchemaNode && isPost()) { - iiToDataList.add(parsed.getIdentifier()); - } - } else { - LOG.warn("Unknown schema node extension {} was not parsed", schemaNode.getClass()); - parsed = null; - } - - final YangInstanceIdentifier fullIIToData = YangInstanceIdentifier.create(Iterables.concat( - pathContext.getInstanceIdentifier().getPathArguments(), iiToDataList)); - - final InstanceIdentifierContext outIIContext = new InstanceIdentifierContext<>( - fullIIToData, pathContext.getSchemaNode(), pathContext.getMountPoint(), pathContext.getSchemaContext()); - - return new NormalizedNodeContext(outIIContext, parsed); - } - - private static Deque findPathToSchemaNodeByName(final DataSchemaNode schemaNode, final String elementName, - final String namespace) { - final Deque result = new ArrayDeque<>(); - final ArrayList choiceSchemaNodes = new ArrayList<>(); - final Collection children = ((DataNodeContainer) schemaNode).getChildNodes(); - for (final DataSchemaNode child : children) { - if (child instanceof ChoiceSchemaNode) { - choiceSchemaNodes.add((ChoiceSchemaNode) child); - } else if (child.getQName().getLocalName().equalsIgnoreCase(elementName) - && child.getQName().getNamespace().toString().equalsIgnoreCase(namespace)) { - // add child to result - result.push(child); - - // find augmentation - if (child.isAugmenting()) { - final AugmentationSchema augment = findCorrespondingAugment(schemaNode, child); - if (augment != null) { - result.push(augment); - } - } - - // return result - return result; - } - } - - for (final ChoiceSchemaNode choiceNode : choiceSchemaNodes) { - for (final ChoiceCaseNode caseNode : choiceNode.getCases()) { - final Deque resultFromRecursion = findPathToSchemaNodeByName(caseNode, elementName, namespace); - if (!resultFromRecursion.isEmpty()) { - resultFromRecursion.push(choiceNode); - if (choiceNode.isAugmenting()) { - final AugmentationSchema augment = findCorrespondingAugment(schemaNode, choiceNode); - if (augment != null) { - resultFromRecursion.push(augment); - } - } - return resultFromRecursion; - } - } - } - return result; - } - - private static AugmentationSchema findCorrespondingAugment(final DataSchemaNode parent, - final DataSchemaNode child) { - if (parent instanceof AugmentationTarget && !(parent instanceof ChoiceSchemaNode)) { - for (final AugmentationSchema augmentation : ((AugmentationTarget) parent).getAvailableAugmentations()) { - final DataSchemaNode childInAugmentation = augmentation.getDataChildByName(child.getQName()); - if (childInAugmentation != null) { - return augmentation; - } - } - } - return null; - } -} - diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlToPatchBodyReader.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlToPatchBodyReader.java deleted file mode 100644 index fc74935120..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/jersey/providers/XmlToPatchBodyReader.java +++ /dev/null @@ -1,277 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.jersey.providers; - -import com.google.common.base.Splitter; -import com.google.common.collect.ImmutableList; -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import javax.annotation.Nonnull; -import javax.ws.rs.Consumes; -import javax.ws.rs.WebApplicationException; -import javax.ws.rs.ext.Provider; -import javax.xml.parsers.ParserConfigurationException; -import javax.xml.stream.XMLStreamException; -import javax.xml.transform.dom.DOMSource; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchEditOperation; -import org.opendaylight.restconf.common.patch.PatchEntity; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.yangtools.util.xml.UntrustedXML; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.stream.NormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.codec.xml.XmlParserStream; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNormalizedNodeStreamWriter; -import org.opendaylight.yangtools.yang.data.impl.schema.NormalizedNodeResult; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataNodeContainer; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.SAXException; - -/** - * Reader of XML to Patch. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -@Provider -@Consumes({Rfc8040.MediaTypes.PATCH + RestconfConstants.XML}) -public class XmlToPatchBodyReader extends AbstractToPatchBodyReader { - private static final Logger LOG = LoggerFactory.getLogger(XmlToPatchBodyReader.class); - private static final Splitter SLASH_SPLITTER = Splitter.on('/'); - - @SuppressWarnings("checkstyle:IllegalCatch") - @Override - protected PatchContext readBody(final InstanceIdentifierContext path, final InputStream entityStream) - throws IOException, WebApplicationException { - try { - final Document doc = UntrustedXML.newDocumentBuilder().parse(entityStream); - return parse(path, doc); - } catch (final RestconfDocumentedException e) { - throw e; - } catch (final Exception e) { - LOG.debug("Error parsing xml input", e); - - throw new RestconfDocumentedException("Error parsing input: " + e.getMessage(), ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE); - } - } - - private static PatchContext parse(final InstanceIdentifierContext pathContext, final Document doc) - throws XMLStreamException, IOException, ParserConfigurationException, SAXException, URISyntaxException { - final List resultCollection = new ArrayList<>(); - final String patchId = doc.getElementsByTagName("patch-id").item(0).getFirstChild().getNodeValue(); - final NodeList editNodes = doc.getElementsByTagName("edit"); - - for (int i = 0; i < editNodes.getLength(); i++) { - DataSchemaNode schemaNode = (DataSchemaNode) pathContext.getSchemaNode(); - final Element element = (Element) editNodes.item(i); - final String operation = element.getElementsByTagName("operation").item(0).getFirstChild().getNodeValue(); - final PatchEditOperation oper = PatchEditOperation.valueOf(operation.toUpperCase()); - final String editId = element.getElementsByTagName("edit-id").item(0).getFirstChild().getNodeValue(); - final String target = element.getElementsByTagName("target").item(0).getFirstChild().getNodeValue(); - final List values = readValueNodes(element, oper); - final Element firstValueElement = values != null ? values.get(0) : null; - - // get namespace according to schema node from path context or value - final String namespace = firstValueElement == null - ? schemaNode.getQName().getNamespace().toString() : firstValueElement.getNamespaceURI(); - - // find module according to namespace - final Module module = pathContext.getSchemaContext().findModuleByNamespace( - URI.create(namespace)).iterator().next(); - - // initialize codec + set default prefix derived from module name - final StringModuleInstanceIdentifierCodec codec = new StringModuleInstanceIdentifierCodec( - pathContext.getSchemaContext(), module.getName()); - - // find complete path to target and target schema node - // target can be also empty (only slash) - YangInstanceIdentifier targetII; - final SchemaNode targetNode; - if (target.equals("/")) { - targetII = pathContext.getInstanceIdentifier(); - targetNode = pathContext.getSchemaContext(); - } else { - targetII = codec.deserialize(codec.serialize(pathContext.getInstanceIdentifier()) - .concat(prepareNonCondXpath(schemaNode, target.replaceFirst("/", ""), firstValueElement, - namespace, module.getQNameModule().getFormattedRevision()))); - - targetNode = SchemaContextUtil.findDataSchemaNode(pathContext.getSchemaContext(), - codec.getDataContextTree().getChild(targetII).getDataSchemaNode().getPath().getParent()); - - // move schema node - schemaNode = (DataSchemaNode) SchemaContextUtil.findDataSchemaNode(pathContext.getSchemaContext(), - codec.getDataContextTree().getChild(targetII).getDataSchemaNode().getPath()); - } - - if (targetNode == null) { - LOG.debug("Target node {} not found in path {} ", target, pathContext.getSchemaNode()); - throw new RestconfDocumentedException("Error parsing input", ErrorType.PROTOCOL, - ErrorTag.MALFORMED_MESSAGE); - } - - if (oper.isWithValue()) { - final NormalizedNode parsed; - if (schemaNode instanceof ContainerSchemaNode || schemaNode instanceof ListSchemaNode) { - final NormalizedNodeResult resultHolder = new NormalizedNodeResult(); - final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(resultHolder); - final XmlParserStream xmlParser = XmlParserStream.create(writer, pathContext.getSchemaContext(), - schemaNode); - xmlParser.traverse(new DOMSource(firstValueElement)); - parsed = resultHolder.getResult(); - } else { - parsed = null; - } - - // for lists allow to manipulate with list items through their parent - if (targetII.getLastPathArgument() instanceof NodeIdentifierWithPredicates) { - targetII = targetII.getParent(); - } - - resultCollection.add(new PatchEntity(editId, oper, targetII, parsed)); - } else { - resultCollection.add(new PatchEntity(editId, oper, targetII)); - } - } - - return new PatchContext(pathContext, ImmutableList.copyOf(resultCollection), patchId); - } - - /** - * Read value nodes. - * - * @param element Element of current edit operation - * @param operation Name of current operation - * @return List of value elements - */ - private static List readValueNodes(@Nonnull final Element element, - @Nonnull final PatchEditOperation operation) { - final Node valueNode = element.getElementsByTagName("value").item(0); - - if (operation.isWithValue() && valueNode == null) { - throw new RestconfDocumentedException("Error parsing input", - ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - - if (!operation.isWithValue() && valueNode != null) { - throw new RestconfDocumentedException("Error parsing input", - ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - - if (valueNode == null) { - return null; - } - - final List result = new ArrayList<>(); - final NodeList childNodes = valueNode.getChildNodes(); - for (int i = 0; i < childNodes.getLength(); i++) { - if (childNodes.item(i) instanceof Element) { - result.add((Element) childNodes.item(i)); - } - } - - return result; - } - - /** - * Prepare non-conditional XPath suitable for deserialization with {@link StringModuleInstanceIdentifierCodec}. - * - * @param schemaNode Top schema node - * @param target Edit operation target - * @param value Element with value - * @param namespace Module namespace - * @param revision Module revision - * @return Non-conditional XPath - */ - private static String prepareNonCondXpath(@Nonnull final DataSchemaNode schemaNode, @Nonnull final String target, - @Nonnull final Element value, @Nonnull final String namespace, @Nonnull final String revision) { - final Iterator args = SLASH_SPLITTER.split(target.substring(target.indexOf(':') + 1)).iterator(); - - final StringBuilder nonCondXpath = new StringBuilder(); - SchemaNode childNode = schemaNode; - - while (args.hasNext()) { - final String s = args.next(); - nonCondXpath.append("/"); - nonCondXpath.append(s); - childNode = ((DataNodeContainer) childNode).getDataChildByName(QName.create(namespace, revision, s)); - - if (childNode instanceof ListSchemaNode && args.hasNext()) { - appendKeys(nonCondXpath, ((ListSchemaNode) childNode).getKeyDefinition().iterator(), args); - } - } - - if (childNode instanceof ListSchemaNode && value != null) { - final Iterator keyValues = readKeyValues(value, - ((ListSchemaNode) childNode).getKeyDefinition().iterator()); - appendKeys(nonCondXpath, ((ListSchemaNode) childNode).getKeyDefinition().iterator(), keyValues); - } - - return nonCondXpath.toString(); - } - - /** - * Read value for every list key. - * - * @param value Value element - * @param keys Iterator of list keys names - * @return Iterator of list keys values - */ - private static Iterator readKeyValues(@Nonnull final Element value, @Nonnull final Iterator keys) { - final List result = new ArrayList<>(); - - while (keys.hasNext()) { - result.add(value.getElementsByTagName(keys.next().getLocalName()).item(0).getFirstChild().getNodeValue()); - } - - return result.iterator(); - } - - /** - * Append key name - key value pairs for every list key to {@code nonCondXpath}. - * - * @param nonCondXpath Builder for creating non-conditional XPath - * @param keyNames Iterator of list keys names - * @param keyValues Iterator of list keys values - */ - private static void appendKeys(@Nonnull final StringBuilder nonCondXpath, @Nonnull final Iterator keyNames, - @Nonnull final Iterator keyValues) { - while (keyNames.hasNext()) { - nonCondXpath.append('['); - nonCondXpath.append(keyNames.next().getLocalName()); - nonCondXpath.append("='"); - nonCondXpath.append(keyValues.next()); - nonCondXpath.append("']"); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/IdentifierCodec.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/IdentifierCodec.java deleted file mode 100644 index 478ee30b02..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/IdentifierCodec.java +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.parser; - -import org.opendaylight.restconf.parser.builder.YangInstanceIdentifierDeserializer; -import org.opendaylight.restconf.parser.builder.YangInstanceIdentifierSerializer; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Codec for identifier to serialize {@link YangInstanceIdentifier} to {@link String} and deserialize - * {@link String} to {@link YangInstanceIdentifier}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class IdentifierCodec { - - private IdentifierCodec() { - throw new UnsupportedOperationException("Util class."); - } - - public static String serialize(final YangInstanceIdentifier data, final SchemaContext schemaContext) { - return YangInstanceIdentifierSerializer.create(schemaContext, data); - } - - public static YangInstanceIdentifier deserialize(final String data, final SchemaContext schemaContext) { - if (data == null) { - return YangInstanceIdentifier.builder().build(); - } - return YangInstanceIdentifier.create(YangInstanceIdentifierDeserializer.create(schemaContext, data)); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java deleted file mode 100644 index c1c319fd73..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierDeserializer.java +++ /dev/null @@ -1,463 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.parser.builder; - -import com.google.common.base.CharMatcher; -import com.google.common.base.Preconditions; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import java.util.Iterator; -import java.util.LinkedList; -import java.util.List; -import org.opendaylight.netconf.sal.restconf.impl.RestCodec; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.util.RestUtil; -import org.opendaylight.restconf.common.util.RestconfSchemaUtil; -import org.opendaylight.restconf.common.validation.RestconfValidationUtils; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants; -import org.opendaylight.yangtools.concepts.Codec; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.IdentitySchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.TypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.IdentityrefTypeDefinition; -import org.opendaylight.yangtools.yang.model.api.type.LeafrefTypeDefinition; -import org.opendaylight.yangtools.yang.model.util.SchemaContextUtil; - -/** - * Deserializer for {@link String} to {@link YangInstanceIdentifier} for restconf. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class YangInstanceIdentifierDeserializer { - - private YangInstanceIdentifierDeserializer() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Method to create {@link Iterable} from {@link PathArgument} which are - * parsing from data by {@link SchemaContext}. - * - * @param schemaContext - * for validate of parsing path arguments - * @param data - * path to data - * @return {@link Iterable} of {@link PathArgument} - */ - public static Iterable create(final SchemaContext schemaContext, final String data) { - final List path = new LinkedList<>(); - final MainVarsWrapper variables = new YangInstanceIdentifierDeserializer.MainVarsWrapper( - data, DataSchemaContextTree.from(schemaContext).getRoot(), - YangInstanceIdentifierDeserializer.MainVarsWrapper.STARTING_OFFSET, schemaContext); - - while (!allCharsConsumed(variables)) { - validArg(variables); - final QName qname = prepareQName(variables); - - // this is the last identifier (input is consumed) or end of identifier (slash) - if (allCharsConsumed(variables) - || (currentChar(variables.getOffset(), variables.getData()) == RestconfConstants.SLASH)) { - prepareIdentifier(qname, path, variables); - if (variables.getCurrent() == null) { - path.add(NodeIdentifier.create(qname)); - } else { - path.add(variables.getCurrent().getIdentifier()); - } - } else if (currentChar(variables.getOffset(), - variables.getData()) == ParserBuilderConstants.Deserializer.EQUAL) { - if (nextContextNode(qname, path, variables).getDataSchemaNode() instanceof ListSchemaNode) { - prepareNodeWithPredicates(qname, path, variables); - } else { - prepareNodeWithValue(qname, path, variables); - } - } else { - throw new IllegalArgumentException( - "Bad char " + currentChar(variables.getOffset(), variables.getData()) + " on position " - + variables.getOffset() + "."); - } - } - - return ImmutableList.copyOf(path); - } - - private static void prepareNodeWithPredicates(final QName qname, final List path, - final MainVarsWrapper variables) { - - final DataSchemaNode dataSchemaNode = variables.getCurrent().getDataSchemaNode(); - checkValid((dataSchemaNode != null), "Data schema node is null", variables.getData(), variables.getOffset()); - - final Iterator keys = ((ListSchemaNode) dataSchemaNode).getKeyDefinition().iterator(); - final ImmutableMap.Builder values = ImmutableMap.builder(); - - // skip already expected equal sign - skipCurrentChar(variables); - - // read key value separated by comma - while (keys.hasNext() && !allCharsConsumed(variables) && (currentChar(variables.getOffset(), - variables.getData()) != RestconfConstants.SLASH)) { - - // empty key value - if (currentChar(variables.getOffset(), variables.getData()) == ParserBuilderConstants.Deserializer.COMMA) { - values.put(keys.next(), ParserBuilderConstants.Deserializer.EMPTY_STRING); - skipCurrentChar(variables); - continue; - } - - // check if next value is parsable - RestconfValidationUtils.checkDocumentedError( - ParserBuilderConstants.Deserializer.IDENTIFIER_PREDICATE - .matches(currentChar(variables.getOffset(), variables.getData())), - RestconfError.ErrorType.PROTOCOL, - RestconfError.ErrorTag.MALFORMED_MESSAGE, - "" - ); - - // parse value - final QName key = keys.next(); - DataSchemaNode leafSchemaNode = null; - if (dataSchemaNode instanceof ListSchemaNode) { - leafSchemaNode = ((ListSchemaNode) dataSchemaNode).getDataChildByName(key); - } else if (dataSchemaNode instanceof LeafListSchemaNode) { - leafSchemaNode = dataSchemaNode; - } - final String value = findAndParsePercentEncoded(nextIdentifierFromNextSequence( - ParserBuilderConstants.Deserializer.IDENTIFIER_PREDICATE, variables)); - final Object valueByType = prepareValueByType(leafSchemaNode, value, variables); - values.put(key, valueByType); - - - // skip comma - if (keys.hasNext() && !allCharsConsumed(variables) && (currentChar( - variables.getOffset(), variables.getData()) == ParserBuilderConstants.Deserializer.COMMA)) { - skipCurrentChar(variables); - } - } - - // the last key is considered to be empty - if (keys.hasNext()) { - if (allCharsConsumed(variables) - || (currentChar(variables.getOffset(), variables.getData()) == RestconfConstants.SLASH)) { - values.put(keys.next(), ParserBuilderConstants.Deserializer.EMPTY_STRING); - } - - // there should be no more missing keys - RestconfValidationUtils.checkDocumentedError( - !keys.hasNext(), - RestconfError.ErrorType.PROTOCOL, - RestconfError.ErrorTag.MISSING_ATTRIBUTE, - "Key value missing for: " + qname - ); - } - - path.add(new YangInstanceIdentifier.NodeIdentifierWithPredicates(qname, values.build())); - } - - private static Object prepareValueByType(final DataSchemaNode schemaNode, final String value, - final MainVarsWrapper vars) { - Object decoded = null; - - TypeDefinition> typedef = null; - if (schemaNode instanceof LeafListSchemaNode) { - typedef = ((LeafListSchemaNode) schemaNode).getType(); - } else { - typedef = ((LeafSchemaNode) schemaNode).getType(); - } - final TypeDefinition baseType = RestUtil.resolveBaseTypeFrom(typedef); - if (baseType instanceof LeafrefTypeDefinition) { - typedef = SchemaContextUtil.getBaseTypeForLeafRef((LeafrefTypeDefinition) baseType, vars.getSchemaContext(), - schemaNode); - } - final Codec codec = RestCodec.from(typedef, null); - decoded = codec.deserialize(value); - if (decoded == null) { - if ((baseType instanceof IdentityrefTypeDefinition)) { - decoded = toQName(value, schemaNode, vars.getSchemaContext()); - } - } - return decoded; - } - - private static Object toQName(final String value, final DataSchemaNode schemaNode, - final SchemaContext schemaContext) { - final String moduleName = toModuleName(value); - final String nodeName = toNodeName(value); - final Module module = schemaContext.findModuleByName(moduleName, null); - for (final IdentitySchemaNode identitySchemaNode : module.getIdentities()) { - final QName qName = identitySchemaNode.getQName(); - if (qName.getLocalName().equals(nodeName)) { - return qName; - } - } - return QName.create(schemaNode.getQName().getNamespace(), schemaNode.getQName().getRevision(), nodeName); - } - - private static String toNodeName(final String str) { - final int idx = str.indexOf(':'); - if (idx == -1) { - return str; - } - - if (str.indexOf(':', idx + 1) != -1) { - return str; - } - - return str.substring(idx + 1); - } - - private static String toModuleName(final String str) { - final int idx = str.indexOf(':'); - if (idx == -1) { - return null; - } - - if (str.indexOf(':', idx + 1) != -1) { - return null; - } - - return str.substring(0, idx); - } - - private static QName prepareQName(final MainVarsWrapper variables) { - checkValid( - ParserBuilderConstants.Deserializer.IDENTIFIER_FIRST_CHAR - .matches(currentChar(variables.getOffset(), variables.getData())), - "Identifier must start with character from set 'a-zA-Z_'", variables.getData(), variables.getOffset()); - final String preparedPrefix = nextIdentifierFromNextSequence( - ParserBuilderConstants.Deserializer.IDENTIFIER, variables); - final String prefix; - final String localName; - - if (allCharsConsumed(variables)) { - return getQNameOfDataSchemaNode(preparedPrefix, variables); - } - - switch (currentChar(variables.getOffset(), variables.getData())) { - case RestconfConstants.SLASH: - prefix = preparedPrefix; - return getQNameOfDataSchemaNode(prefix, variables); - case ParserBuilderConstants.Deserializer.COLON: - prefix = preparedPrefix; - skipCurrentChar(variables); - checkValid( - ParserBuilderConstants.Deserializer.IDENTIFIER_FIRST_CHAR - .matches(currentChar(variables.getOffset(), variables.getData())), - "Identifier must start with character from set 'a-zA-Z_'", variables.getData(), - variables.getOffset()); - localName = nextIdentifierFromNextSequence(ParserBuilderConstants.Deserializer.IDENTIFIER, variables); - - if (!allCharsConsumed(variables) && (currentChar( - variables.getOffset(), variables.getData()) == ParserBuilderConstants.Deserializer.EQUAL)) { - return getQNameOfDataSchemaNode(localName, variables); - } else { - final Module module = moduleForPrefix(prefix, variables.getSchemaContext()); - Preconditions.checkArgument(module != null, "Failed to lookup prefix %s", prefix); - return QName.create(module.getQNameModule(), localName); - } - case ParserBuilderConstants.Deserializer.EQUAL: - prefix = preparedPrefix; - return getQNameOfDataSchemaNode(prefix, variables); - default: - throw new IllegalArgumentException("Failed build path."); - } - } - - private static String nextIdentifierFromNextSequence(final CharMatcher matcher, final MainVarsWrapper variables) { - final int start = variables.getOffset(); - nextSequenceEnd(matcher, variables); - return variables.getData().substring(start, variables.getOffset()); - } - - private static void nextSequenceEnd(final CharMatcher matcher, final MainVarsWrapper variables) { - while (!allCharsConsumed(variables) - && matcher.matches(variables.getData().charAt(variables.getOffset()))) { - variables.setOffset(variables.getOffset() + 1); - } - } - - private static void prepareNodeWithValue(final QName qname, final List path, - final MainVarsWrapper variables) { - skipCurrentChar(variables); - final String value = nextIdentifierFromNextSequence( - ParserBuilderConstants.Deserializer.IDENTIFIER_PREDICATE, variables); - - // exception if value attribute is missing - RestconfValidationUtils.checkDocumentedError( - !value.isEmpty(), - RestconfError.ErrorType.PROTOCOL, - RestconfError.ErrorTag.MISSING_ATTRIBUTE, - "Value missing for: " + qname - ); - final DataSchemaNode dataSchemaNode = variables.getCurrent().getDataSchemaNode(); - final Object valueByType = prepareValueByType(dataSchemaNode, findAndParsePercentEncoded(value), variables); - path.add(new YangInstanceIdentifier.NodeWithValue<>(qname, valueByType)); - } - - private static void prepareIdentifier(final QName qname, final List path, - final MainVarsWrapper variables) { - final DataSchemaContextNode currentNode = nextContextNode(qname, path, variables); - if (currentNode == null) { - return; - } - checkValid(!currentNode.isKeyedEntry(), "Entry " + qname + " requires key or value predicate to be present", - variables.getData(), variables.getOffset()); - } - - private static DataSchemaContextNode nextContextNode(final QName qname, final List path, - final MainVarsWrapper variables) { - variables.setCurrent(variables.getCurrent().getChild(qname)); - DataSchemaContextNode current = variables.getCurrent(); - if (current == null) { - for (final RpcDefinition rpcDefinition : variables.getSchemaContext() - .findModuleByNamespaceAndRevision(qname.getNamespace(), qname.getRevision()).getRpcs()) { - if (rpcDefinition.getQName().getLocalName().equals(qname.getLocalName())) { - return null; - } - } - } - checkValid(current != null, qname + " is not correct schema node identifier.", variables.getData(), - variables.getOffset()); - while (current.isMixin()) { - path.add(current.getIdentifier()); - current = current.getChild(qname); - variables.setCurrent(current); - } - return current; - } - - private static String findAndParsePercentEncoded(final String preparedPrefix) { - if (!preparedPrefix.contains(String.valueOf(ParserBuilderConstants.Deserializer.PERCENT_ENCODING))) { - return preparedPrefix; - } - - final StringBuilder parsedPrefix = new StringBuilder(preparedPrefix); - final CharMatcher matcher = CharMatcher.is(ParserBuilderConstants.Deserializer.PERCENT_ENCODING); - - while (matcher.matchesAnyOf(parsedPrefix)) { - final int percentCharPosition = matcher.indexIn(parsedPrefix); - parsedPrefix.replace( - percentCharPosition, - percentCharPosition + ParserBuilderConstants.Deserializer.LAST_ENCODED_CHAR, - String.valueOf((char) Integer.parseInt(parsedPrefix.substring( - percentCharPosition + ParserBuilderConstants.Deserializer.FIRST_ENCODED_CHAR, - percentCharPosition + ParserBuilderConstants.Deserializer.LAST_ENCODED_CHAR), - ParserBuilderConstants.Deserializer.PERCENT_ENCODED_RADIX))); - } - - return parsedPrefix.toString(); - } - - private static QName getQNameOfDataSchemaNode(final String nodeName, final MainVarsWrapper variables) { - final DataSchemaNode dataSchemaNode = variables.getCurrent().getDataSchemaNode(); - if (dataSchemaNode instanceof ContainerSchemaNode) { - final ContainerSchemaNode contSchemaNode = (ContainerSchemaNode) dataSchemaNode; - final DataSchemaNode node = RestconfSchemaUtil.findSchemaNodeInCollection(contSchemaNode.getChildNodes(), - nodeName); - return node.getQName(); - } else if (dataSchemaNode instanceof ListSchemaNode) { - final ListSchemaNode listSchemaNode = (ListSchemaNode) dataSchemaNode; - final DataSchemaNode node = RestconfSchemaUtil.findSchemaNodeInCollection(listSchemaNode.getChildNodes(), - nodeName); - return node.getQName(); - } - throw new UnsupportedOperationException(); - } - - private static Module moduleForPrefix(final String prefix, final SchemaContext schemaContext) { - return schemaContext.findModuleByName(prefix, null); - } - - private static void validArg(final MainVarsWrapper variables) { - // every identifier except of the first MUST start with slash - if (variables.getOffset() != MainVarsWrapper.STARTING_OFFSET) { - checkValid(RestconfConstants.SLASH == currentChar(variables.getOffset(), variables.getData()), - "Identifier must start with '/'.", variables.getData(), variables.getOffset()); - - // skip slash - skipCurrentChar(variables); - - // check if slash is not also the last char in identifier - checkValid(!allCharsConsumed(variables), "Identifier cannot end with '/'.", - variables.getData(), variables.getOffset()); - } - } - - private static void skipCurrentChar(final MainVarsWrapper variables) { - variables.setOffset(variables.getOffset() + 1); - } - - private static char currentChar(final int offset, final String data) { - return data.charAt(offset); - } - - private static void checkValid(final boolean condition, final String errorMsg, final String data, - final int offset) { - Preconditions.checkArgument(condition, "Could not parse Instance Identifier '%s'. Offset: %s : Reason: %s", - data, offset, errorMsg); - } - - private static boolean allCharsConsumed(final MainVarsWrapper variables) { - return variables.getOffset() == variables.getData().length(); - } - - private static final class MainVarsWrapper { - private static final int STARTING_OFFSET = 0; - - private final SchemaContext schemaContext; - private final String data; - - private DataSchemaContextNode current; - private int offset; - - MainVarsWrapper(final String data, final DataSchemaContextNode current, final int offset, - final SchemaContext schemaContext) { - this.data = data; - this.current = current; - this.offset = offset; - this.schemaContext = schemaContext; - } - - public String getData() { - return this.data; - } - - public DataSchemaContextNode getCurrent() { - return this.current; - } - - public void setCurrent(final DataSchemaContextNode current) { - this.current = current; - } - - public int getOffset() { - return this.offset; - } - - public void setOffset(final int offset) { - this.offset = offset; - } - - public SchemaContext getSchemaContext() { - return this.schemaContext; - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java deleted file mode 100644 index 0f59274e59..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/parser/builder/YangInstanceIdentifierSerializer.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.parser.builder; - -import com.google.common.base.Preconditions; -import java.net.URI; -import java.util.Iterator; -import java.util.Map.Entry; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants.Serializer; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeWithValue; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Serializer for {@link YangInstanceIdentifier} to {@link String} for restconf. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class YangInstanceIdentifierSerializer { - - private YangInstanceIdentifierSerializer() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Method to create String from {@link Iterable} of {@link PathArgument} - * which are parsing from data by {@link SchemaContext}. - * - * @param schemaContext - * for validate of parsing path arguments - * @param data - * path to data - * @return {@link String} - */ - public static String create(final SchemaContext schemaContext, final YangInstanceIdentifier data) { - final DataSchemaContextNode current = DataSchemaContextTree.from(schemaContext).getRoot(); - final MainVarsWrapper variables = new MainVarsWrapper(current); - final StringBuilder path = new StringBuilder(); - - QNameModule parentModule = null; - for (int i = 0; i < data.getPathArguments().size(); i++) { - // get module of the parent - if (!variables.getCurrent().isMixin()) { - parentModule = variables.getCurrent().getDataSchemaNode().getQName().getModule(); - } - - final PathArgument arg = data.getPathArguments().get(i); - variables.setCurrent(variables.getCurrent().getChild(arg)); - - Preconditions.checkArgument(variables.getCurrent() != null, - "Invalid input %s: schema for argument %s (after %s) not found", data, arg, path); - - if (variables.getCurrent().isMixin()) { - continue; - } - - // append namespace before every node which is defined in other module than its parent - // condition is satisfied also for the first path argument - if (!arg.getNodeType().getModule().equals(parentModule)) { - // append slash if it is not the first path argument - if (path.length() > 0) { - path.append(RestconfConstants.SLASH); - } - - path.append(prefixForNamespace(arg.getNodeType(), schemaContext)); - path.append(ParserBuilderConstants.Deserializer.COLON); - } else { - path.append(RestconfConstants.SLASH); - } - - if (arg instanceof NodeIdentifierWithPredicates) { - prepareNodeWithPredicates(path, arg); - } else if (arg instanceof NodeWithValue) { - prepareNodeWithValue(path, arg); - } else { - appendQName(path, arg.getNodeType()); - } - } - - return path.toString(); - } - - private static void prepareNodeWithValue(final StringBuilder path, final PathArgument arg) { - path.append(arg.getNodeType().getLocalName()); - path.append(ParserBuilderConstants.Deserializer.EQUAL); - - String value = String.valueOf(((NodeWithValue) arg).getValue()); - if (Serializer.PERCENT_ENCODE_CHARS.matchesAnyOf(value)) { - value = parsePercentEncodeChars(value); - } - path.append(value); - } - - private static void prepareNodeWithPredicates(final StringBuilder path, final PathArgument arg) { - path.append(arg.getNodeType().getLocalName()); - - final Iterator> iterator = ((NodeIdentifierWithPredicates) arg).getKeyValues() - .entrySet().iterator(); - - if (iterator.hasNext()) { - path.append(ParserBuilderConstants.Deserializer.EQUAL); - } - - while (iterator.hasNext()) { - String valueOf = String.valueOf(iterator.next().getValue()); - if (Serializer.PERCENT_ENCODE_CHARS.matchesAnyOf(valueOf)) { - valueOf = parsePercentEncodeChars(valueOf); - } - path.append(valueOf); - if (iterator.hasNext()) { - path.append(ParserBuilderConstants.Deserializer.COMMA); - } - } - } - - /** - * Encode {@link Serializer#DISABLED_CHARS} chars to percent encoded chars. - * - * @param valueOf - * string to encode - * @return encoded {@link String} - */ - private static String parsePercentEncodeChars(final String valueOf) { - final StringBuilder sb = new StringBuilder(); - int start = 0; - while (start < valueOf.length()) { - if (Serializer.PERCENT_ENCODE_CHARS.matches(valueOf.charAt(start))) { - final String format = String.format("%x", (int) valueOf.charAt(start)); - final String upperCase = format.toUpperCase(); - sb.append(ParserBuilderConstants.Deserializer.PERCENT_ENCODING + upperCase); - } else { - sb.append(valueOf.charAt(start)); - } - start++; - } - return sb.toString(); - } - - /** - * Add {@link QName} to the serialized string. - * - * @param path - * {@link StringBuilder} - * @param qname - * {@link QName} node - * @return {@link StringBuilder} - */ - private static StringBuilder appendQName(final StringBuilder path, final QName qname) { - path.append(qname.getLocalName()); - return path; - } - - /** - * Create prefix of namespace from {@link QName}. - * - * @param qname - * {@link QName} - * @return {@link String} - */ - private static String prefixForNamespace(final QName qname, final SchemaContext schemaContext) { - final URI namespace = qname.getNamespace(); - Preconditions.checkArgument(namespace != null, "Failed to map QName {}", qname); - final Module module = schemaContext.findModuleByNamespaceAndRevision(namespace, qname.getRevision()); - return module.getName(); - } - - private static final class MainVarsWrapper { - - private DataSchemaContextNode current; - - MainVarsWrapper(final DataSchemaContextNode current) { - this.setCurrent(current); - } - - public DataSchemaContextNode getCurrent() { - return this.current; - } - - public void setCurrent(final DataSchemaContextNode current) { - this.current = current; - } - - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfDataService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfDataService.java deleted file mode 100644 index 3d8c1b1b61..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfDataService.java +++ /dev/null @@ -1,162 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.api; - -import javax.ws.rs.Consumes; -import javax.ws.rs.DELETE; -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.POST; -import javax.ws.rs.PUT; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.patch.Patch; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.utils.RestconfConstants; - -/** - * The "{+restconf}/data" subtree represents the datastore resource type, which is a collection of - * configuration data and state data nodes. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface RestconfDataService { - - /** - * Get target data resource. - * - * @param identifier - * path to target - * @param uriInfo - * URI info - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("/data/{identifier:.+}") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - Response readData(@Encoded @PathParam("identifier") String identifier, @Context UriInfo uriInfo); - - /** - * Get target data resource from data root. - * - * @param uriInfo - * URI info - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("/data") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - Response readData(@Context UriInfo uriInfo); - - /** - * Create or replace the target data resource. - * - * @param identifier - * path to target - * @param payload - * data node for put to config DS - * @return {@link Response} - */ - @PUT - @Path("/data/{identifier:.+}") - @Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - Response putData(@Encoded @PathParam("identifier") String identifier, NormalizedNodeContext payload, - @Context UriInfo uriInfo); - - /** - * Create a data resource in target. - * - * @param identifier - * path to target - * @param payload - * new data - * @param uriInfo - * URI info - * @return {@link Response} - */ - @POST - @Path("/data/{identifier:.+}") - @Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - Response postData(@Encoded @PathParam("identifier") String identifier, NormalizedNodeContext payload, - @Context UriInfo uriInfo); - - /** - * Create a data resource. - * - * @param payload - * new data - * @param uriInfo - * URI info - * @return {@link Response} - */ - @POST - @Path("/data") - @Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - Response postData(NormalizedNodeContext payload, @Context UriInfo uriInfo); - - /** - * Delete the target data resource. - * - * @param identifier - * path to target - * @return {@link Response} - */ - @DELETE - @Path("/data/{identifier:.+}") - Response deleteData(@Encoded @PathParam("identifier") String identifier); - - /** - * Ordered list of edits that are applied to the target datastore by the - * server. - * - * @param identifier - * path to target - * @param context - * edits - * @param uriInfo - * URI info - * @return {@link PatchStatusContext} - */ - @Patch - @Path("/data/{identifier:.+}") - @Consumes({ Rfc8040.MediaTypes.PATCH + RestconfConstants.JSON, Rfc8040.MediaTypes.PATCH + RestconfConstants.XML }) - @Produces({ Rfc8040.MediaTypes.PATCH_STATUS + RestconfConstants.JSON, - Rfc8040.MediaTypes.PATCH_STATUS + RestconfConstants.XML }) - PatchStatusContext patchData(@Encoded @PathParam("identifier") String identifier, PatchContext context, - @Context UriInfo uriInfo); - - /** - * Ordered list of edits that are applied to the datastore by the server. - * - * @param context - * edits - * @param uriInfo - * URI info - * @return {@link PatchStatusContext} - */ - @Patch - @Path("/data") - @Consumes({ Rfc8040.MediaTypes.PATCH + RestconfConstants.JSON, Rfc8040.MediaTypes.PATCH + RestconfConstants.XML }) - @Produces({ Rfc8040.MediaTypes.PATCH_STATUS + RestconfConstants.JSON, - Rfc8040.MediaTypes.PATCH_STATUS + RestconfConstants.XML }) - PatchStatusContext patchData(PatchContext context, @Context UriInfo uriInfo); -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfInvokeOperationsService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfInvokeOperationsService.java deleted file mode 100644 index ee64d77544..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfInvokeOperationsService.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.api; - -import javax.ws.rs.Consumes; -import javax.ws.rs.Encoded; -import javax.ws.rs.POST; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.MediaType; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.Rfc8040; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.utils.RestconfConstants; - -/** - * An operation resource represents a protocol operation defined with the YANG "rpc" statement. It is invoked - * using a POST method on the operation resource. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface RestconfInvokeOperationsService { - - /** - * Invoke RPC operation. - * - * @param identifier - * module name and rpc identifier string for the desired - * operation - * @param payload - * {@link NormalizedNodeContext} - the body of the operation - * @param uriInfo - * URI info - * @return {@link NormalizedNodeContext} - */ - @POST - @Path("/operations/{identifier:.+}") - @Produces({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - @Consumes({ Rfc8040.MediaTypes.DATA + RestconfConstants.JSON, Rfc8040.MediaTypes.DATA, MediaType.APPLICATION_JSON, - MediaType.APPLICATION_XML, MediaType.TEXT_XML }) - NormalizedNodeContext invokeRpc(@Encoded @PathParam("identifier") String identifier, - NormalizedNodeContext payload, @Context UriInfo uriInfo); -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfStreamsSubscriptionService.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfStreamsSubscriptionService.java deleted file mode 100644 index 16790a69cf..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/RestconfStreamsSubscriptionService.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.api; - -import javax.ws.rs.Encoded; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.core.Context; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; - -/** - * Subscribing to streams. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface RestconfStreamsSubscriptionService { - - /** - * Subscribing to receive notification from stream support. - * - * @param identifier - * name of stream - * @param uriInfo - * URI info - * @return {@link NormalizedNodeContext} - */ - @GET - @Path("data/ietf-restconf-monitoring:restconf-state/streams/stream/{identifier:.+}") - NormalizedNodeContext subscribeToStream(@Encoded @PathParam("identifier") String identifier, - @Context UriInfo uriInfo); -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/TransactionServicesWrapper.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/TransactionServicesWrapper.java deleted file mode 100644 index f84fc206e2..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/api/TransactionServicesWrapper.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.api; - -/** - * Wrapper for all transaction services. - *
    - *
  • {@link RestconfDataService} - *
  • {@link RestconfInvokeOperationsService} - *
  • {@link RestconfStreamsSubscriptionService} - *
- * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public interface TransactionServicesWrapper - extends RestconfDataService, RestconfInvokeOperationsService, RestconfStreamsSubscriptionService { - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfDataServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfDataServiceImpl.java deleted file mode 100644 index ba1fb57d89..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfDataServiceImpl.java +++ /dev/null @@ -1,349 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.impl; - -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.CREATE_NOTIFICATION_STREAM; -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.STREAM_ACCESS_PATH_PART; -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.STREAM_LOCATION_PATH_PART; -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.STREAM_PATH; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import java.time.Clock; -import java.time.LocalDateTime; -import java.time.format.DateTimeFormatter; -import java.util.List; -import java.util.Map.Entry; -import javax.annotation.Nonnull; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.RestConnectorProvider; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.context.WriterParameters; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.restconf.restful.services.api.RestconfDataService; -import org.opendaylight.restconf.restful.services.api.RestconfStreamsSubscriptionService; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.restconf.restful.utils.DeleteDataTransactionUtil; -import org.opendaylight.restconf.restful.utils.PatchDataTransactionUtil; -import org.opendaylight.restconf.restful.utils.PostDataTransactionUtil; -import org.opendaylight.restconf.restful.utils.PutDataTransactionUtil; -import org.opendaylight.restconf.restful.utils.ReadDataTransactionUtil; -import org.opendaylight.restconf.restful.utils.RestconfDataServiceConstant; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link RestconfDataService}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfDataServiceImpl implements RestconfDataService { - - private static final Logger LOG = LoggerFactory.getLogger(RestconfDataServiceImpl.class); - private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern("yyyy-MMM-dd HH:mm:ss"); - - private final SchemaContextHandler schemaContextHandler; - private final TransactionChainHandler transactionChainHandler; - private final DOMMountPointServiceHandler mountPointServiceHandler; - - private final RestconfStreamsSubscriptionService delegRestconfSubscrService; - - public RestconfDataServiceImpl(final SchemaContextHandler schemaContextHandler, - final TransactionChainHandler transactionChainHandler, - final DOMMountPointServiceHandler mountPointServiceHandler, - final RestconfStreamsSubscriptionService delegRestconfSubscrService) { - this.schemaContextHandler = schemaContextHandler; - this.transactionChainHandler = transactionChainHandler; - this.mountPointServiceHandler = mountPointServiceHandler; - this.delegRestconfSubscrService = delegRestconfSubscrService; - } - - @Override - public Response readData(final UriInfo uriInfo) { - return readData(null, uriInfo); - } - - @Override - public Response readData(final String identifier, final UriInfo uriInfo) { - final SchemaContextRef schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get()); - final InstanceIdentifierContext instanceIdentifier = ParserIdentifier.toInstanceIdentifier( - identifier, schemaContextRef.get(), Optional.of(this.mountPointServiceHandler.get())); - - boolean withDefaUsed = false; - String withDefa = null; - - for (final Entry> entry : uriInfo.getQueryParameters().entrySet()) { - switch (entry.getKey()) { - case "with-defaults": - if (!withDefaUsed) { - withDefaUsed = true; - withDefa = entry.getValue().iterator().next(); - } else { - throw new RestconfDocumentedException("With-defaults parameter can be used only once."); - } - break; - default: - LOG.info("Unknown key : {}.", entry.getKey()); - break; - } - } - boolean tagged = false; - if (withDefaUsed) { - if ("report-all-tagged".equals(withDefa)) { - tagged = true; - withDefa = null; - } - if ("report-all".equals(withDefa)) { - withDefa = null; - } - } - - final WriterParameters parameters = ReadDataTransactionUtil.parseUriParameters( - instanceIdentifier, uriInfo, tagged); - - final DOMMountPoint mountPoint = instanceIdentifier.getMountPoint(); - final DOMTransactionChain transactionChain; - if (mountPoint == null) { - transactionChain = this.transactionChainHandler.get(); - } else { - transactionChain = transactionChainOfMountPoint(mountPoint); - } - - final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper( - instanceIdentifier, mountPoint, transactionChain); - final NormalizedNode node = - ReadDataTransactionUtil.readData(identifier, parameters.getContent(), transactionNode, withDefa, - schemaContextRef, uriInfo); - if (identifier.contains(STREAM_PATH) && identifier.contains(STREAM_ACCESS_PATH_PART) - && identifier.contains(STREAM_LOCATION_PATH_PART)) { - final String value = (String) node.getValue(); - final String streamName = value.substring( - value.indexOf(CREATE_NOTIFICATION_STREAM.toString() + RestconfConstants.SLASH), - value.length()); - this.delegRestconfSubscrService.subscribeToStream(streamName, uriInfo); - } - if (node == null) { - throw new RestconfDocumentedException( - "Request could not be completed because the relevant data model content does not exist", - RestconfError.ErrorType.PROTOCOL, - RestconfError.ErrorTag.DATA_MISSING); - } - - if ((parameters.getContent().equals(RestconfDataServiceConstant.ReadData.ALL)) - || parameters.getContent().equals(RestconfDataServiceConstant.ReadData.CONFIG)) { - return Response.status(200) - .entity(new NormalizedNodeContext(instanceIdentifier, node, parameters)) - .header("ETag", '"' + node.getNodeType().getModule().getFormattedRevision() - + node.getNodeType().getLocalName() + '"') - .header("Last-Modified", FORMATTER.format(LocalDateTime.now(Clock.systemUTC()))) - .build(); - } - - return Response.status(200).entity(new NormalizedNodeContext(instanceIdentifier, node, parameters)).build(); - } - - @Override - public Response putData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { - Preconditions.checkNotNull(payload); - - boolean insertUsed = false; - boolean pointUsed = false; - String insert = null; - String point = null; - - for (final Entry> entry : uriInfo.getQueryParameters().entrySet()) { - switch (entry.getKey()) { - case "insert": - if (!insertUsed) { - insertUsed = true; - insert = entry.getValue().iterator().next(); - } else { - throw new RestconfDocumentedException("Insert parameter can be used only once."); - } - break; - case "point": - if (!pointUsed) { - pointUsed = true; - point = entry.getValue().iterator().next(); - } else { - throw new RestconfDocumentedException("Point parameter can be used only once."); - } - break; - default: - throw new RestconfDocumentedException("Bad parameter for post: " + entry.getKey()); - } - } - - checkQueryParams(insertUsed, pointUsed, insert); - - final InstanceIdentifierContext iid = payload - .getInstanceIdentifierContext(); - - PutDataTransactionUtil.validInputData(iid.getSchemaNode(), payload); - PutDataTransactionUtil.validTopLevelNodeName(iid.getInstanceIdentifier(), payload); - PutDataTransactionUtil.validateListKeysEqualityInPayloadAndUri(payload); - - final DOMMountPoint mountPoint = payload.getInstanceIdentifierContext().getMountPoint(); - final DOMTransactionChain transactionChain; - final SchemaContextRef ref; - if (mountPoint == null) { - transactionChain = this.transactionChainHandler.get(); - ref = new SchemaContextRef(this.schemaContextHandler.get()); - } else { - transactionChain = transactionChainOfMountPoint(mountPoint); - ref = new SchemaContextRef(mountPoint.getSchemaContext()); - } - - final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper( - payload.getInstanceIdentifierContext(), mountPoint, transactionChain); - return PutDataTransactionUtil.putData(payload, ref, transactionNode, insert, point); - } - - private static void checkQueryParams(final boolean insertUsed, final boolean pointUsed, final String insert) { - if (pointUsed && !insertUsed) { - throw new RestconfDocumentedException("Point parameter can't be used without Insert parameter."); - } - if (pointUsed && (insert.equals("first") || insert.equals("last"))) { - throw new RestconfDocumentedException( - "Point parameter can be used only with 'after' or 'before' values of Insert parameter."); - } - } - - @Override - public Response postData(final String identifier, final NormalizedNodeContext payload, final UriInfo uriInfo) { - return postData(payload, uriInfo); - } - - @Override - public Response postData(final NormalizedNodeContext payload, final UriInfo uriInfo) { - Preconditions.checkNotNull(payload); - - boolean insertUsed = false; - boolean pointUsed = false; - String insert = null; - String point = null; - - for (final Entry> entry : uriInfo.getQueryParameters().entrySet()) { - switch (entry.getKey()) { - case "insert": - if (!insertUsed) { - insertUsed = true; - insert = entry.getValue().iterator().next(); - } else { - throw new RestconfDocumentedException("Insert parameter can be used only once."); - } - break; - case "point": - if (!pointUsed) { - pointUsed = true; - point = entry.getValue().iterator().next(); - } else { - throw new RestconfDocumentedException("Point parameter can be used only once."); - } - break; - default: - throw new RestconfDocumentedException("Bad parameter for post: " + entry.getKey()); - } - } - - checkQueryParams(insertUsed, pointUsed, insert); - - final DOMMountPoint mountPoint = payload.getInstanceIdentifierContext().getMountPoint(); - final DOMTransactionChain transactionChain; - final SchemaContextRef ref; - if (mountPoint == null) { - transactionChain = this.transactionChainHandler.get(); - ref = new SchemaContextRef(this.schemaContextHandler.get()); - } else { - transactionChain = transactionChainOfMountPoint(mountPoint); - ref = new SchemaContextRef(mountPoint.getSchemaContext()); - } - final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper( - payload.getInstanceIdentifierContext(), mountPoint, transactionChain); - return PostDataTransactionUtil.postData(uriInfo, payload, transactionNode, ref, insert, point); - } - - @Override - public Response deleteData(final String identifier) { - final SchemaContextRef schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get()); - final InstanceIdentifierContext instanceIdentifier = ParserIdentifier.toInstanceIdentifier( - identifier, schemaContextRef.get(), Optional.of(this.mountPointServiceHandler.get())); - - final DOMMountPoint mountPoint = instanceIdentifier.getMountPoint(); - final DOMTransactionChain transactionChain; - if (mountPoint == null) { - transactionChain = this.transactionChainHandler.get(); - } else { - transactionChain = transactionChainOfMountPoint(mountPoint); - } - - final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper(instanceIdentifier, mountPoint, - transactionChain); - return DeleteDataTransactionUtil.deleteData(transactionNode); - } - - @Override - public PatchStatusContext patchData(final String identifier, final PatchContext context, final UriInfo uriInfo) { - return patchData(context, uriInfo); - } - - @Override - public PatchStatusContext patchData(final PatchContext context, final UriInfo uriInfo) { - Preconditions.checkNotNull(context); - final DOMMountPoint mountPoint = context.getInstanceIdentifierContext().getMountPoint(); - - final DOMTransactionChain transactionChain; - final SchemaContextRef ref; - if (mountPoint == null) { - transactionChain = this.transactionChainHandler.get(); - ref = new SchemaContextRef(this.schemaContextHandler.get()); - } else { - transactionChain = transactionChainOfMountPoint(mountPoint); - ref = new SchemaContextRef(mountPoint.getSchemaContext()); - } - - final TransactionVarsWrapper transactionNode = new TransactionVarsWrapper( - context.getInstanceIdentifierContext(), mountPoint, transactionChain); - - return PatchDataTransactionUtil.patchData(context, transactionNode, ref); - } - - /** - * Prepare transaction chain to access data of mount point. - * @param mountPoint - * mount point reference - * @return {@link DOMTransactionChain} - */ - private static DOMTransactionChain transactionChainOfMountPoint(@Nonnull final DOMMountPoint mountPoint) { - final Optional domDataBrokerService = mountPoint.getService(DOMDataBroker.class); - if (domDataBrokerService.isPresent()) { - return domDataBrokerService.get().createTransactionChain(RestConnectorProvider.TRANSACTION_CHAIN_LISTENER); - } - - final String errMsg = "DOM data broker service isn't available for mount point " + mountPoint.getIdentifier(); - LOG.warn(errMsg); - throw new RestconfDocumentedException(errMsg); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfInvokeOperationsServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfInvokeOperationsServiceImpl.java deleted file mode 100644 index cd7026189d..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfInvokeOperationsServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.impl; - -import java.net.URI; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.handlers.RpcServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.restful.services.api.RestconfInvokeOperationsService; -import org.opendaylight.restconf.restful.utils.CreateStreamUtil; -import org.opendaylight.restconf.restful.utils.RestconfInvokeOperationsUtil; -import org.opendaylight.restconf.restful.utils.RestconfStreamsConstants; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; - -/** - * Implementation of {@link RestconfInvokeOperationsService}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfInvokeOperationsServiceImpl implements RestconfInvokeOperationsService { - - private final RpcServiceHandler rpcServiceHandler; - private final SchemaContextHandler schemaContextHandler; - - public RestconfInvokeOperationsServiceImpl(final RpcServiceHandler rpcServiceHandler, - final SchemaContextHandler schemaContextHandler) { - this.rpcServiceHandler = rpcServiceHandler; - this.schemaContextHandler = schemaContextHandler; - } - - @Override - public NormalizedNodeContext invokeRpc(final String identifier, final NormalizedNodeContext payload, - final UriInfo uriInfo) { - final SchemaContextRef refSchemaCtx = new SchemaContextRef(this.schemaContextHandler.get()); - final SchemaPath schemaPath = payload.getInstanceIdentifierContext().getSchemaNode().getPath(); - final DOMMountPoint mountPoint = payload.getInstanceIdentifierContext().getMountPoint(); - final URI namespace = payload.getInstanceIdentifierContext().getSchemaNode().getQName().getNamespace(); - DOMRpcResult response; - - SchemaContextRef schemaContextRef; - - if (mountPoint == null) { - if (namespace.toString().equals(RestconfStreamsConstants.SAL_REMOTE_NAMESPACE)) { - if (identifier.contains(RestconfStreamsConstants.CREATE_DATA_SUBSCR)) { - response = CreateStreamUtil.createDataChangeNotifiStream(payload, refSchemaCtx); - } else { - throw new RestconfDocumentedException("Not supported operation", ErrorType.RPC, - ErrorTag.OPERATION_NOT_SUPPORTED); - } - } else { - response = RestconfInvokeOperationsUtil.invokeRpc(payload.getData(), schemaPath, - this.rpcServiceHandler); - } - schemaContextRef = new SchemaContextRef(this.schemaContextHandler.get()); - } else { - response = RestconfInvokeOperationsUtil.invokeRpcViaMountPoint(mountPoint, payload.getData(), schemaPath); - schemaContextRef = new SchemaContextRef(mountPoint.getSchemaContext()); - } - - final DOMRpcResult result = RestconfInvokeOperationsUtil.checkResponse(response); - - RpcDefinition resultNodeSchema = null; - final NormalizedNode resultData = result.getResult(); - if ((result != null) && (result.getResult() != null)) { - resultNodeSchema = (RpcDefinition) payload.getInstanceIdentifierContext().getSchemaNode(); - } - return new NormalizedNodeContext(new InstanceIdentifierContext(null, resultNodeSchema, - mountPoint, schemaContextRef.get()), resultData); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfStreamsSubscriptionServiceImpl.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfStreamsSubscriptionServiceImpl.java deleted file mode 100644 index e688d25754..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/services/impl/RestconfStreamsSubscriptionServiceImpl.java +++ /dev/null @@ -1,251 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.services.impl; - -import java.net.URI; -import java.time.Instant; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Optional; -import javax.annotation.Nonnull; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.handlers.DOMDataBrokerHandler; -import org.opendaylight.restconf.handlers.NotificationServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.restconf.restful.services.api.RestconfStreamsSubscriptionService; -import org.opendaylight.restconf.restful.utils.RestconfStreamsConstants; -import org.opendaylight.restconf.restful.utils.SubscribeToStreamUtil; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableLeafNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Implementation of {@link RestconfStreamsSubscriptionService}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfStreamsSubscriptionServiceImpl implements RestconfStreamsSubscriptionService { - - private static final Logger LOG = LoggerFactory.getLogger(RestconfStreamsSubscriptionServiceImpl.class); - - private final HandlersHolder handlersHolder; - - /** - * Initialize holder of handlers with holders as parameters. - * - * @param domDataBrokerHandler - * handler of {@link DOMDataBroker} - * @param notificationServiceHandler - * handler of {@link DOMNotificationService} - * @param schemaHandler - * handler of {@link SchemaContext} - * @param transactionChainHandler - * handler of {@link DOMTransactionChain} - */ - public RestconfStreamsSubscriptionServiceImpl(final DOMDataBrokerHandler domDataBrokerHandler, - final NotificationServiceHandler notificationServiceHandler, final SchemaContextHandler schemaHandler, - final TransactionChainHandler transactionChainHandler) { - this.handlersHolder = new HandlersHolder(domDataBrokerHandler, notificationServiceHandler, - transactionChainHandler, schemaHandler); - } - - @Override - public NormalizedNodeContext subscribeToStream(final String identifier, final UriInfo uriInfo) { - final NotificationQueryParams notificationQueryParams = NotificationQueryParams.fromUriInfo(uriInfo); - - URI response = null; - if (identifier.contains(RestconfStreamsConstants.DATA_SUBSCR)) { - response = SubscribeToStreamUtil.notifiDataStream(identifier, uriInfo, notificationQueryParams, - this.handlersHolder); - } else if (identifier.contains(RestconfStreamsConstants.NOTIFICATION_STREAM)) { - response = SubscribeToStreamUtil.notifYangStream(identifier, uriInfo, notificationQueryParams, - this.handlersHolder); - } - - if (response != null) { - // prepare node with value of location - final InstanceIdentifierContext iid = - SubscribeToStreamUtil.prepareIIDSubsStreamOutput(this.handlersHolder.getSchemaHandler()); - final NormalizedNodeAttrBuilder> 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 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); - } - - /** - * Holder of all handlers for notifications. - */ - public final class HandlersHolder { - - private final DOMDataBrokerHandler domDataBrokerHandler; - private final NotificationServiceHandler notificationServiceHandler; - private final TransactionChainHandler transactionChainHandler; - private final SchemaContextHandler schemaHandler; - - private HandlersHolder(final DOMDataBrokerHandler domDataBrokerHandler, - final NotificationServiceHandler notificationServiceHandler, - final TransactionChainHandler transactionChainHandler, final SchemaContextHandler schemaHandler) { - this.domDataBrokerHandler = domDataBrokerHandler; - this.notificationServiceHandler = notificationServiceHandler; - this.transactionChainHandler = transactionChainHandler; - this.schemaHandler = schemaHandler; - } - - /** - * Get {@link DOMDataBrokerHandler}. - * - * @return the domDataBrokerHandler - */ - public DOMDataBrokerHandler getDomDataBrokerHandler() { - return this.domDataBrokerHandler; - } - - /** - * Get {@link NotificationServiceHandler}. - * - * @return the notificationServiceHandler - */ - public NotificationServiceHandler getNotificationServiceHandler() { - return this.notificationServiceHandler; - } - - /** - * Get {@link TransactionChainHandler}. - * - * @return the transactionChainHandler - */ - public TransactionChainHandler getTransactionChainHandler() { - return this.transactionChainHandler; - } - - /** - * Get {@link SchemaContextHandler}. - * - * @return the schemaHandler - */ - public SchemaContextHandler getSchemaHandler() { - return this.schemaHandler; - } - } - - /** - * Parser and holder of query paramteres from uriInfo for notifications. - * - */ - public static final class NotificationQueryParams { - - private final Instant start; - private final Instant stop; - private final String filter; - - private NotificationQueryParams(final Instant start, final Instant stop, final String filter) { - this.start = start == null ? Instant.now() : start; - this.stop = stop; - this.filter = filter; - } - - static NotificationQueryParams fromUriInfo(final UriInfo uriInfo) { - Instant start = null; - boolean startTimeUsed = false; - Instant stop = null; - boolean stopTimeUsed = false; - String filter = null; - boolean filterUsed = false; - - for (final Entry> entry : uriInfo.getQueryParameters().entrySet()) { - switch (entry.getKey()) { - case "start-time": - if (!startTimeUsed) { - startTimeUsed = true; - start = SubscribeToStreamUtil.parseDateFromQueryParam(entry); - } else { - throw new RestconfDocumentedException("Start-time parameter can be used only once."); - } - break; - case "stop-time": - if (!stopTimeUsed) { - stopTimeUsed = true; - stop = SubscribeToStreamUtil.parseDateFromQueryParam(entry); - } else { - throw new RestconfDocumentedException("Stop-time parameter can be used only once."); - } - break; - case "filter": - if (!filterUsed) { - filterUsed = true; - filter = entry.getValue().iterator().next(); - } - break; - default: - throw new RestconfDocumentedException( - "Bad parameter used with notifications: " + entry.getKey()); - } - } - if (!startTimeUsed && stopTimeUsed) { - throw new RestconfDocumentedException("Stop-time parameter has to be used with start-time parameter."); - } - - return new NotificationQueryParams(start, stop, filter); - } - - /** - * Get start-time query parameter. - * - * @return start-time - */ - @Nonnull - public Instant getStart() { - return start; - } - - /** - * Get stop-time query parameter. - * - * @return stop-time - */ - public Optional getStop() { - return Optional.ofNullable(stop); - } - - /** - * Get filter query parameter. - * - * @return filter - */ - public Optional getFilter() { - return Optional.ofNullable(filter); - } - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/transaction/TransactionVarsWrapper.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/transaction/TransactionVarsWrapper.java deleted file mode 100644 index ad9e609b0b..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/transaction/TransactionVarsWrapper.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.transaction; - -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; - -/** - * This class represent delegation wrapper for transaction variables. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class TransactionVarsWrapper { - - private final InstanceIdentifierContext instanceIdentifier; - private final DOMMountPoint mountPoint; - private LogicalDatastoreType configuration = null; - private final DOMTransactionChain transactionChain; - - /** - * Set base type of variables, which ones we need for transaction. - * {@link LogicalDatastoreType} is default set to null (to read all data - * from DS - config + state). - * - * @param instanceIdentifier - * {@link InstanceIdentifierContext} of data for transaction - * @param mountPoint - * mount point if is present - * @param transactionChain - * transaction chain for creating specific type of transaction - * in specific operation - */ - public TransactionVarsWrapper(final InstanceIdentifierContext instanceIdentifier, final DOMMountPoint mountPoint, - final DOMTransactionChain transactionChain) { - this.instanceIdentifier = instanceIdentifier; - this.mountPoint = mountPoint; - this.transactionChain = transactionChain; - } - - /** - * Get instance identifier of data. - * - * @return {@link InstanceIdentifierContext} - */ - public InstanceIdentifierContext getInstanceIdentifier() { - return this.instanceIdentifier; - } - - /** - * Get mount point. - * - * @return {@link DOMMountPoint} - */ - public DOMMountPoint getMountPoint() { - return this.mountPoint; - } - - /** - * Set {@link LogicalDatastoreType} of data for transaction. - * - * @param configuration - * {@link LogicalDatastoreType} - */ - public void setLogicalDatastoreType(final LogicalDatastoreType configuration) { - this.configuration = configuration; - - } - - /** - * Get type of data. - * - * @return {@link LogicalDatastoreType} - */ - public LogicalDatastoreType getLogicalDatastoreType() { - return this.configuration; - } - - /** - * Get transaction chain for creating specific transaction for specific - * operation. - * - * @return transaction chain - */ - public DOMTransactionChain getTransactionChain() { - return this.transactionChain; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/CreateStreamUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/CreateStreamUtil.java deleted file mode 100644 index 463796ff75..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/CreateStreamUtil.java +++ /dev/null @@ -1,233 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Optional; -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.ArrayList; -import java.util.List; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.sal.streams.listeners.NotificationListenerAdapter; -import org.opendaylight.netconf.sal.streams.listeners.Notificator; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Util class for streams. - *
    - *
  • create stream - *
  • subscribe - *
- * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class CreateStreamUtil { - - private static final Logger LOG = LoggerFactory.getLogger(CreateStreamUtil.class); - private static final String OUTPUT_TYPE_PARAM_NAME = "notification-output-type"; - - private CreateStreamUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Create stream with POST operation via RPC. - * - * @param payload - * input of rpc - example in JSON: - * - *
-     *            {@code
-     *            {
-     *                "input": {
-     *                    "path": "/toaster:toaster/toaster:toasterStatus",
-     *                    "sal-remote-augment:datastore": "OPERATIONAL",
-     *                    "sal-remote-augment:scope": "ONE"
-     *                }
-     *            }
-     *            }
-     *            
- * - * @param refSchemaCtx - * reference to {@link SchemaContext} - - * {@link SchemaContextRef} - * @return {@link CheckedFuture} with {@link DOMRpcResult} - This mean - * output of RPC - example in JSON: - * - *
-     *         {@code
-     *         {
-     *             "output": {
-     *                 "stream-name": "toaster:toaster/toaster:toasterStatus/datastore=OPERATIONAL/scope=ONE"
-     *             }
-     *         }
-     *         }
-     *         
- * - */ - public static DOMRpcResult createDataChangeNotifiStream(final NormalizedNodeContext payload, - final SchemaContextRef refSchemaCtx) { - final ContainerNode data = (ContainerNode) payload.getData(); - final QName qname = payload.getInstanceIdentifierContext().getSchemaNode().getQName(); - final YangInstanceIdentifier path = preparePath(data, qname); - String streamName = prepareDataChangeNotifiStreamName(path, refSchemaCtx.get(), data); - - final QName outputQname = QName.create(qname, "output"); - final QName streamNameQname = QName.create(qname, "stream-name"); - - final NotificationOutputType outputType = prepareOutputType(data); - if (outputType.equals(NotificationOutputType.JSON)) { - streamName = streamName + "/JSON"; - } - - if (!Notificator.existListenerFor(streamName)) { - Notificator.createListener(path, streamName, outputType); - } - - final ContainerNode output = - ImmutableContainerNodeBuilder.create().withNodeIdentifier(new NodeIdentifier(outputQname)) - .withChild(ImmutableNodes.leafNode(streamNameQname, streamName)).build(); - return new DefaultDOMRpcResult(output); - } - - /** - * Prepare {@code NotificationOutputType}. - * - * @param data - * data of notification - * @return output type fo notification - */ - private static NotificationOutputType prepareOutputType(final ContainerNode data) { - NotificationOutputType outputType = parseEnum(data, NotificationOutputType.class, OUTPUT_TYPE_PARAM_NAME); - return outputType = outputType == null ? NotificationOutputType.XML : outputType; - } - - private static String prepareDataChangeNotifiStreamName(final YangInstanceIdentifier path, - final SchemaContext schemaContext, - final ContainerNode data) { - LogicalDatastoreType ds = parseEnum(data, LogicalDatastoreType.class, - RestconfStreamsConstants.DATASTORE_PARAM_NAME); - ds = ds == null ? RestconfStreamsConstants.DEFAULT_DS : ds; - - DataChangeScope scope = parseEnum(data, DataChangeScope.class, RestconfStreamsConstants.SCOPE_PARAM_NAME); - scope = scope == null ? RestconfStreamsConstants.DEFAULT_SCOPE : scope; - - final String streamName = RestconfStreamsConstants.DATA_SUBSCR + "/" - + Notificator - .createStreamNameFromUri(ParserIdentifier.stringFromYangInstanceIdentifier(path, schemaContext) - + RestconfStreamsConstants.DS_URI + ds + RestconfStreamsConstants.SCOPE_URI + scope); - return streamName; - } - - private static T parseEnum(final ContainerNode data, final Class clazz, final String paramName) { - final Optional> augNode = data - .getChild(RestconfStreamsConstants.SAL_REMOTE_AUG_IDENTIFIER); - if (!augNode.isPresent() && !(augNode instanceof AugmentationNode)) { - return null; - } - final Optional> enumNode = - ((AugmentationNode) augNode.get()).getChild( - new NodeIdentifier(QName.create(RestconfStreamsConstants.SAL_REMOTE_AUGMENT, paramName))); - if (!enumNode.isPresent()) { - return null; - } - final Object value = enumNode.get().getValue(); - if (!(value instanceof String)) { - return null; - } - - return ResolveEnumUtil.resolveEnum(clazz, (String) value); - } - - private static YangInstanceIdentifier preparePath(final ContainerNode data, final QName qualifiedName) { - final Optional> path = data - .getChild(new YangInstanceIdentifier.NodeIdentifier(QName.create(qualifiedName, "path"))); - Object pathValue = null; - if (path.isPresent()) { - pathValue = path.get().getValue(); - } - if (!(pathValue instanceof YangInstanceIdentifier)) { - final String errMsg = "Instance identifier was not normalized correctly "; - LOG.debug(errMsg + qualifiedName); - throw new RestconfDocumentedException(errMsg, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED); - } - return (YangInstanceIdentifier) pathValue; - } - - /** - * Create stream with POST operation via RPC. - * - * @param notificatinoDefinition - * input of RPC - * @param refSchemaCtx - * schemaContext - * @param outputType - * output type - * @return {@link DOMRpcResult} - */ - public static List createYangNotifiStream( - final NotificationDefinition notificatinoDefinition, final SchemaContextRef refSchemaCtx, - final String outputType) { - final List paths = new ArrayList<>(); - final QName notificatinoDefinitionQName = notificatinoDefinition.getQName(); - final Module module = - refSchemaCtx.findModuleByNamespaceAndRevision(notificatinoDefinitionQName.getModule().getNamespace(), - notificatinoDefinitionQName.getModule().getRevision()); - Preconditions.checkNotNull(module, - "Module for namespace " + notificatinoDefinitionQName.getModule().getNamespace() + " does not exist"); - NotificationDefinition notifiDef = null; - for (final NotificationDefinition notification : module.getNotifications()) { - if (notification.getQName().equals(notificatinoDefinitionQName)) { - notifiDef = notification; - break; - } - } - final String moduleName = module.getName(); - Preconditions.checkNotNull(notifiDef, - "Notification " + notificatinoDefinitionQName + "doesn't exist in module " + moduleName); - paths.add(notifiDef.getPath()); - String streamName = RestconfStreamsConstants.CREATE_NOTIFICATION_STREAM + "/"; - streamName = streamName + moduleName + ":" + notificatinoDefinitionQName.getLocalName(); - if (outputType.equals("JSON")) { - streamName = streamName + "/JSON"; - } - - if (Notificator.existNotificationListenerFor(streamName)) { - final List notificationListenerFor = - Notificator.getNotificationListenerFor(streamName); - return SubscribeToStreamUtil.pickSpecificListenerByOutput(notificationListenerFor, outputType); - } - - return Notificator.createNotificationListener(paths, streamName, outputType); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/DeleteDataTransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/DeleteDataTransactionUtil.java deleted file mode 100644 index 8db909d59e..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/DeleteDataTransactionUtil.java +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.util.concurrent.CheckedFuture; -import javax.ws.rs.core.Response; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; - -/** - * Util class for delete specific data in config DS. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class DeleteDataTransactionUtil { - - private DeleteDataTransactionUtil() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Delete data from DS via transaction. - * - * @param transactionNode - * Wrapper for data of transaction - * @return {@link Response} - */ - public static Response deleteData(final TransactionVarsWrapper transactionNode) { - final CheckedFuture future = submitData( - transactionNode.getTransactionChain(), transactionNode.getTransactionChain().newReadWriteTransaction(), - transactionNode.getInstanceIdentifier().getInstanceIdentifier()); - final ResponseFactory response = new ResponseFactory(); - FutureCallbackTx.addCallback(future, RestconfDataServiceConstant.DeleteData.DELETE_TX_TYPE, response); - return response.build(); - } - - /** - * Delete data via transaction. Return error if data to delete does not exist. - * - * @param transactionChain - * transaction chain - * @param readWriteTx - * read and write transaction - * @param path - * path of data to delete - * @return {@link CheckedFuture} - */ - private static CheckedFuture submitData( - final DOMTransactionChain transactionChain, final DOMDataReadWriteTransaction readWriteTx, - final YangInstanceIdentifier path) { - TransactionUtil.checkItemExists(transactionChain, readWriteTx, LogicalDatastoreType.CONFIGURATION, path, - RestconfDataServiceConstant.DeleteData.DELETE_TX_TYPE); - readWriteTx.delete(LogicalDatastoreType.CONFIGURATION, path); - return readWriteTx.submit(); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureCallbackTx.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureCallbackTx.java deleted file mode 100644 index e0ffc41a01..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureCallbackTx.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.util.concurrent.CheckedFuture; -import java.util.ArrayList; -import java.util.List; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; -import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.yangtools.yang.common.RpcError; -import org.opendaylight.yangtools.yang.common.RpcResultBuilder; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Add callback for future objects and result set to the data factory. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -final class FutureCallbackTx { - - private static final Logger LOG = LoggerFactory.getLogger(FutureCallbackTx.class); - - private FutureCallbackTx() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Add callback to the future object. - * - * @param listenableFuture - * future object - * @param txType - * type of operation (READ, POST, PUT, DELETE) - * @param dataFactory - * factory setting result - * @throws RestconfDocumentedException - * if the Future throws an exception - */ - @SuppressWarnings("checkstyle:IllegalCatch") - static void addCallback(final CheckedFuture listenableFuture, final String txType, - final FutureDataFactory dataFactory) throws RestconfDocumentedException { - - try { - final T result = listenableFuture.checkedGet(); - dataFactory.setResult(result); - LOG.trace("Transaction({}) SUCCESSFUL", txType); - } catch (final Exception e) { - dataFactory.setFailureStatus(); - LOG.warn("Transaction({}) FAILED!", txType, e); - if (e instanceof DOMRpcException) { - final List rpcErrorList = new ArrayList<>(); - rpcErrorList.add( - RpcResultBuilder.newError(RpcError.ErrorType.RPC, "operation-failed", e.getMessage())); - dataFactory.setResult((T) new DefaultDOMRpcResult(rpcErrorList)); - } else { - throw new RestconfDocumentedException( - "Transaction(" + txType + ") not committed correctly", e); - } - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureDataFactory.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureDataFactory.java deleted file mode 100644 index 25ac7419b5..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/FutureDataFactory.java +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -/** - * Future data factory. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -class FutureDataFactory { - - protected T result; - private boolean statusFail = false; - - void setResult(final T result) { - this.result = result; - } - - void setFailureStatus() { - this.statusFail = true; - } - - boolean getFailureStatus() { - return statusFail; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/NormalizedNodeFactory.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/NormalizedNodeFactory.java deleted file mode 100644 index 578e447201..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/NormalizedNodeFactory.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Optional; -import org.apache.commons.lang3.builder.Builder; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * NormalizedNode factory. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -class NormalizedNodeFactory extends FutureDataFactory>> - implements Builder> { - - @Override - public NormalizedNode build() { - if (this.result.isPresent()) { - return this.result.get(); - } - return null; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ParametersUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ParametersUtil.java deleted file mode 100644 index 6f229c7b36..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ParametersUtil.java +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.restful.utils; - -import com.google.common.collect.Sets; -import java.util.List; -import java.util.Set; -import javax.annotation.Nonnull; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; - -/** - * URI parameters. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -class ParametersUtil { - - private ParametersUtil() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Check if URI does not contain not allowed parameters for specified operation. - * - * @param operationType - * type of operation (READ, POST, PUT, DELETE...) - * @param usedParameters - * parameters used in URI request - * @param allowedParameters - * allowed parameters for operation - */ - static void checkParametersTypes(@Nonnull final String operationType, - @Nonnull final Set usedParameters, - @Nonnull final String... allowedParameters) { - final Set notAllowedParameters = Sets.newHashSet(usedParameters); - notAllowedParameters.removeAll(Sets.newHashSet(allowedParameters)); - - if (!notAllowedParameters.isEmpty()) { - throw new RestconfDocumentedException( - "Not allowed parameters for " + operationType + " operation: " + notAllowedParameters, - RestconfError.ErrorType.PROTOCOL, - RestconfError.ErrorTag.INVALID_VALUE); - } - } - - /** - * Check if URI does not contain value for the same parameter more than once. - * - * @param parameterValues - * URI parameter values - * @param parameterName - * URI parameter name - */ - static void checkParameterCount(@Nonnull final List parameterValues, @Nonnull final String parameterName) { - if (parameterValues.size() > 1) { - throw new RestconfDocumentedException( - "Parameter " + parameterName + " can appear at most once in request URI", - ErrorType.PROTOCOL, - ErrorTag.INVALID_VALUE); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PatchDataTransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PatchDataTransactionUtil.java deleted file mode 100644 index e4df9c901d..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PatchDataTransactionUtil.java +++ /dev/null @@ -1,318 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.restful.utils; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.ArrayList; -import java.util.List; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.restconf.RestConnectorProvider; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.patch.PatchContext; -import org.opendaylight.restconf.common.patch.PatchEntity; -import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.common.patch.PatchStatusEntity; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.restconf.restful.utils.RestconfDataServiceConstant.PatchData; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * PatchDataTransaction util. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class PatchDataTransactionUtil { - private static final Logger LOG = LoggerFactory.getLogger(PatchDataTransactionUtil.class); - - private PatchDataTransactionUtil() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Process edit operations of one {@link PatchContext}. - * @param context Patch context to be processed - * @param transactionNode Wrapper for transaction - * @param schemaContextRef Soft reference for global schema context - * @return {@link PatchStatusContext} - */ - public static PatchStatusContext patchData(final PatchContext context, final TransactionVarsWrapper transactionNode, - final SchemaContextRef schemaContextRef) { - final List editCollection = new ArrayList<>(); - boolean noError = true; - final DOMDataReadWriteTransaction tx = transactionNode.getTransactionChain().newReadWriteTransaction(); - - for (final PatchEntity patchEntity : context.getData()) { - if (noError) { - switch (patchEntity.getOperation()) { - case CREATE: - try { - createDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, - patchEntity.getTargetNode(), patchEntity.getNode(), tx, schemaContextRef); - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), true, null)); - } catch (final RestconfDocumentedException e) { - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(e.getErrors()))); - noError = false; - } - break; - case DELETE: - try { - deleteDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, patchEntity.getTargetNode(), - tx); - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), true, null)); - } catch (final RestconfDocumentedException e) { - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(e.getErrors()))); - noError = false; - } - break; - case MERGE: - try { - mergeDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, - patchEntity.getTargetNode(), patchEntity.getNode(), tx, schemaContextRef); - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), true, null)); - } catch (final RestconfDocumentedException e) { - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(e.getErrors()))); - noError = false; - } - break; - case REPLACE: - try { - replaceDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, - patchEntity.getTargetNode(), patchEntity.getNode(), schemaContextRef, tx); - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), true, null)); - } catch (final RestconfDocumentedException e) { - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(e.getErrors()))); - noError = false; - } - break; - case REMOVE: - try { - removeDataWithinTransaction(LogicalDatastoreType.CONFIGURATION, patchEntity.getTargetNode(), - tx); - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), true, null)); - } catch (final RestconfDocumentedException e) { - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(e.getErrors()))); - noError = false; - } - break; - default: - editCollection.add(new PatchStatusEntity(patchEntity.getEditId(), - false, Lists.newArrayList(new RestconfError(ErrorType.PROTOCOL, - ErrorTag.OPERATION_NOT_SUPPORTED, "Not supported Yang Patch operation")))); - noError = false; - break; - } - } else { - break; - } - } - - // if no errors then submit transaction, otherwise cancel - if (noError) { - final ResponseFactory response = new ResponseFactory(); - final CheckedFuture future = tx.submit(); - - try { - FutureCallbackTx.addCallback(future, PatchData.PATCH_TX_TYPE, response); - } catch (final RestconfDocumentedException e) { - // if errors occurred during transaction commit then patch failed and global errors are reported - return new PatchStatusContext(context.getPatchId(), ImmutableList.copyOf(editCollection), false, - Lists.newArrayList(e.getErrors())); - } - - return new PatchStatusContext(context.getPatchId(), ImmutableList.copyOf(editCollection), true, null); - } else { - tx.cancel(); - RestConnectorProvider.resetTransactionChainForAdapaters(transactionNode.getTransactionChain()); - return new PatchStatusContext(context.getPatchId(), ImmutableList.copyOf(editCollection), - false, null); - } - } - - /** - * Create data within one transaction, return error if already exists. - * @param dataStore Datastore to write data to - * @param path Path for data to be created - * @param payload Data to be created - * @param rWTransaction Transaction - * @param schemaContextRef Soft reference for global schema context - */ - private static void createDataWithinTransaction(final LogicalDatastoreType dataStore, - final YangInstanceIdentifier path, - final NormalizedNode payload, - final DOMDataReadWriteTransaction rwTransaction, - final SchemaContextRef schemaContextRef) { - LOG.trace("POST {} within Restconf Patch: {} with payload {}", dataStore.name(), path, payload); - createData(payload, schemaContextRef.get(), path, rwTransaction, dataStore, true); - } - - /** - * Check if data exists and remove it within one transaction. - * @param dataStore Datastore to delete data from - * @param path Path for data to be deleted - * @param readWriteTransaction Transaction - */ - private static void deleteDataWithinTransaction(final LogicalDatastoreType dataStore, - final YangInstanceIdentifier path, - final DOMDataReadWriteTransaction readWriteTransaction) { - LOG.trace("Delete {} within Restconf Patch: {}", dataStore.name(), path); - checkItemExistsWithinTransaction(readWriteTransaction, dataStore, path); - readWriteTransaction.delete(dataStore, path); - } - - /** - * Merge data within one transaction. - * @param dataStore Datastore to merge data to - * @param path Path for data to be merged - * @param payload Data to be merged - * @param writeTransaction Transaction - * @param schemaContextRef Soft reference for global schema context - */ - private static void mergeDataWithinTransaction(final LogicalDatastoreType dataStore, - final YangInstanceIdentifier path, - final NormalizedNode payload, - final DOMDataReadWriteTransaction writeTransaction, - final SchemaContextRef schemaContextRef) { - LOG.trace("Merge {} within Restconf Patch: {} with payload {}", dataStore.name(), path, payload); - TransactionUtil.ensureParentsByMerge(path, schemaContextRef.get(), writeTransaction); - writeTransaction.merge(dataStore, path, payload); - } - - /** - * Do NOT check if data exists and remove it within one transaction. - * @param dataStore Datastore to delete data from - * @param path Path for data to be deleted - * @param writeTransaction Transaction - */ - private static void removeDataWithinTransaction(final LogicalDatastoreType dataStore, - final YangInstanceIdentifier path, - final DOMDataWriteTransaction writeTransaction) { - LOG.trace("Remove {} within Restconf Patch: {}", dataStore.name(), path); - writeTransaction.delete(dataStore, path); - } - - /** - * Create data within one transaction, replace if already exists. - * @param dataStore Datastore to write data to - * @param path Path for data to be created - * @param payload Data to be created - * @param schemaContextRef Soft reference for global schema context - * @param rwTransaction Transaction - */ - private static void replaceDataWithinTransaction(final LogicalDatastoreType dataStore, - final YangInstanceIdentifier path, - final NormalizedNode payload, - final SchemaContextRef schemaContextRef, - final DOMDataReadWriteTransaction rwTransaction) { - LOG.trace("PUT {} within Restconf Patch: {} with payload {}", dataStore.name(), path, payload); - createData(payload, schemaContextRef.get(), path, rwTransaction, dataStore, false); - } - - /** - * Create data within one transaction. If {@code errorIfExists} is set to {@code true} then data will be checked - * for existence before created, otherwise they will be overwritten. - * @param payload Data to be created - * @param schemaContext Global schema context - * @param path Path for data to be created - * @param rwTransaction Transaction - * @param dataStore Datastore to write data to - * @param errorIfExists Enable checking for existence of data (throws error if already exists) - */ - private static void createData(final NormalizedNode payload, final SchemaContext schemaContext, - final YangInstanceIdentifier path, final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType dataStore, final boolean errorIfExists) { - if (payload instanceof MapNode) { - final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path); - rwTransaction.merge(dataStore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - TransactionUtil.ensureParentsByMerge(path, schemaContext, rwTransaction); - for (final MapEntryNode child : ((MapNode) payload).getValue()) { - final YangInstanceIdentifier childPath = path.node(child.getIdentifier()); - - if (errorIfExists) { - checkItemDoesNotExistsWithinTransaction(rwTransaction, dataStore, childPath); - } - - rwTransaction.put(dataStore, childPath, child); - } - } else { - if (errorIfExists) { - checkItemDoesNotExistsWithinTransaction(rwTransaction, dataStore, path); - } - - TransactionUtil.ensureParentsByMerge(path, schemaContext, rwTransaction); - rwTransaction.put(dataStore, path, payload); - } - } - - /** - * Check if items already exists at specified {@code path}. Throws {@link RestconfDocumentedException} if - * data does NOT already exists. - * @param rwTransaction Transaction - * @param store Datastore - * @param path Path to be checked - */ - public static void checkItemExistsWithinTransaction(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType store, final YangInstanceIdentifier path) { - final CheckedFuture future = rwTransaction.exists(store, path); - final FutureDataFactory response = new FutureDataFactory<>(); - - FutureCallbackTx.addCallback(future, PatchData.PATCH_TX_TYPE, response); - - if (!response.result) { - final String errMsg = "Operation via Restconf was not executed because data does not exist"; - LOG.trace("{}:{}", errMsg, path); - throw new RestconfDocumentedException( - "Data does not exist", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, path); - } - } - - /** - * Check if items do NOT already exists at specified {@code path}. Throws {@link RestconfDocumentedException} if - * data already exists. - * @param rwTransaction Transaction - * @param store Datastore - * @param path Path to be checked - */ - public static void checkItemDoesNotExistsWithinTransaction(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType store, final YangInstanceIdentifier path) { - final CheckedFuture future = rwTransaction.exists(store, path); - final FutureDataFactory response = new FutureDataFactory<>(); - - FutureCallbackTx.addCallback(future, PatchData.PATCH_TX_TYPE, response); - - if (response.result) { - final String errMsg = "Operation via Restconf was not executed because data already exists"; - LOG.trace("{}:{}", errMsg, path); - throw new RestconfDocumentedException( - "Data already exists", ErrorType.PROTOCOL, ErrorTag.DATA_EXISTS, path); - } - } -} \ No newline at end of file diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PostDataTransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PostDataTransactionUtil.java deleted file mode 100644 index 445e9fbc2f..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PostDataTransactionUtil.java +++ /dev/null @@ -1,348 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; -import java.net.URI; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Util class to post data to DS. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class PostDataTransactionUtil { - - private static final Logger LOG = LoggerFactory.getLogger(PostDataTransactionUtil.class); - - private PostDataTransactionUtil() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Check mount point and prepare variables for post data. - * - * @param uriInfo - * - * @param payload - * data - * @param transactionNode - * wrapper for transaction data - * @param schemaContextRef - * reference to actual {@link SchemaContext} - * @param point - * point - * @param insert - * insert - * @return {@link CheckedFuture} - */ - public static Response postData(final UriInfo uriInfo, final NormalizedNodeContext payload, - final TransactionVarsWrapper transactionNode, final SchemaContextRef schemaContextRef, final String insert, - final String point) { - final CheckedFuture future = submitData( - payload.getInstanceIdentifierContext().getInstanceIdentifier(), payload.getData(), - transactionNode, schemaContextRef.get(), insert, point); - final URI location = PostDataTransactionUtil.resolveLocation(uriInfo, transactionNode, schemaContextRef); - final ResponseFactory dataFactory = new ResponseFactory(null, location); - FutureCallbackTx.addCallback(future, RestconfDataServiceConstant.PostData.POST_TX_TYPE, dataFactory); - return dataFactory.build(); - } - - /** - * Post data by type. - * - * @param path - * path - * @param data - * data - * @param transactionNode - * wrapper for data to transaction - * @param schemaContext - * schema context of data - * @param point - * query parameter - * @param insert - * query parameter - * @return {@link CheckedFuture} - */ - private static CheckedFuture submitData(final YangInstanceIdentifier path, - final NormalizedNode data, final TransactionVarsWrapper transactionNode, - final SchemaContext schemaContext, final String insert, final String point) { - final DOMTransactionChain domTransactionChain = transactionNode.getTransactionChain(); - final DOMDataReadWriteTransaction newReadWriteTransaction = domTransactionChain.newReadWriteTransaction(); - if (insert == null) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - final DataSchemaNode schemaNode = PutDataTransactionUtil.checkListAndOrderedType(schemaContext, path); - switch (insert) { - case "first": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - PutDataTransactionUtil.readList(path.getParent(), schemaContext, domTransactionChain, - schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, - path.getParent().getParent()); - simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data, - schemaContext, domTransactionChain); - makePost(path, readData, schemaContext, domTransactionChain, - newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = PutDataTransactionUtil - .readList(path.getParent(), schemaContext, domTransactionChain, schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, - path.getParent().getParent()); - simplePost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, data, - schemaContext, domTransactionChain); - makePost(path, readData, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } - } - case "last": - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - case "before": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - PutDataTransactionUtil.readList(path.getParent(), schemaContext, domTransactionChain, - schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, - data, schemaContext, point, readList, true, domTransactionChain); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = - PutDataTransactionUtil.readList(path.getParent(), schemaContext, domTransactionChain, - schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, - path, data, schemaContext, point, readLeafList, true, domTransactionChain); - return newReadWriteTransaction.submit(); - } - } - case "after": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - PutDataTransactionUtil.readList(path.getParent(), schemaContext, domTransactionChain, - schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - insertWithPointListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, - data, schemaContext, point, readList, false, domTransactionChain); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = - PutDataTransactionUtil.readList(path.getParent(), schemaContext, domTransactionChain, - schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - makePost(path, data, schemaContext, domTransactionChain, newReadWriteTransaction); - return newReadWriteTransaction.submit(); - } else { - insertWithPointLeafListPost(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, - path, data, schemaContext, point, readLeafList, true, domTransactionChain); - return newReadWriteTransaction.submit(); - } - } - default: - throw new RestconfDocumentedException( - "Used bad value of insert parameter. Possible values are first, last, before or after, " - + "but was: " + insert); - } - } - } - - private static void insertWithPointLeafListPost(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType datastore, final YangInstanceIdentifier path, final NormalizedNode payload, - final SchemaContext schemaContext, final String point, final OrderedLeafSetNode readLeafList, - final boolean before, final DOMTransactionChain domTransactionChain) { - rwTransaction.delete(datastore, path.getParent().getParent()); - final InstanceIdentifierContext instanceIdentifier = - ParserIdentifier.toInstanceIdentifier(point, schemaContext, Optional.absent()); - int lastItemPosition = 0; - for (final LeafSetEntryNode nodeChild : readLeafList.getValue()) { - if (nodeChild.getIdentifier().equals(instanceIdentifier.getInstanceIdentifier().getLastPathArgument())) { - break; - } - lastItemPosition++; - } - if (!before) { - lastItemPosition++; - } - int lastInsertedPosition = 0; - final NormalizedNode emptySubtree = - ImmutableNodes.fromInstanceId(schemaContext, path.getParent().getParent()); - rwTransaction.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - for (final LeafSetEntryNode nodeChild : readLeafList.getValue()) { - if (lastInsertedPosition == lastItemPosition) { - TransactionUtil.checkItemDoesNotExists(domTransactionChain, rwTransaction, datastore, path, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - rwTransaction.put(datastore, path, payload); - } - final YangInstanceIdentifier childPath = path.getParent().getParent().node(nodeChild.getIdentifier()); - TransactionUtil.checkItemDoesNotExists(domTransactionChain, rwTransaction, datastore, childPath, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - rwTransaction.put(datastore, childPath, nodeChild); - lastInsertedPosition++; - } - } - - private static void insertWithPointListPost(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType datastore, final YangInstanceIdentifier path, final NormalizedNode payload, - final SchemaContext schemaContext, final String point, final MapNode readList, final boolean before, - final DOMTransactionChain domTransactionChain) { - rwTransaction.delete(datastore, path.getParent().getParent()); - final InstanceIdentifierContext instanceIdentifier = - ParserIdentifier.toInstanceIdentifier(point, schemaContext, Optional.absent()); - int lastItemPosition = 0; - for (final MapEntryNode mapEntryNode : readList.getValue()) { - if (mapEntryNode.getIdentifier().equals(instanceIdentifier.getInstanceIdentifier().getLastPathArgument())) { - break; - } - lastItemPosition++; - } - if (!before) { - lastItemPosition++; - } - int lastInsertedPosition = 0; - final NormalizedNode emptySubtree = - ImmutableNodes.fromInstanceId(schemaContext, path.getParent().getParent()); - rwTransaction.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - for (final MapEntryNode mapEntryNode : readList.getValue()) { - if (lastInsertedPosition == lastItemPosition) { - TransactionUtil.checkItemDoesNotExists(domTransactionChain, rwTransaction, datastore, path, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - rwTransaction.put(datastore, path, payload); - } - final YangInstanceIdentifier childPath = path.getParent().getParent().node(mapEntryNode.getIdentifier()); - TransactionUtil.checkItemDoesNotExists(domTransactionChain, rwTransaction, datastore, childPath, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - rwTransaction.put(datastore, childPath, mapEntryNode); - lastInsertedPosition++; - } - } - - private static void makePost(final YangInstanceIdentifier path, final NormalizedNode data, - final SchemaContext schemaContext, final DOMTransactionChain transactionChain, - final DOMDataReadWriteTransaction transaction) { - if (data instanceof MapNode) { - boolean merge = false; - for (final MapEntryNode child : ((MapNode) data).getValue()) { - final YangInstanceIdentifier childPath = path.node(child.getIdentifier()); - TransactionUtil.checkItemDoesNotExists( - transactionChain, transaction, LogicalDatastoreType.CONFIGURATION, childPath, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - if (!merge) { - merge = true; - TransactionUtil.ensureParentsByMerge(path, schemaContext, transaction); - final NormalizedNode emptySubTree = ImmutableNodes.fromInstanceId(schemaContext, path); - transaction.merge(LogicalDatastoreType.CONFIGURATION, - YangInstanceIdentifier.create(emptySubTree.getIdentifier()), emptySubTree); - } - transaction.put(LogicalDatastoreType.CONFIGURATION, childPath, child); - } - } else { - TransactionUtil.checkItemDoesNotExists( - transactionChain, transaction, LogicalDatastoreType.CONFIGURATION, path, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - - TransactionUtil.ensureParentsByMerge(path, schemaContext, transaction); - transaction.put(LogicalDatastoreType.CONFIGURATION, path, data); - } - } - - /** - * Get location from {@link YangInstanceIdentifier} and {@link UriInfo}. - * - * @param uriInfo - * uri info - * @param transactionNode - * wrapper for data of transaction - * @param schemaContextRef - * reference to {@link SchemaContext} - * @return {@link URI} - */ - private static URI resolveLocation(final UriInfo uriInfo, final TransactionVarsWrapper transactionNode, - final SchemaContextRef schemaContextRef) { - if (uriInfo == null) { - return null; - } - - final UriBuilder uriBuilder = uriInfo.getBaseUriBuilder(); - uriBuilder.path("data"); - uriBuilder.path(ParserIdentifier - .stringFromYangInstanceIdentifier(transactionNode.getInstanceIdentifier().getInstanceIdentifier(), - schemaContextRef.get())); - - return uriBuilder.build(); - } - - private static void simplePost(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType datastore, final YangInstanceIdentifier path, final NormalizedNode payload, - final SchemaContext schemaContext, final DOMTransactionChain transactionChain) { - TransactionUtil.checkItemDoesNotExists(transactionChain, rwTransaction, datastore, path, - RestconfDataServiceConstant.PostData.POST_TX_TYPE); - TransactionUtil.ensureParentsByMerge(path, schemaContext, rwTransaction); - rwTransaction.put(datastore, path, payload); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PutDataTransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PutDataTransactionUtil.java deleted file mode 100644 index f8636cf2a7..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/PutDataTransactionUtil.java +++ /dev/null @@ -1,415 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Optional; -import com.google.common.collect.Maps; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.List; -import java.util.Map; -import javax.ws.rs.core.Response; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.NormalizedNodeContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.common.validation.RestconfValidationUtils; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedLeafSetNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; - -/** - * Util class for put data to DS. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class PutDataTransactionUtil { - - /** - * Valid input data with {@link SchemaNode}. - * - * @param schemaNode - * {@link SchemaNode} - * @param payload - * input data - */ - public static void validInputData(final SchemaNode schemaNode, final NormalizedNodeContext payload) { - if ((schemaNode != null) && (payload.getData() == null)) { - throw new RestconfDocumentedException("Input is required.", ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } else if ((schemaNode == null) && (payload.getData() != null)) { - throw new RestconfDocumentedException("No input expected.", ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - } - - /** - * Valid top level node name. - * - * @param path - * path of node - * @param payload - * data - */ - public static void validTopLevelNodeName(final YangInstanceIdentifier path, final NormalizedNodeContext payload) { - final String payloadName = payload.getData().getNodeType().getLocalName(); - - if (path.isEmpty()) { - if (!payload.getData().getNodeType().equals(RestconfDataServiceConstant.NETCONF_BASE_QNAME)) { - throw new RestconfDocumentedException("Instance identifier has to contain at least one path argument", - ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - } else { - final String identifierName = path.getLastPathArgument().getNodeType().getLocalName(); - if (!payloadName.equals(identifierName)) { - throw new RestconfDocumentedException( - "Payload name (" + payloadName + ") is different from identifier name (" + identifierName + ")", - ErrorType.PROTOCOL, ErrorTag.MALFORMED_MESSAGE); - } - } - } - - /** - * Validates whether keys in {@code payload} are equal to values of keys in - * {@code iiWithData} for list schema node. - * - * @throws RestconfDocumentedException - * if key values or key count in payload and URI isn't equal - */ - public static void validateListKeysEqualityInPayloadAndUri(final NormalizedNodeContext payload) { - final InstanceIdentifierContext iiWithData = payload.getInstanceIdentifierContext(); - final PathArgument lastPathArgument = iiWithData.getInstanceIdentifier().getLastPathArgument(); - final SchemaNode schemaNode = iiWithData.getSchemaNode(); - final NormalizedNode data = payload.getData(); - if (schemaNode instanceof ListSchemaNode) { - final List keyDefinitions = ((ListSchemaNode) schemaNode).getKeyDefinition(); - if ((lastPathArgument instanceof NodeIdentifierWithPredicates) && (data instanceof MapEntryNode)) { - final Map uriKeyValues = ((NodeIdentifierWithPredicates) lastPathArgument) - .getKeyValues(); - isEqualUriAndPayloadKeyValues(uriKeyValues, (MapEntryNode) data, keyDefinitions); - } - } - } - - private static void isEqualUriAndPayloadKeyValues(final Map uriKeyValues, final MapEntryNode payload, - final List keyDefinitions) { - final Map mutableCopyUriKeyValues = Maps.newHashMap(uriKeyValues); - for (final QName keyDefinition : keyDefinitions) { - final Object uriKeyValue = mutableCopyUriKeyValues.remove(keyDefinition); - RestconfValidationUtils.checkDocumentedError(uriKeyValue != null, ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, - "Missing key " + keyDefinition + " in URI."); - - final Object dataKeyValue = payload.getIdentifier().getKeyValues().get(keyDefinition); - - if (!uriKeyValue.equals(dataKeyValue)) { - final String errMsg = "The value '" + uriKeyValue + "' for key '" + keyDefinition.getLocalName() - + "' specified in the URI doesn't match the value '" + dataKeyValue - + "' specified in the message body. "; - throw new RestconfDocumentedException(errMsg, ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - } - } - - /** - * Check mount point and prepare variables for put data to DS. - * - * @param payload - * data to put - * @param schemaCtxRef - * reference to {@link SchemaContext} - * @param transactionNode - * wrapper of variables for transaction - * @param point - * query parameter - * @param insert - * query parameter - * @return {@link CheckedFuture} - */ - public static Response putData(final NormalizedNodeContext payload, final SchemaContextRef schemaCtxRef, - final TransactionVarsWrapper transactionNode, final String insert, final String point) { - final YangInstanceIdentifier path = payload.getInstanceIdentifierContext().getInstanceIdentifier(); - final SchemaContext schemaContext = schemaCtxRef.get(); - final ResponseFactory responseFactory = new ResponseFactory( - ReadDataTransactionUtil.readData(RestconfDataServiceConstant.ReadData.CONFIG, transactionNode, - schemaContext)); - final CheckedFuture submitData = submitData(path, schemaContext, - transactionNode.getTransactionChain(), payload.getData(), insert, point); - FutureCallbackTx.addCallback(submitData, RestconfDataServiceConstant.PutData.PUT_TX_TYPE, responseFactory); - return responseFactory.build(); - } - - /** - * Put data to DS. - * - * @param path - * path of data - * @param schemaContext - * {@link SchemaContext} - * @param domTransactionChain - * write transaction - * @param data - * data - * @param point - * query parameter - * @param insert - * query parameter - * @return {@link CheckedFuture} - */ - private static CheckedFuture submitData(final YangInstanceIdentifier path, - final SchemaContext schemaContext, final DOMTransactionChain domTransactionChain, - final NormalizedNode data, final String insert, final String point) { - final DOMDataReadWriteTransaction newReadWriteTransaction = domTransactionChain.newReadWriteTransaction(); - if (insert == null) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - final DataSchemaNode schemaNode = checkListAndOrderedType(schemaContext, path); - switch (insert) { - case "first": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, path.getParent()); - simplePut(LogicalDatastoreType.CONFIGURATION, path, newReadWriteTransaction, - schemaContext, data); - listPut(LogicalDatastoreType.CONFIGURATION, path.getParent(), newReadWriteTransaction, - schemaContext, readList); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - newReadWriteTransaction.delete(LogicalDatastoreType.CONFIGURATION, path.getParent()); - simplePut(LogicalDatastoreType.CONFIGURATION, path, newReadWriteTransaction, - schemaContext, data); - listPut(LogicalDatastoreType.CONFIGURATION, path.getParent(), newReadWriteTransaction, - schemaContext, readLeafList); - return newReadWriteTransaction.submit(); - } - } - case "last": - return makePut(path, schemaContext, newReadWriteTransaction, data); - case "before": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - insertWithPointListPut(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, path, - data, schemaContext, point, readList, true); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - insertWithPointLeafListPut(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, - path, data, schemaContext, point, readLeafList, true); - return newReadWriteTransaction.submit(); - } - } - case "after": - if (schemaNode instanceof ListSchemaNode) { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - final OrderedMapNode readList = (OrderedMapNode) readData; - if ((readList == null) || readList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - insertWithPointListPut(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, - path, data, schemaContext, point, readList, false); - return newReadWriteTransaction.submit(); - } - } else { - final NormalizedNode readData = - readList(path, schemaContext, domTransactionChain, schemaNode); - - final OrderedLeafSetNode readLeafList = (OrderedLeafSetNode) readData; - if ((readLeafList == null) || readLeafList.getValue().isEmpty()) { - return makePut(path, schemaContext, newReadWriteTransaction, data); - } else { - insertWithPointLeafListPut(newReadWriteTransaction, LogicalDatastoreType.CONFIGURATION, - path, data, schemaContext, point, readLeafList, true); - return newReadWriteTransaction.submit(); - } - } - default: - throw new RestconfDocumentedException( - "Used bad value of insert parameter. Possible values are first, last, before or after, " - + "but was: " + insert); - } - } - } - - public static NormalizedNode readList(final YangInstanceIdentifier path, final SchemaContext schemaContext, - final DOMTransactionChain domTransactionChain, final DataSchemaNode schemaNode) { - final InstanceIdentifierContext iid = new InstanceIdentifierContext( - path.getParent(), schemaNode, null, schemaContext); - final TransactionVarsWrapper transactionNode = - new TransactionVarsWrapper(iid, null, domTransactionChain); - final NormalizedNode readData = ReadDataTransactionUtil - .readData(RestconfDataServiceConstant.ReadData.CONFIG, transactionNode, schemaContext); - return readData; - } - - private static void insertWithPointLeafListPut(final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final NormalizedNode data, final SchemaContext schemaContext, final String point, - final OrderedLeafSetNode readLeafList, final boolean before) { - rwTransaction.delete(datastore, path.getParent()); - final InstanceIdentifierContext instanceIdentifier = - ParserIdentifier.toInstanceIdentifier(point, schemaContext, Optional.absent()); - int lastItemPosition = 0; - for (final LeafSetEntryNode nodeChild : readLeafList.getValue()) { - if (nodeChild.getIdentifier().equals(instanceIdentifier.getInstanceIdentifier().getLastPathArgument())) { - break; - } - lastItemPosition++; - } - if (!before) { - lastItemPosition++; - } - int lastInsertedPosition = 0; - final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent()); - rwTransaction.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - for (final LeafSetEntryNode nodeChild : readLeafList.getValue()) { - if (lastInsertedPosition == lastItemPosition) { - simplePut(datastore, path, rwTransaction, schemaContext, data); - } - final YangInstanceIdentifier childPath = path.getParent().node(nodeChild.getIdentifier()); - rwTransaction.put(datastore, childPath, nodeChild); - lastInsertedPosition++; - } - } - - private static void insertWithPointListPut(final DOMDataReadWriteTransaction writeTx, - final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final NormalizedNode data, final SchemaContext schemaContext, final String point, - final OrderedMapNode readList, final boolean before) { - writeTx.delete(datastore, path.getParent()); - final InstanceIdentifierContext instanceIdentifier = - ParserIdentifier.toInstanceIdentifier(point, schemaContext, Optional.absent()); - int lastItemPosition = 0; - for (final MapEntryNode mapEntryNode : readList.getValue()) { - if (mapEntryNode.getIdentifier().equals(instanceIdentifier.getInstanceIdentifier().getLastPathArgument())) { - break; - } - lastItemPosition++; - } - if (!before) { - lastItemPosition++; - } - int lastInsertedPosition = 0; - final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path.getParent()); - writeTx.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - for (final MapEntryNode mapEntryNode : readList.getValue()) { - if (lastInsertedPosition == lastItemPosition) { - simplePut(datastore, path, writeTx, schemaContext, data); - } - final YangInstanceIdentifier childPath = path.getParent().node(mapEntryNode.getIdentifier()); - writeTx.put(datastore, childPath, mapEntryNode); - lastInsertedPosition++; - } - } - - private static void listPut(final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final DOMDataReadWriteTransaction writeTx, final SchemaContext schemaContext, - final OrderedLeafSetNode payload) { - final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path); - writeTx.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - TransactionUtil.ensureParentsByMerge(path, schemaContext, writeTx); - for (final LeafSetEntryNode child : ((LeafSetNode) payload).getValue()) { - final YangInstanceIdentifier childPath = path.node(child.getIdentifier()); - writeTx.put(datastore, childPath, child); - } - } - - private static void listPut(final LogicalDatastoreType datastore, final YangInstanceIdentifier path, - final DOMDataReadWriteTransaction writeTx, final SchemaContext schemaContext, - final OrderedMapNode payload) { - final NormalizedNode emptySubtree = ImmutableNodes.fromInstanceId(schemaContext, path); - writeTx.merge(datastore, YangInstanceIdentifier.create(emptySubtree.getIdentifier()), emptySubtree); - TransactionUtil.ensureParentsByMerge(path, schemaContext, writeTx); - for (final MapEntryNode child : ((MapNode) payload).getValue()) { - final YangInstanceIdentifier childPath = path.node(child.getIdentifier()); - writeTx.put(datastore, childPath, child); - } - } - - private static void simplePut(final LogicalDatastoreType configuration, final YangInstanceIdentifier path, - final DOMDataReadWriteTransaction writeTx, final SchemaContext schemaContext, - final NormalizedNode data) { - TransactionUtil.ensureParentsByMerge(path, schemaContext, writeTx); - writeTx.put(LogicalDatastoreType.CONFIGURATION, path, data); - } - - private static CheckedFuture makePut(final YangInstanceIdentifier path, - final SchemaContext schemaContext, final DOMDataWriteTransaction writeTx, final NormalizedNode data) { - TransactionUtil.ensureParentsByMerge(path, schemaContext, writeTx); - writeTx.put(LogicalDatastoreType.CONFIGURATION, path, data); - return writeTx.submit(); - } - - public static DataSchemaNode checkListAndOrderedType(final SchemaContext ctx, final YangInstanceIdentifier path) { - final YangInstanceIdentifier parent = path.getParent(); - final DataSchemaContextNode node = DataSchemaContextTree.from(ctx).getChild(parent); - final DataSchemaNode dataSchemaNode = node.getDataSchemaNode(); - - if (dataSchemaNode instanceof ListSchemaNode) { - if (!((ListSchemaNode) dataSchemaNode).isUserOrdered()) { - throw new RestconfDocumentedException("Insert parameter can be used only with ordered-by user list."); - } - return dataSchemaNode; - } - if (dataSchemaNode instanceof LeafListSchemaNode) { - if (!((LeafListSchemaNode) dataSchemaNode).isUserOrdered()) { - throw new RestconfDocumentedException( - "Insert parameter can be used only with ordered-by user leaf-list."); - } - return dataSchemaNode; - } - throw new RestconfDocumentedException("Insert parameter can be used only with list or leaf-list"); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java deleted file mode 100644 index 8bfa442e91..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ReadDataTransactionUtil.java +++ /dev/null @@ -1,697 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.STREAMS_PATH; -import static org.opendaylight.restconf.restful.utils.RestconfStreamsConstants.STREAM_PATH_PART; - -import com.google.common.base.Optional; -import com.google.common.primitives.Ints; -import com.google.common.util.concurrent.CheckedFuture; -import java.net.URI; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.function.Function; -import java.util.stream.Collectors; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.netconf.sal.streams.listeners.NotificationListenerAdapter; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.context.WriterParameters; -import org.opendaylight.restconf.common.context.WriterParameters.WriterParametersBuilder; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError; -import org.opendaylight.restconf.common.references.SchemaContextRef; -import org.opendaylight.restconf.restful.transaction.TransactionVarsWrapper; -import org.opendaylight.restconf.utils.mapping.RestconfMappingNodeUtil; -import org.opendaylight.restconf.utils.parser.ParserFieldsParameter; -import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.AugmentationNode; -import org.opendaylight.yangtools.yang.data.api.schema.ChoiceNode; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.LeafNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -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.DataContainerNodeBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeAttrBuilder; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.api.NormalizedNodeContainerBuilder; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Util class for read data from data store via transaction. - *
    - *
  • config - *
  • state - *
  • all (config + state) - *
- * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class ReadDataTransactionUtil { - - private ReadDataTransactionUtil() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Parse parameters from URI request and check their types and values. - * - * - * @param identifier - * {@link InstanceIdentifierContext} - * @param uriInfo - * URI info - * @param tagged - * set tagged for {@link WriterParameters} - * @return {@link WriterParameters} - */ - @Nonnull - public static WriterParameters parseUriParameters(@Nonnull final InstanceIdentifierContext identifier, - @Nullable final UriInfo uriInfo, final boolean tagged) { - return parseParams(identifier, uriInfo, tagged); - } - - /** - * Parse parameters from URI request and check their types and values. - * - * @param identifier - * {@link InstanceIdentifierContext} - * @param uriInfo - * URI info - * @return {@link WriterParameters} - */ - @Nonnull - public static WriterParameters parseUriParameters(@Nonnull final InstanceIdentifierContext identifier, - @Nullable final UriInfo uriInfo) { - return parseParams(identifier, uriInfo, false); - } - - private static WriterParameters parseParams(final InstanceIdentifierContext identifier, final UriInfo uriInfo, - final boolean tagged) { - final WriterParametersBuilder builder = new WriterParametersBuilder(); - builder.setTagged(tagged); - - if (uriInfo == null) { - return builder.build(); - } - - // check only allowed parameters - ParametersUtil.checkParametersTypes( - RestconfDataServiceConstant.ReadData.READ_TYPE_TX, - uriInfo.getQueryParameters().keySet(), - RestconfDataServiceConstant.ReadData.CONTENT, - RestconfDataServiceConstant.ReadData.DEPTH, - RestconfDataServiceConstant.ReadData.FIELDS, RestconfDataServiceConstant.ReadData.WITH_DEFAULTS); - - // read parameters from URI or set default values - final List content = uriInfo.getQueryParameters().getOrDefault( - RestconfDataServiceConstant.ReadData.CONTENT, - Collections.singletonList(RestconfDataServiceConstant.ReadData.ALL)); - final List depth = uriInfo.getQueryParameters().getOrDefault( - RestconfDataServiceConstant.ReadData.DEPTH, - Collections.singletonList(RestconfDataServiceConstant.ReadData.UNBOUNDED)); - // fields - final List fields = uriInfo.getQueryParameters().getOrDefault( - RestconfDataServiceConstant.ReadData.FIELDS, - Collections.emptyList()); - - // parameter can be in URI at most once - ParametersUtil.checkParameterCount(content, RestconfDataServiceConstant.ReadData.CONTENT); - ParametersUtil.checkParameterCount(depth, RestconfDataServiceConstant.ReadData.DEPTH); - ParametersUtil.checkParameterCount(fields, RestconfDataServiceConstant.ReadData.FIELDS); - - // check and set content - final String contentValue = content.get(0); - if (!contentValue.equals(RestconfDataServiceConstant.ReadData.ALL)) { - if (!contentValue.equals(RestconfDataServiceConstant.ReadData.CONFIG) - && !contentValue.equals(RestconfDataServiceConstant.ReadData.NONCONFIG)) { - throw new RestconfDocumentedException( - new RestconfError(RestconfError.ErrorType.PROTOCOL, RestconfError.ErrorTag.INVALID_VALUE, - "Invalid content parameter: " + contentValue, null, - "The content parameter value must be either config, nonconfig or all (default)")); - } - } - - builder.setContent(content.get(0)); - - // check and set depth - if (!depth.get(0).equals(RestconfDataServiceConstant.ReadData.UNBOUNDED)) { - final Integer value = Ints.tryParse(depth.get(0)); - - if ((value == null) - || (!((value >= RestconfDataServiceConstant.ReadData.MIN_DEPTH) - && (value <= RestconfDataServiceConstant.ReadData.MAX_DEPTH)))) { - throw new RestconfDocumentedException( - new RestconfError(RestconfError.ErrorType.PROTOCOL, RestconfError.ErrorTag.INVALID_VALUE, - "Invalid depth parameter: " + depth, null, - "The depth parameter must be an integer between 1 and 65535 or \"unbounded\"")); - } else { - builder.setDepth(value); - } - } - - // check and set fields - if (!fields.isEmpty()) { - builder.setFields(ParserFieldsParameter.parseFieldsParameter(identifier, fields.get(0))); - } - - return builder.build(); - } - - /** - * Read specific type of data from data store via transaction. - * - * @param valueOfContent - * type of data to read (config, state, all) - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @param ctx - * schema context - * @return {@link NormalizedNode} - */ - @Nullable - public static NormalizedNode readData(@Nonnull final String valueOfContent, - @Nonnull final TransactionVarsWrapper transactionNode, final SchemaContext ctx) { - return readData(valueOfContent, transactionNode, null, ctx); - } - - /** - * Read specific type of data from data store via transaction. - * - * @param valueOfContent - * type of data to read (config, state, all) - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @param withDefa - * vaule of with-defaults parameter - * @param ctx - * schema context - * @return {@link NormalizedNode} - */ - @Nullable - public static NormalizedNode readData(@Nonnull final String valueOfContent, - @Nonnull final TransactionVarsWrapper transactionNode, final String withDefa, final SchemaContext ctx) { - switch (valueOfContent) { - case RestconfDataServiceConstant.ReadData.CONFIG: - transactionNode.setLogicalDatastoreType(LogicalDatastoreType.CONFIGURATION); - if (withDefa == null) { - return readDataViaTransaction(transactionNode); - } else { - return prepareDataByParamWithDef(readDataViaTransaction(transactionNode), - transactionNode.getInstanceIdentifier().getInstanceIdentifier(), withDefa, ctx); - } - case RestconfDataServiceConstant.ReadData.NONCONFIG: - transactionNode.setLogicalDatastoreType(LogicalDatastoreType.OPERATIONAL); - return readDataViaTransaction(transactionNode); - - case RestconfDataServiceConstant.ReadData.ALL: - return readAllData(transactionNode, withDefa, ctx); - - default: - throw new RestconfDocumentedException( - new RestconfError(RestconfError.ErrorType.PROTOCOL, RestconfError.ErrorTag.INVALID_VALUE, - "Invalid content parameter: " + valueOfContent, null, - "The content parameter value must be either config, nonconfig or all (default)")); - } - } - - /** - * Read specific type of data from data store via transaction and if identifier read data from - * streams then put streams from actual schema context to datastore. - * - * @param identifier - * identifier of data to read - * @param content - * type of data to read (config, state, all) - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @param withDefa - * vaule of with-defaults parameter - * @param schemaContextRef - * schema context - * @param uriInfo - * uri info - * @return {@link NormalizedNode} - */ - public static NormalizedNode readData(final String identifier, final String content, - final TransactionVarsWrapper transactionNode, final String withDefa, - final SchemaContextRef schemaContextRef, final UriInfo uriInfo) { - final SchemaContext schemaContext = schemaContextRef.get(); - if (identifier.contains(STREAMS_PATH) && !identifier.contains(STREAM_PATH_PART)) { - final DOMDataReadWriteTransaction wTx = transactionNode.getTransactionChain().newReadWriteTransaction(); - final boolean exist = SubscribeToStreamUtil.checkExist(schemaContext, wTx); - - for (final NotificationDefinition notificationDefinition : schemaContextRef.get().getNotifications()) { - final List notifiStreamXML = - CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContextRef, - NotificationOutputType.XML.getName()); - final List notifiStreamJSON = - CreateStreamUtil.createYangNotifiStream(notificationDefinition, schemaContextRef, - NotificationOutputType.JSON.getName()); - notifiStreamJSON.addAll(notifiStreamXML); - - for (final NotificationListenerAdapter listener : notifiStreamJSON) { - final URI uri = SubscribeToStreamUtil.prepareUriByStreamName(uriInfo, listener.getStreamName()); - final NormalizedNode mapToStreams = - RestconfMappingNodeUtil.mapYangNotificationStreamByIetfRestconfMonitoring( - listener.getSchemaPath().getLastComponent(), schemaContext.getNotifications(), - null, listener.getOutputType(), uri, - SubscribeToStreamUtil.getMonitoringModule(schemaContext), exist); - SubscribeToStreamUtil.writeDataToDS(schemaContext, - listener.getSchemaPath().getLastComponent().getLocalName(), wTx, exist, - mapToStreams); - } - } - SubscribeToStreamUtil.submitData(wTx); - } - return readData(content, transactionNode, withDefa, schemaContext); - } - - private static NormalizedNode prepareDataByParamWithDef(final NormalizedNode result, - final YangInstanceIdentifier path, final String withDefa, final SchemaContext ctx) { - boolean trim; - switch (withDefa) { - case "trim": - trim = true; - break; - case "explicit": - trim = false; - break; - default: - throw new RestconfDocumentedException(""); - } - - final DataSchemaContextTree baseSchemaCtxTree = DataSchemaContextTree.from(ctx); - final DataSchemaNode baseSchemaNode = baseSchemaCtxTree.getChild(path).getDataSchemaNode(); - if (result instanceof ContainerNode) { - final DataContainerNodeAttrBuilder builder = - Builders.containerBuilder((ContainerSchemaNode) baseSchemaNode); - buildCont(builder, (ContainerNode) result, baseSchemaCtxTree, path, trim); - return builder.build(); - } else { - final DataContainerNodeAttrBuilder builder = - Builders.mapEntryBuilder((ListSchemaNode) baseSchemaNode); - buildMapEntryBuilder(builder, (MapEntryNode) result, baseSchemaCtxTree, path, trim, - ((ListSchemaNode) baseSchemaNode).getKeyDefinition()); - return builder.build(); - } - } - - private static void buildMapEntryBuilder( - final DataContainerNodeAttrBuilder builder, - final MapEntryNode result, final DataSchemaContextTree baseSchemaCtxTree, - final YangInstanceIdentifier actualPath, final boolean trim, final List keys) { - for (final DataContainerChild child : result.getValue()) { - final YangInstanceIdentifier path = actualPath.node(child.getIdentifier()); - final DataSchemaNode childSchema = baseSchemaCtxTree.getChild(path).getDataSchemaNode(); - if (child instanceof ContainerNode) { - final DataContainerNodeAttrBuilder childBuilder = - Builders.containerBuilder((ContainerSchemaNode) childSchema); - buildCont(childBuilder, (ContainerNode) child, baseSchemaCtxTree, path, trim); - builder.withChild(childBuilder.build()); - } else if (child instanceof MapNode) { - final CollectionNodeBuilder childBuilder = - Builders.mapBuilder((ListSchemaNode) childSchema); - buildList(childBuilder, (MapNode) child, baseSchemaCtxTree, path, trim, - ((ListSchemaNode) childSchema).getKeyDefinition()); - builder.withChild(childBuilder.build()); - } else if (child instanceof LeafNode) { - final String defaultVal = ((LeafSchemaNode) childSchema).getDefault(); - final String nodeVal = ((LeafNode) child).getValue(); - final NormalizedNodeAttrBuilder> leafBuilder = - Builders.leafBuilder((LeafSchemaNode) childSchema); - if (keys.contains(child.getNodeType())) { - leafBuilder.withValue(((LeafNode) child).getValue()); - builder.withChild(leafBuilder.build()); - } else { - if (trim) { - if ((defaultVal == null) || !defaultVal.equals(nodeVal)) { - leafBuilder.withValue(((LeafNode) child).getValue()); - builder.withChild(leafBuilder.build()); - } - } else { - if ((defaultVal != null) && defaultVal.equals(nodeVal)) { - leafBuilder.withValue(((LeafNode) child).getValue()); - builder.withChild(leafBuilder.build()); - } - } - } - } - } - } - - private static void buildList(final CollectionNodeBuilder builder, final MapNode result, - final DataSchemaContextTree baseSchemaCtxTree, final YangInstanceIdentifier path, final boolean trim, - final List keys) { - for (final MapEntryNode mapEntryNode : result.getValue()) { - final YangInstanceIdentifier actualNode = path.node(mapEntryNode.getIdentifier()); - final DataSchemaNode childSchema = baseSchemaCtxTree.getChild(actualNode).getDataSchemaNode(); - final DataContainerNodeAttrBuilder mapEntryBuilder = - Builders.mapEntryBuilder((ListSchemaNode) childSchema); - buildMapEntryBuilder(mapEntryBuilder, mapEntryNode, baseSchemaCtxTree, actualNode, trim, keys); - builder.withChild(mapEntryBuilder.build()); - } - } - - private static void buildCont(final DataContainerNodeAttrBuilder builder, - final ContainerNode result, final DataSchemaContextTree baseSchemaCtxTree, - final YangInstanceIdentifier actualPath, final boolean trim) { - for (final DataContainerChild child : result.getValue()) { - final YangInstanceIdentifier path = actualPath.node(child.getIdentifier()); - final DataSchemaNode childSchema = baseSchemaCtxTree.getChild(path).getDataSchemaNode(); - if (child instanceof ContainerNode) { - final DataContainerNodeAttrBuilder builderChild = - Builders.containerBuilder((ContainerSchemaNode) childSchema); - buildCont(builderChild, result, baseSchemaCtxTree, actualPath, trim); - builder.withChild(builderChild.build()); - } else if (child instanceof MapNode) { - final CollectionNodeBuilder childBuilder = - Builders.mapBuilder((ListSchemaNode) childSchema); - buildList(childBuilder, (MapNode) child, baseSchemaCtxTree, path, trim, - ((ListSchemaNode) childSchema).getKeyDefinition()); - builder.withChild(childBuilder.build()); - } else if (child instanceof LeafNode) { - final String defaultVal = ((LeafSchemaNode) childSchema).getDefault(); - final String nodeVal = ((LeafNode) child).getValue(); - final NormalizedNodeAttrBuilder> leafBuilder = - Builders.leafBuilder((LeafSchemaNode) childSchema); - if (trim) { - if ((defaultVal == null) || !defaultVal.equals(nodeVal)) { - leafBuilder.withValue(((LeafNode) child).getValue()); - builder.withChild(leafBuilder.build()); - } - } else { - if ((defaultVal != null) && defaultVal.equals(nodeVal)) { - leafBuilder.withValue(((LeafNode) child).getValue()); - builder.withChild(leafBuilder.build()); - } - } - } - } - } - - /** - * If is set specific {@link LogicalDatastoreType} in - * {@link TransactionVarsWrapper}, then read this type of data from DS. If - * don't, we have to read all data from DS (state + config) - * - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @return {@link NormalizedNode} - */ - @Nullable - private static NormalizedNode readDataViaTransaction( - @Nonnull final TransactionVarsWrapper transactionNode) { - final NormalizedNodeFactory dataFactory = new NormalizedNodeFactory(); - try (DOMDataReadOnlyTransaction tx = transactionNode.getTransactionChain().newReadOnlyTransaction()) { - final CheckedFuture>, ReadFailedException> listenableFuture = tx.read( - transactionNode.getLogicalDatastoreType(), - transactionNode.getInstanceIdentifier().getInstanceIdentifier()); - FutureCallbackTx.addCallback(listenableFuture, RestconfDataServiceConstant.ReadData.READ_TYPE_TX, - dataFactory); - } - return dataFactory.build(); - } - - /** - * Read config and state data, then map them. - * - * @param transactionNode - * {@link TransactionVarsWrapper} - wrapper for variables - * @param withDefa - * with-defaults parameter - * @param ctx - * schema context - * @return {@link NormalizedNode} - */ - @Nullable - private static NormalizedNode readAllData(@Nonnull final TransactionVarsWrapper transactionNode, - final String withDefa, final SchemaContext ctx) { - // PREPARE STATE DATA NODE - transactionNode.setLogicalDatastoreType(LogicalDatastoreType.OPERATIONAL); - final NormalizedNode stateDataNode = readDataViaTransaction(transactionNode); - - // PREPARE CONFIG DATA NODE - transactionNode.setLogicalDatastoreType(LogicalDatastoreType.CONFIGURATION); - final NormalizedNode configDataNode; - if (withDefa == null) { - configDataNode = readDataViaTransaction(transactionNode); - } else { - configDataNode = prepareDataByParamWithDef(readDataViaTransaction(transactionNode), - transactionNode.getInstanceIdentifier().getInstanceIdentifier(), withDefa, ctx); - } - - // if no data exists - if ((stateDataNode == null) && (configDataNode == null)) { - return null; - } - - // return config data - if (stateDataNode == null) { - return configDataNode; - } - - // return state data - if (configDataNode == null) { - return stateDataNode; - } - - // merge data from config and state - return mapNode(stateDataNode, configDataNode); - } - - /** - * Map data by type of read node. - * - * @param stateDataNode - * data node of state data - * @param configDataNode - * data node of config data - * @return {@link NormalizedNode} - */ - @Nonnull - private static NormalizedNode mapNode(@Nonnull final NormalizedNode stateDataNode, - @Nonnull final NormalizedNode configDataNode) { - validPossibilityOfMergeNodes(stateDataNode, configDataNode); - if (configDataNode instanceof RpcDefinition) { - return prepareRpcData(configDataNode, stateDataNode); - } else { - return prepareData(configDataNode, stateDataNode); - } - } - - /** - * Valid of can be data merged together. - * - * @param stateDataNode - * data node of state data - * @param configDataNode - * data node of config data - */ - private static void validPossibilityOfMergeNodes(@Nonnull final NormalizedNode stateDataNode, - @Nonnull final NormalizedNode configDataNode) { - final QNameModule moduleOfStateData = stateDataNode.getIdentifier().getNodeType().getModule(); - final QNameModule moduleOfConfigData = configDataNode.getIdentifier().getNodeType().getModule(); - if (moduleOfStateData != moduleOfConfigData) { - throw new RestconfDocumentedException("It is not possible to merge "); - } - } - - /** - * Prepare and map data for rpc. - * - * @param configDataNode - * data node of config data - * @param stateDataNode - * data node of state data - * @return {@link NormalizedNode} - */ - @Nonnull - private static NormalizedNode prepareRpcData(@Nonnull final NormalizedNode configDataNode, - @Nonnull final NormalizedNode stateDataNode) { - final DataContainerNodeBuilder mapEntryBuilder = ImmutableNodes - .mapEntryBuilder(); - mapEntryBuilder.withNodeIdentifier((NodeIdentifierWithPredicates) configDataNode.getIdentifier()); - - // MAP CONFIG DATA - mapRpcDataNode(configDataNode, mapEntryBuilder); - // MAP STATE DATA - mapRpcDataNode(stateDataNode, mapEntryBuilder); - - return ImmutableNodes.mapNodeBuilder(configDataNode.getNodeType()).addChild(mapEntryBuilder.build()).build(); - } - - /** - * Map node to map entry builder. - * - * @param dataNode - * data node - * @param mapEntryBuilder - * builder for mapping data - */ - private static void mapRpcDataNode(@Nonnull final NormalizedNode dataNode, - @Nonnull final DataContainerNodeBuilder< - NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder) { - ((ContainerNode) dataNode).getValue().forEach(mapEntryBuilder::addChild); - } - - /** - * Prepare and map all data from DS. - * - * @param configDataNode - * data node of config data - * @param stateDataNode - * data node of state data - * @return {@link NormalizedNode} - */ - @Nonnull - private static NormalizedNode prepareData(@Nonnull final NormalizedNode configDataNode, - @Nonnull final NormalizedNode stateDataNode) { - if (configDataNode instanceof MapNode) { - final CollectionNodeBuilder builder = ImmutableNodes - .mapNodeBuilder().withNodeIdentifier(((MapNode) configDataNode).getIdentifier()); - - mapValueToBuilder( - ((MapNode) configDataNode).getValue(), ((MapNode) stateDataNode).getValue(), builder); - - return builder.build(); - } else if (configDataNode instanceof MapEntryNode) { - final DataContainerNodeBuilder builder = ImmutableNodes - .mapEntryBuilder().withNodeIdentifier(((MapEntryNode) configDataNode).getIdentifier()); - - mapValueToBuilder( - ((MapEntryNode) configDataNode).getValue(), ((MapEntryNode) stateDataNode).getValue(), builder); - - return builder.build(); - } else if (configDataNode instanceof ContainerNode) { - final DataContainerNodeAttrBuilder builder = Builders - .containerBuilder().withNodeIdentifier(((ContainerNode) configDataNode).getIdentifier()); - - mapValueToBuilder( - ((ContainerNode) configDataNode).getValue(), ((ContainerNode) stateDataNode).getValue(), builder); - - return builder.build(); - } else if (configDataNode instanceof AugmentationNode) { - final DataContainerNodeBuilder builder = Builders - .augmentationBuilder().withNodeIdentifier(((AugmentationNode) configDataNode).getIdentifier()); - - mapValueToBuilder(((AugmentationNode) configDataNode).getValue(), - ((AugmentationNode) stateDataNode).getValue(), builder); - - return builder.build(); - } else if (configDataNode instanceof ChoiceNode) { - final DataContainerNodeBuilder builder = Builders - .choiceBuilder().withNodeIdentifier(((ChoiceNode) configDataNode).getIdentifier()); - - mapValueToBuilder( - ((ChoiceNode) configDataNode).getValue(), ((ChoiceNode) stateDataNode).getValue(), builder); - - return builder.build(); - } else if (configDataNode instanceof LeafNode) { - return ImmutableNodes.leafNode(configDataNode.getNodeType(), configDataNode.getValue()); - } else { - throw new RestconfDocumentedException("Bad type of node."); - } - } - - /** - * Map value from container node to builder. - * - * @param configData - * collection of config data nodes - * @param stateData - * collection of state data nodes - * @param builder - * builder - */ - private static > void mapValueToBuilder( - @Nonnull final Collection configData, - @Nonnull final Collection stateData, - @Nonnull final NormalizedNodeContainerBuilder builder) { - final Map configMap = configData.stream().collect( - Collectors.toMap(NormalizedNode::getIdentifier, Function.identity())); - final Map stateMap = stateData.stream().collect( - Collectors.toMap(NormalizedNode::getIdentifier, Function.identity())); - - // merge config and state data of children with different identifiers - mapDataToBuilder(configMap, stateMap, builder); - - // merge config and state data of children with the same identifiers - mergeDataToBuilder(configMap, stateMap, builder); - } - - /** - * Map data with different identifiers to builder. Data with different identifiers can be just added - * as childs to parent node. - * - * @param configMap - * map of config data nodes - * @param stateMap - * map of state data nodes - * @param builder - * - builder - */ - private static > void mapDataToBuilder( - @Nonnull final Map configMap, - @Nonnull final Map stateMap, - @Nonnull final NormalizedNodeContainerBuilder builder) { - configMap.entrySet().stream().filter(x -> !stateMap.containsKey(x.getKey())).forEach( - y -> builder.addChild(y.getValue())); - stateMap.entrySet().stream().filter(x -> !configMap.containsKey(x.getKey())).forEach( - y -> builder.addChild(y.getValue())); - } - - /** - * Map data with the same identifiers to builder. Data with the same identifiers cannot be just added but we need to - * go one level down with {@code prepareData} method. - * - * @param configMap - * immutable config data - * @param stateMap - * immutable state data - * @param builder - * - builder - */ - @SuppressWarnings("unchecked") - private static > void mergeDataToBuilder( - @Nonnull final Map configMap, - @Nonnull final Map stateMap, - @Nonnull final NormalizedNodeContainerBuilder builder) { - // it is enough to process only config data because operational contains the same data - configMap.entrySet().stream().filter(x -> stateMap.containsKey(x.getKey())).forEach( - y -> builder.addChild((T) prepareData(y.getValue(), stateMap.get(y.getKey())))); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResolveEnumUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResolveEnumUtil.java deleted file mode 100644 index dcf7fd6b71..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResolveEnumUtil.java +++ /dev/null @@ -1,39 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -/** - * Common util class for resolve enum from String. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class ResolveEnumUtil { - - private ResolveEnumUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Resolve specific type of enum by value. - * - * @param clazz - * enum - * @param value - * string of enum - * @return - enum - */ - public static T resolveEnum(final Class clazz, final String value) { - for (final T t : clazz.getEnumConstants()) { - if (((Enum) t).name().equals(value)) { - return t; - } - } - return null; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResponseFactory.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResponseFactory.java deleted file mode 100644 index 297027b6f1..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/ResponseFactory.java +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import java.net.URI; -import javax.ws.rs.core.Response; -import javax.ws.rs.core.Response.ResponseBuilder; -import javax.ws.rs.core.Response.Status; -import org.apache.commons.lang3.builder.Builder; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; - -/** - * Response factory. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -final class ResponseFactory extends FutureDataFactory implements Builder { - - private ResponseBuilder responseBuilder; - - ResponseFactory(final NormalizedNode readData) { - final Status status = prepareStatus(readData); - this.responseBuilder = Response.status(status); - } - - ResponseFactory(final NormalizedNode readData, final URI location) { - final Status status = prepareStatus(readData); - this.responseBuilder = Response.status(status); - this.responseBuilder.location(location); - } - - ResponseFactory() { - this.responseBuilder = Response.status(Status.OK); - } - - @Override - public Response build() { - if (getFailureStatus()) { - responseBuilder = responseBuilder.status(Response.Status.INTERNAL_SERVER_ERROR); - } - return this.responseBuilder.build(); - } - - private static Status prepareStatus(final NormalizedNode readData) { - return readData != null ? Status.OK : Status.CREATED; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfDataServiceConstant.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfDataServiceConstant.java deleted file mode 100644 index 7c2b1c198f..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfDataServiceConstant.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import java.net.URI; -import java.net.URISyntaxException; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; - -/** - * Constants for RestconfDataService. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfDataServiceConstant { - - public static final QName NETCONF_BASE_QNAME; - - static { - try { - NETCONF_BASE_QNAME = QName.create( - QNameModule.create(new URI(PutData.NETCONF_BASE), null), PutData.NETCONF_BASE_PAYLOAD_NAME); - } catch (final URISyntaxException e) { - final String errMsg = "It wasn't possible to create instance of URI class with " + PutData.NETCONF_BASE - + " URI"; - throw new RestconfDocumentedException(errMsg, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED); - } - } - - private RestconfDataServiceConstant() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Constants for read data. - * - */ - public final class ReadData { - // URI parameters - public static final String CONTENT = "content"; - public static final String DEPTH = "depth"; - public static final String FIELDS = "fields"; - - // content values - public static final String CONFIG = "config"; - public static final String ALL = "all"; - public static final String NONCONFIG = "nonconfig"; - - // depth values - public static final String UNBOUNDED = "unbounded"; - public static final int MIN_DEPTH = 1; - public static final int MAX_DEPTH = 65535; - - public static final String READ_TYPE_TX = "READ"; - public static final String WITH_DEFAULTS = "with-defaults"; - - private ReadData() { - throw new UnsupportedOperationException("Util class."); - } - } - - /** - * Constants for data to put. - * - */ - public final class PutData { - public static final String NETCONF_BASE = "urn:ietf:params:xml:ns:netconf:base:1.0"; - public static final String NETCONF_BASE_PAYLOAD_NAME = "data"; - public static final String PUT_TX_TYPE = "PUT"; - - private PutData() { - throw new UnsupportedOperationException("Util class."); - } - } - - /** - * Constants for data to post. - * - */ - public final class PostData { - public static final String POST_TX_TYPE = "POST"; - - private PostData() { - throw new UnsupportedOperationException("Util class."); - } - } - - /** - * Constants for data to delete. - * - */ - public final class DeleteData { - public static final String DELETE_TX_TYPE = "DELETE"; - - private DeleteData() { - throw new UnsupportedOperationException("Util class."); - } - } - - /** - * Constants for data to yang patch. - * - */ - public final class PatchData { - public static final String PATCH_TX_TYPE = "Patch"; - - private PatchData() { - throw new UnsupportedOperationException("Util class."); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfInvokeOperationsUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfInvokeOperationsUtil.java deleted file mode 100644 index 25594a7782..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfInvokeOperationsUtil.java +++ /dev/null @@ -1,116 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Optional; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.concurrent.CancellationException; -import javax.ws.rs.core.Response.Status; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.handlers.RpcServiceHandler; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Util class for rpc. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RestconfInvokeOperationsUtil { - - private static final Logger LOG = LoggerFactory.getLogger(RestconfInvokeOperationsUtil.class); - - private RestconfInvokeOperationsUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Invoking rpc via mount point. - * - * @param mountPoint - * mount point - * @param data - * input data - * @param schemaPath - * schema path of data - * @return {@link CheckedFuture} - */ - public static DOMRpcResult invokeRpcViaMountPoint(final DOMMountPoint mountPoint, final NormalizedNode data, - final SchemaPath schemaPath) { - final Optional mountPointService = mountPoint.getService(DOMRpcService.class); - if (mountPointService.isPresent()) { - final CheckedFuture rpc = mountPointService.get().invokeRpc(schemaPath, - data); - return prepareResult(rpc); - } - final String errmsg = "RPC service is missing."; - LOG.debug(errmsg); - throw new RestconfDocumentedException(errmsg); - } - - /** - * Invoke rpc. - * - * @param data - * input data - * @param schemaPath - * schema path of data - * @param rpcServiceHandler - * rpc service handler to invoke rpc - * @return {@link CheckedFuture} - */ - public static DOMRpcResult invokeRpc(final NormalizedNode data, final SchemaPath schemaPath, - final RpcServiceHandler rpcServiceHandler) { - final DOMRpcService rpcService = rpcServiceHandler.get(); - if (rpcService == null) { - throw new RestconfDocumentedException(Status.SERVICE_UNAVAILABLE); - } - - final CheckedFuture rpc = rpcService.invokeRpc(schemaPath, data); - return prepareResult(rpc); - } - - /** - * Check the validity of the result. - * - * @param response - * response of rpc - * @return {@link DOMRpcResult} result - */ - public static DOMRpcResult checkResponse(final DOMRpcResult response) { - if (response == null) { - return null; - } - try { - if (response.getErrors().isEmpty()) { - return response; - } - LOG.debug("RpcError message", response.getErrors()); - throw new RestconfDocumentedException("RPCerror message ", null, response.getErrors()); - } catch (final CancellationException e) { - final String errMsg = "The operation was cancelled while executing."; - LOG.debug("Cancel RpcExecution: " + errMsg, e); - throw new RestconfDocumentedException(errMsg, ErrorType.RPC, ErrorTag.PARTIAL_OPERATION); - } - } - - private static DOMRpcResult prepareResult(final CheckedFuture rpc) { - final RpcResultFactory dataFactory = new RpcResultFactory(); - FutureCallbackTx.addCallback(rpc, RestconfDataServiceConstant.PostData.POST_TX_TYPE, dataFactory); - return dataFactory.build(); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfStreamsConstants.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfStreamsConstants.java deleted file mode 100644 index 10f4acdd6d..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RestconfStreamsConstants.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.collect.ImmutableSet; -import java.net.URI; -import java.text.ParseException; -import java.util.Date; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.AugmentationIdentifier; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Constants for streams. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfStreamsConstants { - - private static final Logger LOG = LoggerFactory.getLogger(RestconfStreamsConstants.class); - - public static final String SAL_REMOTE_NAMESPACE = "urn:opendaylight:params:xml:ns:yang:controller:md:sal:remote"; - - public static final String DATASTORE_PARAM_NAME = "datastore"; - - private static final URI NAMESPACE_EVENT_SUBSCRIPTION_AUGMENT = URI.create("urn:sal:restconf:event:subscription"); - - public static final QNameModule SAL_REMOTE_AUGMENT; - - static { - final Date eventSubscriptionAugRevision; - try { - eventSubscriptionAugRevision = SimpleDateFormatUtil.getRevisionFormat().parse("2014-07-08"); - } catch (final ParseException e) { - final String errMsg = "It wasn't possible to convert revision date of sal-remote-augment to date"; - LOG.debug(errMsg); - throw new RestconfDocumentedException(errMsg, ErrorType.APPLICATION, ErrorTag.OPERATION_FAILED); - } - SAL_REMOTE_AUGMENT = QNameModule.create(NAMESPACE_EVENT_SUBSCRIPTION_AUGMENT, eventSubscriptionAugRevision) - .intern(); - } - - public static final AugmentationIdentifier SAL_REMOTE_AUG_IDENTIFIER = new AugmentationIdentifier( - ImmutableSet.of(QName.create(SAL_REMOTE_AUGMENT, "scope"), QName.create(SAL_REMOTE_AUGMENT, "datastore"), - QName.create(SAL_REMOTE_AUGMENT, "notification-output-type"))); - - public static final DataChangeScope DEFAULT_SCOPE = DataChangeScope.BASE; - - public static final LogicalDatastoreType DEFAULT_DS = LogicalDatastoreType.CONFIGURATION; - - public static final String SCOPE_PARAM_NAME = "scope"; - - public static final char EQUAL = ParserBuilderConstants.Deserializer.EQUAL; - - public static final String DS_URI = RestconfConstants.SLASH + DATASTORE_PARAM_NAME + EQUAL; - - public static final String SCOPE_URI = RestconfConstants.SLASH + SCOPE_PARAM_NAME + EQUAL; - - public static final int NOTIFICATION_PORT = 8181; - - public static final String SCHEMA_SUBSCIBRE_URI = "ws"; - - public static final CharSequence DATA_SUBSCR = "data-change-event-subscription"; - public static final CharSequence CREATE_DATA_SUBSCR = "create-" + DATA_SUBSCR; - - public static final CharSequence NOTIFICATION_STREAM = "notification-stream"; - public static final CharSequence CREATE_NOTIFICATION_STREAM = "create-" + NOTIFICATION_STREAM; - - public static final String STREAMS_PATH = "ietf-restconf-monitoring:restconf-state/streams"; - public static final String STREAM_PATH_PART = "/stream="; - public static final String STREAM_PATH = STREAMS_PATH + STREAM_PATH_PART; - public static final String STREAM_ACCESS_PATH_PART = "/access="; - public static final String STREAM_LOCATION_PATH_PART = "/location"; - - private RestconfStreamsConstants() { - throw new UnsupportedOperationException("Util class."); - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RpcResultFactory.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RpcResultFactory.java deleted file mode 100644 index 59ed477837..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/RpcResultFactory.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import org.apache.commons.lang3.builder.Builder; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; - -/** - * Rpc result factory. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class RpcResultFactory extends FutureDataFactory implements Builder { - - @Override - public DOMRpcResult build() { - return this.result; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/SubscribeToStreamUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/SubscribeToStreamUtil.java deleted file mode 100644 index 50c4e33149..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/SubscribeToStreamUtil.java +++ /dev/null @@ -1,404 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Preconditions; -import com.google.common.base.Strings; -import java.net.URI; -import java.time.Instant; -import java.time.format.DateTimeFormatter; -import java.time.format.DateTimeFormatterBuilder; -import java.time.format.DateTimeParseException; -import java.time.temporal.ChronoField; -import java.time.temporal.TemporalAccessor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import javax.ws.rs.core.UriBuilder; -import javax.ws.rs.core.UriInfo; -import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataChangeListener; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener; -import org.opendaylight.netconf.sal.streams.listeners.ListenerAdapter; -import org.opendaylight.netconf.sal.streams.listeners.NotificationListenerAdapter; -import org.opendaylight.netconf.sal.streams.listeners.Notificator; -import org.opendaylight.netconf.sal.streams.websockets.WebSocketServer; -import org.opendaylight.restconf.Rfc8040.MonitoringModule; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.handlers.NotificationServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.parser.IdentifierCodec; -import org.opendaylight.restconf.restful.services.impl.RestconfStreamsSubscriptionServiceImpl.HandlersHolder; -import org.opendaylight.restconf.restful.services.impl.RestconfStreamsSubscriptionServiceImpl.NotificationQueryParams; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.mapping.RestconfMappingNodeUtil; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.DateAndTime; -import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; -import org.opendaylight.yangtools.concepts.ListenerRegistration; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Subscribe to stream util class. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class SubscribeToStreamUtil { - - private static final Logger LOG = LoggerFactory.getLogger(SubscribeToStreamUtil.class); - private static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder() - .appendValue(ChronoField.YEAR, 4).appendLiteral('-') - .appendValue(ChronoField.MONTH_OF_YEAR, 2).appendLiteral('-') - .appendValue(ChronoField.DAY_OF_MONTH, 2).appendLiteral('T') - .appendValue(ChronoField.HOUR_OF_DAY, 2).appendLiteral(':') - .appendValue(ChronoField.MINUTE_OF_HOUR, 2).appendLiteral(':') - .appendValue(ChronoField.SECOND_OF_MINUTE, 2) - .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true) - .appendOffset("+HH:MM", "Z").toFormatter(); - - private SubscribeToStreamUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Register listeners by streamName in identifier to listen to yang - * notifications, put or delete info about listener to DS according to - * ietf-restconf-monitoring. - * - * @param identifier - * identifier as stream name - * @param uriInfo - * for getting base URI information - * @param notificationQueryParams - * query parameters of notification - * @param handlersHolder - * holder of handlers for notifications - * @return location for listening - */ - @SuppressWarnings("rawtypes") - public static URI notifYangStream(final String identifier, final UriInfo uriInfo, - final NotificationQueryParams notificationQueryParams, final HandlersHolder handlersHolder) { - final String streamName = Notificator.createStreamNameFromUri(identifier); - if (Strings.isNullOrEmpty(streamName)) { - throw new RestconfDocumentedException("Stream name is empty.", ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - List listeners = Notificator.getNotificationListenerFor(streamName); - if (identifier.contains(RestconfConstants.SLASH + NotificationOutputType.JSON.getName())) { - listeners = pickSpecificListenerByOutput(listeners, NotificationOutputType.JSON.getName()); - } else { - listeners = pickSpecificListenerByOutput(listeners, NotificationOutputType.XML.getName()); - } - if ((listeners == null) || listeners.isEmpty()) { - throw new RestconfDocumentedException("Stream was not found.", ErrorType.PROTOCOL, - ErrorTag.UNKNOWN_ELEMENT); - } - - final DOMDataReadWriteTransaction wTx = - handlersHolder.getTransactionChainHandler().get().newReadWriteTransaction(); - final SchemaContext schemaContext = handlersHolder.getSchemaHandler().get(); - final boolean exist = checkExist(schemaContext, wTx); - - final URI uri = prepareUriByStreamName(uriInfo, streamName); - for (final NotificationListenerAdapter listener : listeners) { - registerToListenNotification(listener, handlersHolder.getNotificationServiceHandler()); - listener.setQueryParams(notificationQueryParams.getStart(), notificationQueryParams.getStop(), - notificationQueryParams.getFilter(), false); - listener.setCloseVars(handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler()); - final NormalizedNode mapToStreams = RestconfMappingNodeUtil - .mapYangNotificationStreamByIetfRestconfMonitoring(listener.getSchemaPath().getLastComponent(), - schemaContext.getNotifications(), notificationQueryParams.getStart(), - listener.getOutputType(), uri, getMonitoringModule(schemaContext), exist); - writeDataToDS(schemaContext, listener.getSchemaPath().getLastComponent().getLocalName(), wTx, exist, - mapToStreams); - } - submitData(wTx); - - return uri; - } - - static List - pickSpecificListenerByOutput(final List listeners, final String outputType) { - for (final NotificationListenerAdapter notificationListenerAdapter : listeners) { - if (notificationListenerAdapter.getOutputType().equals(outputType)) { - final List list = new ArrayList<>(); - list.add(notificationListenerAdapter); - return list; - } - } - return listeners; - } - - /** - * Prepare InstanceIdentifierContext for Location leaf. - * - * @param schemaHandler - * schemaContext handler - * @return InstanceIdentifier of Location leaf - */ - public static InstanceIdentifierContext prepareIIDSubsStreamOutput(final SchemaContextHandler schemaHandler) { - final QName qnameBase = QName.create("subscribe:to:notification", "2016-10-28", "notifi"); - final DataSchemaNode location = ((ContainerSchemaNode) schemaHandler.get() - .findModuleByNamespaceAndRevision(qnameBase.getNamespace(), qnameBase.getRevision()) - .getDataChildByName(qnameBase)).getDataChildByName(QName.create(qnameBase, "location")); - final List path = new ArrayList<>(); - path.add(NodeIdentifier.create(qnameBase)); - path.add(NodeIdentifier.create(QName.create(qnameBase, "location"))); - - return new InstanceIdentifierContext(YangInstanceIdentifier.create(path), location, null, - schemaHandler.get()); - } - - /** - * Register listener by streamName in identifier to listen to data change - * notifications, put or delete info about listener to DS according to - * ietf-restconf-monitoring. - * - * @param identifier - * identifier as stream name - * @param uriInfo - * for getting base URI information - * @param notificationQueryParams - * query parameters of notification - * @param handlersHolder - * holder of handlers for notifications - * @return location for listening - */ - @SuppressWarnings("rawtypes") - public static URI notifiDataStream(final String identifier, final UriInfo uriInfo, - final NotificationQueryParams notificationQueryParams, final HandlersHolder handlersHolder) { - final Map mapOfValues = SubscribeToStreamUtil.mapValuesFromUri(identifier); - - final LogicalDatastoreType ds = SubscribeToStreamUtil.parseURIEnum(LogicalDatastoreType.class, - mapOfValues.get(RestconfStreamsConstants.DATASTORE_PARAM_NAME)); - if (ds == null) { - final String msg = "Stream name doesn't contains datastore value (pattern /datastore=)"; - LOG.debug(msg); - throw new RestconfDocumentedException(msg, ErrorType.APPLICATION, ErrorTag.MISSING_ATTRIBUTE); - } - - final DataChangeScope scope = SubscribeToStreamUtil.parseURIEnum(DataChangeScope.class, - mapOfValues.get(RestconfStreamsConstants.SCOPE_PARAM_NAME)); - if (scope == null) { - final String msg = "Stream name doesn't contains datastore value (pattern /scope=)"; - LOG.warn(msg); - throw new RestconfDocumentedException(msg, ErrorType.APPLICATION, ErrorTag.MISSING_ATTRIBUTE); - } - - final String streamName = Notificator.createStreamNameFromUri(identifier); - - final ListenerAdapter listener = Notificator.getListenerFor(streamName); - Preconditions.checkNotNull(listener, "Listener doesn't exist : " + streamName); - - listener.setQueryParams(notificationQueryParams.getStart(), notificationQueryParams.getStop(), - notificationQueryParams.getFilter(), false); - listener.setCloseVars(handlersHolder.getTransactionChainHandler(), handlersHolder.getSchemaHandler()); - - registration(ds, scope, listener, handlersHolder.getDomDataBrokerHandler().get()); - - final URI uri = prepareUriByStreamName(uriInfo, streamName); - - final DOMDataReadWriteTransaction wTx = - handlersHolder.getTransactionChainHandler().get().newReadWriteTransaction(); - final SchemaContext schemaContext = handlersHolder.getSchemaHandler().get(); - final boolean exist = checkExist(schemaContext, wTx); - - final NormalizedNode mapToStreams = RestconfMappingNodeUtil - .mapDataChangeNotificationStreamByIetfRestconfMonitoring(listener.getPath(), - notificationQueryParams.getStart(), listener.getOutputType(), uri, - getMonitoringModule(schemaContext), exist, schemaContext); - writeDataToDS(schemaContext, listener.getPath().getLastPathArgument().getNodeType().getLocalName(), wTx, exist, - mapToStreams); - submitData(wTx); - return uri; - } - - public static Module getMonitoringModule(final SchemaContext schemaContext) { - final Module monitoringModule = - schemaContext.findModuleByNamespaceAndRevision(MonitoringModule.URI_MODULE, MonitoringModule.DATE); - return monitoringModule; - } - - /** - * Parse input of query parameters - start-time or stop-time - from - * {@link DateAndTime} format to {@link Instant} format. - * - * @param entry - * start-time or stop-time as string in {@link DateAndTime} - * format - * @return parsed {@link Instant} by entry - */ - public static Instant parseDateFromQueryParam(final Entry> entry) { - final DateAndTime event = new DateAndTime(entry.getValue().iterator().next()); - final String value = event.getValue(); - final TemporalAccessor p; - try { - p = FORMATTER.parse(value); - } catch (final DateTimeParseException e) { - throw new RestconfDocumentedException("Cannot parse of value in date: " + value, e); - } - return Instant.from(p); - - } - - @SuppressWarnings("rawtypes") - static void writeDataToDS(final SchemaContext schemaContext, - final String name, final DOMDataReadWriteTransaction readWriteTransaction, - final boolean exist, final NormalizedNode mapToStreams) { - String pathId = ""; - if (exist) { - pathId = MonitoringModule.PATH_TO_STREAM_WITHOUT_KEY + name; - } else { - pathId = MonitoringModule.PATH_TO_STREAMS; - } - readWriteTransaction.merge(LogicalDatastoreType.OPERATIONAL, IdentifierCodec.deserialize(pathId, schemaContext), - mapToStreams); - } - - static void submitData(final DOMDataReadWriteTransaction readWriteTransaction) { - try { - readWriteTransaction.submit().checkedGet(); - } catch (final TransactionCommitFailedException e) { - throw new RestconfDocumentedException("Problem while putting data to DS.", e); - } - } - - /** - * Prepare map of values from URI. - * - * @param identifier - * URI - * @return {@link Map} - */ - public static Map mapValuesFromUri(final String identifier) { - final HashMap result = new HashMap<>(); - for (final String token : RestconfConstants.SLASH_SPLITTER.split(identifier)) { - final String[] paramToken = token.split(String.valueOf(RestconfStreamsConstants.EQUAL)); - if (paramToken.length == 2) { - result.put(paramToken[0], paramToken[1]); - } - } - return result; - } - - static URI prepareUriByStreamName(final UriInfo uriInfo, final String streamName) { - final int port = SubscribeToStreamUtil.prepareNotificationPort(); - - final UriBuilder uriBuilder = uriInfo.getAbsolutePathBuilder(); - final UriBuilder uriToWebSocketServer = - uriBuilder.port(port).scheme(RestconfStreamsConstants.SCHEMA_SUBSCIBRE_URI); - final URI uri = uriToWebSocketServer.replacePath(streamName).build(); - return uri; - } - - /** - * Register data change listener in dom data broker and set it to listener - * on stream. - * - * @param ds - * {@link LogicalDatastoreType} - * @param scope - * {@link DataChangeScope} - * @param listener - * listener on specific stream - * @param domDataBroker - * data broker for register data change listener - */ - @SuppressWarnings("deprecation") - private static void registration(final LogicalDatastoreType ds, final DataChangeScope scope, - final ListenerAdapter listener, final DOMDataBroker domDataBroker) { - if (listener.isListening()) { - return; - } - - final YangInstanceIdentifier path = listener.getPath(); - final ListenerRegistration registration = - domDataBroker.registerDataChangeListener(ds, path, listener, scope); - - listener.setRegistration(registration); - } - - /** - * Get port from web socket server. If doesn't exit, create it. - * - * @return port - */ - private static int prepareNotificationPort() { - int port = RestconfStreamsConstants.NOTIFICATION_PORT; - try { - final WebSocketServer webSocketServer = WebSocketServer.getInstance(); - port = webSocketServer.getPort(); - } catch (final NullPointerException e) { - WebSocketServer.createInstance(RestconfStreamsConstants.NOTIFICATION_PORT); - } - return port; - } - - static boolean checkExist(final SchemaContext schemaContext, - final DOMDataReadWriteTransaction readWriteTransaction) { - boolean exist; - try { - exist = readWriteTransaction.exists(LogicalDatastoreType.OPERATIONAL, - IdentifierCodec.deserialize(MonitoringModule.PATH_TO_STREAMS, schemaContext)).checkedGet(); - } catch (final ReadFailedException e1) { - throw new RestconfDocumentedException("Problem while checking data if exists", e1); - } - return exist; - } - - private static void registerToListenNotification(final NotificationListenerAdapter listener, - final NotificationServiceHandler notificationServiceHandler) { - if (listener.isListening()) { - return; - } - - final SchemaPath path = listener.getSchemaPath(); - final ListenerRegistration registration = - notificationServiceHandler.get().registerNotificationListener(listener, path); - - listener.setRegistration(registration); - } - - /** - * Parse enum from URI. - * - * @param clazz - * enum type - * @param value - * string of enum value - * @return enum - */ - private static T parseURIEnum(final Class clazz, final String value) { - if ((value == null) || value.equals("")) { - return null; - } - return ResolveEnumUtil.resolveEnum(clazz, value); - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/TransactionUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/TransactionUtil.java deleted file mode 100644 index e67a5d5b56..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/restful/utils/TransactionUtil.java +++ /dev/null @@ -1,147 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.restful.utils; - -import com.google.common.base.Preconditions; -import com.google.common.util.concurrent.CheckedFuture; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.restconf.RestConnectorProvider; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Util class for common methods of transactions. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class TransactionUtil { - - private static final Logger LOG = LoggerFactory.getLogger(TransactionUtil.class); - - private TransactionUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Merged parents of data. - * - * @param path - * path of data - * @param schemaContext - * {@link SchemaContext} - * @param writeTx - * write transaction - */ - public static void ensureParentsByMerge(final YangInstanceIdentifier path, final SchemaContext schemaContext, - final DOMDataWriteTransaction writeTx) { - final List normalizedPathWithoutChildArgs = new ArrayList<>(); - YangInstanceIdentifier rootNormalizedPath = null; - - final Iterator it = path.getPathArguments().iterator(); - - while (it.hasNext()) { - final PathArgument pathArgument = it.next(); - if (rootNormalizedPath == null) { - rootNormalizedPath = YangInstanceIdentifier.create(pathArgument); - } - - if (it.hasNext()) { - normalizedPathWithoutChildArgs.add(pathArgument); - } - } - - if (normalizedPathWithoutChildArgs.isEmpty()) { - return; - } - - Preconditions.checkArgument(rootNormalizedPath != null, "Empty path received"); - - final NormalizedNode parentStructure = ImmutableNodes.fromInstanceId(schemaContext, - YangInstanceIdentifier.create(normalizedPathWithoutChildArgs)); - writeTx.merge(LogicalDatastoreType.CONFIGURATION, rootNormalizedPath, parentStructure); - } - - /** - * Check if items already exists at specified {@code path}. Throws {@link RestconfDocumentedException} if - * data does NOT already exists. - * @param transactionChain Transaction chain - * @param rwTransaction Transaction - * @param store Datastore - * @param path Path to be checked - * @param operationType Type of operation (READ, POST, PUT, DELETE...) - */ - public static void checkItemExists(final DOMTransactionChain transactionChain, - final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType store, final YangInstanceIdentifier path, - final String operationType) { - final CheckedFuture future = rwTransaction.exists(store, path); - final FutureDataFactory response = new FutureDataFactory<>(); - - FutureCallbackTx.addCallback(future, operationType, response); - - if (!response.result) { - // close transaction and reset transaction chain - rwTransaction.cancel(); - RestConnectorProvider.resetTransactionChainForAdapaters(transactionChain); - - // throw error - final String errMsg = "Operation via Restconf was not executed because data does not exist"; - LOG.trace("{}:{}", errMsg, path); - throw new RestconfDocumentedException( - "Data does not exist", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING, path); - } - } - - /** - * Check if items do NOT already exists at specified {@code path}. Throws {@link RestconfDocumentedException} if - * data already exists. - * @param transactionChain Transaction chain - * @param rwTransaction Transaction - * @param store Datastore - * @param path Path to be checked - * @param operationType Type of operation (READ, POST, PUT, DELETE...) - */ - public static void checkItemDoesNotExists(final DOMTransactionChain transactionChain, - final DOMDataReadWriteTransaction rwTransaction, - final LogicalDatastoreType store, final YangInstanceIdentifier path, - final String operationType) { - final CheckedFuture future = rwTransaction.exists(store, path); - final FutureDataFactory response = new FutureDataFactory<>(); - - FutureCallbackTx.addCallback(future, operationType, response); - - if (response.result) { - // close transaction and reset transaction chain - rwTransaction.cancel(); - RestConnectorProvider.resetTransactionChainForAdapaters(transactionChain); - - // throw error - final String errMsg = "Operation via Restconf was not executed because data already exists"; - LOG.trace("{}:{}", errMsg, path); - throw new RestconfDocumentedException( - "Data already exists", ErrorType.PROTOCOL, ErrorTag.DATA_EXISTS, path); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/RestconfConstants.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/RestconfConstants.java deleted file mode 100644 index 2a8b414fdc..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/RestconfConstants.java +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils; - -import com.google.common.base.Splitter; - -/** - * Util class for Restconf constants. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfConstants { - - public static final String XML = "+xml"; - public static final String JSON = "+json"; - public static final String MOUNT = "yang-ext:mount"; - public static final String IDENTIFIER = "identifier"; - public static final char SLASH = '/'; - public static final Splitter SLASH_SPLITTER = Splitter.on(SLASH); - public static final String DRAFT_PATTERN = "restconf/18"; - - private RestconfConstants() { - throw new UnsupportedOperationException("Util class"); - } -} \ No newline at end of file diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeConstants.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeConstants.java deleted file mode 100644 index 3a48ed3977..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeConstants.java +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.mapping; - -/** - * Util class for constants of mapping node. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfMappingNodeConstants { - - public static final String NAME = "name"; - public static final String REVISION = "revision"; - public static final String NAMESPACE = "namespace"; - public static final String FEATURE = "feature"; - public static final String DESCRIPTION = "description"; - public static final String REPLAY_SUPPORT = "replay-support"; - public static final String REPLAY_LOG = "replay-log-creation-time"; - public static final String EVENTS = "events"; - - private RestconfMappingNodeConstants() { - throw new UnsupportedOperationException("Util class."); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeUtil.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeUtil.java deleted file mode 100644 index 6673dae1dc..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingNodeUtil.java +++ /dev/null @@ -1,623 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.mapping; - -import com.google.common.base.Optional; -import java.net.URI; -import java.time.Instant; -import java.time.OffsetDateTime; -import java.time.ZoneId; -import java.time.format.DateTimeFormatter; -import java.util.Collection; -import java.util.Set; -import org.opendaylight.restconf.Rfc8040.IetfYangLibrary; -import org.opendaylight.restconf.Rfc8040.MonitoringModule; -import org.opendaylight.restconf.Rfc8040.MonitoringModule.QueryParams; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.utils.parser.ParserIdentifier; -import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.library.rev160621.module.list.Module.ConformanceType; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.LeafSetEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.api.schema.OrderedMapNode; -import org.opendaylight.yangtools.yang.data.impl.schema.Builders; -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.model.api.ContainerSchemaNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Deviation; -import org.opendaylight.yangtools.yang.model.api.FeatureDefinition; -import org.opendaylight.yangtools.yang.model.api.GroupingDefinition; -import org.opendaylight.yangtools.yang.model.api.LeafListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.LeafSchemaNode; -import org.opendaylight.yangtools.yang.model.api.ListSchemaNode; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.NotificationDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; - -/** - * Util class for mapping nodes. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfMappingNodeUtil { - - private RestconfMappingNodeUtil() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Map data from modules to {@link NormalizedNode}. - * - * @param modules - * modules for mapping - * @param ietfYangLibraryModule - * ietf-yang-library module - * @param context - * schema context - * @param moduleSetId - * module-set-id of actual set - * @return mapped data as {@link NormalizedNode} - */ - public static NormalizedNode>> - mapModulesByIetfYangLibraryYang(final Set modules, final Module ietfYangLibraryModule, - final SchemaContext context, final String moduleSetId) { - final DataSchemaNode modulesStateSch = - ietfYangLibraryModule.getDataChildByName(IetfYangLibrary.MODUELS_STATE_CONT_QNAME); - final DataContainerNodeAttrBuilder modulesStateBuilder = - Builders.containerBuilder((ContainerSchemaNode) modulesStateSch); - - final DataSchemaNode moduleSetIdSch = - ((ContainerSchemaNode) modulesStateSch).getDataChildByName(IetfYangLibrary.MODULE_SET_ID_LEAF_QNAME); - modulesStateBuilder - .withChild(Builders.leafBuilder((LeafSchemaNode) moduleSetIdSch).withValue(moduleSetId).build()); - - final DataSchemaNode moduleSch = findNodeInGroupings(IetfYangLibrary.MODULE_QNAME_LIST, ietfYangLibraryModule); - final CollectionNodeBuilder mapBuilder = - Builders.orderedMapBuilder((ListSchemaNode) moduleSch); - for (final Module module : context.getModules()) { - fillMapByModules(mapBuilder, moduleSch, false, module, ietfYangLibraryModule, context); - } - return modulesStateBuilder.withChild(mapBuilder.build()).build(); - } - - /** - * Map data by the specific module or submodule. - * - * @param mapBuilder - * ordered list builder for children - * @param moduleSch - * schema of list for entryMapBuilder - * @param isSubmodule - * true if module is specified as submodule, false otherwise - * @param module - * specific module or submodule - * @param ietfYangLibraryModule - * ietf-yang-library module - * @param context - * schema context - */ - private static void fillMapByModules(final CollectionNodeBuilder mapBuilder, - final DataSchemaNode moduleSch, final boolean isSubmodule, final Module module, - final Module ietfYangLibraryModule, final SchemaContext context) { - final DataContainerNodeAttrBuilder mapEntryBuilder = - Builders.mapEntryBuilder((ListSchemaNode) moduleSch); - addCommonLeafs(module, mapEntryBuilder, ietfYangLibraryModule); - addChildOfModuleBySpecificModuleInternal( - IetfYangLibrary.SPECIFIC_MODULE_SCHEMA_LEAF_QNAME, mapEntryBuilder, IetfYangLibrary.BASE_URI_OF_SCHEMA - + module.getName() + "/" + module.getQNameModule().getFormattedRevision(), - ietfYangLibraryModule); - if (!isSubmodule) { - addChildOfModuleBySpecificModuleOfListChild(IetfYangLibrary.SPECIFIC_MODULE_NAMESPACE_LEAF_QNAME, - mapEntryBuilder, module.getNamespace().toString(), ietfYangLibraryModule); - - // features - not mandatory - if ((module.getFeatures() != null) && !module.getFeatures().isEmpty()) { - addFeatureLeafList(IetfYangLibrary.SPECIFIC_MODULE_FEATURE_LEAF_LIST_QNAME, mapEntryBuilder, - module.getFeatures(), ietfYangLibraryModule); - } - // deviations - not mandatory - if ((module.getDeviations() != null) && !module.getDeviations().isEmpty()) { - addDeviationList(module, mapEntryBuilder, ietfYangLibraryModule, context); - addChildOfModuleBySpecificModuleOfListChild(IetfYangLibrary.SPECIFIC_MODULE_CONFORMANCE_LEAF_QNAME, - mapEntryBuilder, ConformanceType.Implement.getName(), ietfYangLibraryModule); - } else { - addChildOfModuleBySpecificModuleOfListChild(IetfYangLibrary.SPECIFIC_MODULE_CONFORMANCE_LEAF_QNAME, - mapEntryBuilder, ConformanceType.Import.getName(), ietfYangLibraryModule); - } - // submodules - not mandatory - if ((module.getSubmodules() != null) && !module.getSubmodules().isEmpty()) { - addSubmodules(module, mapEntryBuilder, ietfYangLibraryModule, context); - } - } - mapBuilder.withChild(mapEntryBuilder.build()); - } - - /** - * Mapping submodules of specific module. - * - * @param module - * module with submodules - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param ietfYangLibraryModule - * ietf-yang-library module - * @param context - * schema context - */ - private static void addSubmodules(final Module module, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Module ietfYangLibraryModule, final SchemaContext context) { - final DataSchemaNode listSubm = findSchemaInListOfModulesSchema( - IetfYangLibrary.SPECIFIC_MODULE_SUBMODULE_LIST_QNAME, ietfYangLibraryModule); - final CollectionNodeBuilder mapBuilder = - Builders.orderedMapBuilder((ListSchemaNode) listSubm); - for (final Module submodule : module.getSubmodules()) { - fillMapByModules(mapBuilder, listSubm, true, submodule, ietfYangLibraryModule, context); - } - mapEntryBuilder.withChild(mapBuilder.build()); - } - - /** - * Mapping deviations of specific module. - * - * @param module - * module with deviations - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param ietfYangLibraryModule - * ietf-yang-library module - * @param context - * schema context - */ - private static void addDeviationList(final Module module, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Module ietfYangLibraryModule, final SchemaContext context) { - final DataSchemaNode deviationsSchema = findSchemaInListOfModulesSchema( - IetfYangLibrary.SPECIFIC_MODULE_DEVIATION_LIST_QNAME, ietfYangLibraryModule); - final CollectionNodeBuilder deviations = - Builders.mapBuilder((ListSchemaNode) deviationsSchema); - for (final Deviation deviation : module.getDeviations()) { - final DataContainerNodeAttrBuilder deviationEntryNode = - Builders.mapEntryBuilder((ListSchemaNode) deviationsSchema); - final QName lastComponent = deviation.getTargetPath().getLastComponent(); - addChildOfModuleBySpecificModule(IetfYangLibrary.SPECIFIC_MODULE_NAME_LEAF_QNAME, deviationEntryNode, - context.findModuleByNamespaceAndRevision(lastComponent.getNamespace(), lastComponent.getRevision()) - .getName(), - ietfYangLibraryModule); - addChildOfModuleBySpecificModule(IetfYangLibrary.SPECIFIC_MODULE_REVISION_LEAF_QNAME, deviationEntryNode, - lastComponent.getRevision(), ietfYangLibraryModule); - deviations.withChild(deviationEntryNode.build()); - } - mapEntryBuilder.withChild(deviations.build()); - } - - /** - * Mapping features of specific module. - * - * @param qnameOfFeaturesLeafList - * qname of feature leaf-list in ietf-yang-library module - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param features - * features of specific module - * @param ietfYangLibraryModule - * ieat-yang-library module - */ - private static void addFeatureLeafList(final QName qnameOfFeaturesLeafList, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Set features, final Module ietfYangLibraryModule) { - final DataSchemaNode schemaNode = - findSchemaInListOfModulesSchema(qnameOfFeaturesLeafList, ietfYangLibraryModule); - final ListNodeBuilder> leafSetBuilder = - Builders.leafSetBuilder((LeafListSchemaNode) schemaNode); - for (final FeatureDefinition feature : features) { - leafSetBuilder.withChild(Builders.leafSetEntryBuilder((LeafListSchemaNode) schemaNode) - .withValue(feature.getQName().getLocalName()).build()); - } - mapEntryBuilder.withChild(leafSetBuilder.build()); - } - - /** - * Mapping common leafs (grouping common-leafs in ietf-yang-library) of - * specific module. - * - * @param module - * specific module for getting name and revision - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param ietfYangLibraryModule - * ietf-yang-library module - */ - private static void addCommonLeafs(final Module module, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Module ietfYangLibraryModule) { - addChildOfModuleBySpecificModuleInternal(IetfYangLibrary.SPECIFIC_MODULE_NAME_LEAF_QNAME, mapEntryBuilder, - module.getName(), ietfYangLibraryModule); - addChildOfModuleBySpecificModuleInternal(IetfYangLibrary.SPECIFIC_MODULE_REVISION_LEAF_QNAME, mapEntryBuilder, - module.getQNameModule().getFormattedRevision(), ietfYangLibraryModule); - } - - /** - * Mapping data child of grouping module-list by ietf-yang-library. - * - * @param specificQName - * qname of leaf in module-list grouping - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param value - * value of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - */ - private static void addChildOfModuleBySpecificModuleOfListChild(final QName specificQName, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Object value, final Module ietfYangLibraryModule) { - final DataSchemaNode leafSch = findSchemaInListOfModulesSchema(specificQName, ietfYangLibraryModule); - mapEntryBuilder.withChild(Builders.leafBuilder((LeafSchemaNode) leafSch).withValue(value).build()); - } - - /** - * Find specific schema in gourping module-lsit. - * - * @param specificQName - * qname of schema - * @param ietfYangLibraryModule - * ietf-yang-library module - * @return schemaNode of specific child - */ - private static DataSchemaNode findSchemaInListOfModulesSchema(final QName specificQName, - final Module ietfYangLibraryModule) { - for (final GroupingDefinition groupingDefinition : ietfYangLibraryModule.getGroupings()) { - if (groupingDefinition.getQName().equals(IetfYangLibrary.GROUPING_MODULE_LIST_QNAME)) { - final DataSchemaNode dataChildByName = - groupingDefinition.getDataChildByName(IetfYangLibrary.MODULE_QNAME_LIST); - return ((ListSchemaNode) dataChildByName).getDataChildByName(specificQName); - } - } - throw new RestconfDocumentedException(specificQName.getLocalName() + " doesn't exist."); - } - - /** - * Mapping data child of internal groupings in module-list grouping. - * - * @param specifiLeafQName - * qnmae of leaf for mapping - * @param mapEntryBuilder - * mapEntryBuilder of parent for mapping children - * @param value - * value of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - */ - private static void addChildOfModuleBySpecificModuleInternal(final QName specifiLeafQName, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Object value, final Module ietfYangLibraryModule) { - final DataSchemaNode nameLeaf = findNodeInInternGroupings(specifiLeafQName, ietfYangLibraryModule); - mapEntryBuilder.withChild(Builders.leafBuilder((LeafSchemaNode) nameLeaf).withValue(value).build()); - } - - /** - * Find schema node of leaf by qname in internal groupings of module-list. - * grouping - * - * @param qnameOfSchema - * qname of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - * @return schema node of specific leaf - */ - private static DataSchemaNode findNodeInInternGroupings(final QName qnameOfSchema, - final Module ietfYangLibraryModule) { - for (final GroupingDefinition groupingDefinition : ietfYangLibraryModule.getGroupings()) { - if (groupingDefinition.getQName().equals(IetfYangLibrary.GROUPING_MODULE_LIST_QNAME)) { - for (final GroupingDefinition internalGrouping : groupingDefinition.getGroupings()) { - if (internalGrouping.getDataChildByName(qnameOfSchema) != null) { - return internalGrouping.getDataChildByName(qnameOfSchema); - } - } - } - } - throw new RestconfDocumentedException(qnameOfSchema.getLocalName() + " doesn't exist."); - } - - /** - * Mapping childrens of list-module. - * - * @param specifiLeafQName - * qname of leaf - * @param mapEntryBuilder - * maptEntryBuilder of parent for mapping children - * @param value - * valeu of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - */ - private static void addChildOfModuleBySpecificModule(final QName specifiLeafQName, - final DataContainerNodeAttrBuilder mapEntryBuilder, - final Object value, final Module ietfYangLibraryModule) { - final DataSchemaNode nameLeaf = findNodeInGroupings(specifiLeafQName, ietfYangLibraryModule); - mapEntryBuilder.withChild(Builders.leafBuilder((LeafSchemaNode) nameLeaf).withValue(value).build()); - } - - /** - * Find schema of specific leaf in list-module grouping. - * - * @param qnameOfSchema - * qname of leaf - * @param ietfYangLibraryModule - * ietf-yang-library module - * @return schemaNode of specific leaf - */ - private static DataSchemaNode findNodeInGroupings(final QName qnameOfSchema, final Module ietfYangLibraryModule) { - for (final GroupingDefinition groupingDefinition : ietfYangLibraryModule.getGroupings()) { - if (groupingDefinition.getDataChildByName(qnameOfSchema) != null) { - return groupingDefinition.getDataChildByName(qnameOfSchema); - } - } - throw new RestconfDocumentedException(qnameOfSchema.getLocalName() + " doesn't exist."); - } - - /** - * Map capabilites by ietf-restconf-monitoring. - * - * @param monitoringModule - * ietf-restconf-monitoring module - * @return mapped capabilites - */ - public static NormalizedNode>> - mapCapabilites(final Module monitoringModule) { - final DataSchemaNode restconfState = - monitoringModule.getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME); - final DataContainerNodeAttrBuilder restStateContBuilder = - Builders.containerBuilder((ContainerSchemaNode) restconfState); - final DataSchemaNode capabilitesContSchema = - getChildOfCont((ContainerSchemaNode) restconfState, MonitoringModule.CONT_CAPABILITES_QNAME); - final DataContainerNodeAttrBuilder capabilitesContBuilder = - Builders.containerBuilder((ContainerSchemaNode) capabilitesContSchema); - final DataSchemaNode leafListCapa = getChildOfCont((ContainerSchemaNode) capabilitesContSchema, - MonitoringModule.LEAF_LIST_CAPABILITY_QNAME); - final ListNodeBuilder> leafListCapaBuilder = - Builders.orderedLeafSetBuilder((LeafListSchemaNode) leafListCapa); - fillLeafListCapa(leafListCapaBuilder, (LeafListSchemaNode) leafListCapa); - - return restStateContBuilder.withChild(capabilitesContBuilder.withChild(leafListCapaBuilder.build()).build()) - .build(); - } - - /** - * Map data to leaf-list. - * - * @param builder - * builder of parent for children - * @param leafListSchema - * leaf list schema - */ - @SuppressWarnings({ "unchecked", "rawtypes" }) - private static void fillLeafListCapa(final ListNodeBuilder builder, final LeafListSchemaNode leafListSchema) { - builder.withChild(leafListEntryBuild(leafListSchema, QueryParams.DEPTH)); - builder.withChild(leafListEntryBuild(leafListSchema, QueryParams.FIELDS)); - builder.withChild(leafListEntryBuild(leafListSchema, QueryParams.FILTER)); - builder.withChild(leafListEntryBuild(leafListSchema, QueryParams.REPLAY)); - builder.withChild(leafListEntryBuild(leafListSchema, QueryParams.WITH_DEFAULTS)); - } - - /** - * Map value to leaf list entry node. - * - * @param leafListSchema - * leaf list schema of leaf list entry - * @param value - * value of leaf entry - * @return entry node - */ - @SuppressWarnings("rawtypes") - private static LeafSetEntryNode leafListEntryBuild(final LeafListSchemaNode leafListSchema, final String value) { - return Builders.leafSetEntryBuilder(leafListSchema).withValue(value).build(); - } - - /** - * Find specific schema node by qname in parent {@link ContainerSchemaNode}. - * - * @param parent - * schemaNode - * @param childQName - * specific qname of child - * @return schema node of child by qname - */ - private static DataSchemaNode getChildOfCont(final ContainerSchemaNode parent, final QName childQName) { - for (final DataSchemaNode child : parent.getChildNodes()) { - if (child.getQName().equals(childQName)) { - return child; - } - } - throw new RestconfDocumentedException( - childQName.getLocalName() + " doesn't exist in container " + MonitoringModule.CONT_RESTCONF_STATE_NAME); - } - - /** - * Map data of yang notification to normalized node according to - * ietf-restconf-monitoring. - * - * @param notifiQName - * qname of notification from listener - * @param notifications - * list of notifications for find schema of notification by - * notifiQName - * @param start - * start-time query parameter of notification - * @param outputType - * output type of notification - * @param uri - * location of registered listener for sending data of - * notification - * @param monitoringModule - * ietf-restconf-monitoring module - * @param existParent - * true if data of parent - - * ietf-restconf-monitoring:restconf-state/streams - exist in DS - * @return mapped data of notification - map entry node if parent exists, - * container streams with list and map entry node if not - */ - @SuppressWarnings("rawtypes") - public static NormalizedNode mapYangNotificationStreamByIetfRestconfMonitoring(final QName notifiQName, - final Set notifications, final Instant start, final String outputType, - final URI uri, final Module monitoringModule, final boolean existParent) { - for (final NotificationDefinition notificationDefinition : notifications) { - if (notificationDefinition.getQName().equals(notifiQName)) { - final DataSchemaNode streamListSchema = ((ContainerSchemaNode) ((ContainerSchemaNode) monitoringModule - .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME)) - .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME)) - .getDataChildByName(MonitoringModule.LIST_STREAM_QNAME); - final DataContainerNodeAttrBuilder streamEntry = - Builders.mapEntryBuilder((ListSchemaNode) streamListSchema); - - final ListSchemaNode listSchema = ((ListSchemaNode) streamListSchema); - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_NAME_STREAM_QNAME), - notificationDefinition.getQName().getLocalName()); - if ((notificationDefinition.getDescription() != null) - && !notificationDefinition.getDescription().equals("")) { - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_DESCR_STREAM_QNAME), - notificationDefinition.getDescription()); - } - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_REPLAY_SUPP_STREAM_QNAME), true); - if (start != null) { - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_START_TIME_STREAM_QNAME), - DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(OffsetDateTime.ofInstant(start, - ZoneId.systemDefault()))); - } - prepareListAndFillEntryBuilder(streamEntry, - (ListSchemaNode) listSchema.getDataChildByName(MonitoringModule.LIST_ACCESS_STREAM_QNAME), - outputType, uri); - - if (!existParent) { - final DataSchemaNode contStreamsSchema = ((ContainerSchemaNode) monitoringModule - .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME)) - .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME); - return Builders.containerBuilder((ContainerSchemaNode) contStreamsSchema).withChild(Builders - .mapBuilder((ListSchemaNode) streamListSchema).withChild(streamEntry.build()).build()) - .build(); - } - return streamEntry.build(); - } - } - - throw new RestconfDocumentedException(notifiQName + " doesn't exist in any modul"); - } - - private static void prepareListAndFillEntryBuilder( - final DataContainerNodeAttrBuilder streamEntry, - final ListSchemaNode listSchemaNode, final String outputType, final URI uriToWebsocketServer) { - final CollectionNodeBuilder accessListBuilder = Builders.mapBuilder(listSchemaNode); - final DataContainerNodeAttrBuilder entryAccessList = - Builders.mapEntryBuilder(listSchemaNode); - prepareLeafAndFillEntryBuilder(entryAccessList, - listSchemaNode.getDataChildByName(MonitoringModule.LEAF_ENCODING_ACCESS_QNAME), outputType); - prepareLeafAndFillEntryBuilder(entryAccessList, - listSchemaNode.getDataChildByName(MonitoringModule.LEAF_LOCATION_ACCESS_QNAME), - uriToWebsocketServer.toString()); - streamEntry.withChild(accessListBuilder.withChild(entryAccessList.build()).build()); - } - - /** - * Prepare leaf and fill entry builder. - * - * @param streamEntry Stream entry - * @param leafSchema Leaf schema - * @param value Value - */ - private static void prepareLeafAndFillEntryBuilder( - final DataContainerNodeAttrBuilder streamEntry, - final DataSchemaNode leafSchema, final Object value) { - streamEntry.withChild(Builders.leafBuilder((LeafSchemaNode) leafSchema).withValue(value).build()); - } - - /** - * Map data of data change notification to normalized node according to - * ietf-restconf-monitoring. - * - * @param path - * path of data to listen on - * @param start - * start-time query parameter of notification - * @param outputType - * output type of notification - * @param uri - * location of registered listener for sending data of - * notification - * @param monitoringModule - * ietf-restconf-monitoring module - * @param existParent - * true if data of parent - - * ietf-restconf-monitoring:restconf-state/streams - exist in DS - * @param schemaContext - * schemaContext for parsing instance identifier to get schema - * node of data - * @return mapped data of notification - map entry node if parent exists, - * container streams with list and map entry node if not - */ - @SuppressWarnings("rawtypes") - public static NormalizedNode mapDataChangeNotificationStreamByIetfRestconfMonitoring( - final YangInstanceIdentifier path, final Instant start, final String outputType, final URI uri, - final Module monitoringModule, final boolean existParent, final SchemaContext schemaContext) { - final SchemaNode schemaNode = ParserIdentifier - .toInstanceIdentifier(ParserIdentifier.stringFromYangInstanceIdentifier(path, schemaContext), - schemaContext, Optional.absent()) - .getSchemaNode(); - final DataSchemaNode streamListSchema = ((ContainerSchemaNode) ((ContainerSchemaNode) monitoringModule - .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME)) - .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME)) - .getDataChildByName(MonitoringModule.LIST_STREAM_QNAME); - final DataContainerNodeAttrBuilder streamEntry = - Builders.mapEntryBuilder((ListSchemaNode) streamListSchema); - - final ListSchemaNode listSchema = ((ListSchemaNode) streamListSchema); - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_NAME_STREAM_QNAME), - schemaNode.getQName().getLocalName()); - if ((schemaNode.getDescription() != null) && !schemaNode.getDescription().equals("")) { - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_DESCR_STREAM_QNAME), - schemaNode.getDescription()); - } - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_REPLAY_SUPP_STREAM_QNAME), true); - prepareLeafAndFillEntryBuilder(streamEntry, - listSchema.getDataChildByName(MonitoringModule.LEAF_START_TIME_STREAM_QNAME), - DateTimeFormatter.ISO_OFFSET_DATE_TIME.format(OffsetDateTime.ofInstant(start, ZoneId.systemDefault()))); - prepareListAndFillEntryBuilder(streamEntry, - (ListSchemaNode) listSchema.getDataChildByName(MonitoringModule.LIST_ACCESS_STREAM_QNAME), outputType, - uri); - - if (!existParent) { - final DataSchemaNode contStreamsSchema = ((ContainerSchemaNode) monitoringModule - .getDataChildByName(MonitoringModule.CONT_RESTCONF_STATE_QNAME)) - .getDataChildByName(MonitoringModule.CONT_STREAMS_QNAME); - return Builders - .containerBuilder((ContainerSchemaNode) contStreamsSchema).withChild(Builders - .mapBuilder((ListSchemaNode) streamListSchema).withChild(streamEntry.build()).build()) - .build(); - } - return streamEntry.build(); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingStreamConstants.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingStreamConstants.java deleted file mode 100644 index b1b4f1d5e0..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/mapping/RestconfMappingStreamConstants.java +++ /dev/null @@ -1,26 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.mapping; - -/** - * Util class for mapping entry stream. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfMappingStreamConstants { - - public static final String DESCRIPTION = "DESCRIPTION_PLACEHOLDER"; - public static final Boolean REPLAY_SUPPORT = Boolean.valueOf(true); - public static final String REPLAY_LOG = ""; - public static final String EVENTS = ""; - - private RestconfMappingStreamConstants() { - throw new UnsupportedOperationException("Util class"); - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserFieldsParameter.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserFieldsParameter.java deleted file mode 100644 index 2ba3f04561..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserFieldsParameter.java +++ /dev/null @@ -1,274 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ - -package org.opendaylight.restconf.utils.parser; - -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants.Deserializer; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.QNameModule; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; -import org.opendaylight.yangtools.yang.model.api.DataSchemaNode; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; - -/** - * Parameters parser. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public class ParserFieldsParameter { - private static final char COLON = ':'; - private static final char SEMICOLON = ';'; - private static final char SLASH = '/'; - private static final char STARTING_PARENTHESIS = '('; - private static final char CLOSING_PARENTHESIS = ')'; - - /** - * Parse fields parameter and return complete list of child nodes organized into levels. - * @param identifier identifier context created from request URI - * @param input input value of fields parameter - * @return {@link List} - */ - @Nonnull - public static List> parseFieldsParameter(@Nonnull final InstanceIdentifierContext identifier, - @Nonnull final String input) { - final List> parsed = new ArrayList<>(); - final SchemaContext context = identifier.getSchemaContext(); - final QNameModule startQNameModule = identifier.getSchemaNode().getQName().getModule(); - final DataSchemaContextNode startNode = DataSchemaContextNode.fromDataSchemaNode( - (DataSchemaNode) identifier.getSchemaNode()); - - if (startNode == null) { - throw new RestconfDocumentedException( - "Start node missing in " + input, ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - parseInput(input, startQNameModule, startNode, parsed, context); - return parsed; - } - - /** - * Parse input value of fields parameter and create list of sets. Each set represents one level of child nodes. - * @param input input value of fields parameter - * @param startQNameModule starting qname module - * @param startNode starting node - * @param parsed list of results - * @param context schema context - */ - private static void parseInput(@Nonnull final String input, - @Nonnull final QNameModule startQNameModule, - @Nonnull final DataSchemaContextNode startNode, - @Nonnull final List> parsed, - @Nonnull final SchemaContext context) { - int currentPosition = 0; - int startPosition = 0; - DataSchemaContextNode currentNode = startNode; - QNameModule currentQNameModule = startQNameModule; - - Set currentLevel = new HashSet<>(); - parsed.add(currentLevel); - - while (currentPosition < input.length()) { - final char currentChar = input.charAt(currentPosition); - - if (Deserializer.IDENTIFIER.matches(currentChar) || currentChar == '/') { - if (currentChar == SLASH) { - // add parsed identifier to results for current level - currentNode = addChildToResult( - currentNode, - input.substring(startPosition, currentPosition), currentQNameModule, currentLevel); - // go one level down - currentLevel = new HashSet<>(); - parsed.add(currentLevel); - - currentPosition++; - startPosition = currentPosition; - } else { - currentPosition++; - } - - continue; - } - - switch (currentChar) { - case COLON : - // new namespace and revision found - currentQNameModule = context.findModuleByName( - input.substring(startPosition, currentPosition), null).getQNameModule(); - currentPosition++; - break; - case STARTING_PARENTHESIS: - // add current child to parsed results for current level - final DataSchemaContextNode child = addChildToResult( - currentNode, - input.substring(startPosition, currentPosition), currentQNameModule, currentLevel); - // call with child node as new start node for one level down - final int closingParenthesis = currentPosition - + findClosingParenthesis(input.substring(currentPosition + 1)); - parseInput( - input.substring(currentPosition + 1, closingParenthesis), - currentQNameModule, - child, - parsed, - context); - - // closing parenthesis must be at the end of input or separator and one more character is expected - currentPosition = closingParenthesis + 1; - if (currentPosition != input.length()) { - if (currentPosition + 1 < input.length()) { - if (input.charAt(currentPosition) == SEMICOLON) { - currentPosition++; - } else { - throw new RestconfDocumentedException( - "Missing semicolon character after " - + child.getIdentifier().getNodeType().getLocalName() - + " child nodes", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - } else { - throw new RestconfDocumentedException( - "Unexpected character '" - + input.charAt(currentPosition) - + "' found in fields parameter value", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - } - - break; - case SEMICOLON: - // complete identifier found - addChildToResult( - currentNode, - input.substring(startPosition, currentPosition), currentQNameModule, currentLevel); - currentPosition++; - break; - default: - throw new RestconfDocumentedException( - "Unexpected character '" + currentChar + "' found in fields parameter value", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - startPosition = currentPosition; - } - - // parse input to end - if (startPosition < input.length()) { - addChildToResult(currentNode, input.substring(startPosition), currentQNameModule, currentLevel); - } - } - - /** - * Add parsed child of current node to result for current level. - * @param currentNode current node - * @param identifier parsed identifier of child node - * @param currentQNameModule current namespace and revision in {@link QNameModule} - * @param level current nodes level - * @return {@link DataSchemaContextNode} - */ - @Nonnull - private static DataSchemaContextNode addChildToResult( - @Nonnull final DataSchemaContextNode currentNode, - @Nonnull final String identifier, - @Nonnull final QNameModule currentQNameModule, - @Nonnull final Set level) { - final QName childQName = QName.create( - currentQNameModule.getNamespace().toString(), - identifier, - currentQNameModule.getRevision()); - - // resolve parent node - final DataSchemaContextNode parentNode = resolveMixinNode( - currentNode, level, currentNode.getIdentifier().getNodeType()); - if (parentNode == null) { - throw new RestconfDocumentedException( - "Not-mixin node missing in " + currentNode.getIdentifier().getNodeType().getLocalName(), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - // resolve child node - final DataSchemaContextNode childNode = resolveMixinNode( - parentNode.getChild(childQName), level, childQName); - if (childNode == null) { - throw new RestconfDocumentedException( - "Child " + identifier + " node missing in " - + currentNode.getIdentifier().getNodeType().getLocalName(), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - // add final childNode node to level nodes - level.add(childNode.getIdentifier().getNodeType()); - return childNode; - } - - /** - * Resolve mixin node by searching for inner nodes until not mixin node or null is found. - * All nodes expect of not mixin node are added to current level nodes. - * @param node initial mixin or not-mixin node - * @param level current nodes level - * @param qualifiedName qname of initial node - * @return {@link DataSchemaContextNode} - */ - @Nullable - private static DataSchemaContextNode resolveMixinNode(@Nullable final DataSchemaContextNode node, - @Nonnull final Set level, - @Nonnull final QName qualifiedName) { - DataSchemaContextNode currentNode = node; - while (currentNode != null && currentNode.isMixin()) { - level.add(qualifiedName); - currentNode = currentNode.getChild(qualifiedName); - } - - return currentNode; - } - - /** - * Find position of matching parenthesis increased by one, but at most equals to input size. - * @param input input where to find for closing parenthesis - * @return int position of closing parenthesis increased by one - */ - private static int findClosingParenthesis(@Nonnull final String input) { - int position = 0; - int count = 1; - - while (position < input.length()) { - final char currentChar = input.charAt(position); - - if (currentChar == STARTING_PARENTHESIS) { - count++; - } - - if (currentChar == CLOSING_PARENTHESIS) { - count--; - } - - if (count == 0) { - break; - } - - position++; - } - - // closing parenthesis was not found - if (position >= input.length()) { - throw new RestconfDocumentedException("Missing closing parenthesis in fields parameter", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - return ++position; - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java deleted file mode 100644 index 6d22412507..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/ParserIdentifier.java +++ /dev/null @@ -1,244 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.parser; - -import com.google.common.base.Optional; -import com.google.common.base.Splitter; -import com.google.common.collect.Iterables; -import java.text.ParseException; -import java.util.Date; -import java.util.Iterator; -import java.util.List; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; -import org.opendaylight.restconf.common.context.InstanceIdentifierContext; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.schema.SchemaExportContext; -import org.opendaylight.restconf.parser.IdentifierCodec; -import org.opendaylight.restconf.utils.RestconfConstants; -import org.opendaylight.restconf.utils.validation.RestconfValidation; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextNode; -import org.opendaylight.yangtools.yang.data.util.DataSchemaContextTree; -import org.opendaylight.yangtools.yang.model.api.Module; -import org.opendaylight.yangtools.yang.model.api.RpcDefinition; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaNode; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** - * Util class for parsing identifier. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class ParserIdentifier { - - private static final Logger LOG = LoggerFactory.getLogger(ParserIdentifier.class); - - private ParserIdentifier() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Make {@link InstanceIdentifierContext} from {@link String} identifier - *
- * For identifiers of data NOT behind mount points returned - * {@link InstanceIdentifierContext} is prepared with {@code null} reference of {@link DOMMountPoint} and with - * controller's {@link SchemaContext}. - *
- * For identifiers of data behind mount points returned - * {@link InstanceIdentifierContext} is prepared with reference of {@link DOMMountPoint} and its - * own {@link SchemaContext}. - * - * @param identifier - * - path identifier - * @param schemaContext - * - controller schema context - * @param mountPointService - * - mount point service - * @return {@link InstanceIdentifierContext} - */ - public static InstanceIdentifierContext toInstanceIdentifier( - final String identifier, - final SchemaContext schemaContext, - final Optional mountPointService) { - if (identifier != null && identifier.contains(RestconfConstants.MOUNT)) { - if (!mountPointService.isPresent()) { - throw new RestconfDocumentedException("Mount point service is not available"); - } - - final Iterator pathsIt = Splitter.on("/" + RestconfConstants.MOUNT).split(identifier).iterator(); - - final String mountPointId = pathsIt.next(); - final YangInstanceIdentifier mountYangInstanceIdentifier = IdentifierCodec.deserialize( - mountPointId, schemaContext); - final Optional mountPoint = - mountPointService.get().getMountPoint(mountYangInstanceIdentifier); - - if (!mountPoint.isPresent()) { - throw new RestconfDocumentedException( - "Mount point does not exist.", ErrorType.PROTOCOL, ErrorTag.DATA_MISSING); - } - - final DOMMountPoint domMountPoint = mountPoint.get(); - final SchemaContext mountSchemaContext = domMountPoint.getSchemaContext(); - - final String pathId = pathsIt.next().replaceFirst("/", ""); - final YangInstanceIdentifier pathYangInstanceIdentifier = IdentifierCodec.deserialize( - pathId, mountSchemaContext); - - final DataSchemaContextNode child = DataSchemaContextTree.from(mountSchemaContext) - .getChild(pathYangInstanceIdentifier); - if (child != null) { - return new InstanceIdentifierContext(pathYangInstanceIdentifier, child.getDataSchemaNode(), - domMountPoint, mountSchemaContext); - } - final QName rpcQName = pathYangInstanceIdentifier.getLastPathArgument().getNodeType(); - RpcDefinition def = null; - for (final RpcDefinition rpcDefinition : mountSchemaContext - .findModuleByNamespaceAndRevision(rpcQName.getNamespace(), rpcQName.getRevision()).getRpcs()) { - if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) { - def = rpcDefinition; - break; - } - } - return new InstanceIdentifierContext<>(pathYangInstanceIdentifier, def, domMountPoint, mountSchemaContext); - } else { - final YangInstanceIdentifier deserialize = IdentifierCodec.deserialize(identifier, schemaContext); - final DataSchemaContextNode child = DataSchemaContextTree.from(schemaContext).getChild(deserialize); - - if (child != null) { - return new InstanceIdentifierContext( - deserialize, child.getDataSchemaNode(), null, schemaContext); - } - final QName rpcQName = deserialize.getLastPathArgument().getNodeType(); - RpcDefinition def = null; - for (final RpcDefinition rpcDefinition - : schemaContext.findModuleByNamespaceAndRevision(rpcQName.getNamespace(), - rpcQName.getRevision()).getRpcs()) { - if (rpcDefinition.getQName().getLocalName().equals(rpcQName.getLocalName())) { - def = rpcDefinition; - break; - } - } - return new InstanceIdentifierContext<>(deserialize, def, null, schemaContext); - } - } - - /** - * Make {@link String} from {@link YangInstanceIdentifier}. - * - * @param instanceIdentifier Instance identifier - * @param schemaContext Schema context - * @return Yang instance identifier serialized to String - */ - public static String stringFromYangInstanceIdentifier(final YangInstanceIdentifier instanceIdentifier, - final SchemaContext schemaContext) { - return IdentifierCodec.serialize(instanceIdentifier, schemaContext); - } - - /** - * Make a {@link QName} from identifier. - * - * @param identifier - * path parameter - * @return {@link QName} - */ - public static QName makeQNameFromIdentifier(final String identifier) { - // check if more than one slash is not used as path separator - if (identifier.contains( - String.valueOf(RestconfConstants.SLASH).concat(String.valueOf(RestconfConstants.SLASH)))) { - LOG.debug("URI has bad format. It should be \'moduleName/yyyy-MM-dd\' " + identifier); - throw new RestconfDocumentedException( - "URI has bad format. End of URI should be in format \'moduleName/yyyy-MM-dd\'", ErrorType.PROTOCOL, - ErrorTag.INVALID_VALUE); - } - - final int mountIndex = identifier.indexOf(RestconfConstants.MOUNT); - final String moduleNameAndRevision; - if (mountIndex >= 0) { - moduleNameAndRevision = identifier.substring(mountIndex + RestconfConstants.MOUNT.length()) - .replaceFirst(String.valueOf(RestconfConstants.SLASH), ""); - } else { - moduleNameAndRevision = identifier; - } - - final List pathArgs = RestconfConstants.SLASH_SPLITTER.splitToList(moduleNameAndRevision); - if (pathArgs.size() != 2) { - LOG.debug("URI has bad format '{}'. It should be 'moduleName/yyyy-MM-dd'", identifier); - throw new RestconfDocumentedException( - "URI has bad format. End of URI should be in format \'moduleName/yyyy-MM-dd\'", ErrorType.PROTOCOL, - ErrorTag.INVALID_VALUE); - } - - final Date moduleRevision; - try { - moduleRevision = SimpleDateFormatUtil.getRevisionFormat().parse(pathArgs.get(1)); - } catch (final ParseException e) { - LOG.debug("URI has bad format: '{}'. It should be 'moduleName/yyyy-MM-dd'", identifier); - throw new RestconfDocumentedException("URI has bad format. It should be \'moduleName/yyyy-MM-dd\'", - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE); - } - - return QName.create(null, moduleRevision, pathArgs.get(0)); - } - - /** - * Parsing {@link Module} module by {@link String} module name and - * {@link Date} revision and from the parsed module create - * {@link SchemaExportContext}. - * - * @param schemaContext - * {@link SchemaContext} - * @param identifier - * path parameter - * @param domMountPointService - * {@link DOMMountPointService} - * @return {@link SchemaExportContext} - */ - public static SchemaExportContext toSchemaExportContextFromIdentifier(final SchemaContext schemaContext, - final String identifier, final DOMMountPointService domMountPointService) { - final Iterable pathComponents = RestconfConstants.SLASH_SPLITTER.split(identifier); - final Iterator componentIter = pathComponents.iterator(); - if (!Iterables.contains(pathComponents, RestconfConstants.MOUNT)) { - final String moduleName = RestconfValidation.validateAndGetModulName(componentIter); - final Date revision = RestconfValidation.validateAndGetRevision(componentIter); - final Module module = schemaContext.findModuleByName(moduleName, revision); - return new SchemaExportContext(schemaContext, module); - } else { - final StringBuilder pathBuilder = new StringBuilder(); - while (componentIter.hasNext()) { - final String current = componentIter.next(); - - if (RestconfConstants.MOUNT.equals(current)) { - pathBuilder.append("/"); - pathBuilder.append(RestconfConstants.MOUNT); - break; - } - - if (pathBuilder.length() != 0) { - pathBuilder.append("/"); - } - - pathBuilder.append(current); - } - final InstanceIdentifierContext point = ParserIdentifier - .toInstanceIdentifier(pathBuilder.toString(), schemaContext, Optional.of(domMountPointService)); - final String moduleName = RestconfValidation.validateAndGetModulName(componentIter); - final Date revision = RestconfValidation.validateAndGetRevision(componentIter); - final Module module = point.getMountPoint().getSchemaContext().findModuleByName(moduleName, revision); - return new SchemaExportContext(point.getMountPoint().getSchemaContext(), module); - } - } -} diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/builder/ParserBuilderConstants.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/builder/ParserBuilderConstants.java deleted file mode 100644 index 9faecc9532..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/parser/builder/ParserBuilderConstants.java +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.parser.builder; - -import com.google.common.base.CharMatcher; -import java.util.Arrays; -import org.opendaylight.restconf.parser.builder.YangInstanceIdentifierDeserializer; -import org.opendaylight.restconf.parser.builder.YangInstanceIdentifierSerializer; - -/** - * Util class of constants of {@link YangInstanceIdentifierSerializer} and - * {@link YangInstanceIdentifierDeserializer}. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class ParserBuilderConstants { - - private ParserBuilderConstants() { - throw new UnsupportedOperationException("Util class"); - } - - /** - * Constants for {@link YangInstanceIdentifierSerializer}. - * - */ - public static final class Serializer { - - private Serializer() { - throw new UnsupportedOperationException("Util class"); - } - - public static final String DISABLED_CHARS = Arrays.toString(new char[] { ':', '/', '?', '#', '[', ']', '@' }) - .concat(Arrays.toString(new char[] { '!', '$', '&', '\'', '(', ')', '*', '+', ',', ';', '=' })); - - public static final CharMatcher PERCENT_ENCODE_CHARS = CharMatcher.anyOf(DISABLED_CHARS).precomputed(); - } - - /** - * Constants for {@link YangInstanceIdentifierSerializer}. - * - */ - public static final class Deserializer { - - private Deserializer() { - throw new UnsupportedOperationException("Util class"); - } - - public static final CharMatcher BASE = CharMatcher.inRange('a', 'z').or(CharMatcher.inRange('A', 'Z')) - .precomputed(); - - public static final CharMatcher IDENTIFIER_FIRST_CHAR = BASE.or(CharMatcher.is('_')).precomputed(); - - public static final CharMatcher IDENTIFIER = IDENTIFIER_FIRST_CHAR.or(CharMatcher.inRange('0', '9')) - .or(CharMatcher.anyOf(".-")).precomputed(); - - public static final CharMatcher IDENTIFIER_HEXA = CharMatcher.inRange('a', 'f') - .or(CharMatcher.inRange('A', 'F')).or(CharMatcher.inRange('0', '9')).precomputed(); - - public static final char COLON = ':'; - public static final char EQUAL = '='; - public static final char COMMA = ','; - public static final char HYPHEN = '-'; - public static final char PERCENT_ENCODING = '%'; - - public static final CharMatcher IDENTIFIER_PREDICATE = CharMatcher.noneOf( - Serializer.DISABLED_CHARS).precomputed(); - - public static final String EMPTY_STRING = ""; - - // position of the first encoded char after percent sign in percent encoded string - public static final int FIRST_ENCODED_CHAR = 1; - // position of the last encoded char after percent sign in percent encoded string - public static final int LAST_ENCODED_CHAR = 3; - // percent encoded radix for parsing integers - public static final int PERCENT_ENCODED_RADIX = 16; - } -} \ No newline at end of file diff --git a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/validation/RestconfValidation.java b/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/validation/RestconfValidation.java deleted file mode 100644 index 0152873f0c..0000000000 --- a/restconf/restconf-nb-bierman02/src/main/java/org/opendaylight/restconf/utils/validation/RestconfValidation.java +++ /dev/null @@ -1,86 +0,0 @@ -/* - * Copyright (c) 2016 Cisco Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.restconf.utils.validation; - -import java.text.ParseException; -import java.util.Date; -import java.util.Iterator; -import org.opendaylight.restconf.common.errors.RestconfDocumentedException; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; -import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; -import org.opendaylight.restconf.common.validation.RestconfValidationUtils; -import org.opendaylight.restconf.utils.parser.builder.ParserBuilderConstants; -import org.opendaylight.yangtools.yang.common.SimpleDateFormatUtil; - -/** - * Util class for validations. - * - * @deprecated move to splitted module restconf-nb-rfc8040 - */ -@Deprecated -public final class RestconfValidation { - - private RestconfValidation() { - throw new UnsupportedOperationException("Util class."); - } - - /** - * Validation and parsing of revision. - * - * @param revisionDate - * iterator - * @return {@link Date} - */ - public static Date validateAndGetRevision(final Iterator revisionDate) { - RestconfValidationUtils.checkDocumentedError(revisionDate.hasNext(), ErrorType.PROTOCOL, - ErrorTag.INVALID_VALUE, "Revision date must be supplied."); - try { - return SimpleDateFormatUtil.getRevisionFormat().parse(revisionDate.next()); - } catch (final ParseException e) { - throw new RestconfDocumentedException("Supplied revision is not in expected date format YYYY-mm-dd", e); - } - } - - /** - * Validation of name. - * - * @param moduleName - * iterator - * @return {@link String} - */ - public static String validateAndGetModulName(final Iterator moduleName) { - RestconfValidationUtils.checkDocumentedError( - moduleName.hasNext(), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, - "Module name must be supplied." - ); - - final String name = moduleName.next(); - - RestconfValidationUtils.checkDocumentedError( - !name.isEmpty() && ParserBuilderConstants.Deserializer.IDENTIFIER_FIRST_CHAR.matches(name.charAt(0)), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, - "Identifier must start with character from set 'a-zA-Z_" - ); - - RestconfValidationUtils.checkDocumentedError( - !name.toUpperCase().startsWith("XML"), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, - "Identifier must NOT start with XML ignore case." - ); - - RestconfValidationUtils.checkDocumentedError( - ParserBuilderConstants.Deserializer.IDENTIFIER.matchesAllOf(name.substring(1)), - ErrorType.PROTOCOL, ErrorTag.INVALID_VALUE, - "Supplied name has not expected identifier format." - ); - - return name; - } - -} diff --git a/restconf/restconf-nb-bierman02/src/main/resources/WEB-INF/web.xml b/restconf/restconf-nb-bierman02/src/main/resources/WEB-INF/web.xml index c71898e415..c555bd2b0d 100644 --- a/restconf/restconf-nb-bierman02/src/main/resources/WEB-INF/web.xml +++ b/restconf/restconf-nb-bierman02/src/main/resources/WEB-INF/web.xml @@ -13,16 +13,6 @@ 0 - - Restconf - com.sun.jersey.spi.container.servlet.ServletContainer - - javax.ws.rs.Application - org.opendaylight.restconf.RestconfApplication - - 1 - - shiroEnvironmentClass org.opendaylight.aaa.shiro.web.env.KarafIniWebEnvironment @@ -58,11 +48,6 @@ /* - - Restconf - /18/* - - GzipFilter org.eclipse.jetty.servlets.GzipFilter diff --git a/restconf/restconf-nb-bierman02/src/main/resources/org/opendaylight/blueprint/restconf-config.xml b/restconf/restconf-nb-bierman02/src/main/resources/org/opendaylight/blueprint/restconf-config.xml index 268dfe2274..d3d249c6d4 100644 --- a/restconf/restconf-nb-bierman02/src/main/resources/org/opendaylight/blueprint/restconf-config.xml +++ b/restconf/restconf-nb-bierman02/src/main/resources/org/opendaylight/blueprint/restconf-config.xml @@ -57,20 +57,7 @@ - - - - - - - - - - - @@ -78,19 +65,4 @@ - - - - - - - - - - - diff --git a/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/BrokerFacadeTest.java b/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/BrokerFacadeTest.java index 86a1a11682..50f2195302 100644 --- a/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/BrokerFacadeTest.java +++ b/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/BrokerFacadeTest.java @@ -33,7 +33,6 @@ import org.junit.Before; import org.junit.Test; import org.mockito.InOrder; import org.mockito.Mock; -import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.opendaylight.controller.md.sal.common.api.data.AsyncDataBroker.DataChangeScope; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; @@ -63,8 +62,6 @@ import org.opendaylight.restconf.common.errors.RestconfError.ErrorTag; import org.opendaylight.restconf.common.errors.RestconfError.ErrorType; import org.opendaylight.restconf.common.patch.PatchContext; import org.opendaylight.restconf.common.patch.PatchStatusContext; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; import org.opendaylight.yang.gen.v1.urn.sal.restconf.event.subscription.rev140708.NotificationOutputTypeGrouping.NotificationOutputType; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.common.QName; @@ -117,7 +114,8 @@ public class BrokerFacadeTest { when(this.domDataBroker.newWriteOnlyTransaction()).thenReturn(this.writeTransaction); when(this.domDataBroker.newReadWriteTransaction()).thenReturn(this.rwTransaction); - ControllerContext.getInstance().setSchemas(TestUtils.loadSchemaContext("/full-versions/test-module")); + ControllerContext.getInstance() + .setSchemas(TestUtils.loadSchemaContext("/full-versions/test-module", "/modules")); } private static CheckedFuture>, ReadFailedException> wrapDummyNode( @@ -380,11 +378,6 @@ public class BrokerFacadeTest { final CheckedFuture checked = Futures.immediateCheckedFuture(null); when(wTx.submit()).thenReturn(checked); when(transactionChain.newWriteOnlyTransaction()).thenReturn(wTx); - final TransactionChainHandler transactionChainHandler = new TransactionChainHandler(transactionChain); - final SchemaContextHandler schemaHandler = Mockito.mock(SchemaContextHandler.class); - final SchemaContext schCtx = TestUtils.loadSchemaContext("/modules"); - when(schemaHandler.get()).thenReturn(schCtx); - listener.setCloseVars(transactionChainHandler, schemaHandler); // close and remove test notification listener listener.close(); Notificator.removeListenerIfNoSubscriberExists(listener); diff --git a/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/JSONRestconfServiceDraft18Test.java b/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/JSONRestconfServiceDraft18Test.java deleted file mode 100644 index de5d138a4a..0000000000 --- a/restconf/restconf-nb-bierman02/src/test/java/org/opendaylight/controller/sal/restconf/impl/test/JSONRestconfServiceDraft18Test.java +++ /dev/null @@ -1,539 +0,0 @@ -/* - * Copyright (c) 2015 Brocade Communications Systems, Inc. and others. All rights reserved. - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License v1.0 which accompanies this distribution, - * and is available at http://www.eclipse.org/legal/epl-v10.html - */ -package org.opendaylight.controller.sal.restconf.impl.test; - -import static org.hamcrest.CoreMatchers.containsString; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertThat; -import static org.junit.Assert.assertTrue; -import static org.mockito.Matchers.any; -import static org.mockito.Matchers.eq; -import static org.mockito.Matchers.isNull; -import static org.mockito.Matchers.notNull; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doReturn; -import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.verify; - -import com.google.common.base.Optional; -import com.google.common.io.Resources; -import com.google.common.util.concurrent.Futures; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.util.List; -import java.util.Map; -import org.junit.Before; -import org.junit.BeforeClass; -import org.junit.Test; -import org.mockito.ArgumentCaptor; -import org.mockito.Mock; -import org.mockito.MockitoAnnotations; -import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; -import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException; -import org.opendaylight.controller.md.sal.dom.api.DOMDataBroker; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadOnlyTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataReadWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMDataWriteTransaction; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPoint; -import org.opendaylight.controller.md.sal.dom.api.DOMMountPointService; -import org.opendaylight.controller.md.sal.dom.api.DOMNotificationService; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcException; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcImplementationNotAvailableException; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcResult; -import org.opendaylight.controller.md.sal.dom.api.DOMRpcService; -import org.opendaylight.controller.md.sal.dom.api.DOMTransactionChain; -import org.opendaylight.controller.md.sal.dom.spi.DefaultDOMRpcResult; -import org.opendaylight.netconf.sal.restconf.impl.ControllerContext; -import org.opendaylight.netconf.sal.restconf.impl.JSONRestconfServiceDraft18; -import org.opendaylight.restconf.common.wrapper.services.ServicesWrapperImpl; -import org.opendaylight.restconf.handlers.DOMDataBrokerHandler; -import org.opendaylight.restconf.handlers.DOMMountPointServiceHandler; -import org.opendaylight.restconf.handlers.NotificationServiceHandler; -import org.opendaylight.restconf.handlers.RpcServiceHandler; -import org.opendaylight.restconf.handlers.SchemaContextHandler; -import org.opendaylight.restconf.handlers.TransactionChainHandler; -import org.opendaylight.yangtools.yang.common.OperationFailedException; -import org.opendaylight.yangtools.yang.common.QName; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifier; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; -import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.PathArgument; -import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild; -import org.opendaylight.yangtools.yang.data.api.schema.DataContainerNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapEntryNode; -import org.opendaylight.yangtools.yang.data.api.schema.MapNode; -import org.opendaylight.yangtools.yang.data.api.schema.NormalizedNode; -import org.opendaylight.yangtools.yang.data.impl.schema.ImmutableNodes; -import org.opendaylight.yangtools.yang.data.impl.schema.builder.impl.ImmutableContainerNodeBuilder; -import org.opendaylight.yangtools.yang.model.api.SchemaContext; -import org.opendaylight.yangtools.yang.model.api.SchemaPath; -import org.opendaylight.yangtools.yang.parser.spi.meta.ReactorException; - -/** - * Unit tests for JSONRestconfServiceDraft18. - * - * @author Thomas Pantelis - */ -public class JSONRestconfServiceDraft18Test { - static final String IETF_INTERFACES_NS = "urn:ietf:params:xml:ns:yang:ietf-interfaces"; - static final String IETF_INTERFACES_VERSION = "2013-07-04"; - static final QName INTERFACES_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "interfaces"); - static final QName INTERFACE_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "interface"); - static final QName NAME_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "name"); - static final QName TYPE_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "type"); - static final QName ENABLED_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "enabled"); - static final QName DESC_QNAME = QName.create(IETF_INTERFACES_NS, IETF_INTERFACES_VERSION, "description"); - - static final String TEST_MODULE_NS = "test:module"; - static final String TEST_MODULE_VERSION = "2014-01-09"; - static final QName TEST_CONT_QNAME = QName.create(TEST_MODULE_NS, TEST_MODULE_VERSION, "cont"); - static final QName TEST_CONT1_QNAME = QName.create(TEST_MODULE_NS, TEST_MODULE_VERSION, "cont1"); - static final QName TEST_LF11_QNAME = QName.create(TEST_MODULE_NS, TEST_MODULE_VERSION, "lf11"); - static final QName TEST_LF12_QNAME = QName.create(TEST_MODULE_NS, TEST_MODULE_VERSION, "lf12"); - - static final String TOASTER_MODULE_NS = "http://netconfcentral.org/ns/toaster"; - static final String TOASTER_MODULE_VERSION = "2009-11-20"; - static final QName TOASTER_DONENESS_QNAME = - QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "toasterDoneness"); - static final QName TOASTER_TYPE_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "toasterToastType"); - static final QName WHEAT_BREAD_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "wheat-bread"); - static final QName MAKE_TOAST_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "make-toast"); - static final QName CANCEL_TOAST_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "cancel-toast"); - static final QName TEST_OUTPUT_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "testOutput"); - static final QName TEXT_OUT_QNAME = QName.create(TOASTER_MODULE_NS, TOASTER_MODULE_VERSION, "textOut"); - - private static SchemaContext schemaContext; - - @Mock - private DOMTransactionChain mockTxChain; - - @Mock - private DOMDataReadWriteTransaction mockReadWriteTx; - - @Mock - private DOMDataReadOnlyTransaction mockReadOnlyTx; - - @Mock - private DOMDataWriteTransaction mockWriteTx; - - @Mock - private DOMMountPointService mockMountPointService; - - @Mock - private SchemaContextHandler mockSchemaContextHandler; - - @Mock - private DOMDataBroker mockDOMDataBroker; - - @Mock - private DOMRpcService mockRpcService; - - private JSONRestconfServiceDraft18 service; - - @BeforeClass - public static void init() throws IOException, ReactorException { - schemaContext = TestUtils.loadSchemaContext("/full-versions/yangs"); - ControllerContext.getInstance().setSchemas(schemaContext); - } - - @Before - public void setup() throws Exception { - MockitoAnnotations.initMocks(this); - - doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadOnlyTx).read( - eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)); - - doNothing().when(mockWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class), - any(NormalizedNode.class)); - doNothing().when(mockWriteTx).merge(eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class), - any(NormalizedNode.class)); - doNothing().when(mockWriteTx).delete(eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)); - doReturn(Futures.immediateCheckedFuture(null)).when(mockWriteTx).submit(); - - doNothing().when(mockReadWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class), - any(NormalizedNode.class)); - doReturn(Futures.immediateCheckedFuture(null)).when(mockReadWriteTx).submit(); - doReturn(Futures.immediateCheckedFuture(Optional.absent())).when(mockReadWriteTx).read( - eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)); - doReturn(Futures.immediateCheckedFuture(Boolean.FALSE)).when(mockReadWriteTx).exists( - eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)); - - doReturn(mockReadOnlyTx).when(mockTxChain).newReadOnlyTransaction(); - doReturn(mockReadWriteTx).when(mockTxChain).newReadWriteTransaction(); - doReturn(mockWriteTx).when(mockTxChain).newWriteOnlyTransaction(); - - doReturn(mockTxChain).when(mockDOMDataBroker).createTransactionChain(any()); - - doReturn(schemaContext).when(mockSchemaContextHandler).get(); - - final TransactionChainHandler txChainHandler = new TransactionChainHandler(mockTxChain); - - final DOMMountPointServiceHandler mountPointServiceHandler = - new DOMMountPointServiceHandler(mockMountPointService); - - ServicesWrapperImpl.getInstance().setHandlers(mockSchemaContextHandler, mountPointServiceHandler, - txChainHandler, new DOMDataBrokerHandler(mockDOMDataBroker), - new RpcServiceHandler(mockRpcService), - new NotificationServiceHandler(mock(DOMNotificationService.class))); - - service = new JSONRestconfServiceDraft18(ServicesWrapperImpl.getInstance(), mountPointServiceHandler); - } - - private static String loadData(final String path) throws IOException { - return Resources.asCharSource(JSONRestconfServiceDraft18Test.class.getResource(path), - StandardCharsets.UTF_8).read(); - } - - @SuppressWarnings("rawtypes") - @Test - public void testPut() throws Exception { - final String uriPath = "ietf-interfaces:interfaces/interface=eth0"; - final String payload = loadData("/parts/ietf-interfaces_interfaces.json"); - - this.service.put(uriPath, payload); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - final ArgumentCaptor capturedNode = ArgumentCaptor.forClass(NormalizedNode.class); - - verify(mockReadWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), capturedPath.capture(), - capturedNode.capture()); - - verifyPath(capturedPath.getValue(), INTERFACES_QNAME, INTERFACE_QNAME, - new Object[]{INTERFACE_QNAME, NAME_QNAME, "eth0"}); - - assertTrue("Expected MapEntryNode. Actual " + capturedNode.getValue().getClass(), - capturedNode.getValue() instanceof MapEntryNode); - final MapEntryNode actualNode = (MapEntryNode) capturedNode.getValue(); - assertEquals("MapEntryNode node type", INTERFACE_QNAME, actualNode.getNodeType()); - verifyLeafNode(actualNode, NAME_QNAME, "eth0"); - verifyLeafNode(actualNode, TYPE_QNAME, "ethernetCsmacd"); - verifyLeafNode(actualNode, ENABLED_QNAME, Boolean.FALSE); - verifyLeafNode(actualNode, DESC_QNAME, "some interface"); - } - - @SuppressWarnings("rawtypes") - @Test - public void testPutBehindMountPoint() throws Exception { - setupTestMountPoint(); - - final String uriPath = "ietf-interfaces:interfaces/yang-ext:mount/test-module:cont/cont1"; - final String payload = loadData("/full-versions/testCont1Data.json"); - - this.service.put(uriPath, payload); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - final ArgumentCaptor capturedNode = ArgumentCaptor.forClass(NormalizedNode.class); - - verify(mockReadWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), capturedPath.capture(), - capturedNode.capture()); - - verifyPath(capturedPath.getValue(), TEST_CONT_QNAME, TEST_CONT1_QNAME); - - assertTrue("Expected ContainerNode", capturedNode.getValue() instanceof ContainerNode); - final ContainerNode actualNode = (ContainerNode) capturedNode.getValue(); - assertEquals("ContainerNode node type", TEST_CONT1_QNAME, actualNode.getNodeType()); - verifyLeafNode(actualNode, TEST_LF11_QNAME, "lf11 data"); - verifyLeafNode(actualNode, TEST_LF12_QNAME, "lf12 data"); - } - - @Test(expected = OperationFailedException.class) - @SuppressWarnings("checkstyle:IllegalThrows") - public void testPutFailure() throws Throwable { - doReturn(Futures.immediateFailedCheckedFuture(new TransactionCommitFailedException("mock"))) - .when(mockReadWriteTx).submit(); - - final String uriPath = "ietf-interfaces:interfaces/interface=eth0"; - final String payload = loadData("/parts/ietf-interfaces_interfaces.json"); - - this.service.put(uriPath, payload); - } - - @SuppressWarnings("rawtypes") - @Test - public void testPost() throws Exception { - final String uriPath = null; - final String payload = loadData("/parts/ietf-interfaces_interfaces_absolute_path.json"); - - this.service.post(uriPath, payload); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - final ArgumentCaptor capturedNode = ArgumentCaptor.forClass(NormalizedNode.class); - - verify(mockReadWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), capturedPath.capture(), - capturedNode.capture()); - - verifyPath(capturedPath.getValue(), INTERFACES_QNAME); - - assertTrue("Expected ContainerNode", capturedNode.getValue() instanceof ContainerNode); - final ContainerNode actualNode = (ContainerNode) capturedNode.getValue(); - assertEquals("ContainerNode node type", INTERFACES_QNAME, actualNode.getNodeType()); - - final Optional> mapChild = actualNode.getChild(new NodeIdentifier(INTERFACE_QNAME)); - assertEquals(INTERFACE_QNAME.toString() + " present", true, mapChild.isPresent()); - assertTrue("Expected MapNode. Actual " + mapChild.get().getClass(), mapChild.get() instanceof MapNode); - final MapNode mapNode = (MapNode)mapChild.get(); - - final NodeIdentifierWithPredicates entryNodeID = new NodeIdentifierWithPredicates( - INTERFACE_QNAME, NAME_QNAME, "eth0"); - final Optional entryChild = mapNode.getChild(entryNodeID); - assertEquals(entryNodeID.toString() + " present", true, entryChild.isPresent()); - final MapEntryNode entryNode = entryChild.get(); - verifyLeafNode(entryNode, NAME_QNAME, "eth0"); - verifyLeafNode(entryNode, TYPE_QNAME, "ethernetCsmacd"); - verifyLeafNode(entryNode, ENABLED_QNAME, Boolean.FALSE); - verifyLeafNode(entryNode, DESC_QNAME, "some interface"); - } - - @SuppressWarnings("rawtypes") - @Test - public void testPostBehindMountPoint() throws Exception { - setupTestMountPoint(); - - final String uriPath = "ietf-interfaces:interfaces/yang-ext:mount/test-module:cont"; - final String payload = loadData("/full-versions/testCont1Data.json"); - - this.service.post(uriPath, payload); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - final ArgumentCaptor capturedNode = ArgumentCaptor.forClass(NormalizedNode.class); - - verify(mockReadWriteTx).put(eq(LogicalDatastoreType.CONFIGURATION), capturedPath.capture(), - capturedNode.capture()); - - verifyPath(capturedPath.getValue(), TEST_CONT_QNAME, TEST_CONT1_QNAME); - - assertTrue("Expected ContainerNode", capturedNode.getValue() instanceof ContainerNode); - final ContainerNode actualNode = (ContainerNode) capturedNode.getValue(); - assertEquals("ContainerNode node type", TEST_CONT1_QNAME, actualNode.getNodeType()); - verifyLeafNode(actualNode, TEST_LF11_QNAME, "lf11 data"); - verifyLeafNode(actualNode, TEST_LF12_QNAME, "lf12 data"); - } - - @Test(expected = TransactionCommitFailedException.class) - @SuppressWarnings("checkstyle:IllegalThrows") - public void testPostFailure() throws Throwable { - doReturn(Futures.immediateFailedCheckedFuture(new TransactionCommitFailedException("mock"))) - .when(mockReadWriteTx).submit(); - - final String uriPath = null; - final String payload = loadData("/parts/ietf-interfaces_interfaces_absolute_path.json"); - - try { - this.service.post(uriPath, payload); - } catch (final OperationFailedException e) { - assertNotNull(e.getCause()); - throw e.getCause(); - } - } - - @Test - public void testDelete() throws Exception { - doReturn(Futures.immediateCheckedFuture(Boolean.TRUE)).when(mockReadWriteTx).exists( - eq(LogicalDatastoreType.CONFIGURATION), any(YangInstanceIdentifier.class)); - - final String uriPath = "ietf-interfaces:interfaces/interface=eth0"; - - this.service.delete(uriPath); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - - verify(mockReadWriteTx).delete(eq(LogicalDatastoreType.CONFIGURATION), capturedPath.capture()); - - verifyPath(capturedPath.getValue(), INTERFACES_QNAME, INTERFACE_QNAME, - new Object[]{INTERFACE_QNAME, NAME_QNAME, "eth0"}); - } - - @Test(expected = OperationFailedException.class) - public void testDeleteFailure() throws Exception { - final String invalidUriPath = "ietf-interfaces:interfaces/invalid"; - - this.service.delete(invalidUriPath); - } - - @Test - public void testGetConfig() throws Exception { - testGet(LogicalDatastoreType.CONFIGURATION); - } - - @Test - public void testGetOperational() throws Exception { - testGet(LogicalDatastoreType.OPERATIONAL); - } - - @Test - public void testGetWithNoData() throws OperationFailedException { - final String uriPath = "ietf-interfaces:interfaces"; - this.service.get(uriPath, LogicalDatastoreType.CONFIGURATION); - } - - @Test(expected = OperationFailedException.class) - public void testGetFailure() throws Exception { - final String invalidUriPath = "/ietf-interfaces:interfaces/invalid"; - this.service.get(invalidUriPath, LogicalDatastoreType.CONFIGURATION); - } - - @SuppressWarnings("rawtypes") - @Test - public void testInvokeRpcWithInput() throws Exception { - final SchemaPath path = SchemaPath.create(true, MAKE_TOAST_QNAME); - - final DOMRpcResult expResult = new DefaultDOMRpcResult((NormalizedNode)null); - doReturn(Futures.immediateCheckedFuture(expResult)).when(mockRpcService).invokeRpc(eq(path), - any(NormalizedNode.class)); - - final String uriPath = "toaster:make-toast"; - final String input = loadData("/full-versions/make-toast-rpc-input.json"); - - final Optional output = this.service.invokeRpc(uriPath, Optional.of(input)); - - assertEquals("Output present", false, output.isPresent()); - - final ArgumentCaptor capturedNode = ArgumentCaptor.forClass(NormalizedNode.class); - verify(mockRpcService).invokeRpc(eq(path), capturedNode.capture()); - - assertTrue("Expected ContainerNode. Actual " + capturedNode.getValue().getClass(), - capturedNode.getValue() instanceof ContainerNode); - final ContainerNode actualNode = (ContainerNode) capturedNode.getValue(); - verifyLeafNode(actualNode, TOASTER_DONENESS_QNAME, Long.valueOf(10)); - verifyLeafNode(actualNode, TOASTER_TYPE_QNAME, WHEAT_BREAD_QNAME); - } - - @Test - public void testInvokeRpcWithNoInput() throws Exception { - final SchemaPath path = SchemaPath.create(true, CANCEL_TOAST_QNAME); - - final DOMRpcResult expResult = new DefaultDOMRpcResult((NormalizedNode)null); - doReturn(Futures.immediateCheckedFuture(expResult)).when(mockRpcService).invokeRpc(eq(path), - any(NormalizedNode.class)); - - final String uriPath = "toaster:cancel-toast"; - - final Optional output = this.service.invokeRpc(uriPath, Optional.absent()); - - assertEquals("Output present", false, output.isPresent()); - - verify(mockRpcService).invokeRpc(eq(path), isNull(NormalizedNode.class)); - } - - @Test - public void testInvokeRpcWithOutput() throws Exception { - final SchemaPath path = SchemaPath.create(true, TEST_OUTPUT_QNAME); - - final NormalizedNode outputNode = ImmutableContainerNodeBuilder.create() - .withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(TEST_OUTPUT_QNAME)) - .withChild(ImmutableNodes.leafNode(TEXT_OUT_QNAME, "foo")).build(); - final DOMRpcResult expResult = new DefaultDOMRpcResult(outputNode); - doReturn(Futures.immediateCheckedFuture(expResult)).when(mockRpcService).invokeRpc(eq(path), - any(NormalizedNode.class)); - - final String uriPath = "toaster:testOutput"; - - final Optional output = this.service.invokeRpc(uriPath, Optional.absent()); - - assertEquals("Output present", true, output.isPresent()); - assertNotNull("Returned null response", output.get()); - assertThat("Missing \"textOut\"", output.get(), containsString("\"textOut\":\"foo\"")); - - verify(mockRpcService).invokeRpc(eq(path), isNull(NormalizedNode.class)); - } - - @Test(expected = OperationFailedException.class) - public void testInvokeRpcFailure() throws Exception { - final DOMRpcException exception = new DOMRpcImplementationNotAvailableException("testExeption"); - doReturn(Futures.immediateFailedCheckedFuture(exception)).when(mockRpcService).invokeRpc(any(SchemaPath.class), - any(NormalizedNode.class)); - - final String uriPath = "toaster:cancel-toast"; - - this.service.invokeRpc(uriPath, Optional.absent()); - } - - void testGet(final LogicalDatastoreType datastoreType) throws OperationFailedException { - final MapEntryNode entryNode = ImmutableNodes.mapEntryBuilder(INTERFACE_QNAME, NAME_QNAME, "eth0") - .withChild(ImmutableNodes.leafNode(NAME_QNAME, "eth0")) - .withChild(ImmutableNodes.leafNode(TYPE_QNAME, "ethernetCsmacd")) - .withChild(ImmutableNodes.leafNode(ENABLED_QNAME, Boolean.TRUE)) - .withChild(ImmutableNodes.leafNode(DESC_QNAME, "eth interface")) - .build(); - - doReturn(Futures.immediateCheckedFuture(Optional.of(entryNode))).when(mockReadOnlyTx).read( - eq(datastoreType), any(YangInstanceIdentifier.class)); - - final String uriPath = "ietf-interfaces:interfaces/interface=eth0"; - - final Optional optionalResp = this.service.get(uriPath, datastoreType); - assertEquals("Response present", true, optionalResp.isPresent()); - final String jsonResp = optionalResp.get(); - - assertNotNull("Returned null response", jsonResp); - assertThat("Missing \"name\"", jsonResp, containsString("\"name\":\"eth0\"")); - assertThat("Missing \"type\"", jsonResp, containsString("\"type\":\"ethernetCsmacd\"")); - assertThat("Missing \"enabled\"", jsonResp, containsString("\"enabled\":true")); - assertThat("Missing \"description\"", jsonResp, containsString("\"description\":\"eth interface\"")); - - final ArgumentCaptor capturedPath = - ArgumentCaptor.forClass(YangInstanceIdentifier.class); - verify(mockReadOnlyTx).read(eq(datastoreType), capturedPath.capture()); - - verifyPath(capturedPath.getValue(), INTERFACES_QNAME, INTERFACE_QNAME, - new Object[]{INTERFACE_QNAME, NAME_QNAME, "eth0"}); - } - - DOMMountPoint setupTestMountPoint() throws FileNotFoundException, ReactorException { - final SchemaContext schemaContextTestModule = TestUtils.loadSchemaContext("/full-versions/test-module"); - final DOMMountPoint mockMountPoint = mock(DOMMountPoint.class); - doReturn(schemaContextTestModule).when(mockMountPoint).getSchemaContext(); - - doReturn(Optional.of(mockDOMDataBroker)).when(mockMountPoint).getService(DOMDataBroker.class); - - doReturn(Optional.of(mockMountPoint)) - .when(mockMountPointService).getMountPoint(notNull(YangInstanceIdentifier.class)); - - return mockMountPoint; - } - - void verifyLeafNode(final DataContainerNode parent, final QName leafType, final Object leafValue) { - final Optional> leafChild = parent.getChild(new NodeIdentifier(leafType)); - assertEquals(leafType.toString() + " present", true, leafChild.isPresent()); - assertEquals(leafType.toString() + " value", leafValue, leafChild.get().getValue()); - } - - void verifyPath(final YangInstanceIdentifier path, final Object... expArgs) { - final List pathArgs = path.getPathArguments(); - assertEquals("Arg count for actual path " + path, expArgs.length, pathArgs.size()); - int index = 0; - for (final PathArgument actual: pathArgs) { - QName expNodeType; - if (expArgs[index] instanceof Object[]) { - final Object[] listEntry = (Object[]) expArgs[index]; - expNodeType = (QName) listEntry[0]; - - assertTrue(actual instanceof NodeIdentifierWithPredicates); - final Map keyValues = ((NodeIdentifierWithPredicates)actual).getKeyValues(); - assertEquals(String.format("Path arg %d keyValues size", index + 1), 1, keyValues.size()); - final QName expKey = (QName) listEntry[1]; - assertEquals(String.format("Path arg %d keyValue for %s", index + 1, expKey), listEntry[2], - keyValues.get(expKey)); - } else { - expNodeType = (QName) expArgs[index]; - } - - assertEquals(String.format("Path arg %d node type", index + 1), expNodeType, actual.getNodeType()); - index++; - } - - } -} diff --git a/restconf/restconf-nb-rfc8040/pom.xml b/restconf/restconf-nb-rfc8040/pom.xml index 8997a67410..ac80a47534 100644 --- a/restconf/restconf-nb-rfc8040/pom.xml +++ b/restconf/restconf-nb-rfc8040/pom.xml @@ -195,7 +195,7 @@ - + org.apache.felix maven-bundle-plugin true @@ -213,7 +213,7 @@ org.opendaylight.aaa.api, org.apache.shiro.web.env - /restconf/rfc + /rests diff --git a/restconf/restconf-nb-rfc8040/src/main/resources/WEB-INF/web.xml b/restconf/restconf-nb-rfc8040/src/main/resources/WEB-INF/web.xml index a17ef96d2c..058ccb890a 100644 --- a/restconf/restconf-nb-rfc8040/src/main/resources/WEB-INF/web.xml +++ b/restconf/restconf-nb-rfc8040/src/main/resources/WEB-INF/web.xml @@ -4,13 +4,13 @@ version="3.0"> - Restconf + Restconf-rfc8040 com.sun.jersey.spi.container.servlet.ServletContainer javax.ws.rs.Application org.opendaylight.restconf.nb.rfc8040.RestconfApplication - 1 + 0 @@ -43,7 +43,7 @@ - Restconf NB - RFC 8040 + Restconf-rfc8040 /* @@ -87,7 +87,7 @@ - NB RFC api + Restconf NB RFC api /* POST GET