| /* |
| * 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.components.language.markup.xsp; |
| |
| import org.apache.avalon.framework.CascadingRuntimeException; |
| import org.apache.cocoon.Constants; |
| import org.apache.cocoon.environment.ObjectModelHelper; |
| import org.apache.cocoon.environment.Request; |
| import org.apache.cocoon.environment.Session; |
| |
| import org.xml.sax.ContentHandler; |
| import org.xml.sax.SAXException; |
| import org.xml.sax.helpers.AttributesImpl; |
| |
| import java.util.ArrayList; |
| import java.util.Date; |
| import java.util.Enumeration; |
| import java.util.Locale; |
| import java.util.Map; |
| |
| /** |
| * The <code>Request</code> object helper |
| * |
| * @author <a href="mailto:ricardo@apache.org">Ricardo Rocha</a> |
| * @version CVS $Id$ |
| */ |
| public class XSPRequestHelper { |
| /** |
| * Assign values to the object's namespace uri and prefix |
| */ |
| private static final String URI = Constants.XSP_REQUEST_URI; |
| private static final String PREFIX = Constants.XSP_REQUEST_PREFIX; |
| |
| private static void getLocale(Locale locale, ContentHandler handler) |
| throws SAXException |
| { |
| XSPObjectHelper.start(URI, PREFIX, handler, "locale"); |
| |
| XSPObjectHelper.elementData(URI, PREFIX, handler, "language", |
| locale.getLanguage()); |
| XSPObjectHelper.elementData(URI, PREFIX, handler, "country", |
| locale.getCountry()); |
| XSPObjectHelper.elementData(URI, PREFIX, handler, "variant", |
| locale.getVariant()); |
| |
| XSPObjectHelper.end(URI, PREFIX, handler, "locale"); |
| } |
| |
| public static void getLocale(Map objectModel, ContentHandler handler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| getLocale(request.getLocale(), handler); |
| } |
| |
| /** |
| * Return the request locales as array |
| * @return Array containing request locales. |
| */ |
| public static Locale[] getLocales(Map objectModel) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| ArrayList a = new ArrayList(10); |
| Enumeration e = request.getLocales(); |
| while (e.hasMoreElements()) { |
| a.add(e.nextElement()); |
| } |
| |
| return (Locale[])a.toArray(new Locale[a.size()]); |
| } |
| |
| /** |
| * Output request locales |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getLocales(Map objectModel, ContentHandler contentHandler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, "locales"); |
| Enumeration e = request.getLocales(); |
| while (e.hasMoreElements()) { |
| getLocale((Locale)e.nextElement(), contentHandler); |
| } |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "locales"); |
| } |
| |
| /** |
| * Return the given request parameter value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param name The parameter name |
| * @param defaultValue Value to substitute in absence of a parameter value |
| */ |
| public static String getParameter(Map objectModel, String name, |
| String defaultValue) { |
| return getParameter(objectModel, name, defaultValue, null, null); |
| } |
| |
| /** |
| * Return the given request parameter value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param name The parameter name |
| * @param defaultValue Value to substitute in absence of a parameter value |
| * @param form_encoding The supposed encoding of the request parameter. |
| * @param container_encoding The encoding used by container. |
| */ |
| public static String getParameter(Map objectModel, String name, |
| String defaultValue, String form_encoding, |
| String container_encoding) { |
| if(container_encoding == null) |
| container_encoding = "ISO-8859-1"; // default per Servlet spec |
| |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| String value = request.getParameter(name); |
| if(form_encoding != null && value != null && value.length() > 0) { |
| try { |
| value = new String(value.getBytes(container_encoding), form_encoding); |
| } catch(java.io.UnsupportedEncodingException uee) { |
| throw new CascadingRuntimeException("Unsupported Encoding Exception", uee); |
| } |
| } |
| |
| if (value == null) { |
| value = defaultValue; |
| } |
| |
| return value; |
| } |
| |
| /** |
| * Output the given request parameter value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @param name The parameter name |
| * @param defaultValue Value to substitute in absence of a parameter value |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getParameter(Map objectModel, ContentHandler contentHandler, |
| String name, String defaultValue) |
| throws SAXException { |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "parameter", |
| getParameter(objectModel, name, defaultValue, null, null), attr); |
| } |
| |
| /** |
| * Output the given request parameter value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @param name The parameter name |
| * @param defaultValue Value to substitute in absence of a parameter value |
| * @param form_encoding The supposed encoding of the request parameter. |
| * @param container_encoding The encoding used by container. |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getParameter(Map objectModel, ContentHandler contentHandler, |
| String name, String defaultValue, |
| String form_encoding, |
| String container_encoding) |
| throws SAXException { |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "parameter", |
| String.valueOf(getParameter(objectModel, name, defaultValue, |
| form_encoding, container_encoding)), attr); |
| } |
| |
| /** |
| * Output the request parameter values for a given name |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getParameterValues(Map objectModel, |
| ContentHandler contentHandler, |
| String name) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, |
| "parameter-values", attr); |
| |
| String[] values = request.getParameterValues(name); |
| |
| if (values != null) { |
| for (int i = 0; i < values.length; i++) { |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, |
| "value", values[i]); |
| } |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "parameter-values"); |
| } |
| |
| /** |
| * Output the request parameter values for a given name |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @param form_encoding The supposed encoding of the request parameter. |
| * @param container_encoding The encoding used by container. |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getParameterValues(Map objectModel, |
| ContentHandler contentHandler, |
| String name, String form_encoding, |
| String container_encoding) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, |
| "parameter-values", attr); |
| |
| String[] values = request.getParameterValues(name); |
| if (values != null) { |
| for (int i = 0; i < values.length; i++) { |
| if(form_encoding != null && values[i] != null && |
| values[i].length() > 0) { |
| try { |
| values[i] = new String(values[i].getBytes(container_encoding), |
| form_encoding); |
| } catch(java.io.UnsupportedEncodingException uee) { |
| throw new CascadingRuntimeException("Unsupported Encoding Exception", uee); |
| } |
| } |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, |
| "value", values[i]); |
| } |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "parameter-values"); |
| } |
| |
| /** |
| * return the request parameter values for a given name as array |
| * |
| * @param objectModel The Map objectModel |
| * @param form_encoding The supposed encoding of the request parameter. |
| * @param container_encoding The encoding used by container. |
| * @return Array containing requested values. |
| */ |
| public static String[] getParameterValues(Map objectModel, String name, |
| String form_encoding, |
| String container_encoding) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| String[] values = request.getParameterValues(name); |
| |
| if (values != null) { |
| for (int i = 0; i < values.length; i++) { |
| if(form_encoding != null && values[i] != null && |
| values[i].length() > 0) { |
| try { |
| values[i] = new String(values[i].getBytes(container_encoding), |
| form_encoding); |
| } catch(java.io.UnsupportedEncodingException uee) { |
| throw new CascadingRuntimeException("Unsupported Encoding Exception", uee); |
| } |
| } |
| } |
| } |
| return values; |
| } |
| |
| /** |
| * return the request parameter names as array |
| * |
| * @return Array containing parameter names. |
| */ |
| public static String[] getParameterNames(Map objectModel) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| ArrayList a = new ArrayList(10); |
| Enumeration e = request.getParameterNames(); |
| while (e.hasMoreElements()) { |
| a.add(e.nextElement()); |
| } |
| |
| return (String[])a.toArray(new String[a.size()]); |
| } |
| |
| /** |
| * Output parameter names for a given request |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getParameterNames(Map objectModel, |
| ContentHandler contentHandler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, "parameter-names"); |
| |
| Enumeration e = request.getParameterNames(); |
| while (e.hasMoreElements()) { |
| String name = (String) e.nextElement(); |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "name", name); |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "parameter-names"); |
| } |
| |
| /** |
| * Output the header names for a given request |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getHeaderNames(Map objectModel, |
| ContentHandler contentHandler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, "header-names"); |
| |
| Enumeration e = request.getHeaderNames(); |
| while (e.hasMoreElements()) { |
| String name = (String) e.nextElement(); |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "name", name); |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "header-names"); |
| } |
| |
| /** |
| * Returns the header names for a given request |
| * |
| * @param objectModel The Map objectModel |
| */ |
| public static String[] getHeaderNames(Map objectModel) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| ArrayList a = new ArrayList(10); |
| Enumeration e = request.getHeaderNames(); |
| while (e.hasMoreElements()) { |
| a.add(e.nextElement()); |
| } |
| |
| return (String[])a.toArray(new String[a.size()]); |
| } |
| |
| public static String[] getHeaders(Map objectModel, String name) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| ArrayList a = new ArrayList(10); |
| Enumeration e = request.getHeaders(name); |
| while (e.hasMoreElements()) { |
| a.add(e.nextElement()); |
| } |
| |
| return (String[])a.toArray(new String[a.size()]); |
| } |
| |
| public static void getHeaders(Map objectModel, String name, |
| ContentHandler contentHandler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, "header-values"); |
| |
| Enumeration e = request.getHeaders(name); |
| while (e.hasMoreElements()) { |
| String value = (String) e.nextElement(); |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "value", value); |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "header-values"); |
| } |
| |
| public static Date getDateHeader(Map objectModel, String name) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| if (name == null || name.length() == 0) { |
| return null; |
| } |
| long dateHeader = request.getDateHeader(name); |
| if (dateHeader == -1) { |
| return null; |
| } |
| return new Date(dateHeader); |
| } |
| |
| public static String getDateHeader(Map objectModel, String name, String format) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| if (name == null || name.length() == 0) { |
| return null; |
| } |
| long dateHeader = request.getDateHeader(name); |
| if (dateHeader == -1) { |
| return null; |
| } |
| if (format != null) format = format.trim(); |
| return XSPUtil.formatDate(new Date(dateHeader), format); |
| } |
| |
| /** |
| * Output attribute names for a given request |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getAttributeNames(Map objectModel, |
| ContentHandler contentHandler) |
| throws SAXException { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| XSPObjectHelper.start(URI, PREFIX, contentHandler, "attribute-names"); |
| |
| Enumeration e = request.getAttributeNames(); |
| while (e.hasMoreElements()) { |
| String name = (String) e.nextElement(); |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "name", name); |
| } |
| |
| XSPObjectHelper.end(URI, PREFIX, contentHandler, "attribute-names"); |
| } |
| |
| /** |
| * Returns the attribute names |
| * |
| * @param objectModel The Map objectModel |
| */ |
| public static String[] getAttributeNames(Map objectModel) |
| { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| |
| ArrayList a = new ArrayList(10); |
| Enumeration e = request.getAttributeNames(); |
| while (e.hasMoreElements()) { |
| a.add(e.nextElement()); |
| } |
| |
| return (String[])a.toArray(new String[a.size()]); |
| } |
| |
| public static String getRequestedURL(Map objectModel) { |
| Request request = ObjectModelHelper.getRequest(objectModel); |
| StringBuffer uribuf = null; |
| boolean isSecure = request.isSecure(); |
| int port = request.getServerPort(); |
| |
| if (isSecure) { |
| uribuf = new StringBuffer("https://"); |
| } else { |
| uribuf = new StringBuffer("http://"); |
| } |
| |
| uribuf.append(request.getServerName()); |
| if (isSecure) { |
| if (port != 443) { |
| uribuf.append(":").append(port); |
| } |
| } else { |
| if (port != 80) { |
| uribuf.append(":").append(port); |
| } |
| } |
| |
| uribuf.append(request.getRequestURI()); |
| return uribuf.toString(); |
| } |
| |
| /** |
| * Return the given session attribute value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param name The attribute name |
| * @param defaultValue Value to substitute in absence of a attribute value |
| */ |
| public static Object getSessionAttribute(Map objectModel, String name, |
| Object defaultValue ) { |
| |
| Session session = ObjectModelHelper.getRequest(objectModel).getSession(); |
| Object obj = session.getAttribute(name); |
| return (obj != null ? obj : defaultValue ); |
| } |
| |
| /** |
| * Output the given session attribute value or a user-provided default if |
| * none was specified. |
| * |
| * @param objectModel The Map objectModel |
| * @param contentHandler The SAX content handler |
| * @param name The attribute name |
| * @param defaultValue Value to substitute in absence of an attribute value |
| * @exception SAXException If a SAX error occurs |
| */ |
| public static void getSessionAttribute(Map objectModel, ContentHandler contentHandler, |
| String name, Object defaultValue) |
| throws SAXException { |
| AttributesImpl attr = new AttributesImpl(); |
| XSPObjectHelper.addAttribute(attr, "name", name); |
| |
| XSPObjectHelper.elementData(URI, PREFIX, contentHandler, "parameter", |
| getSessionAttribute(objectModel, name, defaultValue).toString(), attr); |
| } |
| } |