/* * Copyright (C) 2013 Intel Corporation * All rights reserved. */ package com.intel.mtwilson.rpc.v2.resource; import com.fasterxml.jackson.databind.ObjectMapper; import com.intel.mtwilson.rpc.v2.model.Rpc; import com.intel.mtwilson.rpc.v2.model.RpcFilterCriteria; import com.intel.mtwilson.rpc.v2.model.RpcCollection; import com.intel.mtwilson.jaxrs2.NoLinks; import com.intel.mtwilson.jaxrs2.server.resource.AbstractJsonapiResource; import com.intel.mtwilson.launcher.ws.ext.V2; import com.intel.mtwilson.rpc.v2.model.RpcLocator; import com.intel.mtwilson.rpc.v2.model.RpcPriv; import com.thoughtworks.xstream.XStream; import java.nio.charset.Charset; //import javax.ejb.Stateless; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.BeanParam; import javax.ws.rs.DELETE; import javax.ws.rs.GET; import javax.ws.rs.Path; import javax.ws.rs.Produces; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Context; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import org.glassfish.jersey.message.MessageBodyWorkers; /** * * @author jbuhacoff */ @V2 //@Stateless @Path("/rpcs") public class Rpcs extends AbstractJsonapiResource<Rpc,RpcCollection,RpcFilterCriteria,NoLinks<Rpc>,RpcLocator> { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(Rpcs.class); private RpcRepository repository; private ObjectMapper mapper = new ObjectMapper(); public Rpcs() { // super(); repository = new RpcRepository(); // setRepository(repository); } @Override protected RpcRepository getRepository() { return repository; } @Context private MessageBodyWorkers workers; /* @Override protected RpcCollection createEmptyCollection() { return new RpcCollection(); } */ @Override @Path("/{id}") @DELETE public void deleteOne(@BeanParam RpcLocator locator) { log.debug("Rpcs deleteOne"); boolean isRunning = false; if (isRunning) { throw new WebApplicationException(Response.Status.CONFLICT); } // now remove from database super.deleteOne(locator); } @Path("/{id}/input") @GET public Response getRpcInput(@BeanParam RpcLocator locator) { log.debug("rpc get input, sending fake data"); RpcPriv rpc = repository.retrieveInput(locator); if (rpc != null) { rpc.setInput("<input><sample/></input>".getBytes()); Response response = Response.ok(rpc.getInput(), "application/octet-stream" /*rpc.getInputContentType()*/).build(); return response; } else { return null; } } /* @Path("/{id}/output") @GET public Response getRpcOutput(@BeanParam RpcLocator locator, @Context HttpServletRequest request) { Rpc rpc = repository.retrieveOutput(locator); // convert the intermediate output to client's requested output type log.debug("Client requested output type: {}" ,request.getHeader(HttpHeaders.ACCEPT)); // rpc.setOutputContentType(MediaType.WILDCARD); String xml = new String(rpc.getOutput(), Charset.forName("UTF-8")); log.debug("output xml: {}", xml); // use jersey classes to find the appropriate message body reader based on request's content type XStream xs = new XStream(); Object pojo = xs.fromXML(xml); Class outputContentClass = pojo.getClass(); log.debug("output pojo: {}", pojo.getClass().getName()); com.intel.dcsg.cpg.util.MultivaluedHashMap<String,String> headerMap = RpcUtil.convertHeadersToMultivaluedMap(request); String responseAccept = RpcUtil.getPreferredTypeFromAccept(headerMap.get("Accept")); MediaType responseMediaType = MediaType.valueOf(responseAccept); final MessageBodyWriter messageBodyWriter2 = workers.getMessageBodyWriter(outputContentClass, outputContentClass, new Annotation[]{}, responseMediaType); if( messageBodyWriter2 == null ) { // we don't know how to write the final response! log.error("Cannot find MessageBodyWriter for response"); throw new WebApplicationException(Response.Status.BAD_REQUEST); } try { javax.ws.rs.core.MultivaluedHashMap jaxrsHeaders = new javax.ws.rs.core.MultivaluedHashMap(); jaxrsHeaders.putAll(headerMap.getMap()); // Object responseObject = messageBodyReader2.readFrom(outputContentClass, outputContentClass, new Annotation[]{}, outputMediaType, jaxrsHeaders, new ByteArrayInputStream(rpc.getOutput())); Object responseObject = pojo; log.debug("Read intermediate response object: {}", mapper.writeValueAsString(responseObject)); ByteArrayOutputStream out = new ByteArrayOutputStream(); messageBodyWriter2.writeTo(responseObject, outputContentClass, outputContentClass, new Annotation[]{}, responseMediaType, jaxrsHeaders, out); byte[] responseContent = out.toByteArray(); // this will go in database log.debug("Response object: {}", new String(responseContent)); // we can only do this because we know the output is xml format for testing... Response response = Response.ok(responseContent,responseMediaType).build(); return response; } catch(Exception e) { log.error("Cannot convert output to requested response type: {}", e.getMessage()); throw new WebApplicationException(Response.Status.BAD_REQUEST); } } */ @Path("/{id}/output") @GET // @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML, OtherMediaType.APPLICATION_YAML, OtherMediaType.TEXT_YAML}) @Produces(MediaType.WILDCARD) public Object getRpcOutput(@BeanParam RpcLocator locator, @Context HttpServletRequest request) { RpcPriv rpc = repository.retrieveOutput(locator); if (rpc == null) { return null; } // convert the intermediate output to client's requested output type log.debug("Client requested output type: {}" ,request.getHeader(HttpHeaders.ACCEPT)); // rpc.setOutputContentType(MediaType.WILDCARD); String xml = new String(rpc.getOutput(), Charset.forName("UTF-8")); log.debug("output xml: {}", xml); // use jersey classes to find the appropriate message body reader based on request's content type XStream xs = new XStream(); Object pojo = xs.fromXML(xml); // Class outputContentClass = pojo.getClass(); log.debug("output pojo: {}", pojo.getClass().getName()); return pojo; } @Override protected RpcCollection createEmptyCollection() { return new RpcCollection(); } }