Author: craigmcc
Date: Fri Feb 10 15:34:09 2006
New Revision: 376889
URL: http://svn.apache.org/viewcvs?rev=376889&view=rev
Log:
Refactor the configuration of remoting support into a helper class so that
it can be used from more than one place. Call it from XhtmlHelper if the
very first thing that happens is a non-Faces request forwarding to a
Faces response.
Added:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
(with props)
Modified:
struts/shale/trunk/core-library/build.xml
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/XhtmlHelper.java
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/RemotingPhaseListener.java
Modified: struts/shale/trunk/core-library/build.xml
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/build.xml?rev=376889&r1=376888&r2=376889&view=diff
==============================================================================
--- struts/shale/trunk/core-library/build.xml (original)
+++ struts/shale/trunk/core-library/build.xml Fri Feb 10 15:34:09 2006
@@ -113,6 +113,7 @@
<pathelement location="${commons-logging.jar}"/>
<pathelement location="${commons-validator.jar}"/>
<pathelement location="${jsf-api.jar}"/>
+ <pathelement location="${jsf-impl.jar}"/>
<pathelement location="${jsp-api.jar}"/>
<pathelement location="${junit.jar}"/>
<pathelement location="${servlet-api.jar}"/>
@@ -464,6 +465,10 @@
value="${test.level}"/>
<sysproperty key="documentRoot"
value="${build.home}/test-classes"/>
+ <sysproperty key="jsfri"
+ value="${jsfri.present}"/>
+ <sysproperty key="myfaces"
+ value="${myfaces.present}"/>
<classpath refid="test.classpath"/>
<formatter type="plain"
usefile="false"/>
Modified:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/XhtmlHelper.java
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/XhtmlHelper.java?rev=376889&r1=376888&r2=376889&view=diff
==============================================================================
---
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/XhtmlHelper.java
(original)
+++
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/XhtmlHelper.java
Fri Feb 10 15:34:09 2006
@@ -25,6 +25,7 @@
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
+import org.apache.shale.remoting.faces.MappingsHelper;
/**
* <p>Helper bean for rendering links to download resources commonly used
@@ -39,7 +40,7 @@
public class XhtmlHelper {
- // -------------------------------------------------------------- Manifest
Constants
+ // ------------------------------------------------------ Manifest
Constants
/**
@@ -49,6 +50,15 @@
protected static final String PREFIX = "org.apache.shale.remoting.LINKED";
+ // ------------------------------------------------------ Instance
Variables
+
+
+ /**
+ * <p>Helper to retrieve the [EMAIL PROTECTED] Mappings} instance for this
application.</p>
+ */
+ private MappingsHelper helper = new MappingsHelper();
+
+
// ---------------------------------------------------------- Public
Methods
@@ -197,9 +207,7 @@
}
// Acquire a reference to the Mappings instance for this application
- Mappings mappings = (Mappings)
- context.getExternalContext().getApplicationMap().
- get(Constants.MAPPINGS_ATTR);
+ Mappings mappings = helper.getMappings(context);
if (mappings == null) {
throw new IllegalStateException
(resourceBundle(context).getString("xhtml.noMappings"));
Added:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java?rev=376889&view=auto
==============================================================================
---
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
(added)
+++
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
Fri Feb 10 15:34:09 2006
@@ -0,0 +1,406 @@
+/*
+ * Copyright 2005-2006 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.
+ *
+ * $Id$
+ */
+
+package org.apache.shale.remoting.faces;
+
+import java.io.InputStream;
+import java.lang.reflect.Method;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.ResourceBundle;
+import javax.faces.FacesException;
+import javax.faces.application.ViewHandler;
+import javax.faces.context.FacesContext;
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.apache.shale.remoting.Constants;
+import org.apache.shale.remoting.Mapping;
+import org.apache.shale.remoting.Mappings;
+import org.apache.shale.remoting.Mechanism;
+import org.apache.shale.remoting.Processor;
+import org.apache.shale.remoting.impl.MappingImpl;
+import org.apache.shale.remoting.impl.MappingsImpl;
+import org.w3c.dom.Document;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+
+/**
+ * <p>Helper bean for accessing the [EMAIL PROTECTED] Mappings} instance for
this
+ * application, creating it the first time if necessary.</p>
+ *
+ * @since 1.0.1
+ */
+public class MappingsHelper {
+
+
+ // ------------------------------------------------------ Instance
Variables
+
+
+ /**
+ * <p><code>ResourceBundle</code> containing our localized messages.</p>
+ */
+ private ResourceBundle bundle =
+ ResourceBundle.getBundle("org.apache.shale.remoting.Bundle");
+
+
+ /**
+ * <p>Log instance for this class.</p>
+ */
+ private transient Log log = null;
+
+
+ // ---------------------------------------------------------- Public
Methods
+
+
+ /**
+ * <p>Return the [EMAIL PROTECTED] Mappings} instance for this web
application,
+ * creating it if necessary.</p>
+ *
+ * @param context <code>FacesContext</code> for the current request
+ */
+ public Mappings getMappings(FacesContext context) {
+
+ Mappings mappings = (Mappings)
+ context.getExternalContext().getApplicationMap().
+ get(Constants.MAPPINGS_ATTR);
+ if (mappings == null) {
+ mappings = createMappings(context);
+ context.getExternalContext().getApplicationMap().
+ put(Constants.MAPPINGS_ATTR, mappings);
+ }
+ return mappings;
+
+ }
+
+
+ // --------------------------------------------------------- Private
Methods
+
+
+ /**
+ * <p>Configure [EMAIL PROTECTED] Mapping} instances on the specified
[EMAIL PROTECTED] Mappings}
+ * instance, for the specified context initialization parameter.</p>
+ *
+ * @param context <code>FacesContext</code> for the current request
+ * @param mappings [EMAIL PROTECTED] Mappings} instance being configured
+ * @param paramName Context initialization parameter name to process
+ * @param mechanism [EMAIL PROTECTED] Mechanism} to configure on created
instances
+ * @param defaultValue Default value (if any) if not specified
+ *
+ * @exception FacesException if a new Mapping instance cannot be created
+ * or configured
+ */
+ private void configureMappings(FacesContext context, Mappings mappings,
+ String paramName, Mechanism mechanism,
+ String defaultValue) {
+
+ // Identify the Mapping implementation class to be used
+ Class clazz = MappingImpl.class;
+ String mappingClass =
+
context.getExternalContext().getInitParameter(Constants.MAPPING_CLASS);
+ if (mappingClass != null) {
+ try {
+ clazz = loadClass(mappingClass);
+ } catch (Exception e) {
+ throw new FacesException(e);
+ }
+ }
+
+ // Acquire the context initialization parameter value (or default it)
+ String paramValue =
context.getExternalContext().getInitParameter(paramName);
+ if (paramValue == null) {
+ paramValue = defaultValue;
+ }
+ if (paramValue == null) {
+ return;
+ }
+
+ // Configure new Mapping instances for each specified
pattern:classname pair
+ while (true) {
+ paramValue = paramValue.trim();
+ if (paramValue.length() == 0) {
+ break;
+ }
+ String pair = null;
+ int comma = paramValue.indexOf(',');
+ if (comma >= 0) {
+ pair = paramValue.substring(0, comma).trim();
+ paramValue = paramValue.substring(comma + 1);
+ } else {
+ pair = paramValue.trim();
+ paramValue = "";
+ }
+ int colon = pair.indexOf(':');
+ if (colon < 0) {
+ throw new IllegalArgumentException(pair);
+ }
+ String pattern = pair.substring(0, colon).trim();
+ String processorClass = pair.substring(colon + 1).trim();
+ if (log().isInfoEnabled()) {
+ log().info(bundle.getString("mapping.configure"));
+ log().info(pattern + ":" + processorClass);
+ }
+ Class processorClazz = null;
+ try {
+ processorClazz = loadClass(processorClass);
+ } catch (Exception e) {
+ throw new FacesException(e);
+ }
+ try {
+ Mapping mapping = (Mapping) clazz.newInstance();
+ mapping.setMappings(mappings);
+ mapping.setMechanism(mechanism);
+ mapping.setPattern(pattern);
+ mapping.setProcessor((Processor) processorClazz.newInstance());
+ mappings.addMapping(mapping);
+ } catch (Exception e) {
+ throw new FacesException(e);
+ }
+ }
+
+ }
+
+
+ /**
+ * <p>Create and configure a [EMAIL PROTECTED] Mappings} instance based on
the relevant
+ * context initialization parameters for this web application.</p>
+ *
+ * @param context <code>FacesContext</code> for the current request
+ *
+ * @exception FacesException if a new Mappings instance cannot be created
+ * or configured
+ */
+ private Mappings createMappings(FacesContext context) {
+
+ // Instantiate a Mappings instance to configure
+ Mappings mappings = null;
+ String mappingsClass = MappingsImpl.class.getName();
+ String mappingsClassParam =
+
context.getExternalContext().getInitParameter(Constants.MAPPINGS_CLASS);
+ if (mappingsClassParam != null) {
+ mappingsClass = mappingsClassParam;
+ }
+ Class clazz = null;
+ try {
+ if (log().isInfoEnabled()) {
+ log().info(bundle.getString("mappings.configure"));
+ log().info(mappingsClass);
+ }
+ clazz = loadClass(mappingsClass);
+ } catch (Exception e) {
+ throw new FacesException(e);
+ }
+ try {
+ mappings = (Mappings) clazz.newInstance();
+ } catch (Exception e) {
+ throw new FacesException(e);
+ }
+
+ // Configure the Mapping instances for this Mappings instance
+ configureMappings(context, mappings, Constants.CLASS_RESOURCES_PARAM,
+ Mechanism.CLASS_RESOURCE,
+
"/static/*:org.apache.shale.remoting.impl.ClassResourceProcessor");
+ configureMappings(context, mappings, Constants.DYNAMIC_RESOURCES_PARAM,
+ Mechanism.DYNAMIC_RESOURCE,
+
"/dynamic/*:org.apache.shale.remoting.impl.MethodBindingProcessor");
+ configureMappings(context, mappings, Constants.OTHER_RESOURCES_PARAM,
+ Mechanism.OTHER_RESOURCE,
+ null);
+ configureMappings(context, mappings, Constants.WEBAPP_RESOURCES_PARAM,
+ Mechanism.WEBAPP_RESOURCE,
+
"/webapp/*:org.apache.shale.remoting.impl.WebResourceProcessor");
+
+ // Calculate and set the replacement extension, to be used
+ // if FacesServlet is extension mapped
+ String extension = context.getExternalContext().
+ getInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME);
+ if (extension == null) {
+ extension = ViewHandler.DEFAULT_SUFFIX;
+ }
+ mappings.setExtension(extension);
+
+ // Calculate and set the URL patterns that FacesServlet is mapped with
+ // FIXME - hard coded to "*.faces" for now
+ String patterns[] = patterns(context);
+ if (log().isTraceEnabled()) {
+ for (int i = 0; i < patterns.length; i++) {
+ log().trace("FacesServlet is mapped with URL pattern '" +
patterns[i] + "'");
+ }
+ }
+ mappings.setPatterns(patterns);
+
+ // Return the configured Mappings instance
+ return mappings;
+
+ }
+
+
+ /**
+ * <p>Load the specified class from the web application class loader
+ * (if possible).</p>
+ *
+ * @param name Fully qualified class name
+ *
+ * @exception ClassNotFoundException if the specified class cannot
+ * be loaded
+ */
+ private Class loadClass(String name) throws ClassNotFoundException {
+
+ ClassLoader cl = Thread.currentThread().getContextClassLoader();
+ if (cl == null) {
+ cl = this.getClass().getClassLoader();
+ }
+ return cl.loadClass(name);
+
+ }
+
+
+ /**
+ * <p>Return the <code>Log</code> instance to use, creating one if
needed.</p>
+ */
+ private Log log() {
+
+ if (this.log == null) {
+ log = LogFactory.getLog(MappingsHelper.class);
+ }
+ return log;
+
+ }
+
+
+ /**
+ * <p>Return an array of URL patterns that <code>FacesServlet</code> is
+ * mapped to for this application.</p>
+ *
+ * @param context <code>FacesContext</code> for the current request
+ */
+ private String[] patterns(FacesContext context) {
+
+ Document document = null;
+ InputStream stream = null;
+
+ try {
+
+ // Acquire a URL for /WEB-INF/web.xml (if any)
+ Object ctxt = context.getExternalContext().getContext();
+ Method method =
+ ctxt.getClass().getMethod("getResource",
+ new Class[] { String.class });
+ URL url = (URL) method.invoke(ctxt, new Object[] {
"/WEB-INF/web.xml" });
+ if (url == null) {
+ if (log().isTraceEnabled()) {
+ log().trace("No /WEB-INF/web.xml resource available,
returning empty list");
+ }
+ return new String[0];
+ }
+
+ // Parse this resource into a DOM tree
+ DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+ DocumentBuilder db = dbf.newDocumentBuilder();
+ stream = url.openStream();
+ document = db.parse(stream);
+
+ } catch (Exception e) {
+
+ if (log().isErrorEnabled()) {
+ log().error(bundle.getString("mappings.parseWebXml"), e);
+ }
+ return new String[0];
+
+ } finally {
+
+ if (stream != null) {
+ try { stream.close(); } catch (Exception e) {}
+ }
+
+ }
+
+ // Identify the servlet name of the JavaServer Faces controller servlet
+ String name = null;
+ NodeList servletNodes = document.getElementsByTagName("servlet");
+ for (int i = 0; i < servletNodes.getLength(); i++) {
+ Node servletNode = servletNodes.item(i);
+ String servletName = null;
+ String servletClass = null;
+ NodeList kids = servletNode.getChildNodes();
+ for (int j = 0; j < kids.getLength(); j++) {
+ Node kid = kids.item(j);
+ if ("servlet-name".equals(kid.getNodeName())) {
+ servletName = text(kid);
+ } else if ("servlet-class".equals(kid.getNodeName())) {
+ servletClass = text(kid);
+ }
+ }
+ if ("javax.faces.webapp.FacesServlet".equals(servletClass)) {
+ name = servletName;
+// break;
+ }
+ }
+ if (name == null) {
+ return new String[0];
+ }
+
+ // Identify the URL patterns to which this servlet is mapped
+ List list = new ArrayList();
+ NodeList mappingNodes =
document.getElementsByTagName("servlet-mapping");
+ for (int i = 0; i < mappingNodes.getLength(); i++) {
+ Node mappingNode = mappingNodes.item(i);
+ String servletName = null;
+ String urlPattern = null;
+ NodeList kids = mappingNode.getChildNodes();
+ for (int j = 0; j < kids.getLength(); j++) {
+ Node kid = kids.item(j);
+ if ("servlet-name".equals(kid.getNodeName())) {
+ servletName = text(kid);
+ } else if ("url-pattern".equals(kid.getNodeName())) {
+ urlPattern = text(kid);
+ }
+ }
+ if (name.equals(servletName)) {
+ list.add(urlPattern);
+ }
+ }
+
+ // Return the resulting list
+ return (String[]) list.toArray(new String[list.size()]);
+
+ }
+
+
+ /**
+ * <p>Return the text content inside the specified node.</p>
+ *
+ * @param node Node from which text is to be extracted
+ */
+ private String text(Node node) {
+
+ NodeList kids = node.getChildNodes();
+ for (int k = 0; k < kids.getLength(); k++) {
+ Node kid = kids.item(k);
+ if ("#text".equals(kid.getNodeName())) {
+ return kid.getNodeValue().trim();
+ }
+ }
+ return "";
+
+ }
+
+
+}
Propchange:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
------------------------------------------------------------------------------
svn:eol-style = native
Propchange:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/MappingsHelper.java
------------------------------------------------------------------------------
svn:keywords = Date Author Id Revision HeadURL
Modified:
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/RemotingPhaseListener.java
URL:
http://svn.apache.org/viewcvs/struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/RemotingPhaseListener.java?rev=376889&r1=376888&r2=376889&view=diff
==============================================================================
---
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/RemotingPhaseListener.java
(original)
+++
struts/shale/trunk/core-library/src/java/org/apache/shale/remoting/faces/RemotingPhaseListener.java
Fri Feb 10 15:34:09 2006
@@ -17,34 +17,16 @@
package org.apache.shale.remoting.faces;
import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.net.URL;
-import java.util.ArrayList;
import java.util.Iterator;
-import java.util.List;
import java.util.ResourceBundle;
import javax.faces.FacesException;
-import javax.faces.application.ViewHandler;
import javax.faces.context.FacesContext;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
-import javax.xml.parsers.DocumentBuilder;
-import javax.xml.parsers.DocumentBuilderFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
-import org.apache.shale.remoting.Constants;
import org.apache.shale.remoting.Mapping;
-import org.apache.shale.remoting.Mappings;
-import org.apache.shale.remoting.Mechanism;
-import org.apache.shale.remoting.Processor;
-import org.apache.shale.remoting.impl.MappingImpl;
-import org.apache.shale.remoting.impl.MappingsImpl;
-import org.w3c.dom.Document;
-import org.w3c.dom.Element;
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
/**
* <p>A JavaServer Faces <code>PhaseListener</code> that provides support for
@@ -76,6 +58,13 @@
/**
+ * <p>Helper object to acquire a reference to the [EMAIL PROTECTED]
Mappings}
+ * instance for this web application.</p>
+ */
+ private MappingsHelper helper = new MappingsHelper();
+
+
+ /**
* <p>Log instance for this class.</p>
*/
private transient Log log = null;
@@ -99,7 +88,7 @@
}
// Match this view identifier against our configured patterns
- Iterator mappings = getMappings(context).getMappings().iterator();
+ Iterator mappings =
helper.getMappings(context).getMappings().iterator();
while (mappings.hasNext()) {
Mapping mapping = (Mapping) mappings.next();
String resourceId = mapping.mapViewId(context);
@@ -149,205 +138,6 @@
/**
- * <p>Configure [EMAIL PROTECTED] Mapping} instances on the specified
[EMAIL PROTECTED] Mappings}
- * instance, for the specified context initialization parameter.</p>
- *
- * @param context <code>FacesContext</code> for the current request
- * @param mappings [EMAIL PROTECTED] Mappings} instance being configured
- * @param paramName Context initialization parameter name to process
- * @param mechanism [EMAIL PROTECTED] Mechanism} to configure on created
instances
- * @param defaultValue Default value (if any) if not specified
- *
- * @exception FacesException if a new Mapping instance cannot be created
- * or configured
- */
- private void configureMappings(FacesContext context, Mappings mappings,
- String paramName, Mechanism mechanism,
- String defaultValue) {
-
- // Identify the Mapping implementation class to be used
- Class clazz = MappingImpl.class;
- String mappingClass =
-
context.getExternalContext().getInitParameter(Constants.MAPPING_CLASS);
- if (mappingClass != null) {
- try {
- clazz = loadClass(mappingClass);
- } catch (Exception e) {
- throw new FacesException(e);
- }
- }
-
- // Acquire the context initialization parameter value (or default it)
- String paramValue =
context.getExternalContext().getInitParameter(paramName);
- if (paramValue == null) {
- paramValue = defaultValue;
- }
- if (paramValue == null) {
- return;
- }
-
- // Configure new Mapping instances for each specified
pattern:classname pair
- while (true) {
- paramValue = paramValue.trim();
- if (paramValue.length() == 0) {
- break;
- }
- String pair = null;
- int comma = paramValue.indexOf(',');
- if (comma >= 0) {
- pair = paramValue.substring(0, comma).trim();
- paramValue = paramValue.substring(comma + 1);
- } else {
- pair = paramValue.trim();
- paramValue = "";
- }
- int colon = pair.indexOf(':');
- if (colon < 0) {
- throw new IllegalArgumentException(pair);
- }
- String pattern = pair.substring(0, colon).trim();
- String processorClass = pair.substring(colon + 1).trim();
- if (log().isInfoEnabled()) {
- log().info(bundle.getString("mapping.configure"));
- log().info(pattern + ":" + processorClass);
- }
- Class processorClazz = null;
- try {
- processorClazz = loadClass(processorClass);
- } catch (Exception e) {
- throw new FacesException(e);
- }
- try {
- Mapping mapping = (Mapping) clazz.newInstance();
- mapping.setMappings(mappings);
- mapping.setMechanism(mechanism);
- mapping.setPattern(pattern);
- mapping.setProcessor((Processor) processorClazz.newInstance());
- mappings.addMapping(mapping);
- } catch (Exception e) {
- throw new FacesException(e);
- }
- }
-
- }
-
-
- /**
- * <p>Create and configure a [EMAIL PROTECTED] Mappings} instance based on
the relevant
- * context initialization parameters for this web application.</p>
- *
- * @param context <code>FacesContext</code> for the current request
- *
- * @exception FacesException if a new Mappings instance cannot be created
- * or configured
- */
- private Mappings createMappings(FacesContext context) {
-
- // Instantiate a Mappings instance to configure
- Mappings mappings = null;
- String mappingsClass = MappingsImpl.class.getName();
- String mappingsClassParam =
-
context.getExternalContext().getInitParameter(Constants.MAPPINGS_CLASS);
- if (mappingsClassParam != null) {
- mappingsClass = mappingsClassParam;
- }
- Class clazz = null;
- try {
- if (log().isInfoEnabled()) {
- log().info(bundle.getString("mappings.configure"));
- log().info(mappingsClass);
- }
- clazz = loadClass(mappingsClass);
- } catch (Exception e) {
- throw new FacesException(e);
- }
- try {
- mappings = (Mappings) clazz.newInstance();
- } catch (Exception e) {
- throw new FacesException(e);
- }
-
- // Configure the Mapping instances for this Mappings instance
- configureMappings(context, mappings, Constants.CLASS_RESOURCES_PARAM,
- Mechanism.CLASS_RESOURCE,
-
"/static/*:org.apache.shale.remoting.impl.ClassResourceProcessor");
- configureMappings(context, mappings, Constants.DYNAMIC_RESOURCES_PARAM,
- Mechanism.DYNAMIC_RESOURCE,
-
"/dynamic/*:org.apache.shale.remoting.impl.MethodBindingProcessor");
- configureMappings(context, mappings, Constants.OTHER_RESOURCES_PARAM,
- Mechanism.OTHER_RESOURCE,
- null);
- configureMappings(context, mappings, Constants.WEBAPP_RESOURCES_PARAM,
- Mechanism.WEBAPP_RESOURCE,
-
"/webapp/*:org.apache.shale.remoting.impl.WebResourceProcessor");
-
- // Calculate and set the replacement extension, to be used
- // if FacesServlet is extension mapped
- String extension = context.getExternalContext().
- getInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME);
- if (extension == null) {
- extension = ViewHandler.DEFAULT_SUFFIX;
- }
- mappings.setExtension(extension);
-
- // Calculate and set the URL patterns that FacesServlet is mapped with
- // FIXME - hard coded to "*.faces" for now
- String patterns[] = patterns(context);
- if (log().isTraceEnabled()) {
- for (int i = 0; i < patterns.length; i++) {
- log().trace("FacesServlet is mapped with URL pattern '" +
patterns[i] + "'");
- }
- }
- mappings.setPatterns(patterns);
-
- // Return the configured Mappings instance
- return mappings;
-
- }
-
-
- /**
- * <p>Return the configured [EMAIL PROTECTED] Mappings} instance for this
application,
- * creating it if necessary.</p>
- *
- * @param context <code>FacesContext</code> for the current request
- */
- private Mappings getMappings(FacesContext context) {
-
- Mappings mappings = (Mappings)
- context.getExternalContext().getApplicationMap().
- get(Constants.MAPPINGS_ATTR);
- if (mappings == null) {
- mappings = createMappings(context);
- context.getExternalContext().getApplicationMap().
- put(Constants.MAPPINGS_ATTR, mappings);
- }
- return mappings;
-
- }
-
-
- /**
- * <p>Load the specified class from the web application class loader
- * (if possible).</p>
- *
- * @param name Fully qualified class name
- *
- * @exception ClassNotFoundException if the specified class cannot
- * be loaded
- */
- private Class loadClass(String name) throws ClassNotFoundException {
-
- ClassLoader cl = Thread.currentThread().getContextClassLoader();
- if (cl == null) {
- cl = this.getClass().getClassLoader();
- }
- return cl.loadClass(name);
-
- }
-
-
- /**
* <p>Return the <code>Log</code> instance to use, creating one if
needed.</p>
*/
private Log log() {
@@ -356,124 +146,6 @@
log = LogFactory.getLog(RemotingPhaseListener.class);
}
return log;
-
- }
-
-
- /**
- * <p>Return an array of URL patterns that <code>FacesServlet</code> is
- * mapped to for this application.</p>
- *
- * @param context <code>FacesContext</code> for the current request
- */
- private String[] patterns(FacesContext context) {
-
- Document document = null;
- InputStream stream = null;
-
- try {
-
- // Acquire a URL for /WEB-INF/web.xml (if any)
- Object ctxt = context.getExternalContext().getContext();
- Method method =
- ctxt.getClass().getMethod("getResource",
- new Class[] { String.class });
- URL url = (URL) method.invoke(ctxt, new Object[] {
"/WEB-INF/web.xml" });
- if (url == null) {
- if (log().isTraceEnabled()) {
- log().trace("No /WEB-INF/web.xml resource available,
returning empty list");
- }
- return new String[0];
- }
-
- // Parse this resource into a DOM tree
- DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
- DocumentBuilder db = dbf.newDocumentBuilder();
- stream = url.openStream();
- document = db.parse(stream);
-
- } catch (Exception e) {
-
- if (log().isErrorEnabled()) {
- log().error(bundle.getString("mappings.parseWebXml"), e);
- }
- return new String[0];
-
- } finally {
-
- if (stream != null) {
- try { stream.close(); } catch (Exception e) {}
- }
-
- }
-
- // Identify the servlet name of the JavaServer Faces controller servlet
- String name = null;
- NodeList servletNodes = document.getElementsByTagName("servlet");
- for (int i = 0; i < servletNodes.getLength(); i++) {
- Node servletNode = servletNodes.item(i);
- String servletName = null;
- String servletClass = null;
- NodeList kids = servletNode.getChildNodes();
- for (int j = 0; j < kids.getLength(); j++) {
- Node kid = kids.item(j);
- if ("servlet-name".equals(kid.getNodeName())) {
- servletName = text(kid);
- } else if ("servlet-class".equals(kid.getNodeName())) {
- servletClass = text(kid);
- }
- }
- if ("javax.faces.webapp.FacesServlet".equals(servletClass)) {
- name = servletName;
-// break;
- }
- }
- if (name == null) {
- return new String[0];
- }
-
- // Identify the URL patterns to which this servlet is mapped
- List list = new ArrayList();
- NodeList mappingNodes =
document.getElementsByTagName("servlet-mapping");
- for (int i = 0; i < mappingNodes.getLength(); i++) {
- Node mappingNode = mappingNodes.item(i);
- String servletName = null;
- String urlPattern = null;
- NodeList kids = mappingNode.getChildNodes();
- for (int j = 0; j < kids.getLength(); j++) {
- Node kid = kids.item(j);
- if ("servlet-name".equals(kid.getNodeName())) {
- servletName = text(kid);
- } else if ("url-pattern".equals(kid.getNodeName())) {
- urlPattern = text(kid);
- }
- }
- if (name.equals(servletName)) {
- list.add(urlPattern);
- }
- }
-
- // Return the resulting list
- return (String[]) list.toArray(new String[list.size()]);
-
- }
-
-
- /**
- * <p>Return the text content inside the specified node.</p>
- *
- * @param node Node from which text is to be extracted
- */
- private String text(Node node) {
-
- NodeList kids = node.getChildNodes();
- for (int k = 0; k < kids.getLength(); k++) {
- Node kid = kids.item(k);
- if ("#text".equals(kid.getNodeName())) {
- return kid.getNodeValue().trim();
- }
- }
- return "";
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]