/**
* Licensed 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 com.github.cchacin.cucumber.steps.example.app;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.servlet.http.HttpServletRequest;
import javax.ws.rs.Consumes;
import javax.ws.rs.DELETE;
import javax.ws.rs.GET;
import javax.ws.rs.HEAD;
import javax.ws.rs.POST;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.QueryParam;
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 javax.xml.bind.annotation.XmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.Value;
import org.apache.cxf.jaxrs.client.WebClient;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
@Path("/")
@Stateless
public class Controller {
@Context
UriInfo uriInfo;
@EJB
ModelDao modelDao;
private final ExecutorService executor = Executors.newFixedThreadPool(10);
@GET
@Path("/successful/get")
@Produces("application/json")
public Response successfulGET(@Context final HttpServletRequest request) {
Response.ResponseBuilder builder =
Response.ok(new Model(1L, new Date(), new Date(), null, "", ""));
buildResponseHeaders(builder, request);
return builder.build();
}
@GET
@Path("/successful/get/params")
@Produces("application/json")
public Response successfulGETQueryParams(@QueryParam("param1") final String param1,
@QueryParam("param2") final String param2) {
return Response.ok(new Model(1L, new Date(), new Date(), null, param2, param1)).build();
}
@GET
@Path("/users")
@Produces("application/json")
public List<Model> successfulGETUsers() {
return modelDao.get();
}
@GET
@Path("/successful/get/csv")
@Produces("text/csv")
public Response successfulGETCSV() {
return Response.ok("\"headerA\",\"headerB\"\n\"row1A\",\"row1B\"\n").build();
}
@HEAD
@Path("/successful/head")
public Response successfulHEAD() {
return Response.noContent().build();
}
@PUT
@Path("/successful/put")
public Response successfulPUT(final String body) {
return Response.noContent().build();
}
@POST
@Path("/successful/post")
public Response successfulPOST(final String body) {
return Response.created(uriInfo.getAbsolutePathBuilder().path("1").build()).build();
}
@PUT
@Path("/successful/headers/put")
@Consumes("application/json")
public Response successfulHeadersPUT(@Context final HttpServletRequest request, final String body) {
Response.ResponseBuilder builder = Response.noContent();
buildResponseHeaders(builder, request);
return builder.build();
}
@POST
@Path("/successful/headers/post")
@Consumes("application/json")
public Response successfulHeadersPOST(@Context final HttpServletRequest request, final String body) {
Response.ResponseBuilder builder =
Response.created(uriInfo.getAbsolutePathBuilder().path("1").build());
buildResponseHeaders(builder, request);
return builder.build();
}
private void buildResponseHeaders(final Response.ResponseBuilder builder,
final HttpServletRequest request) {
Enumeration<String> enumerations = request.getHeaderNames();
while (enumerations.hasMoreElements()) {
final String headerName = enumerations.nextElement();
builder.header(headerName, request.getHeader(headerName));
}
}
@DELETE
@Path("/successful/delete")
@Produces("application/json")
public Response successfulDELETE() {
return Response.noContent().build();
}
@GET
@Path("/external/call/user/71e7cb11")
@Consumes("application/json")
@Produces("application/json")
public Response mockExternalCall() {
final WebClient client = WebClient.create("http://localhost:9090");
final ResponseWrapper wrapper;
final List<ResponseItem> items = Lists.newArrayList();
final List<ResponseItem> getItems = Lists.newArrayList();
List<Future<Response>> calls = Lists.newArrayList();
for (int i = 0; i < 5; i++) {
final WebClient getClient =
WebClient.create("http://localhost:9090").accept(MediaType.APPLICATION_JSON)
.path("/user/71e7cb11").query("a", i + 1);
final Future<Response> future = executor.submit(new GetResponse(getClient));
calls.add(future);
}
for (final Future<Response> responseFuture : calls) {
try {
final Response r = responseFuture.get();
getItems.add(new ResponseItem(r.getStatus()));
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
}
final Response postResponse =
client.accept(MediaType.APPLICATION_JSON).back(true).path("/user").query("b", "b")
.post("{\"a\":\"a\"}");
final Response putResponse =
client.accept(MediaType.APPLICATION_JSON).back(true).path("/user/71e7cb11").put(null);
final Response deleteResponse =
client.accept(MediaType.APPLICATION_JSON).back(true).path("/user/71e7cb11").delete();
final List<Response> responseList = ImmutableList.of(postResponse, putResponse, deleteResponse);
for (final Response response : responseList) {
items.add(new ResponseItem(response.getStatus()));
}
items.addAll(getItems);
wrapper = new ResponseWrapper(items);
return Response.ok(wrapper).build();
}
@Value
static class GetResponse implements Callable<Response> {
private WebClient client;
@Override
public Response call() throws Exception {
return client.get();
}
}
@GET
@Path("/external/proxy/user/71e7cb11")
@Produces("application/json")
public Response mockExternalProxy() {
final WebClient client = WebClient.create("http://localhost:9090");
final Response response =
client.accept(MediaType.APPLICATION_JSON).path("/user/71e7cb11").query("a", "a").get();
return Response.ok(response.getEntity()).build();
}
@Data
@NoArgsConstructor
@AllArgsConstructor
@XmlRootElement
private static class ResponseWrapper {
private List<ResponseItem> responses;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
private static class ResponseItem {
private int status;
}
}