Java tutorial
/* * Copyright 2006 Open Source Applications Foundation * * 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 org.unitedinternet.cosmo.dav.impl; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintWriter; import java.util.Collection; import java.util.Locale; import javax.servlet.ServletOutputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamWriter; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.jackrabbit.webdav.DavConstants; import org.apache.jackrabbit.webdav.WebdavResponseImpl; import org.apache.jackrabbit.webdav.xml.DomUtil; import org.apache.jackrabbit.webdav.xml.XmlSerializable; import org.unitedinternet.cosmo.dav.CosmoDavException; import org.unitedinternet.cosmo.dav.DavResponse; import org.unitedinternet.cosmo.dav.ticket.TicketConstants; import org.unitedinternet.cosmo.dav.ticket.property.TicketDiscovery; import org.unitedinternet.cosmo.dav.util.XmlSerializer; import org.w3c.dom.Document; import org.w3c.dom.Element; /** * Extends {@link org.apache.jackrabbit.webdav.WebdavResponseImpl} and * implements methods for the DAV ticket extension. */ public class StandardDavResponse extends WebdavResponseImpl implements DavResponse, DavConstants, TicketConstants { private static final Log LOG = LogFactory.getLog(StandardDavResponse.class); private static final XMLOutputFactory XML_OUTPUT_FACTORY = XMLOutputFactory.newInstance(); private HttpServletResponse originalHttpServletResponse; /** */ public StandardDavResponse(HttpServletResponse response) { super(response); originalHttpServletResponse = response; } public void addCookie(Cookie cookie) { originalHttpServletResponse.addCookie(cookie); } public boolean containsHeader(String name) { return originalHttpServletResponse.containsHeader(name); } public String encodeURL(String url) { return originalHttpServletResponse.encodeURL(url); } public String getCharacterEncoding() { return originalHttpServletResponse.getCharacterEncoding(); } public String encodeRedirectURL(String url) { return originalHttpServletResponse.encodeRedirectURL(url); } public String getContentType() { return originalHttpServletResponse.getContentType(); } public String encodeUrl(String url) { return originalHttpServletResponse.encodeUrl(url); } public String encodeRedirectUrl(String url) { return originalHttpServletResponse.encodeRedirectUrl(url); } public ServletOutputStream getOutputStream() throws IOException { return originalHttpServletResponse.getOutputStream(); } public void sendError(int sc, String msg) throws IOException { originalHttpServletResponse.sendError(sc, msg); } public PrintWriter getWriter() throws IOException { return originalHttpServletResponse.getWriter(); } public void sendError(int sc) throws IOException { originalHttpServletResponse.sendError(sc); } public void setCharacterEncoding(String charset) { originalHttpServletResponse.setCharacterEncoding(charset); } public void sendRedirect(String location) throws IOException { originalHttpServletResponse.sendRedirect(location); } public void setDateHeader(String name, long date) { originalHttpServletResponse.setDateHeader(name, date); } public void setContentLength(int len) { originalHttpServletResponse.setContentLength(len); } public void addDateHeader(String name, long date) { originalHttpServletResponse.addDateHeader(name, date); } public void setContentType(String type) { originalHttpServletResponse.setContentType(type); } public void setHeader(String name, String value) { //Including unvalidated data in an HTTP response header can enable //cache-poisoning, cross-site scripting, cross-user defacement, page hijacking, //cookie manipulation or open redirect. value = value.replaceAll("\r", " ").replace("\n", " "); originalHttpServletResponse.setHeader(name, value); } public void addHeader(String name, String value) { originalHttpServletResponse.addHeader(name, value); } public void setBufferSize(int size) { originalHttpServletResponse.setBufferSize(size); } public void setIntHeader(String name, int value) { originalHttpServletResponse.setIntHeader(name, value); } public void addIntHeader(String name, int value) { originalHttpServletResponse.addIntHeader(name, value); } public void setStatus(int sc) { originalHttpServletResponse.setStatus(sc); } public int getBufferSize() { return originalHttpServletResponse.getBufferSize(); } public void flushBuffer() throws IOException { originalHttpServletResponse.flushBuffer(); } public void setStatus(int sc, String sm) { originalHttpServletResponse.setStatus(sc, sm); } public void resetBuffer() { originalHttpServletResponse.resetBuffer(); } public boolean isCommitted() { return originalHttpServletResponse.isCommitted(); } public void reset() { originalHttpServletResponse.reset(); } public void setLocale(Locale loc) { originalHttpServletResponse.setLocale(loc); } public Locale getLocale() { return originalHttpServletResponse.getLocale(); } @Override public void sendXmlResponse(XmlSerializable serializable, int status) throws IOException { super.sendXmlResponse(serializable, status); if (serializable != null && LOG.isTraceEnabled()) { StringBuffer sb = new StringBuffer("\n------------------------ Dump of response -------------------\n"); sb.append("Status: ").append(status).append("\n"); sb.append(XmlSerializer.serialize(serializable)); sb.append("\n------------------------ End dump of response -------------------"); LOG.trace(sb); } } @Override public String getHeader(String name) { return originalHttpServletResponse.getHeader(name); } @Override public Collection<String> getHeaderNames() { return originalHttpServletResponse.getHeaderNames(); } @Override public Collection<String> getHeaders(String name) { return originalHttpServletResponse.getHeaders(name); } @Override public int getStatus() { return originalHttpServletResponse.getStatus(); } // DavResponse methods /** * Send the <code>ticketdiscovery</code> response to a * <code>MKTICKET</code> request. * * @param resource the resource on which the ticket was created * @param ticketId the id of the newly created ticket */ public void sendMkTicketResponse(DavItemResource resource, String ticketId) throws CosmoDavException, IOException { setHeader(HEADER_TICKET, ticketId); TicketDiscovery ticketdiscovery = (TicketDiscovery) resource.getProperties().get(TICKETDISCOVERY); MkTicketInfo info = new MkTicketInfo(ticketdiscovery); sendXmlResponse(info, SC_OK); } private static class MkTicketInfo implements XmlSerializable { private TicketDiscovery td; public MkTicketInfo(TicketDiscovery td) { this.td = td; } public Element toXml(Document document) { Element prop = DomUtil.createElement(document, XML_PROP, NAMESPACE); prop.appendChild(td.toXml(document)); return prop; } } public void sendDavError(CosmoDavException e) throws IOException { setStatus(e.getErrorCode()); if (!e.hasContent()) { return; } XMLStreamWriter writer = null; try { ByteArrayOutputStream out = new ByteArrayOutputStream(); writer = XML_OUTPUT_FACTORY.createXMLStreamWriter(out); writer.writeStartDocument(); e.writeTo(writer); writer.writeEndDocument(); setContentType("text/xml; charset=UTF-8"); byte[] bytes = out.toByteArray(); setContentLength(bytes.length); getOutputStream().write(bytes); } catch (Exception e2) { LOG.error("Error writing XML", e2); LOG.error("Original exception", e); setStatus(500); } finally { if (writer != null) { try { writer.close(); } catch (XMLStreamException e2) { LOG.warn("Unable to close XML writer", e2); } } } } @Override public void setContentLengthLong(long len) { } }