/* * 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.cocoon.Constants; import org.apache.cocoon.environment.Cookie; import org.apache.cocoon.environment.ObjectModelHelper; import org.apache.cocoon.environment.Request; import org.apache.cocoon.environment.Response; import org.apache.commons.lang.BooleanUtils; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import java.util.Enumeration; import java.util.Hashtable; import java.util.Map; /** * This class is a helper class used by Cookie logicsheet * * This class contains following methods: * <pre> * public static void addCookie(Map , String , String , String , String , * int , String , String , int); * public static Cookie[] getCookies(Map); * public static void getCookies(Map , ContentHandler) * throws SAXException; * public static Cookie getCookie(Map , String ,int ) * throws SAXException; * public static void getCookie(Map ,String ,int , ContentHandler) * throws SAXException; * public static String getComment(Map ,String , int); * public static String getDomain(Map , String , int); * public static String getMaxAge(Map ,String , int); * public static String getName(Map ,String , int); * public static String getPath(Map , String , int); * public static String getSecure(Map , String , int); * public static String getValue(Map , String , int); * public static String getVersion(Map , String , int); * private static String returnCookieProperty(Map ,String ,int ,String ); * </pre> * * @version CVS $Id$ */ public class XSPCookieHelper extends XSPObjectHelper { /** * Assign values to the object's namespace uri and prefix */ private static final String URI = Constants.XSP_COOKIE_URI; private static final String PREFIX = Constants.XSP_COOKIE_PREFIX; /** * This method will set a new cookie with values that are passed through parameters * * @param objectModel * @param name name to be set for the cookie * @param value value to be set for the cookie * @param comment comment to be set for the cookie * @param domain domain to be set for the cookie * @param maxage maxage to be set for the cookie * @param path path to be set for the cookie * @param secure secure property to be set for the cookie * @param version version to be set for the cookie */ public static void addCookie(Map objectModel, String name, String value, String comment, String domain, int maxage, String path, String secure, int version) { Response response = ObjectModelHelper.getResponse(objectModel); Cookie cookieToSet = response.createCookie(name,value); if ((comment.trim()).length() > 0) cookieToSet.setComment(comment); if ((domain.trim()).length() > 0) cookieToSet.setDomain(domain); if (maxage > 0) cookieToSet.setMaxAge(maxage); if ((path.trim()).length() > 0) cookieToSet.setPath("/"); cookieToSet.setSecure(BooleanUtils.toBoolean(secure)); cookieToSet.setVersion(version); response.addCookie(cookieToSet); } /** * This method is used to return all the cookies that present in the passed request object * * @param objectModel * @return an array of Cookie is returned */ public static Cookie[] getCookies(Map objectModel) { Request request = ObjectModelHelper.getRequest(objectModel); return request.getCookies(); } /** * This method is used to write the values of all the cookies in the resulting XML tree * The structure that will be added to the XML tree will be * <pre> * <cookies> * <cookie> * <name>......</name> * <value>.....</value> * <comment>...</comment> * <domain>....</domain> * <maxage>....</maxage> * <path>......</path> * <secure>....</secure> * <version>...</version> * </cookie> * <cookie> * ... * </cookie> * ... * </cookies> * </pre> * If the values of any of these is not present those tags will not be present. * @param objectModel * @param contentHandler * @exception SAXException */ public static void getCookies(Map objectModel, ContentHandler contentHandler) throws SAXException { Request request = ObjectModelHelper.getRequest(objectModel); Cookie[] cookies = request.getCookies(); if(cookies != null && cookies.length > 0) { int count = 0; String tempStr = null; Hashtable nodeTable = new Hashtable(); XSPObjectHelper.start(URI, PREFIX, contentHandler, "cookies"); for(count=0; count<cookies.length; count++) { XSPObjectHelper.start(URI, PREFIX, contentHandler, "cookie"); if ((tempStr = getName(objectModel , null , count)) != null) nodeTable.put("name", tempStr); if((tempStr = getValue(objectModel , null , count))!=null) nodeTable.put("value", tempStr); if((tempStr = getComment(objectModel , null , count))!=null) nodeTable.put("comment", tempStr); if((tempStr = getDomain(objectModel , null , count))!= null) nodeTable.put("domain", tempStr); if((tempStr = getMaxAge(objectModel , null , count))!=null) nodeTable.put("maxage", tempStr); if((tempStr = getPath(objectModel , null , count)) != null) nodeTable.put("path", tempStr); if((tempStr = getSecure(objectModel , null , count)) !=null) nodeTable.put("secure", tempStr); if((tempStr = getVersion(objectModel , null , count)) != null) nodeTable.put("version", tempStr); Enumeration keys = nodeTable.keys(); while (keys.hasMoreElements()) { String nodeName = (String)keys.nextElement(); String nodeValue = (String)nodeTable.get(nodeName); XSPObjectHelper.elementData(URI, PREFIX, contentHandler, nodeName, nodeValue); } XSPObjectHelper.end(URI, PREFIX, contentHandler, "cookie"); } XSPObjectHelper.end(URI, PREFIX, contentHandler, "cookies"); } } /** * Method used to return a cookie object based on the name or the index that was passed * * If both name and index of cookie to be extracted is passed in, name will take * precedence. Basic thing followed is that, when name is passed, index should be -1 and * when index is passed name should null * * @param objectModel * @param cookieName Name of the cookie which is to be found and returned back * @param cookieIndex Index of the cookie which is to be found and returned * @return cookie object is returned */ public static Cookie getCookie(Map objectModel, String cookieName, int cookieIndex) { boolean retrieveByName = false; boolean retrieveByIndex = false; boolean matchFound = false; int count = 0; Request request = ObjectModelHelper.getRequest(objectModel); Cookie currentCookie = null; if (cookieName != null) { retrieveByName = true; } else if (cookieIndex >=0) { retrieveByIndex = true; } Cookie[] cookies = request.getCookies(); if (cookies != null && retrieveByName) { for(count = 0; count < cookies.length; count++) { currentCookie = cookies[count]; if (currentCookie.getName().equals(cookieName)) { matchFound = true; break; } } } else if(cookies != null && retrieveByIndex) { if(cookies.length > cookieIndex) { currentCookie = cookies[cookieIndex]; matchFound = true; } } if (matchFound) return currentCookie; else return null; } /** * This method is used to find a cookie by it's name or index and place it in * the XML resulting tree * * The xml structure that will be inserted will be, * <pre> * <cookie> * <name>......</name> * <value>.....</value> * <comment>...</comment> * <domain>....</domain> * <maxage>....</maxage> * <path>......</path> * <secure>....</secure> * <version>...</version> * </cookie> * </pre> * @param objectModel * @param cookieName name of the cookie which is to be found * @param cookieIndex index of the cookie which is to be found * @param contentHandler * @exception SAXException */ public static void getCookie(Map objectModel, String cookieName, int cookieIndex, ContentHandler contentHandler) throws SAXException { boolean retrieveByName = false; boolean retrieveByIndex = false; String tempStr = null; Hashtable nodeTable = new Hashtable(); if (cookieName != null) { retrieveByName = true; } else if (cookieIndex >=0) { retrieveByIndex = true; } if (retrieveByName || retrieveByIndex) tempStr = getName(objectModel , cookieName , cookieIndex); if (tempStr !=null) { XSPObjectHelper.start(URI, PREFIX, contentHandler, "cookie"); // name nodeTable.put("name", tempStr); // value if ((tempStr = getValue(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("value", tempStr); //comment if ((tempStr = getComment(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("comment", tempStr); //value if ((tempStr = getDomain(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("domain", tempStr); // maxage if((tempStr = getMaxAge(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("maxage", tempStr); // path if((tempStr = getPath(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("path", tempStr); // secure if((tempStr = getSecure(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("secure", tempStr); // version if((tempStr = getVersion(objectModel , cookieName , cookieIndex)) != null) nodeTable.put("version", tempStr); Enumeration keys = nodeTable.keys(); while (keys.hasMoreElements()) { String nodeName = (String)keys.nextElement(); String nodeValue = (String)nodeTable.get(nodeName); XSPObjectHelper.elementData(URI, PREFIX, contentHandler, nodeName, nodeValue); } XSPObjectHelper.end(URI, PREFIX, contentHandler, "cookie"); } } /** * Method to return the value of comment for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose comment is to be passed * @param cookieIndex index of the cookie whose comment is to be passed * @return a string is returned containing the comment of the cookie, if not found * then null is returned */ public static String getComment(Map objectModel, String cookieName, int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "C"); } /** * Method to return the value of domain for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose domain is to be passed * @param cookieIndex index of the cookie whose domain is to be passed * @return a string is returned containing the domain of the cookie, if not found * then null is returned */ public static String getDomain(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "D"); } /** * Method to return the value of maxage for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose maxage is to be passed * @param cookieIndex index of the cookie whose maxage is to be passed * @return a string is returned containing the maxage of the cookie, if not found * then null is returned */ public static String getMaxAge(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "M"); } /** * Method to return the value of name for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose name is to be passed * @param cookieIndex index of the cookie whose name is to be passed * @return a string is returned containing the name of the cookie, if not found * then null is returned */ public static String getName(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "N"); } /** * Method to return the value of path for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose path is to be passed * @param cookieIndex index of the cookie whose path is to be passed * @return a string is returned containing the path of the cookie, if not found * then null is returned */ public static String getPath(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "P"); } /** * Method to return the value of secure property for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose secure property is to be passed * @param cookieIndex index of the cookie whose secure property is to be passed * @return a string is returned containing the secure property of the cookie, if not found * then null is returned */ public static String getSecure(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "S"); } /** * Method to return the value for a particular cookie based on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose value is to be passed * @param cookieIndex index of the cookie whose value * @return a string is returned containing the value of the cookie, if not found * then null is returned */ public static String getValue(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "V"); } /** * Method to return the version of comment for a particular cookie based * on it's name or index * * Rule for passing name and index of the cookie remains same as specified in * previous method(s) * * @param objectModel * @param cookieName name of the cookie whose version is to be passed * @param cookieIndex index of the cookie whose version is to be passed * @return a string is returned containing the version of the cookie, if not found * then null is returned */ public static String getVersion(Map objectModel, String cookieName , int cookieIndex) { return returnCookieProperty(objectModel , cookieName , cookieIndex , "Ve"); } /** * Method returnCookieProperty will be used to retrieve the property * value of cookie. This method will return the value based on the name * or the index of the cookie that is passed. * * Cookie properties, * comment = "C" * domain = "D" * maxage = "M" * name = "N" * path = "P" * secure = "S" * value = "V" * version = "Ve" * * @param objectModel * @param cookieName Name of the cookie whose property is to be returned. * This value will be null if cookie index is specified * @param cookieIndex Index of the cookie whose property is to be returned. * This property will be -1 if cookie name is specified. * If both name and index are specified, name will take * preference. * @param propertyPrefix Specifies the property whose value if to be retrieved. * Properties have been specifed above * @return If the name or index that is passed is improper then a null value * will be returned, otherwise whatever will be the extracted value of * the property will be returned. */ private static String returnCookieProperty(Map objectModel, String cookieName, int cookieIndex, String propertyPrefix) { Cookie currentCookie = getCookie(objectModel, cookieName, cookieIndex); String returnValue = null; if (currentCookie != null) { if(propertyPrefix.equals("C")) returnValue = currentCookie.getComment(); else if(propertyPrefix.equals("D")) returnValue = currentCookie.getDomain(); else if(propertyPrefix.equals("M")) returnValue = Integer.toString(currentCookie.getMaxAge()); else if(propertyPrefix.equals("N")) returnValue = currentCookie.getName(); else if(propertyPrefix.equals("P")) returnValue = currentCookie.getPath(); else if(propertyPrefix.equals("S")) returnValue = String.valueOf(currentCookie.getSecure()); else if(propertyPrefix.equals("V")) returnValue = currentCookie.getValue(); else if(propertyPrefix.equals("Ve")) returnValue = Integer.toString(currentCookie.getVersion()); } return returnValue; } }