blob: 6f1d46284271dceedf5b73f8418bb38e4861c25a [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.apache.cocoon;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.apache.avalon.framework.context.DefaultContext;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.avalon.framework.service.ServiceException;
import org.apache.avalon.framework.service.ServiceSelector;
import org.apache.cocoon.acting.Action;
import org.apache.cocoon.components.ContextHelper;
import org.apache.cocoon.components.flow.AbstractInterpreter;
import org.apache.cocoon.components.flow.FlowHelper;
import org.apache.cocoon.components.flow.Interpreter;
import org.apache.cocoon.components.source.SourceResolverAdapter;
import org.apache.cocoon.core.container.ContainerTestCase;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.mock.MockContext;
import org.apache.cocoon.environment.mock.MockRedirector;
import org.apache.cocoon.environment.mock.MockRequest;
import org.apache.cocoon.environment.mock.MockResponse;
import org.apache.cocoon.generation.Generator;
import org.apache.cocoon.matching.Matcher;
import org.apache.cocoon.reading.Reader;
import org.apache.cocoon.serialization.Serializer;
import org.apache.cocoon.sitemap.PatternException;
import org.apache.cocoon.transformation.Transformer;
import org.apache.cocoon.xml.WhitespaceFilter;
import org.apache.cocoon.xml.dom.DOMBuilder;
import org.apache.cocoon.xml.dom.DOMStreamer;
import org.apache.excalibur.source.Source;
import org.apache.excalibur.source.SourceResolver;
import org.apache.excalibur.xml.sax.SAXParser;
import org.custommonkey.xmlunit.Diff;
import org.w3c.dom.Document;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
/**
* Testcase for actions, generators, transformers and serializer components.
*
* @author <a href="mailto:stephan@apache.org">Stephan Michels</a>
* @author <a href="mailto:mark.leicester@energyintellect.com">Mark Leicester</a>
* @version CVS $Id$
*/
public abstract class SitemapComponentTestCase extends ContainerTestCase {
public final static Parameters EMPTY_PARAMS = Parameters.EMPTY_PARAMETERS;
private final MockRequest request = new MockRequest();
private final MockResponse response = new MockResponse();
private final MockContext context = new MockContext();
private final MockRedirector redirector = new MockRedirector();
private final Map<String, Object> objectmodel = new HashMap<String, Object>();
public final MockRequest getRequest() {
return request;
}
public final MockResponse getResponse() {
return response;
}
public final MockContext getContext() {
return context;
}
public final MockRedirector getRedirector() {
return redirector;
}
public final Map<String, Object> getObjectModel() {
return objectmodel;
}
protected void addContext(DefaultContext context) {
context.put(ContextHelper.CONTEXT_REQUEST_OBJECT, request);
context.put(ContextHelper.CONTEXT_RESPONSE_OBJECT, response);
context.put(ContextHelper.CONTEXT_OBJECT_MODEL, objectmodel);
}
public void setUp() throws Exception {
super.setUp();
objectmodel.clear();
request.reset();
objectmodel.put(ObjectModelHelper.REQUEST_OBJECT, request);
response.reset();
objectmodel.put(ObjectModelHelper.RESPONSE_OBJECT, response);
context.reset();
objectmodel.put(ObjectModelHelper.CONTEXT_OBJECT, context);
redirector.reset();
}
/**
* Match with a pattern.
*
* @param type Hint of the matcher.
* @param pattern Pattern for the matcher.
* @param parameters Matcher parameters.
*/
public final Map<String, String> match(String type, String pattern, Parameters parameters) throws PatternException {
ServiceSelector selector = null;
Matcher matcher = null;
SourceResolver resolver = null;
try {
selector = (ServiceSelector) this.lookup(Matcher.ROLE +
"Selector");
assertNotNull("Test lookup of matcher selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if matcher name is not null", type);
matcher = (Matcher) selector.select(type);
assertNotNull("Test lookup of matcher", matcher);
@SuppressWarnings("unchecked")
Map<String, String> result = (Map<String, String>) matcher.match(pattern, objectmodel, parameters);
return result;
} catch (ServiceException ce) {
getLogger().error("Could not retrieve matcher", ce);
fail("Could not retrieve matcher: " + ce.toString());
return null;
} finally {
if (matcher != null) {
selector.release(matcher);
}
this.release(selector);
this.release(resolver);
}
}
/**
* Select with a pattern.
*
* @param type Hint of the matcher.
* @param expression Expression for the selector.
* @param parameters Matcher parameters.
*/
public final boolean select(String type, String expression, Parameters parameters) {
ServiceSelector selector = null;
org.apache.cocoon.selection.Selector sel = null;
SourceResolver resolver = null;
boolean result = false;
try {
selector = (ServiceSelector) this.lookup(org.apache.cocoon.selection.Selector.ROLE +
"Selector");
assertNotNull("Test lookup of selector selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if selector name is not null", type);
sel = (org.apache.cocoon.selection.Selector) selector.select(type);
assertNotNull("Test lookup of selector", sel);
result = sel.select(expression, objectmodel, parameters);
} catch (ServiceException ce) {
getLogger().error("Could not retrieve selector", ce);
fail("Could not retrieve selector: " + ce.toString());
} finally {
if (sel != null) {
selector.release(sel);
}
this.release(selector);
this.release(resolver);
}
return result;
}
/**
* Perform the action component.
*
* @param type Hint of the action.
* @param source Source for the action.
* @param parameters Action parameters.
*/
public final Map<String, String> act(String type, String source, Parameters parameters) throws Exception {
redirector.reset();
ServiceSelector selector = null;
Action action = null;
SourceResolver resolver = null;
try {
selector = (ServiceSelector) this.lookup(Action.ROLE +
"Selector");
assertNotNull("Test lookup of action selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if action name is not null", type);
action = (Action) selector.select(type);
assertNotNull("Test lookup of action", action);
@SuppressWarnings("unchecked")
Map<String, String> result = (Map<String, String>) action.act(redirector, new SourceResolverAdapter(resolver),
objectmodel, source, parameters);
return result;
} catch (ServiceException ce) {
getLogger().error("Could not retrieve action", ce);
fail("Could not retrieve action: " + ce.toString());
return null;
} finally {
if (action != null) {
selector.release(action);
}
this.release(selector);
this.release(resolver);
}
}
/**
* Generate the generator output.
*
* @param type Hint of the generator.
* @param source Source for the generator.
* @param parameters Generator parameters.
*/
public final Document generate(String type, String source, Parameters parameters)
throws IOException, SAXException, ProcessingException {
ServiceSelector selector = null;
Generator generator = null;
SourceResolver resolver = null;
SAXParser parser = null;
Document document = null;
try {
selector = (ServiceSelector) this.lookup(Generator.ROLE +
"Selector");
assertNotNull("Test lookup of generator selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
parser = (SAXParser) this.lookup(SAXParser.ROLE);
assertNotNull("Test lookup of parser", parser);
assertNotNull("Test if generator name is not null", type);
generator = (Generator) selector.select(type);
assertNotNull("Test lookup of generator", generator);
generator.setup(new SourceResolverAdapter(resolver),
objectmodel, source, parameters);
DOMBuilder builder = new DOMBuilder();
generator.setConsumer(new WhitespaceFilter(builder));
generator.generate();
document = builder.getDocument();
assertNotNull("Test for generator document", document);
} catch (ServiceException ce) {
getLogger().error("Could not retrieve generator", ce);
fail("Could not retrieve generator: " + ce.toString());
} finally {
if (generator != null) {
selector.release(generator);
}
this.release(selector);
this.release(resolver);
this.release(parser);
}
return document;
}
/**
* Trannsform a document by a transformer
*
* @param type Hint of the transformer.
* @param source Source for the transformer.
* @param parameters Generator parameters.
* @param input Input document.
*/
public final Document transform(String type, String source, Parameters parameters, Document input)
throws SAXException, ProcessingException, IOException {
ServiceSelector selector = null;
Transformer transformer = null;
SourceResolver resolver = null;
SAXParser parser = null;
Source inputsource = null;
assertNotNull("Test for component manager", this.getManager());
Document document = null;
try {
selector = (ServiceSelector) this.lookup(Transformer.ROLE+
"Selector");
assertNotNull("Test lookup of transformer selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
parser = (SAXParser) this.lookup(SAXParser.ROLE);
assertNotNull("Test lookup of parser", parser);
assertNotNull("Test if transformer name is not null", type);
transformer = (Transformer) selector.select(type);
assertNotNull("Test lookup of transformer", transformer);
transformer.setup(new SourceResolverAdapter(resolver),
objectmodel, source, parameters);
DOMBuilder builder = new DOMBuilder();
transformer.setConsumer(new WhitespaceFilter(builder));
assertNotNull("Test if input document is not null", input);
DOMStreamer streamer = new DOMStreamer(transformer);
streamer.stream(input);
document = builder.getDocument();
assertNotNull("Test for transformer document", document);
} catch (ServiceException ce) {
getLogger().error("Could not retrieve transformer", ce);
ce.printStackTrace();
fail("Could not retrieve transformer:"+ce.toString());
} finally {
if (transformer!=null) {
selector.release(transformer);
}
if (selector!=null) {
this.release(selector);
}
if (inputsource!=null) {
resolver.release(inputsource);
}
if (resolver!=null) {
this.release(resolver);
}
if (parser!=null) {
this.release(parser);
}
}
return document;
}
/**
* Serialize a document by a serializer
*
* @param type Hint of the serializer.
* @param parameters Serializer parameters.
* @param input Input document.
*
* @return Serialized data.
*/
public final byte[] serialize(String type, Parameters parameters,
Document input) throws SAXException, IOException{
ServiceSelector selector = null;
Serializer serializer = null;
SourceResolver resolver = null;
Source inputsource = null;
assertNotNull("Test for component manager", this.getManager());
ByteArrayOutputStream document = null;
try {
selector = (ServiceSelector) this.lookup(Serializer.ROLE+
"Selector");
assertNotNull("Test lookup of serializer selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if serializer name is not null", type);
serializer = (Serializer) selector.select(type);
assertNotNull("Test lookup of serializer", serializer);
document = new ByteArrayOutputStream();
serializer.setOutputStream(document);
assertNotNull("Test if input document is not null", input);
DOMStreamer streamer = new DOMStreamer(serializer);
streamer.stream(input);
} catch (ServiceException ce) {
getLogger().error("Could not retrieve serializer", ce);
fail("Could not retrieve serializer:"+ce.toString());
} finally {
if (serializer!=null) {
selector.release(serializer);
}
if (selector!=null) {
this.release(selector);
}
if (inputsource!=null) {
resolver.release(inputsource);
}
if (resolver!=null) {
this.release(resolver);
}
}
return document.toByteArray();
}
public final byte[] read(String type, Parameters parameters, String source) throws SAXException, IOException, ProcessingException {
ServiceSelector selector = null;
Reader reader = null;
SourceResolver resolver = null;
Source inputsource = null;
assertNotNull("Test for component manager", this.getManager());
ByteArrayOutputStream document = null;
try {
selector = (ServiceSelector) this.lookup(Reader.ROLE+
"Selector");
assertNotNull("Test lookup of serializer selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if reader name is not null", type);
reader = (Reader) selector.select(type);
assertNotNull("Test lookup of reader", reader);
reader.setup(new SourceResolverAdapter(resolver),
this.getObjectModel(), source, parameters);
document = new ByteArrayOutputStream();
reader.setOutputStream(document);
reader.generate();
} catch (ServiceException ce) {
getLogger().error("Could not retrieve serializer", ce);
fail("Could not retrieve serializer:"+ce.toString());
} finally {
if (reader!=null) {
selector.release(reader);
}
if (selector!=null) {
this.release(selector);
}
if (inputsource!=null) {
resolver.release(inputsource);
}
if (resolver!=null) {
this.release(resolver);
}
}
return document.toByteArray();
}
public String callFunction(String type, String source, String function, Map<String, String> params) throws Exception {
redirector.reset();
ServiceSelector selector = null;
Interpreter interpreter = null;
SourceResolver resolver = null;
try {
selector = (ServiceSelector) this.lookup(Interpreter.ROLE);
assertNotNull("Test lookup of interpreter selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if interpreter name is not null", type);
interpreter = (Interpreter) selector.select(type);
assertNotNull("Test lookup of interpreter", interpreter);
((AbstractInterpreter)interpreter).register(source);
List<Interpreter.Argument> parameters = new ArrayList<Interpreter.Argument>();
for (Map.Entry<String, String> entry : params.entrySet()) {
String name = entry.getKey();
String value = entry.getValue();
parameters.add(new Interpreter.Argument(name, value));
}
interpreter.callFunction(function, parameters, getRedirector());
} catch (ServiceException ce) {
getLogger().error("Could not retrieve interpeter", ce);
fail("Could not retrieve interpreter: " + ce.toString());
} finally {
if (interpreter != null) {
selector.release(interpreter);
}
this.release(selector);
this.release(resolver);
}
return FlowHelper.getWebContinuation(getObjectModel()).getId();
}
public String callContinuation(String type, String source, String id, Map<String, String> params) throws Exception {
redirector.reset();
ServiceSelector selector = null;
Interpreter interpreter = null;
SourceResolver resolver = null;
try {
selector = (ServiceSelector) this.lookup(Interpreter.ROLE);
assertNotNull("Test lookup of interpreter selector", selector);
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
assertNotNull("Test if interpreter name is not null", type);
interpreter = (Interpreter) selector.select(type);
assertNotNull("Test lookup of interpreter", interpreter);
((AbstractInterpreter)interpreter).register(source);
List<Interpreter.Argument> parameters = new ArrayList<Interpreter.Argument>();
for (Map.Entry<String, String> entry : params.entrySet()) {
String name = entry.getKey();
String value = entry.getValue();
parameters.add(new Interpreter.Argument(name, value));
}
interpreter.handleContinuation(id, parameters, getRedirector());
} catch (ServiceException ce) {
getLogger().error("Could not retrieve interpreter", ce);
fail("Could not retrieve interpreter: " + ce.toString());
} finally {
if (interpreter != null) {
selector.release(interpreter);
}
this.release(selector);
this.release(resolver);
}
return FlowHelper.getWebContinuation(getObjectModel()).getId();
}
public Object getFlowContextObject() {
return FlowHelper.getContextObject(getObjectModel());
}
public final void print(Document document) {
TransformerFactory factory = TransformerFactory.newInstance();
try {
javax.xml.transform.Transformer serializer = factory.newTransformer();
serializer.transform(new DOMSource(document), new StreamResult(System.out));
System.out.println();
}
catch (TransformerException ex) {
ex.printStackTrace();
}
}
public final Document load(String source) {
SourceResolver resolver = null;
SAXParser parser = null;
Source assertionsource = null;
assertNotNull("Test for component manager", this.getManager());
Document assertiondocument = null;
try {
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
parser = (SAXParser) this.lookup(SAXParser.ROLE);
assertNotNull("Test lookup of parser", parser);
assertNotNull("Test if assertion document is not null",
source);
assertionsource = resolver.resolveURI(source);
assertNotNull("Test lookup of assertion source",
assertionsource);
assertTrue("Test if source exist", assertionsource.exists());
DOMBuilder builder = new DOMBuilder();
assertNotNull("Test if inputstream of the assertion source is not null",
assertionsource.getInputStream());
parser.parse(new InputSource(assertionsource.getInputStream()),
new WhitespaceFilter(builder),
builder);
assertiondocument = builder.getDocument();
assertNotNull("Test if assertion document exists", assertiondocument);
} catch (ServiceException ce) {
getLogger().error("Could not retrieve generator", ce);
fail("Could not retrieve generator: " + ce.toString());
} catch (Exception e) {
getLogger().error("Could not execute test", e);
fail("Could not execute test: " + e);
} finally {
if (resolver != null) {
resolver.release(assertionsource);
}
this.release(resolver);
this.release(parser);
}
return assertiondocument;
}
/**
* Load a binary document.
*
* @param source Source location.
*
* @return Binary data.
*/
public final byte[] loadByteArray(String source) {
SourceResolver resolver = null;
SAXParser parser = null;
Source assertionsource = null;
assertNotNull("Test for component manager", this.getManager());
byte[] assertiondocument = null;
try {
resolver = (SourceResolver) this.lookup(SourceResolver.ROLE);
assertNotNull("Test lookup of source resolver", resolver);
parser = (SAXParser) this.lookup(SAXParser.ROLE);
assertNotNull("Test lookup of parser", parser);
assertNotNull("Test if assertion document is not null", source);
assertionsource = resolver.resolveURI(source);
assertNotNull("Test lookup of assertion source", assertionsource);
assertTrue("Test if source exist", assertionsource.exists());
assertNotNull("Test if inputstream of the assertion source is not null",
assertionsource.getInputStream());
InputStream input = assertionsource.getInputStream();
long size = assertionsource.getContentLength();
assertiondocument = new byte[(int) size];
int i = 0;
int c;
while ((c = input.read())!=-1) {
assertiondocument[i] = (byte) c;
i++;
}
} catch (ServiceException ce) {
getLogger().error("Could not retrieve generator", ce);
fail("Could not retrieve generator: "+ce.toString());
} catch (Exception e) {
getLogger().error("Could not execute test", e);
fail("Could not execute test: "+e);
} finally {
if (resolver!=null) {
resolver.release(assertionsource);
}
this.release(resolver);
this.release(parser);
}
return assertiondocument;
}
/**
* Compare two XML documents provided as strings
* @param control Control document
* @param test Document to test
* @return Diff object describing differences in documents
*/
public final Diff compareXML(Document control, Document test) {
return new Diff(control, test);
}
/**
* Assert that the result of an XML comparison is similar.
*
* @param msg The assertion message
* @param expected The expected XML document
* @param actual The actual XML Document
*/
public final void assertEqual(String msg, Document expected, Document actual) {
expected.getDocumentElement().normalize();
actual.getDocumentElement().normalize();
Diff diff = compareXML(expected, actual);
assertTrue(msg + ", " + diff.toString(), diff.similar());
}
/**
* Assert that the result of an XML comparison is similar.
*
* @param expected The expected XML document
* @param actual The actual XML Document
*/
public final void assertEqual(Document expected, Document actual) {
expected.getDocumentElement().normalize();
actual.getDocumentElement().normalize();
Diff diff = compareXML(expected, actual);
assertTrue("Test if the assertion document is equal, " + diff.toString(), diff.similar());
}
/**
* Assert that the result of an XML comparison is identical.
*
* @param msg The assertion message
* @param expected The expected XML document
* @param actual The actual XML Document
*/
public final void assertIdentical(String msg, Document expected, Document actual) {
expected.getDocumentElement().normalize();
actual.getDocumentElement().normalize();
Diff diff = compareXML(expected, actual);
assertTrue(msg + ", " + diff.toString(), diff.identical());
}
/**
* Assert that the result of an XML comparison is identical.
*
* @param expected The expected XML document
* @param actual The actual XML Document
*/
public final void assertIdentical(Document expected, Document actual) {
expected.getDocumentElement().normalize();
actual.getDocumentElement().normalize();
Diff diff = compareXML(expected, actual);
assertTrue("Test if the assertion document is equal, " + diff.toString(), diff.identical());
}
/**
* Assert that the result of a byte comparison is identical.
*
* @param expected The expected byte array
* @param actual The actual byte array
*/
public final void assertIdentical(byte[] expected, byte[] actual) {
assertEquals("Byte arrays of differing sizes, ", expected.length,
actual.length);
if (expected.length>0) {
for (int i = 0; i<expected.length; i++) {
assertEquals("Byte array differs at index "+i, expected[i],
actual[i]);
}
}
}
}