/* * Copyright (C) 2014 Intel Corporation * All rights reserved. */ package com.intel.mtwilson.rpc.v2.resource; import com.intel.dcsg.cpg.io.UUID; import com.intel.dcsg.cpg.util.MultivaluedHashMap; import com.intel.dcsg.cpg.validation.Fault; import com.intel.mtwilson.rpc.v2.model.Rpc; import com.intel.mtwilson.rpc.v2.model.RpcPriv; import com.intel.mtwilson.v2.rpc.RpcUtil; import com.thoughtworks.xstream.XStream; import java.io.ByteArrayInputStream; import java.io.IOException; import java.lang.annotation.Annotation; import java.nio.charset.Charset; import javax.servlet.http.HttpServletRequest; import javax.ws.rs.PathParam; 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 javax.ws.rs.ext.MessageBodyReader; import org.glassfish.jersey.message.MessageBodyWorkers; /** * Code shared by AsyncRpc and BlockingRpc, mostly converting the POST body * from its original format to xstream for storing in database. * * @author jbuhacoff */ public class AbstractRpc { private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(AbstractRpc.class); protected RpcRepository repository = new RpcRepository(); protected RpcRepository getRepository() { return repository; } @Context protected MessageBodyWorkers workers; protected MessageBodyWorkers getMessageBodyWorkers() { return workers; } protected XStream xstream = new XStream(); protected RpcAdapter getAdapter(String name) { RpcAdapter adapter = RpcUtil.findRpcForName(name); if (adapter == null) { throw new WebApplicationException(Response.Status.NOT_FOUND); } return adapter; } protected Object getInput(byte[] input, Class<?> inputClass, HttpServletRequest request) { Object inputObject; // convert the client's input into our internal format try { String inputAccept = RpcUtil.getPreferredTypeFromAccept(request.getHeader(HttpHeaders.CONTENT_TYPE)); log.debug("Client prefers content type: {}", inputAccept); MediaType inputMediaType = MediaType.valueOf(inputAccept); // use jersey classes to find the appropriate message body reader based on request's content type final MessageBodyReader messageBodyReader = workers.getMessageBodyReader(inputClass, inputClass, inputClass.getAnnotations(), inputMediaType); if (messageBodyReader == null) { throw new WebApplicationException(Response.Status.NOT_ACCEPTABLE); } javax.ws.rs.core.MultivaluedHashMap jaxrsHeaders = new javax.ws.rs.core.MultivaluedHashMap(); MultivaluedHashMap<String, String> headerMap = RpcUtil.convertHeadersToMultivaluedMap(request); jaxrsHeaders.putAll(headerMap.getMap()); inputObject = messageBodyReader.readFrom(inputClass, inputClass, inputClass.getAnnotations(), inputMediaType, jaxrsHeaders, new ByteArrayInputStream(input)); } catch (IOException e) { log.error ("IOException.", e); throw new WebApplicationException("Invalid input to RPC", e); } return inputObject; } protected byte[] toXml(Object inputObject) { // log.info("BlockRPC: input xml is {}.", xstream.toXML(inputObject)); return xstream.toXML(inputObject).getBytes(Charset.forName("UTF-8")); } }