001: // Copyright (C) 2003,2004,2005 by Object Mentor, Inc. All rights reserved.
002: // Released under the terms of the GNU General Public License version 2 or later.
003: package fitnesse.responders;
004:
005: import fitnesse.*;
006: import fitnesse.components.XmlWriter;
007: import fitnesse.authentication.*;
008: import fitnesse.wiki.*;
009: import fitnesse.http.*;
010:
011: import java.io.*;
012: import org.w3c.dom.Document;
013:
014: public class SerializedPageResponder implements SecureResponder {
015: private XmlizePageCondition xmlizePageCondition = new XmlizePageCondition() {
016: public boolean canBeXmlized(WikiPage page) throws Exception {
017: return !(page instanceof SymbolicPage);
018: }
019: };
020:
021: public Response makeResponse(FitNesseContext context,
022: Request request) throws Exception {
023: WikiPage page = getRequestedPage(request, context);
024: if (page == null)
025: return new NotFoundResponder().makeResponse(context,
026: request);
027:
028: if ("pages".equals(request.getInput("type"))) {
029: PageXmlizer pageXmlizer = new PageXmlizer();
030: pageXmlizer.addPageCondition(xmlizePageCondition);
031: Document doc = pageXmlizer.xmlize(page);
032: SimpleResponse response = makeResponseWithxml(doc);
033: return response;
034: } else if ("data".equals(request.getInput("type"))) {
035: Document doc = new PageXmlizer().xmlize(page.getData());
036: SimpleResponse response = makeResponseWithxml(doc);
037: return response;
038: } else {
039: Object object = getObjectToSerialize(request, page);
040: byte[] bytes = serializeToBytes(object);
041: return responseWith(bytes);
042: }
043: }
044:
045: private SimpleResponse makeResponseWithxml(Document doc)
046: throws Exception {
047: //TODO MdM Shoudl probably use a StreamedResponse
048: ByteArrayOutputStream output = new ByteArrayOutputStream();
049: XmlWriter xmlWriter = new XmlWriter(output);
050: xmlWriter.write(doc);
051: xmlWriter.flush();
052: xmlWriter.close();
053: SimpleResponse response = new SimpleResponse();
054: response.setContentType("text/xml");
055: response.setContent(output.toByteArray());
056: return response;
057: }
058:
059: private Object getObjectToSerialize(Request request, WikiPage page)
060: throws Exception {
061: Object object;
062: if ("bones".equals(request.getInput("type")))
063: object = new ProxyPage(page);
064: else if ("meat".equals(request.getInput("type"))) {
065: PageData originalData = page.getData();
066: if (request.hasInput("version"))
067: originalData = page.getDataVersion((String) request
068: .getInput("version"));
069: PageData data = new PageData(originalData);
070:
071: object = data;
072: } else
073: throw new Exception("Improper use of proxy retrieval");
074: return object;
075: }
076:
077: private WikiPage getRequestedPage(Request request,
078: FitNesseContext context) throws Exception {
079: String resource = request.getResource();
080: WikiPagePath path = PathParser.parse(resource);
081: WikiPage page = context.root.getPageCrawler().getPage(
082: context.root, path);
083: return page;
084: }
085:
086: private SimpleResponse responseWith(byte[] bytes) {
087: SimpleResponse response = new SimpleResponse();
088: response.setContentType("application/octet-stream");
089: response.setContent(bytes);
090: return response;
091: }
092:
093: private byte[] serializeToBytes(Object object) throws IOException {
094: ByteArrayOutputStream byteStream = new ByteArrayOutputStream();
095: ObjectOutputStream os = new ObjectOutputStream(byteStream);
096: os.writeObject(object);
097: os.close();
098: byte[] bytes = byteStream.toByteArray();
099: return bytes;
100: }
101:
102: public SecureOperation getSecureOperation() {
103: return new SecureReadOperation();
104: }
105:
106: }
|