blob: 17c52aa230b322d67149b1365b198e47eacb4d76 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2011 BSI Business Systems Integration AG.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Daniel Wiehl (BSI Business Systems Integration AG) - initial API and implementation
******************************************************************************/
package org.eclipse.scout.jaxws.internal.servlet;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.ws.handler.MessageContext;
import com.sun.xml.internal.ws.api.message.Packet;
import com.sun.xml.internal.ws.api.server.WebServiceContextDelegate;
import com.sun.xml.internal.ws.developer.JAXWSProperties;
import com.sun.xml.internal.ws.transport.http.HttpAdapter;
import com.sun.xml.internal.ws.transport.http.WSHTTPConnection;
@SuppressWarnings("restriction")
public class ServletConnection extends WSHTTPConnection {
private static final PropertyMap PROP_MODEL;
private final HttpServletRequest m_request;
private final HttpServletResponse m_response;
private final ServletContext m_context;
private final WebServiceContextDelegate m_contextDelegate;
private int m_status;
private final Map<String, List<String>> m_responseHeaderMap;
static {
PROP_MODEL = parse(ServletConnection.class);
}
public ServletConnection(HttpAdapter adapter, ServletContext context, HttpServletRequest request, HttpServletResponse response) {
m_context = context;
m_request = request;
m_response = response;
m_contextDelegate = createContextDelegate(adapter, request);
m_responseHeaderMap = new HashMap<String, List<String>>();
}
@Property(MessageContext.SERVLET_RESPONSE)
public HttpServletResponse getResponse() {
return m_response;
}
@Property(MessageContext.SERVLET_REQUEST)
public HttpServletRequest getRequest() {
return m_request;
}
@Property(JAXWSProperties.HTTP_REQUEST_URL)
public String getRequestURL() {
return m_request.getRequestURL().toString();
}
@Override
public void setStatus(int status) {
m_status = status;
}
@Override
@Property(MessageContext.HTTP_RESPONSE_CODE)
public int getStatus() {
return m_status;
}
@Override
public boolean isSecure() {
return m_request.getScheme().equals("https");
}
@Override
public InputStream getInput() throws IOException {
return m_request.getInputStream();
}
@Override
public String getProtocol() {
return m_request.getProtocol();
}
@Override
public OutputStream getOutput() throws IOException {
m_response.setStatus(m_status);
return m_response.getOutputStream();
}
@Override
@Property(MessageContext.PATH_INFO)
public String getPathInfo() {
return m_request.getPathInfo();
}
@Override
public String getBaseAddress() {
return JaxWsHelper.getBaseAddress(m_request, true);
}
@Override
@Property(MessageContext.QUERY_STRING)
public String getQueryString() {
return m_request.getQueryString();
}
@Override
@Property(MessageContext.HTTP_REQUEST_METHOD)
public String getRequestMethod() {
return m_request.getMethod();
}
@Override
public String getRequestHeader(String headerName) {
return m_request.getHeader(headerName);
}
@Override
@SuppressWarnings("deprecation")
@Property({MessageContext.HTTP_REQUEST_HEADERS, Packet.INBOUND_TRANSPORT_HEADERS})
public Map<String, List<String>> getRequestHeaders() {
Map<String, List<String>> headerMap = new HashMap<String, List<String>>();
Enumeration headerNames = m_request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String name = (String) headerNames.nextElement();
String value = m_request.getHeader(name);
if (headerMap.get(name) == null) {
headerMap.put(name, new ArrayList<String>());
}
headerMap.get(name).add(value);
}
return headerMap;
}
@Override
public void setResponseHeaders(Map<String, List<String>> responseHeaders) {
m_responseHeaderMap.clear();
m_response.reset();
m_response.setStatus(m_status);
// update headers of @{link HttpServletResponse}
if (responseHeaders == null || responseHeaders.size() == 0) {
return;
}
for (Entry<String, List<String>> entry : responseHeaders.entrySet()) {
String name = entry.getKey();
List<String> values = entry.getValue();
// According to JavaDoc, ignore 'Content-Type' and 'Content-Length'
if (name.equalsIgnoreCase("Content-Type") || name.equalsIgnoreCase("Content-Length")) {
continue;
}
for (String value : values) {
m_response.addHeader(name, value);
}
}
}
@Override
@Property({MessageContext.HTTP_RESPONSE_HEADERS, Packet.OUTBOUND_TRANSPORT_HEADERS})
public Map<String, List<String>> getResponseHeaders() {
return JaxWsHelper.cloneHeaderMap(m_responseHeaderMap); // clone according do JavaDoc
}
@Override
public void setContentTypeResponseHeader(String value) {
m_response.setContentType(value);
}
@Override
public void setContentLengthResponseHeader(int value) {
m_response.setContentLength(value);
}
@Override
@Property(MessageContext.SERVLET_CONTEXT)
public ServletContext getContext() {
return m_context;
}
@Override
public WebServiceContextDelegate getWebServiceContextDelegate() {
return m_contextDelegate;
}
@Override
protected PropertyMap getPropertyMap() {
return PROP_MODEL;
}
protected WebServiceContextDelegate createContextDelegate(HttpAdapter adapter, HttpServletRequest request) {
return new ServletContextDelegate(adapter, request);
}
@Override
@SuppressWarnings("deprecation")
@Deprecated
public Set<String> getRequestHeaderNames() {
Set<String> headerNameSet = new HashSet<String>();
for (Enumeration<String> headerNames = m_request.getHeaderNames(); headerNames.hasMoreElements();) {
headerNameSet.add(headerNames.nextElement());
}
return headerNameSet;
}
@Override
public List<String> getRequestHeaderValues(String arg0) {
List<String> headerList = new ArrayList<String>();
for (Enumeration<String> headers = m_request.getHeaders(arg0); headers.hasMoreElements();) {
headerList.add(headers.nextElement());
}
return headerList;
}
@Override
public String getRequestScheme() {
return m_request.getScheme();
}
@Override
public String getRequestURI() {
return m_request.getRequestURI();
}
@Override
public String getServerName() {
return m_request.getServerName();
}
@Override
public int getServerPort() {
return m_request.getServerPort();
}
@Override
public void setResponseHeader(String name, List<String> values) {
// According to JavaDoc, ignore 'Content-Type' and 'Content-Length'
if (name.equalsIgnoreCase("Content-Type") || name.equalsIgnoreCase("Content-Length")) {
return;
}
for (String value : values) {
m_response.addHeader(name, value);
}
}
}