/* * 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.deli; import java.io.BufferedReader; import java.io.IOException; import java.net.MalformedURLException; import java.security.Principal; import java.util.Enumeration; import java.util.Iterator; import java.util.Locale; import java.util.Map; import java.util.Set; import java.util.Vector; import javax.servlet.RequestDispatcher; import javax.servlet.Servlet; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletInputStream; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpSession; import org.apache.avalon.framework.activity.Disposable; import org.apache.avalon.framework.activity.Initializable; import org.apache.avalon.framework.context.Context; import org.apache.avalon.framework.context.ContextException; import org.apache.avalon.framework.context.Contextualizable; import org.apache.avalon.framework.logger.AbstractLogEnabled; import org.apache.avalon.framework.parameters.Parameterizable; import org.apache.avalon.framework.parameters.Parameters; import org.apache.avalon.framework.service.ServiceException; import org.apache.avalon.framework.service.ServiceManager; import org.apache.avalon.framework.service.Serviceable; import org.apache.avalon.framework.thread.ThreadSafe; import org.apache.cocoon.Constants; import org.apache.cocoon.environment.Request; import org.apache.excalibur.xml.dom.DOMParser; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Text; import com.hp.hpl.deli.Profile; import com.hp.hpl.deli.ProfileAttribute; import com.hp.hpl.deli.Workspace; /** * Allows the use of <a href="http://www-uk.hpl.hp.com/people/marbut/">DELI</a> * to provide <a href="http://www.w3.org/Mobile/CCPP/">CC/PP</a> or * <a href="http://www1.wapforum.org/tech/terms.asp?doc=WAP-248-UAProf-20010530-p.pdf">UAProf</a> * support. For more details of DELI see the Technical Report * <a href="http://www-uk.hpl.hp.com/people/marbut/DeliUserGuideWEB.htm">DELI: * A Delivery Context Library for CC/PP and UAProf</a>. * * @author <a href="mailto:marbut@hplb.hpl.hp.com">Mark H. Butler</a> * @version CVS $Id$ */ public final class DeliImpl extends AbstractLogEnabled implements Parameterizable, Deli, Serviceable, Disposable, Initializable, ThreadSafe, Contextualizable { /** The name of the main DELI configuration file */ private String deliConfig = "deli/config/deliConfig.xml"; /** The service manager */ protected ServiceManager manager = null; /** Parser used to construct the DOM tree to import the profile to a stylesheet */ protected DOMParser parser; /** A context, used to retrieve the path to the configuration file */ protected CocoonServletContext servletContext; /** Contextualize this class */ public void contextualize(Context context) throws ContextException { org.apache.cocoon.environment.Context ctx = (org.apache.cocoon.environment.Context)context.get( Constants.CONTEXT_ENVIRONMENT_CONTEXT); this.servletContext = new CocoonServletContext(ctx); } /** Service this class */ public void service(ServiceManager manager) throws ServiceException { this.manager = manager; try { this.parser = (DOMParser)this.manager.lookup(DOMParser.ROLE); } catch (ServiceException e) { getLogger().error("DELI Exception while creating parser: ", e); throw e; } } /** Configure this class */ public void parameterize(Parameters params) { this.deliConfig = params.getParameter("deli-config-file", this.deliConfig); } /** * Initialize */ public void initialize() throws Exception { try { Workspace.getInstance().configure(this.servletContext, this.deliConfig); } catch (Exception e) { getLogger().error("DELI Exception while creating workspace: ", e); throw e; } } /** Dispose of this class */ public void dispose() { if (parser != null) { this.manager.release(parser); } this.parser = null; } /** Process a HttpServletRequest and either extract * CC/PP or UAProf information from it and use this information * to resolve a profile or examine the user agent string, match * this using the DELI legacy device database, and use this * information to retrieve the appropriate CC/PP profile. * * @param theRequest The Request. * @return The profile as a vector of profile attributes. * @throws IOException * @throws ServletException * @throws Exception */ public Profile getProfile(Request theRequest) throws IOException, ServletException, Exception { Profile theProfile = null; try { CocoonServletRequest servletRequest = new CocoonServletRequest(theRequest); theProfile = new Profile(servletRequest); } catch (Exception e) { getLogger().error("DELI Exception while retrieving profile: ", e); throw e; } return theProfile; } /** Convert a profile stored as a vector of profile attributes * to a DOM tree. * * @param theProfile The profile as a vector of profile attributes. * @return The DOM tree. */ public Document getUACapabilities(Profile theProfile) throws Exception { Document document = null; try { Element rootElement; Element attributeNode; Element complexAttributeNode; Text text; document = parser.createDocument(); rootElement = document.createElementNS(null, "browser"); document.appendChild(rootElement); Iterator profileIter = theProfile.iterator(); while (profileIter.hasNext()) { ProfileAttribute p = (ProfileAttribute)profileIter.next(); attributeNode = document.createElementNS(null, p.getAttribute()); rootElement.appendChild(attributeNode); Vector attributeValue = p.get(); if (attributeValue != null) { Iterator complexValueIter = attributeValue.iterator(); if (p.getCollectionType().equals("Simple")) { // Simple attribute String value = (String)complexValueIter.next(); text = document.createTextNode(value); attributeNode.appendChild(text); } else { // Complex attribute e.g. Seq or Bag while (complexValueIter.hasNext()) { String value = (String)complexValueIter.next(); complexAttributeNode = document.createElementNS(null, "li"); attributeNode.appendChild(complexAttributeNode); text = document.createTextNode(value); complexAttributeNode.appendChild(text); } } } } } catch (Exception e) { getLogger().error("DELI Exception while converting profile to DOM fragment: ", e); throw e; } return document; } public Document getUACapabilities(Request theRequest) throws IOException, Exception { return this.getUACapabilities(this.getProfile(theRequest)); } /** * Stub implementation of Servlet Context */ public static class CocoonServletContext implements ServletContext { org.apache.cocoon.environment.Context envContext; public CocoonServletContext(org.apache.cocoon.environment.Context context) { this.envContext = context; } public Object getAttribute(String name) { return envContext.getAttribute(name); } public void setAttribute(String name, Object value) { envContext.setAttribute(name, value); } public Enumeration getAttributeNames() { return envContext.getAttributeNames(); } public java.net.URL getResource(String path) throws MalformedURLException { return envContext.getResource(path); } public String getRealPath(String path) { return envContext.getRealPath(path); } public String getMimeType(String file) { return envContext.getMimeType(file); } public String getInitParameter(String name) { return envContext.getInitParameter(name); } public java.io.InputStream getResourceAsStream(String path) { return envContext.getResourceAsStream(path); } public ServletContext getContext(String uripath) { return (null); } public Enumeration getInitParameterNames() { return (null); } public int getMajorVersion() { return (2); } public int getMinorVersion() { return (3); } public RequestDispatcher getNamedDispatcher(String name) { return (null); } public RequestDispatcher getRequestDispatcher(String path) { return (null); } public Set getResourcePaths(String path) { return null; } public String getServerInfo() { return (null); } /** * @deprecated The method DeliImpl.CocoonServletContext.getServlet(String) * overrides a deprecated method from ServletContext. * @see <a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getServlet(java.lang.String)">ServletContext#getServlet(java.lang.String)</a> */ public Servlet getServlet(String name) throws ServletException { return (null); } public String getServletContextName() { return (null); } /** * @deprecated The method DeliImpl.CocoonServletContext.getServletNames() * overrides a deprecated method from ServletContext. * @see <a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getServletNames()">ServletContext#getServletNames()</a> */ public Enumeration getServletNames() { return (null); } /** * @deprecated The method DeliImpl.CocoonServletContext.getServlets() * overrides a deprecated method from ServletContext. * @see <a href="http://java.sun.com/j2ee/sdk_1.3/techdocs/api/javax/servlet/ServletContext.html#getServlets()">ServletContext#getServlets()</a> */ public Enumeration getServlets() { return (null); } public void log(String message) {} /** @deprecated use {@link #log(String message, Throwable throwable)} instead. */ public void log(Exception exception, String message) {} public void log(String message, Throwable throwable) {} public void removeAttribute(String name) {} } /** * Stub implementation of HttpServletRequest */ public static class CocoonServletRequest implements HttpServletRequest { Request request; public CocoonServletRequest(Request request) { this.request = request; } public String getAuthType() { return request.getAuthType(); } public long getDateHeader(String s) { return request.getDateHeader(s); } public String getHeader(String s) { return request.getHeader(s); } public Enumeration getHeaders(String s) { return request.getHeaders(s); } public Enumeration getHeaderNames() { return request.getHeaderNames(); } public String getMethod() { return request.getMethod(); } public String getPathInfo() { return request.getPathInfo(); } public String getPathTranslated() { return request.getPathTranslated(); } public String getContextPath() { return request.getContextPath(); } public String getQueryString() { return request.getQueryString(); } public String getRemoteUser() { return request.getRemoteUser(); } public boolean isUserInRole(String s) { return request.isUserInRole(s); } public String getRequestedSessionId() { return request.getRequestedSessionId(); } public String getRequestURI() { return request.getRequestURI(); } public String getServletPath() { return request.getServletPath(); } public boolean isRequestedSessionIdValid() { return request.isRequestedSessionIdValid(); } public boolean isRequestedSessionIdFromCookie() { return request.isRequestedSessionIdFromCookie(); } public Object getAttribute(String s) { return request.getAttribute(s); } public Enumeration getAttributeNames() { return request.getAttributeNames(); } public String getCharacterEncoding() { return request.getCharacterEncoding(); } public int getContentLength() { return request.getContentLength(); } public String getContentType() { return request.getContentType(); } public String getParameter(String s) { return request.getParameter(s); } public Enumeration getParameterNames() { return request.getParameterNames(); } public String[] getParameterValues(String s) { return request.getParameterValues(s); } public String getProtocol() { return request.getProtocol(); } public String getScheme() { return request.getScheme(); } public String getServerName() { return request.getServerName(); } public int getServerPort() { return request.getServerPort(); } public String getRemoteAddr() { return request.getRemoteAddr(); } public String getRemoteHost() { return request.getRemoteHost(); } public void setAttribute(String s, Object obj) { request.setAttribute(s, obj); } public void removeAttribute(String s) { request.removeAttribute(s); } public boolean isSecure() { return request.isSecure(); } public StringBuffer getRequestURL() { return null; } public Map getParameterMap() { return null; } public void setCharacterEncoding(String s) {} public Principal getUserPrincipal() { return request.getUserPrincipal(); } public Locale getLocale() { return request.getLocale(); } public Enumeration getLocales() { return request.getLocales(); } /** @deprecated use {@link org.apache.cocoon.components.deli.DeliImpl.CocoonServletContext#getRealPath(java.lang.String)} instead. */ public String getRealPath(String s) { return null; } public Cookie[] getCookies() { return null; } public RequestDispatcher getRequestDispatcher(String s) { return null; } public BufferedReader getReader() throws IOException { return null; } public ServletInputStream getInputStream() throws IOException { return null; } public HttpSession getSession(boolean flag) { return null; } public HttpSession getSession() { return null; } public boolean isRequestedSessionIdFromURL() { return false; } /** @deprecated use {@link #isRequestedSessionIdFromURL()} instead */ public boolean isRequestedSessionIdFromUrl() { return false; } public int getIntHeader(String s) { return 0; } } }