/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * 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.kie.server.remote.rest.common.util; import java.util.List; import javax.ws.rs.core.HttpHeaders; import javax.ws.rs.core.MediaType; import javax.ws.rs.core.Response; import javax.ws.rs.core.Variant; import org.kie.server.common.rest.RestEasy960Util; import org.kie.server.api.ConversationId; import org.kie.server.api.KieServerConstants; import org.kie.server.api.KieServerEnvironment; import org.kie.server.api.marshalling.MarshallingFormat; import org.kie.server.api.model.KieContainerStatus; import org.kie.server.api.model.ReleaseId; import org.kie.server.remote.rest.common.Header; import org.kie.server.services.api.KieServerRegistry; import org.kie.server.services.impl.KieContainerInstanceImpl; import org.kie.server.services.impl.marshal.MarshallerHelper; public class RestUtils { private static MarshallerHelper marshallerHelper = new MarshallerHelper(null); public static Response createCorrectVariant(Object responseObj, HttpHeaders headers, Header... customHeaders) { return createCorrectVariant(responseObj, headers, null, customHeaders); } public static Response createCorrectVariant(Object responseObj, HttpHeaders headers, javax.ws.rs.core.Response.Status status, Header... customHeaders) { Response.ResponseBuilder responseBuilder = null; Variant v = getVariant(headers); String contentType = getContentType(headers); if( status != null ) { responseBuilder = Response.status(status).entity(marshallerHelper.marshal(contentType, responseObj)).variant(v); } else { responseBuilder = Response.ok(marshallerHelper.marshal(contentType, responseObj), v); } applyCustomHeaders(responseBuilder, customHeaders); return responseBuilder.build(); } public static Response createCorrectVariant(MarshallerHelper marshallerHelper, String containerId, Object responseObj, HttpHeaders headers, javax.ws.rs.core.Response.Status status, Header... customHeaders) { Response.ResponseBuilder responseBuilder = null; Variant v = getVariant(headers); String contentType = getContentType(headers); String marshalledResponse; if (marshallerHelper.getRegistry().getContainer(containerId) == null) { marshalledResponse = marshallerHelper.marshal(contentType, responseObj); } else { marshalledResponse = marshallerHelper.marshal(containerId, contentType, responseObj); } if( status != null ) { responseBuilder = Response.status(status).entity(marshalledResponse).variant(v); } else { responseBuilder = Response.ok(marshalledResponse, v); } applyCustomHeaders(responseBuilder, customHeaders); return responseBuilder.build(); } public static Response createResponse(Object responseObj, Variant v, javax.ws.rs.core.Response.Status status, Header... customHeaders) { Response.ResponseBuilder responseBuilder = null; if( status != null ) { responseBuilder = Response.status(status).entity(responseObj).variant(v); } else { responseBuilder = Response.ok(responseObj, v); } applyCustomHeaders(responseBuilder, customHeaders); return responseBuilder.build(); } public static Variant getVariant(HttpHeaders headers) { Variant v = RestEasy960Util.getVariant(headers); if( v == null ) { v = Variant.mediaTypes(getMediaType(headers)).add().build().get(0); } return v; } public static String getClassType(HttpHeaders headers) { String classType = null; List<String> header = headers.getRequestHeader(KieServerConstants.CLASS_TYPE_HEADER); if (header != null && !header.isEmpty()) { classType = header.get(0); } return classType; } public static String getContentType(HttpHeaders headers) { // default to application/xml String contentType = MediaType.APPLICATION_XML_TYPE.toString(); // check variant that is based on accept header important in case of GET as then Content-Type might not be given Variant v = RestEasy960Util.getVariant(headers); if (v != null) { // set the default to selected variant contentType = v.getMediaType().toString(); } // now look for actual Content-Type header List<String> contentTypeHeader = headers.getRequestHeader(HttpHeaders.CONTENT_TYPE); if (contentTypeHeader != null && !contentTypeHeader.isEmpty() && contentTypeHeader.get(0) != null) { contentType = contentTypeHeader.get(0); } List<String> kieContentTypeHeader = headers.getRequestHeader(KieServerConstants.KIE_CONTENT_TYPE_HEADER); if (kieContentTypeHeader != null && !kieContentTypeHeader.isEmpty()) { contentType = kieContentTypeHeader.get(0); } return contentType; } public static MediaType getMediaType(HttpHeaders httpHeaders) { String contentType = getContentType(httpHeaders); try { return MediaType.valueOf(contentType); } catch (IllegalArgumentException e) { MarshallingFormat format = MarshallingFormat.fromType(contentType); switch (format) { case JAXB: return MediaType.APPLICATION_XML_TYPE; case XSTREAM: return MediaType.APPLICATION_XML_TYPE; case JSON: return MediaType.APPLICATION_JSON_TYPE; default: return MediaType.APPLICATION_XML_TYPE; } } } public static Response notFound(String message, Variant v, Header... customHeaders) { return createResponse("\"" +message + "\"", v, Response.Status.NOT_FOUND, customHeaders); } public static Response internalServerError(String message, Variant v, Header... customHeaders) { return createResponse("\"" +message + "\"", v, Response.Status.INTERNAL_SERVER_ERROR, customHeaders); } public static Response alreadyExists(String message, Variant v, Header... customHeaders) { return createResponse("\"" +message + "\"", v, Response.Status.CONFLICT, customHeaders); } public static Response badRequest(String reason, Variant v, Header... customHeaders) { return createResponse("\"" +reason + "\"", v, Response.Status.BAD_REQUEST, customHeaders); } public static Response forbidden(String reason, Variant v, Header... customHeaders) { return createResponse("\"" +reason + "\"", v, Response.Status.FORBIDDEN, customHeaders); } public static Response noContent(Variant v, Header... customHeaders) { return createResponse("", v, Response.Status.NO_CONTENT, customHeaders); } protected static void applyCustomHeaders(Response.ResponseBuilder builder, Header... customHeaders) { if (customHeaders != null && customHeaders.length > 0) { for (Header header : customHeaders) { if (header != null) { builder.header(header.getName(), header.getValue()); } } } } public static Header buildConversationIdHeader(String containerId, KieServerRegistry registry, HttpHeaders headers) { List<String> conversationIdHeader = headers.getRequestHeader(KieServerConstants.KIE_CONVERSATION_ID_TYPE_HEADER); if (conversationIdHeader != null && !conversationIdHeader.isEmpty()) { return new Header(KieServerConstants.KIE_CONVERSATION_ID_TYPE_HEADER, conversationIdHeader.get(0)); } KieContainerInstanceImpl container = registry.getContainer(containerId); if (container != null && KieContainerStatus.STARTED.equals(container.getStatus())) { ReleaseId releaseId = container.getResource().getResolvedReleaseId(); if (releaseId == null) { releaseId = container.getResource().getReleaseId(); } String conversationId = ConversationId.from(KieServerEnvironment.getServerId(), containerId, releaseId).toString(); return new Header(KieServerConstants.KIE_CONVERSATION_ID_TYPE_HEADER, conversationId); } return null; } }