blob: be2c6ad450b793b058c85f8cd89c0f96d4a80d83 [file] [log] [blame]
/*
* Copyright 1999-2004 The Apache Software 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.apache.cocoon.generation;
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
import java.util.Enumeration;
import java.util.Map;
import org.apache.avalon.framework.CascadingRuntimeException;
import org.apache.avalon.framework.parameters.ParameterException;
import org.apache.avalon.framework.parameters.Parameterizable;
import org.apache.avalon.framework.parameters.Parameters;
import org.apache.cocoon.ProcessingException;
import org.apache.cocoon.environment.ObjectModelHelper;
import org.apache.cocoon.environment.Request;
import org.apache.cocoon.environment.SourceResolver;
import org.apache.cocoon.xml.XMLUtils;
import org.apache.cocoon.xml.IncludeXMLConsumer;
import org.apache.excalibur.xml.sax.SAXParser;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.AttributesImpl;
/**
* Generates an XML representation of the incoming request.
* <p>
* <b>Configuration options:</b>
* <dl>
* <dt> <i>container-encoding</i> (optional)
* <dd> The encoding used by container. Default value is ISO-8859-1.
* <dt> <i>form-encoding</i> (optional)
* <dd> The supposed encoding of the request parameter. Default is null.
* <dt> <i>generate-attributes</i> (optional)
* <dd> If true, request attributes were also included. Default is false.
* </dl>
* These configuration options are supported at both declaration and use time.
* The configuration at use time takes priority over declaration time.
*
* @author <a href="mailto:pier@apache.org">Pierpaolo Fumagalli</a>
* @author <a href="mailto:Giacomo.Pati@pwr.ch">Giacomo Pati</a>
* @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a>
* @author <a href="mailto:stefano@apache.org">Stefano Mazzocchi</a>
* @version CVS $Id: RequestGenerator.java,v 1.9 2004/03/05 13:02:55 bdelacretaz Exp $
*/
public class RequestGenerator extends ServiceableGenerator implements Parameterizable {
/** The namespace prefix of this generator. */
private final static String PREFIX = "h";
/** The namespace URI of this generator. */
private final static String URI = "http://apache.org/cocoon/request/2.0";
/** The configured container encoding at declaration time. */
private String global_container_encoding;
/** The configured container encoding at use time. */
private String container_encoding;
/** The configured form encoding at declaration time. */
private String global_form_encoding;
/** The configured form encoding at use time. */
private String form_encoding;
/** The configuration for including request attributes at declaration time. */
private boolean global_generate_attributes;
/** The configuration for including request attributes at use time. */
private boolean generate_attributes;
public void parameterize(Parameters parameters)
throws ParameterException {
global_container_encoding = parameters.getParameter("container-encoding", "ISO-8859-1");
global_form_encoding = parameters.getParameter("form-encoding", null);
global_generate_attributes = parameters.getParameterAsBoolean("generate-attributes", false);
}
public void setup(SourceResolver resolver, Map objectModel, String src, Parameters parameters)
throws ProcessingException, SAXException, IOException {
super.setup(resolver, objectModel, src, parameters);
container_encoding = parameters.getParameter("container-encoding", global_container_encoding);
form_encoding = parameters.getParameter("form-encoding", global_form_encoding);
generate_attributes = parameters.getParameterAsBoolean("generate-attributes", global_generate_attributes);
}
/**
* Generate XML data.
*/
public void generate()
throws SAXException {
final Request request = ObjectModelHelper.getRequest(objectModel);
final AttributesImpl attr = new AttributesImpl();
this.contentHandler.startDocument();
this.contentHandler.startPrefixMapping(PREFIX, URI);
attribute(attr, "target", request.getRequestURI());
attribute(attr, "sitemap", request.getSitemapURI());
attribute(attr, "source", (this.source != null ? this.source : ""));
start("request", attr);
start("requestHeaders", attr);
Enumeration headers = request.getHeaderNames();
while (headers.hasMoreElements()) {
String header = (String)headers.nextElement();
attribute(attr, "name", header);
start("header", attr);
data(request.getHeader(header));
end("header");
}
end("requestHeaders");
start("requestParameters", attr);
Enumeration parameters = request.getParameterNames();
while (parameters.hasMoreElements()) {
String parameter = (String)parameters.nextElement();
attribute(attr, "name", parameter);
start("parameter", attr);
String values[] = request.getParameterValues(parameter);
if (values != null) {
for (int x = 0; x < values.length; x++) {
start("value", attr);
if (form_encoding != null) {
try {
data(values[x], container_encoding, form_encoding);
} catch (UnsupportedEncodingException uee) {
throw new CascadingRuntimeException("The suggested encoding is not supported.", uee);
}
} else if (parameter.startsWith("xml:")) {
try {
parse(values[x]);
} catch (Exception e) {
throw new CascadingRuntimeException("Could not parse the xml parameter", e);
}
} else {
data(values[x]);
}
end("value");
}
}
end("parameter");
}
end("requestParameters");
if (generate_attributes) {
start("requestAttributes", attr);
Enumeration attributes = request.getAttributeNames();
while (attributes.hasMoreElements()) {
String attribute = (String)attributes.nextElement();
attribute(attr, "name", attribute);
start("attribute", attr);
Object value = request.getAttribute(attribute);
if (value != null) {
start("value", attr);
XMLUtils.valueOf(this.contentHandler, value);
end("value");
}
end("attribute");
}
end("requestAttributes");
}
this.start("configurationParameters", attr);
String[] confparams = super.parameters.getNames();
for (int i = 0; i < confparams.length; i++) {
attribute(attr, "name", confparams[i]);
start("parameter", attr);
data(super.parameters.getParameter(confparams[i], ""));
end("parameter");
}
end("configurationParameters");
end("request");
this.contentHandler.endPrefixMapping(PREFIX);
this.contentHandler.endDocument();
}
private void attribute(AttributesImpl attr, String name, String value) {
attr.addAttribute("", name, name, "CDATA", value);
}
private void start(String name, AttributesImpl attr)
throws SAXException {
super.contentHandler.startElement(URI, name, PREFIX + ":" + name, attr);
attr.clear();
}
private void end(String name)
throws SAXException {
super.contentHandler.endElement(URI, name, PREFIX + ":" + name);
}
private void data(String data)
throws SAXException {
super.contentHandler.characters(data.toCharArray(), 0, data.length());
}
private void data(String data, String container_encoding, String form_encoding)
throws SAXException, UnsupportedEncodingException {
this.data(new String(data.getBytes(container_encoding), form_encoding));
}
private void parse(String data)
throws Exception {
SAXParser parser = null;
try {
parser = (SAXParser) manager.lookup(SAXParser.ROLE);
InputSource is = new InputSource(new StringReader(data));
parser.parse(is, new IncludeXMLConsumer(super.xmlConsumer));
} finally {
manager.release(parser);
}
}
}