From ad24cfd13495c9913da276ac905901bd1c829e07 Mon Sep 17 00:00:00 2001 From: Markus KARG Date: Sat, 6 Jul 2024 08:01:23 +0000 Subject: [PATCH] Entity Provider for java.nio.file.Path --- .../chapters/appendix/_change-log.adoc | 4 +- .../appendix/_changes-since-4.0-release.adoc | 14 +++ .../chapters/providers/_entity_providers.adoc | 4 +- .../ee/sse/sseeventsink/MBWCheckResource.java | 24 +++- .../filter/interceptor/JAXRSClientIT.java | 109 +++++++++++++++++- .../rs/spec/filter/interceptor/Resource.java | 18 ++- .../overridestandard/JAXRSClientIT.java | 22 +++- .../provider/overridestandard/Resource.java | 8 +- .../overridestandard/TSAppConfig.java | 1 + .../overridestandard/TckPathProvider.java | 77 +++++++++++++ .../spec/provider/standard/JAXRSClientIT.java | 4 +- .../rs/spec/provider/standard/Resource.java | 8 +- .../standardnotnull/JAXRSClientIT.java | 50 +++++++- .../provider/standardnotnull/Resource.java | 8 +- 14 files changed, 336 insertions(+), 15 deletions(-) create mode 100644 jaxrs-spec/src/main/asciidoc/chapters/appendix/_changes-since-4.0-release.adoc create mode 100644 jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TckPathProvider.java diff --git a/jaxrs-spec/src/main/asciidoc/chapters/appendix/_change-log.adoc b/jaxrs-spec/src/main/asciidoc/chapters/appendix/_change-log.adoc index 716a214b3..b411caed0 100644 --- a/jaxrs-spec/src/main/asciidoc/chapters/appendix/_change-log.adoc +++ b/jaxrs-spec/src/main/asciidoc/chapters/appendix/_change-log.adoc @@ -1,6 +1,6 @@ //// ******************************************************************* -* Copyright (c) 2019, 2024 Eclipse Foundation +* Copyright (c) 2019 Eclipse Foundation * * This specification document is made available under the terms * of the Eclipse Foundation Specification License v1.0, which is @@ -12,6 +12,8 @@ [[change-log]] == Change Log +include::_changes-since-4.0-release.adoc[] + include::_changes-since-3.1-release.adoc[] include::_changes-since-3.0-release.adoc[] diff --git a/jaxrs-spec/src/main/asciidoc/chapters/appendix/_changes-since-4.0-release.adoc b/jaxrs-spec/src/main/asciidoc/chapters/appendix/_changes-since-4.0-release.adoc new file mode 100644 index 000000000..ed3c003a9 --- /dev/null +++ b/jaxrs-spec/src/main/asciidoc/chapters/appendix/_changes-since-4.0-release.adoc @@ -0,0 +1,14 @@ +//// +******************************************************************* +* Copyright (c) 2024 Eclipse Foundation +* +* This specification document is made available under the terms +* of the Eclipse Foundation Specification License v1.0, which is +* available at https://www.eclipse.org/legal/efsl.php. +******************************************************************* +//// + +[[changes-since-4.0-release]] +=== Changes Since 4.0 Release + +* <>: Added entity provider for `java.nio.file.Path` diff --git a/jaxrs-spec/src/main/asciidoc/chapters/providers/_entity_providers.adoc b/jaxrs-spec/src/main/asciidoc/chapters/providers/_entity_providers.adoc index 989168aa6..7a8ca8190 100644 --- a/jaxrs-spec/src/main/asciidoc/chapters/providers/_entity_providers.adoc +++ b/jaxrs-spec/src/main/asciidoc/chapters/providers/_entity_providers.adoc @@ -1,6 +1,6 @@ //// ******************************************************************* -* Copyright (c) 2019, 2021 Eclipse Foundation +* Copyright (c) 2019 Eclipse Foundation * * This specification document is made available under the terms * of the Eclipse Foundation Specification License v1.0, which is @@ -138,6 +138,8 @@ type combinations: All media types (`\*/*`). `java.io.File`:: All media types (`\*/*`). +`java.nio.file.Path`:: + All media types (`\*/*`). `jakarta.activation.DataSource`:: All media types (`\*/*`). `javax.xml.transform.Source`:: diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/sse/sseeventsink/MBWCheckResource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/sse/sseeventsink/MBWCheckResource.java index 5eca3f8e7..4bf16bdf9 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/sse/sseeventsink/MBWCheckResource.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/jaxrs21/ee/sse/sseeventsink/MBWCheckResource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017, 2020 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2017 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -133,6 +133,28 @@ public void sendFile(@Context SseEventSink sink, @Context Sse sse) { } } + @GET + @Path("path") + @Produces(MediaType.SERVER_SENT_EVENTS) + public void sendPath(@Context SseEventSink sink, @Context Sse sse) { + java.nio.file.Path p; + try (SseEventSink s = sink) { + try { + p = Files.createTempFile("tck", "temppath"); + Files.write(p, MESSAGE.getBytes(), StandardOpenOption.CREATE, + StandardOpenOption.APPEND); + p.toFile().deleteOnExit(); + s.send(sse.newEventBuilder().data(p).mediaType(MediaType.WILDCARD_TYPE) + .build()); + } catch (IOException e) { + s.send(sse.newEvent(e.getMessage())); + throw new RuntimeException(e); // log to server log + } + } catch (IOException e) { + LOG.log(Level.WARNING, "Failed to close SseEventSink", e); + } + } + @GET @Path("inputstream") @Produces(MediaType.SERVER_SENT_EVENTS) diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/JAXRSClientIT.java index a258a9c8c..055ee2212 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/JAXRSClientIT.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -22,6 +22,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.InputStream; +import java.nio.file.Files; import javax.xml.namespace.QName; @@ -548,7 +549,7 @@ public void fileReaderContainerInterceptorTest() throws Fault { @Test @Tag("xml_binding") public void fileReaderNoInterceptorTest() throws Fault { - setProperty(Property.REQUEST, buildRequest(Request.POST, "postfile")); + setProperty(Property.REQUEST, buildRequest(Request.POST, "postpath")); setRequestContentEntity(content); setProperty(Property.SEARCH_STRING, content); invoke(); @@ -620,6 +621,110 @@ public void fileWriterClientInterceptorTest() throws Fault { logMsg("JAXRS called registered writer interceptor for file provider"); } + // ------------------------- Path ----------------------------------- + + /* + * @testName: pathReaderContainerInterceptorTest + * + * @assertion_ids: JAXRS:SPEC:84; + * + * @test_Strategy: JAX-RS implementations are REQUIRED to call registered + * interceptors when mapping representations to Java types and vice versa. + */ + @Test + @Tag("xml_binding") + public void pathReaderContainerInterceptorTest() throws Fault { + addInterceptors(EntityReaderInterceptor.class); + setProperty(Property.REQUEST, buildRequest(Request.POST, "postpath")); + setRequestContentEntity(content); + setProperty(Property.SEARCH_STRING, + EntityReaderInterceptor.class.getName()); + setProperty(Property.UNEXPECTED_RESPONSE_MATCH, Resource.DIRECTION); + invoke(); + logMsg("JAXRS called registered reader interceptor for path provider"); + } + + /* + * @testName: pathReaderNoInterceptorTest + * + * @assertion_ids: JAXRS:SPEC:84; + * + * @test_Strategy: JAX-RS implementations are REQUIRED to call registered + * interceptors when mapping representations to Java types and vice versa. + */ + @Test + @Tag("xml_binding") + public void pathReaderNoInterceptorTest() throws Fault { + setProperty(Property.REQUEST, buildRequest(Request.POST, "postpath")); + setRequestContentEntity(content); + setProperty(Property.SEARCH_STRING, content); + invoke(); + } + + /* + * @testName: pathWriterContainerInterceptorTest + * + * @assertion_ids: JAXRS:SPEC:84; + * + * @test_Strategy: JAX-RS implementations are REQUIRED to call registered + * interceptors when mapping representations to Java types and vice versa. + */ + @Test + @Tag("xml_binding") + public void pathWriterContainerInterceptorTest() throws Fault { + addInterceptors(EntityWriterInterceptor.class); + setProperty(Property.REQUEST, buildRequest(Request.GET, "getpath")); + setProperty(Property.SEARCH_STRING, + EntityWriterInterceptor.class.getName()); + setProperty(Property.SEARCH_STRING, Resource.DIRECTION); + invoke(); + logMsg("JAXRS called registered writer interceptor for path provider"); + } + + /* + * @testName: pathWriterNoInterceptorTest + * + * @assertion_ids: JAXRS:SPEC:84; + * + * @test_Strategy: JAX-RS implementations are REQUIRED to call registered + * interceptors when mapping representations to Java types and vice versa. + */ + @Test + @Tag("xml_binding") + public void pathWriterNoInterceptorTest() throws Fault { + setProperty(Property.REQUEST, buildRequest(Request.GET, "getpath")); + setProperty(Property.SEARCH_STRING, Resource.getName()); + invoke(); + } + + /* + * @testName: pathWriterClientInterceptorTest + * + * @assertion_ids: JAXRS:SPEC:84; + * + * @test_Strategy: JAX-RS implementations are REQUIRED to call registered + * interceptors when mapping representations to Java types and vice versa. + */ + @Test + @Tag("xml_binding") + public void pathWriterClientInterceptorTest() throws Fault { + try { + java.nio.file.Path path = Files.createTempFile("temp", "tmp"); + Files.writeString(path, content); + setRequestContentEntity(path); + } catch (IOException e) { + throw new Fault(e); + } + addProvider(EntityWriterInterceptor.class); + addInterceptors(EntityWriterInterceptor.class); + setProperty(Property.REQUEST, buildRequest(Request.POST, "poststring")); + setProperty(Property.SEARCH_STRING, + EntityWriterInterceptor.class.getName()); + setProperty(Property.UNEXPECTED_RESPONSE_MATCH, Resource.DIRECTION); + invoke(); + logMsg("JAXRS called registered writer interceptor for path provider"); + } + // ------------------------- DataSource ----------------------------------- /* diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/Resource.java index 55978227f..e65c9e2e7 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/Resource.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/filter/interceptor/Resource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2013 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -23,6 +23,7 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; +import java.nio.file.Files; import java.util.List; import javax.xml.namespace.QName; @@ -133,6 +134,21 @@ public Response postFile(File file) throws IOException { return buildResponse(text); } + @GET + @Path("getpath") + public Response getPath() throws IOException { + java.nio.file.Path path = Files.createTempFile("filter", "tmp"); + Files.writeString(path, getName()); + return buildResponse(path); + } + + @POST + @Path("postpath") + public Response postPath(java.nio.file.Path path) throws IOException { + String text = Files.readString(path); + return buildResponse(text); + } + @GET @Path("getdatasource") public Response getDataSource() { diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/JAXRSClientIT.java index 1dbd47b25..152742b36 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/JAXRSClientIT.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -82,7 +82,7 @@ void setPropertyAndInvokeEncoded(String resourceMethod) throws Fault { } String[] methodsAll = { "bytearray", "string", "inputstream", "reader", - "file", "datasource", "source", "jaxb", "streamingoutput" }; + "file", "path", "datasource", "source", "jaxb", "streamingoutput" }; @Deployment(testable = false) @@ -94,7 +94,7 @@ public static WebArchive createDeployment() throws IOException{ AbstractProvider.class, TckBooleanProvider.class, TckByteArrayProvider.class, TckCharacterProvider.class, TckDataSourceProvider.class, TckDataSourceProvider.class, - TckFileProvider.class, TckInputStreamProvider.class, + TckFileProvider.class, TckPathProvider.class, TckInputStreamProvider.class, TckJaxbProvider.class, TckMapProvider.class, TckNumberProvider.class, TckReaderProvider.class, TckSourceProvider.class, TckStreamingOutputProvider.class, @@ -195,6 +195,22 @@ public void readWriteFileProviderTest() throws Fault { setPropertyAndInvoke("file", MediaType.APPLICATION_XML_TYPE); } + /* + * @testName: readWritePathProviderTest + * + * @assertion_ids: JAXRS:SPEC:35 + * + * @test_Strategy: An implementation MUST support application-provided entity + * providers and MUST use those in preference to its own pre-packaged + * providers when either could handle the same request. + * + */ + @Test + @Tag("xml_binding") + public void readWritePathProviderTest() throws Fault { + setPropertyAndInvoke("path", MediaType.APPLICATION_XML_TYPE); + } + /* * @testName: readWriteDataSourceProviderTest * diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/Resource.java index 6652ef13a..548a8914e 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/Resource.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/Resource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -63,6 +63,12 @@ public File file(File file) { return file; } + @Path("path") + @POST + public java.nio.file.Path path(java.nio.file.Path path) { + return path; + } + @Path("datasource") @POST public DataSource datasource(DataSource datasource) { diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TSAppConfig.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TSAppConfig.java index 8381daa35..98ecc14cb 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TSAppConfig.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TSAppConfig.java @@ -29,6 +29,7 @@ public java.util.Set> getClasses() { resources.add(TckByteArrayProvider.class); resources.add(TckDataSourceProvider.class); resources.add(TckFileProvider.class); + resources.add(TckPathProvider.class); resources.add(TckInputStreamProvider.class); resources.add(TckJaxbProvider.class); resources.add(TckMapProvider.class); diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TckPathProvider.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TckPathProvider.java new file mode 100644 index 000000000..12e18ea42 --- /dev/null +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/overridestandard/TckPathProvider.java @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2024 Markus Karg. All rights reserved. + * + * This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v. 2.0, which is available at + * http://www.eclipse.org/legal/epl-2.0. + * + * This Source Code may also be made available under the following Secondary + * Licenses when the conditions for such availability set forth in the + * Eclipse Public License v. 2.0 are satisfied: GNU General Public License, + * version 2 with the GNU Classpath Exception, which is available at + * https://www.gnu.org/software/classpath/license.html. + * + * SPDX-License-Identifier: EPL-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 + */ + +package ee.jakarta.tck.ws.rs.spec.provider.overridestandard; + +import java.io.BufferedReader; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.lang.annotation.Annotation; +import java.lang.reflect.Type; +import java.nio.file.Files; +import java.nio.file.Path; + +import jakarta.ws.rs.WebApplicationException; +import jakarta.ws.rs.core.MediaType; +import jakarta.ws.rs.core.MultivaluedMap; +import jakarta.ws.rs.ext.MessageBodyReader; +import jakarta.ws.rs.ext.MessageBodyWriter; +import jakarta.ws.rs.ext.Provider; + +@Provider +public class TckPathProvider extends AbstractProvider + implements MessageBodyReader, MessageBodyWriter { + + @Override + public boolean isWriteable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return type == Path.class; + } + + @Override + public long getSize(Path t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return getLength(); + } + + @Override + public void writeTo(Path t, Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, OutputStream entityStream) + throws IOException, WebApplicationException { + String text = Files.readString(t); + entityStream.write(text == null ? "".getBytes() : text.getBytes()); + entityStream.write(getWriterName().getBytes()); + } + + @Override + public boolean isReadable(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType) { + return isWriteable(type, genericType, annotations, mediaType); + } + + @Override + public Path readFrom(Class type, Type genericType, + Annotation[] annotations, MediaType mediaType, + MultivaluedMap httpHeaders, InputStream entityStream) + throws IOException, WebApplicationException { + Path p = Files.createTempFile("tckjaxrs", "tmp"); + Files.writeString(p, getReaderName()); + return p; + } + +} diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/JAXRSClientIT.java index df778ab79..4cbb64457 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/JAXRSClientIT.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -151,7 +151,7 @@ void logFinishTest(TestInfo testInfo) { } - String[] methodsAll = { "bytearray", "string", "inputstream", "file", + String[] methodsAll = { "bytearray", "string", "inputstream", "file", "path", "datasource", "streamingoutput" }; /* Run test */ diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/Resource.java index e69348238..cc5ab1a68 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/Resource.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standard/Resource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -110,6 +110,12 @@ public File filesvg(File file) { return file; } + @Path("path") + @POST + public java.nio.file.Path file(java.nio.file.Path path) { + return path; + } + @Path("datasource") @POST public DataSource datasource(DataSource datasource) { diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/JAXRSClientIT.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/JAXRSClientIT.java index 767652c49..170672aef 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/JAXRSClientIT.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/JAXRSClientIT.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -21,6 +21,7 @@ import java.io.Reader; import java.math.BigDecimal; import java.io.IOException; +import java.nio.file.Files; import javax.xml.transform.Source; @@ -310,6 +311,53 @@ public void clientFileProviderTest() throws Fault { "File reader gets unexpected"+ content); } + /* + * @testName: serverPathProviderTest + * + * @assertion_ids: JAXRS:SPEC:33; JAXRS:SPEC:33.5; JAXRS:SPEC:75; + * + * @test_Strategy: java.nio.file.Path All media types. + * + * When reading zero-length request entities, all implementation-supplied + * MessageBodyReader implementations except the JAXB-related one MUST create a + * corresponding Java object that represents zero-length data; they MUST NOT + * return null. + */ + @Test + @Tag("xml_binding") + public void serverPathProviderTest() throws Fault { + setProperty(Property.SEARCH_STRING, Resource.NOTNULL); + setProperty(Property.REQUEST, buildRequest(Request.POST, "path")); + invoke(); + } + + /* + * @testName: clientPathProviderTest + * + * @assertion_ids: JAXRS:JAVADOC:863; + * + * @test_Strategy: java.io.File All media types. + * + * for a zero-length response entities returns null or a corresponding Java + * object that represents zero-length data. + */ + @Test + @Tag("xml_binding") + public void clientPathProviderTest() throws Fault { + setProperty(Property.REQUEST, buildRequest(Request.GET, "entity")); + invoke(); + java.nio.file.Path entity = getResponseBody(java.nio.file.Path.class); + String content = null; + if (entity != null) + try { + content = Files.readString(entity); + } catch (Exception e) { + throw new Fault(e); + } + assertTrue(content == null || content.length() == 0, + "Path reader gets unexpected"+ content); + } + /* * @testName: serverDataSourceProviderTest * diff --git a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/Resource.java b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/Resource.java index 31e9e3d7d..cad71b8c0 100644 --- a/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/Resource.java +++ b/jaxrs-tck/src/main/java/ee/jakarta/tck/ws/rs/spec/provider/standardnotnull/Resource.java @@ -1,5 +1,5 @@ /* - * Copyright (c) 2012, 2021 Oracle and/or its affiliates. All rights reserved. + * Copyright (c) 2012 Oracle and/or its affiliates. All rights reserved. * * This program and the accompanying materials are made available under the * terms of the Eclipse Public License v. 2.0, which is available at @@ -72,6 +72,12 @@ public String file(File file) { return isNull(file); } + @Path("path") + @POST + public String path(java.nio.file.Path path) { + return isNull(path); + } + @Path("datasource") @POST public String datasource(DataSource datasource) {