| /* |
| * 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.faces.context; |
| |
| import org.apache.cocoon.environment.Context; |
| import org.apache.cocoon.environment.Request; |
| import org.apache.cocoon.environment.Response; |
| import org.apache.cocoon.faces.FacesAction; |
| import org.apache.cocoon.faces.FacesRedirector; |
| |
| import org.apache.commons.collections.iterators.EnumerationIterator; |
| |
| import javax.faces.context.ExternalContext; |
| import java.io.IOException; |
| import java.io.InputStream; |
| import java.net.MalformedURLException; |
| import java.net.URL; |
| import java.security.Principal; |
| import java.util.Collections; |
| import java.util.Iterator; |
| import java.util.Locale; |
| import java.util.Map; |
| import java.util.Set; |
| |
| /** |
| * Implementation of the Java Server Faces ExternalContext |
| * |
| * @author <a href="mailto:vgritsenko@apache.org">Vadim Gritsenko</a> |
| * @version CVS $Id$ |
| */ |
| public class ExternalContextImpl extends ExternalContext { |
| |
| private Context context; |
| private Request request; |
| private Response response; |
| |
| |
| public ExternalContextImpl(Context context, Request request, Response response) { |
| this.context = context; |
| this.request = request; |
| this.response = response; |
| } |
| |
| public void dispatch(String url) throws IOException { |
| FacesRedirector redirector = (FacesRedirector)request.getAttribute(FacesAction.REQUEST_REDIRECTOR_ATTRIBUTE); |
| if (redirector == null) { |
| throw new IOException("Can not dispatch to <" + url + ">: Redirector missing."); |
| } |
| |
| redirector.dispatch(url); |
| } |
| |
| public String encodeActionURL(String url) { |
| FacesRedirector redirector = (FacesRedirector)request.getAttribute(FacesAction.REQUEST_REDIRECTOR_ATTRIBUTE); |
| if (redirector == null) { |
| throw new RuntimeException("Can not encode action URL <" + url + ">: Redirector missing."); |
| } |
| |
| return redirector.encodeActionURL(url); |
| } |
| |
| public String encodeNamespace(String ns) { |
| return ns; |
| } |
| |
| public String encodeResourceURL(String url) { |
| FacesRedirector redirector = (FacesRedirector)request.getAttribute(FacesAction.REQUEST_REDIRECTOR_ATTRIBUTE); |
| if (redirector == null) { |
| throw new RuntimeException("Can not encode resource URL <" + url + ">: Redirector missing."); |
| } |
| |
| return redirector.encodeResourceURL(url); |
| } |
| |
| public Map getApplicationMap() { |
| return new ApplicationMap(this.context); |
| } |
| |
| public String getAuthType() { |
| return this.request.getAuthType(); |
| } |
| |
| public Object getContext() { |
| return this.context; |
| } |
| |
| public String getInitParameter(String parameter) { |
| return this.context.getInitParameter(parameter); |
| } |
| |
| public Map getInitParameterMap() { |
| return new InitParameterMap(this.context); |
| } |
| |
| public String getRemoteUser() { |
| return this.request.getRemoteUser(); |
| } |
| |
| public Object getRequest() { |
| return this.request; |
| } |
| |
| public String getRequestContextPath() { |
| return this.request.getContextPath(); |
| } |
| |
| public Map getRequestCookieMap() { |
| // TODO: Implement getRequestCookieMap |
| System.err.println("WARNING: getRequestCookieMap called."); |
| return Collections.EMPTY_MAP; |
| } |
| |
| public Map getRequestHeaderMap() { |
| return new RequestHeaderMap(this.request); |
| } |
| |
| public Map getRequestHeaderValuesMap() { |
| return new RequestHeaderValuesMap(this.request); |
| } |
| |
| public Locale getRequestLocale() { |
| return this.request.getLocale(); |
| } |
| |
| public Iterator getRequestLocales() { |
| return new EnumerationIterator(this.request.getLocales()); |
| } |
| |
| public Map getRequestMap() { |
| return new RequestMap(this.request); |
| } |
| |
| public Map getRequestParameterMap() { |
| return new RequestParameterMap(this.request); |
| } |
| |
| public Iterator getRequestParameterNames() { |
| return new EnumerationIterator(this.request.getParameterNames()); |
| } |
| |
| public Map getRequestParameterValuesMap() { |
| return new RequestParameterValuesMap(this.request); |
| } |
| |
| public String getRequestPathInfo() { |
| // HACK (VG): |
| // Emulate servlet prefix mapping. This allows to bypass suffix mapping calculations, |
| // as well as helps with WebSphere servlet container bugs (it treats default servlet |
| // as prefix mapped servlet). |
| |
| // JSF Specification, 2.2.1 Restore View: |
| // o Derive the view identifier that corresponds to this request, as follows: |
| // o If prefix mapping (such as ?/faces/*?) is used for FacesServlet, the viewId |
| // is set from the extra path information of the request URI. |
| |
| StringBuffer path = new StringBuffer(); |
| |
| boolean slash = false; |
| String s = request.getServletPath(); |
| if (s != null) { |
| path.append(s); |
| slash = s.endsWith("/"); |
| } |
| |
| s = request.getPathInfo(); |
| if (s != null) { |
| if (s.startsWith("/")) { |
| if (slash){ |
| s = s.substring(1); |
| } |
| } else { |
| if (!slash) { |
| path.append('/'); |
| } |
| } |
| path.append(s); |
| } |
| |
| return path.toString(); |
| } |
| |
| public String getRequestServletPath() { |
| // See #getRequestPathInfo |
| return ""; |
| } |
| |
| public URL getResource(String resource) throws MalformedURLException { |
| return this.context.getResource(resource); |
| } |
| |
| public InputStream getResourceAsStream(String resource) { |
| return this.context.getResourceAsStream(resource); |
| } |
| |
| public Set getResourcePaths(String path) { |
| // TODO: Implement getResourcePaths |
| System.err.println("WARNING: getResourcePaths(" + path + ") called."); |
| throw new UnsupportedOperationException(); |
| } |
| |
| public Object getResponse() { |
| return this.response; |
| } |
| |
| public Object getSession(boolean create) { |
| return this.request.getSession(create); |
| } |
| |
| public Map getSessionMap() { |
| return new SessionMap(request.getSession()); |
| } |
| |
| public Principal getUserPrincipal() { |
| return this.request.getUserPrincipal(); |
| } |
| |
| public boolean isUserInRole(String role) { |
| return this.request.isUserInRole(role); |
| } |
| |
| public void log(String message) { |
| // TODO: Implement |
| System.err.println("WARNING: log(" + message + ") called."); |
| } |
| |
| public void log(String message, Throwable e) { |
| // TODO: Implement |
| System.err.println("WARNING: log(" + message + ", " + e + ") called."); |
| } |
| |
| public void redirect(String url) throws IOException { |
| FacesRedirector redirector = (FacesRedirector)request.getAttribute(FacesAction.REQUEST_REDIRECTOR_ATTRIBUTE); |
| if (redirector == null) { |
| throw new IOException("Can not redirect to <" + url + ">: Redirector missing."); |
| } |
| |
| redirector.redirect(url); |
| } |
| } |