/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.wink.itest.request;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
import javax.ws.rs.GET;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.QueryParam;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.core.Context;
import javax.ws.rs.core.EntityTag;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Request;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Variant;
import javax.ws.rs.core.Response.ResponseBuilder;
/**
* A resource for testing the {@link Request} interface. This is treated like a
* singleton in the application.
*/
@Path("context/request")
public class RequestResource {
private Date date;
private EntityTag etag;
final private static SimpleDateFormat rfc1123Format =
new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss zzz",
Locale.ENGLISH);
@GET
@Path("timezone")
public String getTimeZone() {
boolean dst = TimeZone.getDefault().inDaylightTime(new Date());
return TimeZone.getDefault().getDisplayName(dst, TimeZone.SHORT);
}
@GET
@Path("date")
public Response evalDate(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
if (date == null) {
return Response.serverError().build();
}
System.out.println("GET Date: " + date);
ResponseBuilder respBuilder = req.evaluatePreconditions(date);
if (respBuilder != null) {
System.out.println("Returning 304");
return respBuilder.build();
}
System.out.println("Returning 200");
SimpleDateFormat rfc1123Format =
new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss zzz",
Locale.ENGLISH);
rfc1123Format.setTimeZone(TimeZone.getTimeZone("GMT"));
return Response.ok("the date: " + rfc1123Format.format(date)).lastModified(date).build();
}
@PUT
@Path("date")
public Response putDate(String dateSource, @Context Request req) {
if (!"PUT".equals(req.getMethod())) {
throw new WebApplicationException();
}
try {
date = new SimpleDateFormat(
"EEE, dd MMM yyyy HH:mm:ss zzz",
Locale.ENGLISH).parse(dateSource);
System.out.println("PUT Date: " + date);
} catch (ParseException e) {
throw new WebApplicationException(e);
}
return Response.noContent().build();
}
@GET
@Path("etag")
public Response evalEtag(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
if (etag == null) {
return Response.serverError().build();
}
ResponseBuilder respBuilder = req.evaluatePreconditions(etag);
if (respBuilder != null) {
return respBuilder.build();
}
return Response.ok("the etag: \"" + etag.getValue() + "\"" + etag.isWeak()).tag(etag)
.build();
}
@POST
@Path("etag")
public Response evalPostEtag(@Context Request req) {
if (!"POST".equals(req.getMethod())) {
throw new WebApplicationException();
}
if (etag == null) {
return Response.serverError().build();
}
ResponseBuilder respBuilder = req.evaluatePreconditions(etag);
if (respBuilder != null) {
return respBuilder.build();
}
return Response.ok("the etag: \"" + etag.getValue() + "\"" + etag.isWeak()).tag(etag)
.build();
}
@PUT
@Path("etag")
public Response putEtag(@Context Request req, String etag) {
if (!"PUT".equals(req.getMethod())) {
throw new WebApplicationException();
}
this.etag = EntityTag.valueOf(etag);
return Response.noContent().build();
}
@GET
@Path("variant/acceptonly")
public Response evalAcceptVariant(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
List<Variant> variants =
Variant.mediaTypes(MediaType.APPLICATION_JSON_TYPE,
MediaType.valueOf("text/*"),
MediaType.TEXT_XML_TYPE,
MediaType.TEXT_HTML_TYPE).add().build();
Variant targettedVariant = req.selectVariant(variants);
if (targettedVariant == null) {
return Response.status(466).build();
}
if ("xml".equals(targettedVariant.getMediaType().getSubtype())) {
org.apache.wink.itest.request.Variant v =
new org.apache.wink.itest.request.Variant();
v.setMediatype(targettedVariant.getMediaType().getType() + "/"
+ targettedVariant.getMediaType().getSubtype());
v.setEncoding(targettedVariant.getEncoding());
v.setLanguage((targettedVariant.getLanguage() != null) ? targettedVariant.getLanguage()
.getLanguage() : null);
return Response.ok(v).build();
}
return Response.ok(targettedVariant.getMediaType().getType() + "/"
+ targettedVariant.getMediaType().getSubtype()).build();
}
@GET
@Path("variant/acceptlanguageonly")
public Response evalAcceptLanguageVariant(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
List<Variant> variants =
Variant.languages(Locale.ENGLISH, Locale.JAPANESE, Locale.CHINESE, Locale.GERMAN).add()
.build();
Variant targettedVariant = req.selectVariant(variants);
if (targettedVariant == null) {
return Response.status(466).build();
}
return Response.ok(targettedVariant.getLanguage().getLanguage()).build();
}
@GET
@Path("variant/acceptencodingonly")
public Response evalAcceptEncodingVariant(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
List<Variant> variants = Variant.encodings("compress", "gzip", "identity").add().build();
Variant targettedVariant = req.selectVariant(variants);
if (targettedVariant == null) {
return Response.status(466).build();
}
return Response.ok(targettedVariant.getEncoding()).build();
}
@GET
@Path("variant/responsebuilder")
public Response evalResponseBuilderVary(@Context Request req, @QueryParam("type") String type) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
List<Variant> variants =
Variant.languages(Locale.ENGLISH, Locale.JAPANESE, Locale.CHINESE, Locale.GERMAN)
.mediaTypes(MediaType.APPLICATION_JSON_TYPE,
MediaType.valueOf("text/*"),
MediaType.TEXT_XML_TYPE,
MediaType.TEXT_HTML_TYPE).encodings("compress", "gzip", "identity")
.add().build();
Variant targettedVariant = req.selectVariant(variants);
if ("notacceptable".equals(type)) {
List<Variant> notAcceptableVariants =
Variant.mediaTypes(MediaType.APPLICATION_JSON_TYPE,
MediaType.valueOf("text/*"),
MediaType.TEXT_XML_TYPE,
MediaType.TEXT_HTML_TYPE).encodings("compress",
"gzip",
"identity").add().build();
return Response.notAcceptable(notAcceptableVariants).build();
} else if ("variants".equals(type)) {
List<Variant> okVariants =
Variant.languages(Locale.ENGLISH, Locale.JAPANESE, Locale.CHINESE, Locale.GERMAN)
.encodings("compress", "gzip", "identity").add().build();
return Response.ok().variants(okVariants).build();
}
if (targettedVariant == null) {
return Response.status(466).build();
}
return Response.ok(targettedVariant.getMediaType().getType() + "/"
+ targettedVariant.getMediaType().getSubtype()
+ "-"
+ ((targettedVariant.getLanguage() != null) ? targettedVariant
.getLanguage().getLanguage() : "")
+ "-"
+ targettedVariant.getEncoding(),
new Variant(new MediaType("text", "plain"), Locale.ENGLISH, "identity"))
.build();
}
@GET
@Path("variant/acceptmultiple")
public Response evalAcceptMultipleVariant(@Context Request req) {
if (!"GET".equals(req.getMethod())) {
throw new WebApplicationException();
}
List<Variant> variants =
Variant.languages(Locale.ENGLISH, Locale.JAPANESE, Locale.CHINESE, Locale.GERMAN)
.mediaTypes(MediaType.APPLICATION_JSON_TYPE,
MediaType.valueOf("text/*"),
MediaType.TEXT_XML_TYPE,
MediaType.TEXT_HTML_TYPE).encodings("compress", "gzip", "identity")
.add().build();
Variant targettedVariant = req.selectVariant(variants);
if (targettedVariant == null) {
return Response.status(466).build();
}
if ("xml".equals(targettedVariant.getMediaType().getSubtype())) {
org.apache.wink.itest.request.Variant v =
new org.apache.wink.itest.request.Variant();
v.setMediatype(targettedVariant.getMediaType().getType() + "/"
+ targettedVariant.getMediaType().getSubtype());
v.setEncoding(targettedVariant.getEncoding());
v.setLanguage((targettedVariant.getLanguage() != null) ? targettedVariant.getLanguage()
.getLanguage() : null);
return Response.ok(v).build();
}
return Response.ok(targettedVariant.getMediaType().getType() + "/"
+ targettedVariant.getMediaType().getSubtype()
+ "-"
+ ((targettedVariant.getLanguage() != null) ? targettedVariant.getLanguage()
.getLanguage() : "")
+ "-"
+ targettedVariant.getEncoding()).build();
}
}