X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=restconf%2Frestconf-nb-bierman02%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fnetconf%2Fsal%2Frest%2Fimpl%2FJsonToPatchBodyReader.java;h=852e3033492266baf46874f80fd351d5692b7df6;hb=f6d8bcc3ae8ff969f527c998f4ca480ff30a6556;hp=d902f3648b2f92105477a5333a9972b14773f507;hpb=f9a0c88a73fe4ba7577c1d072251b8f286bbdd62;p=netconf.git 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 d902f3648b..852e303349 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 @@ -17,9 +17,12 @@ import java.io.InputStreamReader; import java.io.StringReader; import java.lang.annotation.Annotation; import java.lang.reflect.Type; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.List; +import java.util.Locale; import java.util.Optional; +import java.util.concurrent.atomic.AtomicReference; import javax.annotation.Nonnull; import javax.ws.rs.Consumes; import javax.ws.rs.WebApplicationException; @@ -42,6 +45,7 @@ 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.JSONCodecFactorySupplier; 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; @@ -63,7 +67,10 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider implements MessageBodyReader { private static final Logger LOG = LoggerFactory.getLogger(JsonToPatchBodyReader.class); - private String patchId; + + public JsonToPatchBodyReader(ControllerContext controllerContext) { + super(controllerContext); + } @Override public boolean isReadable(final Class type, final Type genericType, @@ -76,7 +83,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider public PatchContext readFrom(final Class type, final Type genericType, final Annotation[] annotations, final MediaType mediaType, final MultivaluedMap httpHeaders, final InputStream entityStream) - throws IOException, WebApplicationException { + throws WebApplicationException { try { return readFrom(getInstanceIdentifierContext(), entityStream); } catch (final Exception e) { @@ -88,7 +95,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider public PatchContext readFrom(final String uriPath, final InputStream entityStream) throws RestconfDocumentedException { try { - return readFrom(ControllerContext.getInstance().toInstanceIdentifier(uriPath), entityStream); + return readFrom(getControllerContext().toInstanceIdentifier(uriPath), entityStream); } catch (final Exception e) { propagateExceptionAs(e); return null; // no-op @@ -102,11 +109,13 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider return new PatchContext(path, null, null); } - final JsonReader jsonReader = new JsonReader(new InputStreamReader(nonEmptyInputStreamOptional.get())); - final List resultList = read(jsonReader, path); + final JsonReader jsonReader = new JsonReader(new InputStreamReader(nonEmptyInputStreamOptional.get(), + StandardCharsets.UTF_8)); + AtomicReference patchId = new AtomicReference<>(); + final List resultList = read(jsonReader, path, patchId); jsonReader.close(); - return new PatchContext(path, resultList, this.patchId); + return new PatchContext(path, resultList, patchId.get()); } private static RuntimeException propagateExceptionAs(final Exception exception) throws RestconfDocumentedException { @@ -123,7 +132,8 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider ErrorTag.MALFORMED_MESSAGE, exception); } - private List read(final JsonReader in, final InstanceIdentifierContext path) throws IOException { + private List read(final JsonReader in, final InstanceIdentifierContext path, + final AtomicReference patchId) throws IOException { final List resultCollection = new ArrayList<>(); final StringModuleInstanceIdentifierCodec codec = new StringModuleInstanceIdentifierCodec( path.getSchemaContext()); @@ -150,7 +160,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider case END_DOCUMENT: break; case NAME: - parseByName(in.nextName(), edit, in, path, codec, resultCollection); + parseByName(in.nextName(), edit, in, path, codec, resultCollection, patchId); break; case END_OBJECT: in.endObject(); @@ -181,7 +191,8 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider 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 { + @Nonnull final List resultCollection, + @Nonnull final AtomicReference patchId) throws IOException { switch (name) { case "edit" : if (in.peek() == JsonToken.BEGIN_ARRAY) { @@ -202,7 +213,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider break; case "patch-id" : - this.patchId = in.nextString(); + patchId.set(in.nextString()); break; default: break; @@ -230,7 +241,7 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider edit.setId(in.nextString()); break; case "operation" : - edit.setOperation(PatchEditOperation.valueOf(in.nextString().toUpperCase())); + edit.setOperation(PatchEditOperation.valueOf(in.nextString().toUpperCase(Locale.ROOT))); break; case "target" : // target can be specified completely in request URI @@ -363,7 +374,9 @@ public class JsonToPatchBodyReader extends AbstractIdentifierAwareJaxRsProvider @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); + JsonParserStream.create(writer, + JSONCodecFactorySupplier.DRAFT_LHOTKA_NETMOD_YANG_JSON_02.getShared(path.getSchemaContext()), + targetSchemaNode).parse(in); return resultHolder.getResult(); }