[richfaces-svn-commits] JBoss Rich Faces SVN: r2165 - in trunk/framework: impl/src/main/java/org/ajax4jsf/context and 3 other directories.

richfaces-svn-commits at lists.jboss.org richfaces-svn-commits at lists.jboss.org
Wed Aug 8 22:08:46 EDT 2007


Author: alexsmirnov
Date: 2007-08-08 22:08:46 -0400 (Wed, 08 Aug 2007)
New Revision: 2165

Modified:
   trunk/framework/api/src/main/java/org/ajax4jsf/context/AjaxContext.java
   trunk/framework/impl/src/main/java/org/ajax4jsf/context/AjaxContextImpl.java
   trunk/framework/impl/src/main/java/org/ajax4jsf/event/AjaxPhaseListener.java
   trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseFilter.java
   trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
   trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
Log:
Start progress on http://jira.jboss.org/jira/browse/RF-548 .
Display error page in ajax requests.

Modified: trunk/framework/api/src/main/java/org/ajax4jsf/context/AjaxContext.java
===================================================================
--- trunk/framework/api/src/main/java/org/ajax4jsf/context/AjaxContext.java	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/api/src/main/java/org/ajax4jsf/context/AjaxContext.java	2007-08-09 02:08:46 UTC (rev 2165)
@@ -109,6 +109,8 @@
 	public AjaxContext() {
 		super();
 	}
+	
+	public abstract void release();
 
 	public abstract Map getResponseDataMap();
 

Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/context/AjaxContextImpl.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/context/AjaxContextImpl.java	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/context/AjaxContextImpl.java	2007-08-09 02:08:46 UTC (rev 2165)
@@ -78,499 +78,524 @@
  * 
  */
 public class AjaxContextImpl extends AjaxContext {
-    public static final String RESOURCES_PROCESSED = "org.ajax4jsf.framework.HEADER_PROCESSED";
+	public static final String RESOURCES_PROCESSED = "org.ajax4jsf.framework.HEADER_PROCESSED";
 
-    private static final Log log = LogFactory.getLog(AjaxContext.class);
+	private static final Log log = LogFactory.getLog(AjaxContext.class);
 
-    private static ComponentInvoker invoker;
+	private static ComponentInvoker invoker;
 
-    private static Map contextClasses = new HashMap();
+	private static Map contextClasses = new HashMap();
 
-    Set ajaxAreasToRender = new HashSet();
+	Set ajaxAreasToRender = new HashSet();
 
-    Set ajaxRenderedAreas = new HashSet();
+	Set ajaxRenderedAreas = new HashSet();
 
-    boolean ajaxRequest = false;
+	boolean ajaxRequest = false;
 
-    boolean ajaxRequestSet = false;
+	boolean ajaxRequestSet = false;
 
-    boolean selfRender = false;
+	boolean selfRender = false;
 
-    Integer viewSequence = new Integer(1);
+	Integer viewSequence = new Integer(1);
 
-    String submittedRegionClientId = null;
+	String submittedRegionClientId = null;
 
-    boolean submittedRegionSet = false;
+	boolean submittedRegionSet = false;
 
-    ViewIdHolder viewIdHolder = null;
+	ViewIdHolder viewIdHolder = null;
 
-    Map responseDataMap = new HashMap();
+	Map responseDataMap = new HashMap();
 
-    Map commonAjaxParameters = new HashMap();
+	Map commonAjaxParameters = new HashMap();
 
-    static {
-	try {
-	    // Attempt to create JSF1.2 specific invoker.
-	    invoker = new JsfOneOneInvoker();
-	} catch (Exception e) {
-	    invoker = new JsfOneOneInvoker();
+	static {
+		try {
+			// Attempt to create JSF1.2 specific invoker.
+			invoker = new JsfOneOneInvoker();
+		} catch (Exception e) {
+			invoker = new JsfOneOneInvoker();
+		}
 	}
-    }
+	
+	public void release() {
+		
+		ajaxAreasToRender = new HashSet();
 
-    /**
-         * @param root
-         * @param context
-         * @param callback
-         * @param regionId
-         * @return
-         * @see org.ajax4jsf.context.JsfOneOneInvoker#invokeOnComponent(javax.faces.component.UIComponent,
-         *      javax.faces.context.FacesContext,
-         *      org.ajax4jsf.context.InvokerCallback, java.lang.String)
-         */
-    public static boolean invokeOnComponent(UIComponent root,
-	    FacesContext context, InvokerCallback callback, String regionId) {
-	return invoker.invokeOnComponent(root, context, callback, regionId);
-    }
+		ajaxRenderedAreas = new HashSet();
 
-    /**
-         * @param viewRoot
-     * @param context
-     * @param callback
-         * @see org.ajax4jsf.context.JsfOneOneInvoker#invokeOnRegionOrRoot(org.ajax4jsf.component.AjaxViewRoot,
-         *      javax.faces.context.FacesContext,
-         *      org.ajax4jsf.context.InvokerCallback)
-         */
-    public static void invokeOnRegionOrRoot(AjaxViewRoot viewRoot,
-	    FacesContext context, InvokerCallback callback) {
-	invoker.invokeOnRegionOrRoot(viewRoot, context, callback);
-    }
+		ajaxRequest = false;
 
-    private InvokerCallback _ajaxInvoker = new InvokerCallback() {
+		ajaxRequestSet = false;
 
-	public void invoke(FacesContext context, UIComponent component) {
-	    if (component instanceof AjaxContainer) {
-		AjaxContainer ajax = (AjaxContainer) component;
-		renderAjaxRegion(context, component, true);
-	    } else {
-		// Container not found, use Root for encode.
-		renderAjaxRegion(context, context.getViewRoot(), true);
-	    }
+		selfRender = false;
+
+		viewSequence = new Integer(1);
+
+		submittedRegionClientId = null;
+
+		submittedRegionSet = false;
+
+		viewIdHolder = null;
+
+		responseDataMap = new HashMap();
+
+		commonAjaxParameters = new HashMap();
+		
 	}
 
-	public void invokeRoot(FacesContext context) {
-	    renderAjaxRegion(context, context.getViewRoot(), true);
+	/**
+	 * @param root
+	 * @param context
+	 * @param callback
+	 * @param regionId
+	 * @return
+	 * @see org.ajax4jsf.context.JsfOneOneInvoker#invokeOnComponent(javax.faces.component.UIComponent,
+	 *      javax.faces.context.FacesContext,
+	 *      org.ajax4jsf.context.InvokerCallback, java.lang.String)
+	 */
+	public static boolean invokeOnComponent(UIComponent root,
+			FacesContext context, InvokerCallback callback, String regionId) {
+		return invoker.invokeOnComponent(root, context, callback, regionId);
 	}
 
-    };
+	/**
+	 * @param viewRoot
+	 * @param context
+	 * @param callback
+	 * @see org.ajax4jsf.context.JsfOneOneInvoker#invokeOnRegionOrRoot(org.ajax4jsf.component.AjaxViewRoot,
+	 *      javax.faces.context.FacesContext,
+	 *      org.ajax4jsf.context.InvokerCallback)
+	 */
+	public static void invokeOnRegionOrRoot(AjaxViewRoot viewRoot,
+			FacesContext context, InvokerCallback callback) {
+		invoker.invokeOnRegionOrRoot(viewRoot, context, callback);
+	}
 
-    public void renderSubmittedAjaxRegion(FacesContext context) {
-	renderSubmittedAjaxRegion(context, true);
-    }
+	private InvokerCallback _ajaxInvoker = new InvokerCallback() {
 
-    public void renderSubmittedAjaxRegion(FacesContext context,
-	    final boolean useFilterWriter) {
-	InvokerCallback ajaxInvoker = new InvokerCallback() {
+		public void invoke(FacesContext context, UIComponent component) {
+			if (component instanceof AjaxContainer) {
+				AjaxContainer ajax = (AjaxContainer) component;
+				renderAjaxRegion(context, component, true);
+			} else {
+				// Container not found, use Root for encode.
+				renderAjaxRegion(context, context.getViewRoot(), true);
+			}
+		}
 
-	    public void invoke(FacesContext context, UIComponent component) {
-		if (component instanceof AjaxContainer) {
-		    renderAjaxRegion(context, component, useFilterWriter);
-		} else {
-		    // Container not found, use Root for encode.
-		    renderAjaxRegion(context, context.getViewRoot(),
-			    useFilterWriter);
+		public void invokeRoot(FacesContext context) {
+			renderAjaxRegion(context, context.getViewRoot(), true);
 		}
-	    }
 
-	    public void invokeRoot(FacesContext context) {
-		renderAjaxRegion(context, context.getViewRoot(),
-			useFilterWriter);
-	    }
+	};
 
-	};
-	if (!invokeOnComponent(context.getViewRoot(), context, ajaxInvoker,
-		getSubmittedRegionClientId(context))) {
-	    renderAjaxRegion(context, context.getViewRoot(), useFilterWriter);
+	public void renderSubmittedAjaxRegion(FacesContext context) {
+		renderSubmittedAjaxRegion(context, true);
 	}
 
-    }
+	public void renderSubmittedAjaxRegion(FacesContext context,
+			final boolean useFilterWriter) {
+		InvokerCallback ajaxInvoker = new InvokerCallback() {
 
-    /**
-         * @param context
-         * @param useFilterWriter
-         *                TODO
-         * @throws AbortProcessingException
-         */
-    public void renderAjaxRegion(FacesContext context, UIComponent component,
-	    boolean useFilterWriter) throws FacesException {
-	if (log.isDebugEnabled()) {
-	    log.debug(Messages.getMessage(Messages.RENDER_AJAX_REQUEST,
-		    component.getId()));
+			public void invoke(FacesContext context, UIComponent component) {
+				if (component instanceof AjaxContainer) {
+					renderAjaxRegion(context, component, useFilterWriter);
+				} else {
+					// Container not found, use Root for encode.
+					renderAjaxRegion(context, context.getViewRoot(),
+							useFilterWriter);
+				}
+			}
+
+			public void invokeRoot(FacesContext context) {
+				renderAjaxRegion(context, context.getViewRoot(),
+						useFilterWriter);
+			}
+
+		};
+		if (!invokeOnComponent(context.getViewRoot(), context, ajaxInvoker,
+				getSubmittedRegionClientId(context))) {
+			renderAjaxRegion(context, context.getViewRoot(), useFilterWriter);
+		}
+
 	}
-	try {
-	    setSelfRender(true);
-	    // create response writer.
-	    ExternalContext extContext = context.getExternalContext();
-	    RenderKit renderKit = context.getRenderKit();
-	    String encoding;
-	    // Depends if we talk about servlets, portlets, ...
-	    if (extContext.getRequest() instanceof ServletRequest) {
-		ServletRequest request = (ServletRequest) extContext
-			.getRequest();
-		ServletResponse response = (ServletResponse) extContext
-			.getResponse();
-		// HACK - bypass MyFaces ( and other ) extensions filter.
 
-		// Setup encoding and content type
-		String contentType = "text/xml";
-		// get the encoding - must be setup by faces context or filter.
-		encoding = request.getCharacterEncoding();
-		if (encoding == null) {
-		    encoding = "UTF-8";
+	/**
+	 * @param context
+	 * @param useFilterWriter
+	 *            TODO
+	 * @throws AbortProcessingException
+	 */
+	public void renderAjaxRegion(FacesContext context, UIComponent component,
+			boolean useFilterWriter) throws FacesException {
+		if (log.isDebugEnabled()) {
+			log.debug(Messages.getMessage(Messages.RENDER_AJAX_REQUEST,
+					component.getId()));
 		}
-		response.setContentType(contentType + ";charset=" + encoding);
-	    } else
-		encoding = "UTF-8";
+		try {
+			setSelfRender(true);
+			// create response writer.
+			ExternalContext extContext = context.getExternalContext();
+			RenderKit renderKit = context.getRenderKit();
+			String encoding;
+			// Depends if we talk about servlets, portlets, ...
+			if (extContext.getRequest() instanceof ServletRequest) {
+				ServletRequest request = (ServletRequest) extContext
+						.getRequest();
+				ServletResponse response = (ServletResponse) extContext
+						.getResponse();
+				// HACK - bypass MyFaces ( and other ) extensions filter.
 
-	    PrintWriter servletWriter;
-	    if (useFilterWriter
-		    && extContext.getRequestMap().containsKey(
-			    BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE)) {
-		// HACK - Special case for MyFaces, since <f:view don't call
-		// encode methods,
-		// encode response as for self-rendered region directly to
-		// filter response wrpper.
-		// to avoid exceptions, inform wrapper to ignore illegal states
-		// for getWriter/Stream.
-		ServletResponse servletResponse = (ServletResponse) extContext
-			.getRequestMap().get(
-				BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE);
-		servletResponse.resetBuffer();
-		servletWriter = servletResponse.getWriter();
-		((FilterServletResponseWrapper) servletResponse)
-			.setUseNullStream(true);
-	    } else {
-		servletWriter = getWriter(extContext);
-	    }
-	    ResponseWriter writer = renderKit.createResponseWriter(
-		    servletWriter, null, encoding);
-	    context.setResponseWriter(writer);
-	    // make response
-	    writer.startDocument();
-	    encodeAjaxBegin(context, component);
-	    component.encodeBegin(context);
-	    ((AjaxContainer) component).encodeAjax(context);
-	    component.encodeEnd(context);
-	    saveViewState(context);
-	    encodeAjaxEnd(context, component);
-	    writer.endDocument();
-	    writer.flush();
-	    writer.close();
-	    servletWriter.close();
-	    // Save tree state.
-	} catch (IOException e) {
-	    throw new FacesException(Messages.getMessage(
-		    Messages.RENDERING_AJAX_REGION_ERROR, component
-			    .getClientId(context)), e);
-	} finally {
-	    context.responseComplete();
-	    // component.setRendererType(defaultRenderer);
+				// Setup encoding and content type
+				String contentType = "text/xml";
+				// get the encoding - must be setup by faces context or filter.
+				encoding = request.getCharacterEncoding();
+				if (encoding == null) {
+					encoding = "UTF-8";
+				}
+				response.setContentType(contentType + ";charset=" + encoding);
+			} else
+				encoding = "UTF-8";
+
+			PrintWriter servletWriter;
+			if (useFilterWriter
+					&& extContext.getRequestMap().containsKey(
+							BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE)) {
+				// HACK - Special case for MyFaces, since <f:view don't call
+				// encode methods,
+				// encode response as for self-rendered region directly to
+				// filter response wrpper.
+				// to avoid exceptions, inform wrapper to ignore illegal states
+				// for getWriter/Stream.
+				ServletResponse servletResponse = (ServletResponse) extContext
+						.getRequestMap().get(
+								BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE);
+				servletResponse.resetBuffer();
+				servletWriter = servletResponse.getWriter();
+				((FilterServletResponseWrapper) servletResponse)
+						.setUseNullStream(true);
+			} else {
+				servletWriter = getWriter(extContext);
+			}
+			ResponseWriter writer = renderKit.createResponseWriter(
+					servletWriter, null, encoding);
+			context.setResponseWriter(writer);
+			// make response
+			writer.startDocument();
+			encodeAjaxBegin(context, component);
+			component.encodeBegin(context);
+			((AjaxContainer) component).encodeAjax(context);
+			component.encodeEnd(context);
+			saveViewState(context);
+			encodeAjaxEnd(context, component);
+			writer.endDocument();
+			writer.flush();
+			writer.close();
+			servletWriter.close();
+			// Save tree state.
+		} catch (IOException e) {
+			throw new FacesException(Messages.getMessage(
+					Messages.RENDERING_AJAX_REGION_ERROR, component
+							.getClientId(context)), e);
+		} finally {
+			context.responseComplete();
+			// component.setRendererType(defaultRenderer);
+		}
 	}
-    }
 
-    /**
-         * Encode declaration for AJAX response. Render &lt;html&gt;&lt;body&gt;
-         * 
-         * @param context
-         * @param component
-         * @throws IOException
-         */
-    public void encodeAjaxBegin(FacesContext context, UIComponent component)
-	    throws IOException {
-	// AjaxContainer ajax = (AjaxContainer) component;
-	ResponseWriter out = context.getResponseWriter();
-	// DebugUtils.traceView("ViewRoot in AJAX Page encode begin");
-	out.startElement(HTML.HTML_ELEMENT, component);
-	// TODO - html attributes. lang - from current locale ?
-	Locale locale = context.getViewRoot().getLocale();
-	out.writeAttribute(HTML.lang_ATTRIBUTE, locale.toString(), "lang");
-	out.startElement(HTML.BODY_ELEMENT, component);
-    }
+	/**
+	 * Encode declaration for AJAX response. Render &lt;html&gt;&lt;body&gt;
+	 * 
+	 * @param context
+	 * @param component
+	 * @throws IOException
+	 */
+	public void encodeAjaxBegin(FacesContext context, UIComponent component)
+			throws IOException {
+		// AjaxContainer ajax = (AjaxContainer) component;
+		ResponseWriter out = context.getResponseWriter();
+		// DebugUtils.traceView("ViewRoot in AJAX Page encode begin");
+		out.startElement(HTML.HTML_ELEMENT, component);
+		// TODO - html attributes. lang - from current locale ?
+		Locale locale = context.getViewRoot().getLocale();
+		out.writeAttribute(HTML.lang_ATTRIBUTE, locale.toString(), "lang");
+		out.startElement(HTML.BODY_ELEMENT, component);
+	}
 
-    /**
-         * End encoding of AJAX response. Render tag with included areas and
-         * close &lt;/body&gt;&lt;/html&gt;
-         * 
-         * @param context
-         * @param component
-         * @throws IOException
-         */
-    public void encodeAjaxEnd(FacesContext context, UIComponent component)
-	    throws IOException {
-	// AjaxContainer ajax = (AjaxContainer) component;
-	ResponseWriter out = context.getResponseWriter();
-	// DebugUtils.traceView("ViewRoot in AJAX Page encode begin");
-	out.endElement(HTML.BODY_ELEMENT);
-	out.endElement(HTML.HTML_ELEMENT);
-    }
+	/**
+	 * End encoding of AJAX response. Render tag with included areas and close
+	 * &lt;/body&gt;&lt;/html&gt;
+	 * 
+	 * @param context
+	 * @param component
+	 * @throws IOException
+	 */
+	public void encodeAjaxEnd(FacesContext context, UIComponent component)
+			throws IOException {
+		// AjaxContainer ajax = (AjaxContainer) component;
+		ResponseWriter out = context.getResponseWriter();
+		// DebugUtils.traceView("ViewRoot in AJAX Page encode begin");
+		out.endElement(HTML.BODY_ELEMENT);
+		out.endElement(HTML.HTML_ELEMENT);
+	}
 
-    /**
-         * @param context
-         * @param root
-         * @throws FacesException
-         */
-    public void processHeadResources(FacesContext context)
-	    throws FacesException {
-	ExternalContext externalContext = context.getExternalContext();
-	Map requestMap = externalContext.getRequestMap();
-	if (!Boolean.TRUE.equals(requestMap.get(RESOURCES_PROCESSED))) {
-	    if (null != requestMap.get(BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE)) {
-		if (log.isDebugEnabled()) {
-		    log
-			    .debug("Process component tree for collect used scripts and styles");
+	/**
+	 * @param context
+	 * @param root
+	 * @throws FacesException
+	 */
+	public void processHeadResources(FacesContext context)
+			throws FacesException {
+		ExternalContext externalContext = context.getExternalContext();
+		Map requestMap = externalContext.getRequestMap();
+		if (!Boolean.TRUE.equals(requestMap.get(RESOURCES_PROCESSED))) {
+			if (null != requestMap.get(BaseFilter.RESPONSE_WRAPPER_ATTRIBUTE)) {
+				if (log.isDebugEnabled()) {
+					log
+							.debug("Process component tree for collect used scripts and styles");
+				}
+				UIViewRoot root = context.getViewRoot();
+				Set scripts = new LinkedHashSet();
+				Set styles = new LinkedHashSet();
+				RenderKitFactory rkFactory = (RenderKitFactory) FactoryFinder
+						.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
+				RenderKit renderKit = rkFactory.getRenderKit(context, context
+						.getViewRoot().getRenderKitId());
+				processHeadResources(context, root, scripts, styles, renderKit);
+				if (scripts.size() > 0) {
+					if (log.isDebugEnabled()) {
+						StringBuffer buff = new StringBuffer(
+								"Scripts for insert into head : \n");
+						for (Iterator iter = scripts.iterator(); iter.hasNext();) {
+							String script = (String) iter.next();
+							buff.append(script).append("\n");
+						}
+						log.debug(buff.toString());
+					}
+					requestMap.put(SCRIPTS_PARAMETER, scripts);
+				}
+				// Set default style sheet for current skin.
+				String styleSheetUri = null;
+				try {
+					styleSheetUri = (String) SkinFactory.getInstance().getSkin(
+							context).getParameter(context,
+							Skin.generalStyleSheet);
+				} catch (SkinNotFoundException e) {
+					log.warn("Current Skin is not found", e);
+				}
+				if (null != styleSheetUri) {
+					String resourceURL = context.getApplication()
+							.getViewHandler().getResourceURL(context,
+									styleSheetUri);
+					// TODO - some resources can be non-session aware, we
+					// must
+					// skip encoding for this case ?
+					// But, in common case - static links not need session
+					// info,
+					// and dynamic resources perform encodings if nessesary
+					// resourceURL =
+					// context.getExternalContext().encodeResourceURL(resourceURL);
+					styles.add(resourceURL);
+				}
+				if (styles.size() > 0) {
+					if (log.isDebugEnabled()) {
+						StringBuffer buff = new StringBuffer(
+								"Styles for insert into head : \n");
+						for (Iterator iter = styles.iterator(); iter.hasNext();) {
+							String style = (String) iter.next();
+							buff.append(style).append("\n");
+						}
+						log.debug(buff.toString());
+					}
+					requestMap.put(STYLES_PARAMETER, styles);
+				}
+				// Mark as processed.
+				requestMap.put(RESOURCES_PROCESSED, Boolean.TRUE);
+				// Save viewId for a parser selection
+				requestMap.put(AjaxViewHandler.VIEW_ID_KEY, root.getViewId());
+			}
+
 		}
-		UIViewRoot root = context.getViewRoot();
-		Set scripts = new LinkedHashSet();
-		Set styles = new LinkedHashSet();
-		RenderKitFactory rkFactory = (RenderKitFactory) FactoryFinder
-			.getFactory(FactoryFinder.RENDER_KIT_FACTORY);
-		RenderKit renderKit = rkFactory.getRenderKit(context, context
-			.getViewRoot().getRenderKitId());
-		processHeadResources(context, root, scripts, styles, renderKit);
-		if (scripts.size() > 0) {
-		    if (log.isDebugEnabled()) {
-			StringBuffer buff = new StringBuffer(
-				"Scripts for insert into head : \n");
-			for (Iterator iter = scripts.iterator(); iter.hasNext();) {
-			    String script = (String) iter.next();
-			    buff.append(script).append("\n");
+	}
+
+	/**
+	 * Append nessesary scripts and styles from component ( if renderer
+	 * implements {@link HeaderResourceProducer}) and recursive process all
+	 * facets and childrens.
+	 * 
+	 * @param context
+	 *            TODO
+	 * @param root
+	 * @param scripts
+	 * @param styles
+	 * @param renderKit
+	 *            TODO
+	 */
+	private void processHeadResources(FacesContext context, UIComponent root,
+			Set scripts, Set styles, RenderKit renderKit) {
+		Renderer renderer = getRenderer(context, root, renderKit);
+		if (null != renderer) {
+			if (renderer instanceof HeaderResourceProducer) {
+				HeaderResourceProducer producer = (HeaderResourceProducer) renderer;
+				Set set = producer.getHeaderScripts(context, root);
+				if (null != set) {
+					scripts.addAll(set);
+				}
+				set = producer.getHeaderStyles(context, root);
+				if (null != set) {
+					styles.addAll(set);
+				}
 			}
-			log.debug(buff.toString());
-		    }
-		    requestMap.put(SCRIPTS_PARAMETER, scripts);
 		}
-		// Set default style sheet for current skin.
-		String styleSheetUri = null;
-		try {
-		    styleSheetUri = (String) SkinFactory.getInstance().getSkin(
-			    context).getParameter(context,
-			    Skin.generalStyleSheet);
-		} catch (SkinNotFoundException e) {
-		    log.warn("Current Skin is not found", e);
+		for (Iterator iter = root.getFacets().values().iterator(); iter
+				.hasNext();) {
+			UIComponent child = (UIComponent) iter.next();
+			processHeadResources(context, child, scripts, styles, renderKit);
 		}
-		if (null != styleSheetUri) {
-		    String resourceURL = context.getApplication()
-			    .getViewHandler().getResourceURL(context,
-				    styleSheetUri);
-		    // TODO - some resources can be non-session aware, we
-		    // must
-		    // skip encoding for this case ?
-		    // But, in common case - static links not need session
-		    // info,
-		    // and dynamic resources perform encodings if nessesary
-		    // resourceURL =
-		    // context.getExternalContext().encodeResourceURL(resourceURL);
-		    styles.add(resourceURL);
+		for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) {
+			UIComponent child = (UIComponent) iter.next();
+			processHeadResources(context, child, scripts, styles, renderKit);
 		}
-		if (styles.size() > 0) {
-		    if (log.isDebugEnabled()) {
-			StringBuffer buff = new StringBuffer(
-				"Styles for insert into head : \n");
-			for (Iterator iter = styles.iterator(); iter.hasNext();) {
-			    String style = (String) iter.next();
-			    buff.append(style).append("\n");
-			}
-			log.debug(buff.toString());
-		    }
-		    requestMap.put(STYLES_PARAMETER, styles);
+	}
+
+	/**
+	 * Find renderer for given component.
+	 * 
+	 * @param context
+	 * @param comp
+	 * @param renderKit
+	 * @return
+	 */
+	private Renderer getRenderer(FacesContext context, UIComponent comp,
+			RenderKit renderKit) {
+
+		String rendererType = comp.getRendererType();
+		if (rendererType != null) {
+			return (renderKit.getRenderer(comp.getFamily(), rendererType));
+		} else {
+			return (null);
 		}
-		// Mark as processed.
-		requestMap.put(RESOURCES_PROCESSED, Boolean.TRUE);
-        // Save viewId for a parser selection
-        requestMap.put(
-                AjaxViewHandler.VIEW_ID_KEY,root.getViewId());
-	    }
 
 	}
-    }
 
-    /**
-         * Append nessesary scripts and styles from component ( if renderer
-         * implements {@link HeaderResourceProducer}) and recursive process all
-         * facets and childrens.
-         * 
-         * @param context
-         *                TODO
-         * @param root
-         * @param scripts
-         * @param styles
-         * @param renderKit
-         *                TODO
-         */
-    private void processHeadResources(FacesContext context, UIComponent root,
-	    Set scripts, Set styles, RenderKit renderKit) {
-	Renderer renderer = getRenderer(context, root, renderKit);
-	if (null != renderer) {
-	    if (renderer instanceof HeaderResourceProducer) {
-		HeaderResourceProducer producer = (HeaderResourceProducer) renderer;
-		Set set = producer.getHeaderScripts(context, root);
-		if (null != set) {
-		    scripts.addAll(set);
+	public void saveViewState(FacesContext context) throws IOException {
+		// TODO - for facelets environment, we need to remove transient
+		// components.
+		try {
+			Application.class.getMethod("getExpressionFactory", null);
+		} catch (NoSuchMethodException e) {
+			// JSF 1.1 !
 		}
-		set = producer.getHeaderStyles(context, root);
-		if (null != set) {
-		    styles.addAll(set);
+		ResponseWriter writer = context.getResponseWriter();
+		StateManager stateManager = context.getApplication().getStateManager();
+		SerializedView serializedView = stateManager
+				.saveSerializedView(context);
+		if (null != serializedView) {
+			StringWriter bufWriter = new StringWriter();
+			ResponseWriter cloneWithWriter = writer.cloneWithWriter(bufWriter);
+			context.setResponseWriter(cloneWithWriter);
+			stateManager.writeState(context, serializedView);
+			cloneWithWriter.flush();
+			if (bufWriter.getBuffer().length() > 0) {
+				context.getExternalContext().getRequestMap().put(
+						AjaxViewHandler.SERIALIZED_STATE_KEY,
+						bufWriter.toString());
+			}
+			// Restore original writer.
+			context.setResponseWriter(writer);
 		}
-	    }
 	}
-	for (Iterator iter = root.getFacets().values().iterator(); iter
-		.hasNext();) {
-	    UIComponent child = (UIComponent) iter.next();
-	    processHeadResources(context, child, scripts, styles, renderKit);
+
+	/**
+	 * @return Returns the ajaxRequest.
+	 */
+	public boolean isAjaxRequest() {
+		return isAjaxRequest(FacesContext.getCurrentInstance());
 	}
-	for (Iterator iter = root.getChildren().iterator(); iter.hasNext();) {
-	    UIComponent child = (UIComponent) iter.next();
-	    processHeadResources(context, child, scripts, styles, renderKit);
+
+	/**
+	 * @return Returns the ajaxRequest.
+	 */
+	public boolean isAjaxRequest(FacesContext context) {
+		if (!this.ajaxRequestSet) {
+			ajaxRequest = null != getSubmittedRegionClientId(context);
+			ajaxRequestSet = true;
+		}
+		return ajaxRequest;
 	}
-    }
 
-    /**
-         * Find renderer for given component.
-         * 
-         * @param context
-         * @param comp
-         * @param renderKit
-         * @return
-         */
-    private Renderer getRenderer(FacesContext context, UIComponent comp,
-	    RenderKit renderKit) {
+	/**
+	 * @param ajaxRequest
+	 *            The ajaxRequest to set.
+	 */
+	public void setAjaxRequest(boolean ajaxRequest) {
+		this.ajaxRequest = ajaxRequest;
+		this.ajaxRequestSet = true;
+	}
 
-	String rendererType = comp.getRendererType();
-	if (rendererType != null) {
-	    return (renderKit.getRenderer(comp.getFamily(), rendererType));
-	} else {
-	    return (null);
+	/**
+	 * @return Returns the ajaxAreasToRender.
+	 */
+	public Set getAjaxAreasToRender() {
+		return this.ajaxAreasToRender;
 	}
 
-    }
-
-    public void saveViewState(FacesContext context) throws IOException {
-	// TODO - for facelets environment, we need to remove transient
-	// components.
-	try {
-	    Application.class.getMethod("getExpressionFactory", null);
-	} catch (NoSuchMethodException e) {
-	    // JSF 1.1 !
+	/**
+	 * Add affected regions's ID to ajaxView component.
+	 * 
+	 * @param component
+	 */
+	public void addRegionsFromComponent(UIComponent component) {
+		// First step - find parent ajax view
+		Set ajaxRegions = AjaxRendererUtils.getAjaxAreas(component);
+		// if (ajaxRegions == null){
+		// FacesContext context = FacesContext.getCurrentInstance();
+		// ajaxRegions = AjaxRendererUtils.getAbsoluteId(context,component);
+		// }
+		if (log.isDebugEnabled()) {
+			log.debug(Messages.getMessage(Messages.INVOKE_AJAX_REGION_LISTENER,
+					component.getId()));
+		}
+		if (ajaxRegions != null) {
+			for (Iterator iter = ajaxRegions.iterator(); iter.hasNext();) {
+				String id = iter.next().toString();
+				ajaxAreasToRender.add(convertId(component, id));
+			}
+		}
 	}
-	ResponseWriter writer = context.getResponseWriter();
-	StateManager stateManager = context.getApplication().getStateManager();
-	SerializedView serializedView = stateManager
-		.saveSerializedView(context);
-	if (null != serializedView) {
-	    StringWriter bufWriter = new StringWriter();
-	    ResponseWriter cloneWithWriter = writer.cloneWithWriter(bufWriter);
-	    context.setResponseWriter(cloneWithWriter);
-	    stateManager.writeState(context, serializedView);
-	    cloneWithWriter.flush();
-	    if (bufWriter.getBuffer().length() > 0) {
-		context.getExternalContext().getRequestMap().put(
-			AjaxViewHandler.SERIALIZED_STATE_KEY,
-			bufWriter.toString());
-	    }
-	    // Restore original writer.
-	    context.setResponseWriter(writer);
-	}
-    }
 
-    /**
-         * @return Returns the ajaxRequest.
-         */
-    public boolean isAjaxRequest() {
-	return isAjaxRequest(FacesContext.getCurrentInstance());
-    }
-
-    /**
-         * @return Returns the ajaxRequest.
-         */
-    public boolean isAjaxRequest(FacesContext context) {
-	if (!this.ajaxRequestSet) {
-	    ajaxRequest = null != getSubmittedRegionClientId(context);
-	    ajaxRequestSet = true;
+	public void addComponentToAjaxRender(UIComponent component) {
+		this.ajaxAreasToRender.add(AjaxRendererUtils.getAbsoluteId(component));
 	}
-	return ajaxRequest;
-    }
 
-    /**
-         * @param ajaxRequest
-         *                The ajaxRequest to set.
-         */
-    public void setAjaxRequest(boolean ajaxRequest) {
-	this.ajaxRequest = ajaxRequest;
-	this.ajaxRequestSet = true;
-    }
-
-    /**
-         * @return Returns the ajaxAreasToRender.
-         */
-    public Set getAjaxAreasToRender() {
-	return this.ajaxAreasToRender;
-    }
-
-    /**
-         * Add affected regions's ID to ajaxView component.
-         * 
-         * @param component
-         */
-    public void addRegionsFromComponent(UIComponent component) {
-	// First step - find parent ajax view
-	Set ajaxRegions = AjaxRendererUtils.getAjaxAreas(component);
-	// if (ajaxRegions == null){
-	// FacesContext context = FacesContext.getCurrentInstance();
-	// ajaxRegions = AjaxRendererUtils.getAbsoluteId(context,component);
-	// }
-	if (log.isDebugEnabled()) {
-	    log.debug(Messages.getMessage(Messages.INVOKE_AJAX_REGION_LISTENER,
-		    component.getId()));
+	public void addComponentToAjaxRender(UIComponent base, String id) {
+		this.ajaxAreasToRender.add(convertId(base, id));
 	}
-	if (ajaxRegions != null) {
-	    for (Iterator iter = ajaxRegions.iterator(); iter.hasNext();) {
-		String id = iter.next().toString();
-		ajaxAreasToRender.add(convertId(component, id));
-	    }
-	}
-    }
 
-    public void addComponentToAjaxRender(UIComponent component) {
-	this.ajaxAreasToRender.add(AjaxRendererUtils.getAbsoluteId(component));
-    }
-
-    public void addComponentToAjaxRender(UIComponent base, String id) {
-	this.ajaxAreasToRender.add(convertId(base, id));
-    }
-
-    /**
-         * Test for relative id of target components. Attempt convert to
-         * absolute. For use as argument for
-         * {@link UIComponent#findComponent(java.lang.String)}
-         * 
-         * @param component
-         * @param id
-         * @return
-         */
-    private String convertId(UIComponent component, String id) {
-	if (id.charAt(0) == NamingContainer.SEPARATOR_CHAR) {
-	    return id;
+	/**
+	 * Test for relative id of target components. Attempt convert to absolute.
+	 * For use as argument for
+	 * {@link UIComponent#findComponent(java.lang.String)}
+	 * 
+	 * @param component
+	 * @param id
+	 * @return
+	 */
+	private String convertId(UIComponent component, String id) {
+		if (id.charAt(0) == NamingContainer.SEPARATOR_CHAR) {
+			return id;
+		}
+		if (null == component) {
+			throw new NullPointerException(
+					"Base component for search re-rendered compnnent is null");
+		}
+		UIComponent target = findComponentFor(component, id);
+		if (null != target) {
+			return AjaxRendererUtils.getAbsoluteId(target);
+		}
+		log.warn("Target component for id " + id + " not found");
+		return id;
 	}
-	if (null == component) {
-	    throw new NullPointerException(
-		    "Base component for search re-rendered compnnent is null");
-	}
-	UIComponent target = findComponentFor(component, id);
-	if (null != target) {
-	    return AjaxRendererUtils.getAbsoluteId(target);
-	}
-	log.warn("Target component for id "+id+" not found");
-	return id;
-    }
 
 	/**
 	 * @param component
@@ -582,192 +607,200 @@
 		UIComponent parent = component;
 		UIComponent root = component;
 		while (null == target && null != parent) {
-		    target = parent.findComponent(id);
-		    root = parent;
-		    parent = parent.getParent();
+			target = parent.findComponent(id);
+			root = parent;
+			parent = parent.getParent();
 		}
 		if (null == target) {
-		    target = findUIComponentBelow(root, id);
+			target = findUIComponentBelow(root, id);
 		}
 		return target;
 	}
 
-    private UIComponent findUIComponentBelow(UIComponent root,
-	    String id) {
+	private UIComponent findUIComponentBelow(UIComponent root, String id) {
 
-	UIComponent target = null;
-	for (Iterator iter = root.getFacetsAndChildren(); iter.hasNext();) {
-	    UIComponent child = (UIComponent) iter.next();
-	    if (child instanceof NamingContainer) {
-		try {
-		    target = child.findComponent(id);
-		} catch (IllegalArgumentException iae) {
-		    continue;
+		UIComponent target = null;
+		for (Iterator iter = root.getFacetsAndChildren(); iter.hasNext();) {
+			UIComponent child = (UIComponent) iter.next();
+			if (child instanceof NamingContainer) {
+				try {
+					target = child.findComponent(id);
+				} catch (IllegalArgumentException iae) {
+					continue;
+				}
+			}
+			if (target == null) {
+				if (child.getChildCount() > 0) {
+					target = findUIComponentBelow(child, id);
+				}
+			}
+
+			if (target != null) {
+				break;
+			}
+
 		}
-	    }
-	    if (target == null) {
-		if (child.getChildCount() > 0) {
-		    target = findUIComponentBelow(child, id);
-		}
-	    }
+		return target;
+	}
 
-	    if (target != null) {
-		break;
-	    }
-	    
+	/**
+	 * @return Returns the ajaxRenderedAreas.
+	 */
+	public Set getAjaxRenderedAreas() {
+		return ajaxRenderedAreas;
 	}
-	return target;
-    }
 
-    /**
-         * @return Returns the ajaxRenderedAreas.
-         */
-    public Set getAjaxRenderedAreas() {
-	return ajaxRenderedAreas;
-    }
+	public void addRenderedArea(String id) {
+		ajaxRenderedAreas.add(id);
+	}
 
-    public void addRenderedArea(String id) {
-	ajaxRenderedAreas.add(id);
-    }
+	public boolean removeRenderedArea(String id) {
+		return ajaxRenderedAreas.remove(id);
+	}
 
-    public boolean removeRenderedArea(String id) {
-	return ajaxRenderedAreas.remove(id);
-    }
+	/**
+	 * @return Returns the submittedClientId.
+	 */
+	public String getSubmittedRegionClientId(FacesContext context) {
+		if (!this.submittedRegionSet) {
+			ExternalContext externalContext = context.getExternalContext();
+			if (null == externalContext.getRequestMap().get(
+					"javax.servlet.error.exception")) {
+				Map requestParameterMap = externalContext
+						.getRequestParameterMap();
+				this.submittedRegionClientId = (String) requestParameterMap
+						.get(AjaxContainerRenderer.AJAX_PARAMETER_NAME);
 
-    /**
-         * @return Returns the submittedClientId.
-         */
-    public String getSubmittedRegionClientId(FacesContext context) {
-	if (!this.submittedRegionSet) {
-	    this.submittedRegionClientId = (String) context
-		    .getExternalContext().getRequestParameterMap().get(
-			    AjaxContainerRenderer.AJAX_PARAMETER_NAME);
-	    this.submittedRegionSet = true;
-	    if (!this.ajaxRequestSet) {
-		setAjaxRequest(this.submittedRegionClientId != null);
-	    }
+			} else {
+				// Error page, always parsed as non-ajax request.
+				this.submittedRegionClientId = null;
+			}
+			this.submittedRegionSet = true;
+			if (!this.ajaxRequestSet) {
+				setAjaxRequest(this.submittedRegionClientId != null);
+			}
+		}
+		return this.submittedRegionClientId;
 	}
-	return this.submittedRegionClientId;
-    }
 
-    /**
-         * @param submittedClientId
-         *                The submittedClientId to set.
-         */
-    public void setSubmittedRegionClientId(String submittedClientId) {
-	this.submittedRegionClientId = submittedClientId;
-	this.submittedRegionSet = true;
-    }
+	/**
+	 * @param submittedClientId
+	 *            The submittedClientId to set.
+	 */
+	public void setSubmittedRegionClientId(String submittedClientId) {
+		this.submittedRegionClientId = submittedClientId;
+		this.submittedRegionSet = true;
+	}
 
-    /**
-         * @return Returns the selfRender.
-         */
-    public boolean isSelfRender() {
-	return selfRender;
-    }
+	/**
+	 * @return Returns the selfRender.
+	 */
+	public boolean isSelfRender() {
+		return selfRender;
+	}
 
-    /**
-         * @param selfRender
-         *                The selfRender to set.
-         */
-    public void setSelfRender(boolean selfRender) {
-	this.selfRender = selfRender;
-    }
+	/**
+	 * @param selfRender
+	 *            The selfRender to set.
+	 */
+	public void setSelfRender(boolean selfRender) {
+		this.selfRender = selfRender;
+	}
 
-    /**
-         * @return the vievIdHolder
-         */
-    public ViewIdHolder getViewIdHolder() {
-	return viewIdHolder;
-    }
+	/**
+	 * @return the vievIdHolder
+	 */
+	public ViewIdHolder getViewIdHolder() {
+		return viewIdHolder;
+	}
 
-    /**
-         * @param viewIdHolder
-         *                the vievIdHolder to set
-         */
-    public void setViewIdHolder(ViewIdHolder viewIdHolder) {
-	this.viewIdHolder = viewIdHolder;
-    }
+	/**
+	 * @param viewIdHolder
+	 *            the vievIdHolder to set
+	 */
+	public void setViewIdHolder(ViewIdHolder viewIdHolder) {
+		this.viewIdHolder = viewIdHolder;
+	}
 
-    /**
-         * @return the responseData
-         */
-    public Object getResponseData() {
-	return responseDataMap.get(RESPONSE_DATA_KEY);
-    }
+	/**
+	 * @return the responseData
+	 */
+	public Object getResponseData() {
+		return responseDataMap.get(RESPONSE_DATA_KEY);
+	}
 
-    /**
-         * @param responseData
-         *                the responseData to set
-         */
-    public void setResponseData(Object responseData) {
-	this.responseDataMap.put(RESPONSE_DATA_KEY, responseData);
-    }
+	/**
+	 * @param responseData
+	 *            the responseData to set
+	 */
+	public void setResponseData(Object responseData) {
+		this.responseDataMap.put(RESPONSE_DATA_KEY, responseData);
+	}
 
-    /**
-         * @return the responseDataMap
-         */
-    public Map getResponseDataMap() {
-	return responseDataMap;
-    }
+	/**
+	 * @return the responseDataMap
+	 */
+	public Map getResponseDataMap() {
+		return responseDataMap;
+	}
 
-    /**
-         * Gives back the writer of a Response object.
-         * 
-         * @param extContext
-         *                The external context.
-         * @return The writer of the response.
-         * @throws FacesException
-         *                 If the response object has no getWriter() method.
-         */
-    protected PrintWriter getWriter(ExternalContext extContext)
-	    throws FacesException {
-	PrintWriter writer = null;
-	Object response = extContext.getResponse();
-	try {
-	    Method gW = response.getClass()
-		    .getMethod("getWriter", new Class[0]);
-	    writer = (PrintWriter) gW.invoke(response, new Object[0]);
-	} catch (Exception e) {
-	    throw new FacesException(e);
+	/**
+	 * Gives back the writer of a Response object.
+	 * 
+	 * @param extContext
+	 *            The external context.
+	 * @return The writer of the response.
+	 * @throws FacesException
+	 *             If the response object has no getWriter() method.
+	 */
+	protected PrintWriter getWriter(ExternalContext extContext)
+			throws FacesException {
+		PrintWriter writer = null;
+		Object response = extContext.getResponse();
+		try {
+			Method gW = response.getClass()
+					.getMethod("getWriter", new Class[0]);
+			writer = (PrintWriter) gW.invoke(response, new Object[0]);
+		} catch (Exception e) {
+			throw new FacesException(e);
+		}
+		return writer;
 	}
-	return writer;
-    }
 
-    public String getAjaxActionURL() {
-	return getAjaxActionURL(FacesContext.getCurrentInstance());
-    }
+	public String getAjaxActionURL() {
+		return getAjaxActionURL(FacesContext.getCurrentInstance());
+	}
 
-    public String getAjaxActionURL(FacesContext context) {
-	// Check arguments
-	if (null == context) {
-	    throw new NullPointerException(
-		    "Faces context for build AJAX Action URL is null");
+	public String getAjaxActionURL(FacesContext context) {
+		// Check arguments
+		if (null == context) {
+			throw new NullPointerException(
+					"Faces context for build AJAX Action URL is null");
+		}
+		UIViewRoot viewRoot = context.getViewRoot();
+		if (null == viewRoot) {
+			throw new NullPointerException(
+					"Faces view tree for build AJAX Action URL is null");
+		}
+		String viewId = viewRoot.getViewId();
+		if (null == viewId) {
+			throw new NullPointerException(
+					"View id for build AJAX Action URL is null");
+		}
+		if (!viewId.startsWith("/")) {
+			throw new IllegalArgumentException(
+					"Illegal view Id for build AJAX Action URL: " + viewId);
+		}
+		ViewHandler viewHandler = context.getApplication().getViewHandler();
+		return context.getExternalContext().encodeActionURL(
+				viewHandler.getActionURL(context, viewId));
 	}
-	UIViewRoot viewRoot = context.getViewRoot();
-	if (null == viewRoot) {
-	    throw new NullPointerException(
-		    "Faces view tree for build AJAX Action URL is null");
+
+	/**
+	 * @return the commonAjaxParameters
+	 */
+	public Map getCommonAjaxParameters() {
+		return commonAjaxParameters;
 	}
-	String viewId = viewRoot.getViewId();
-	if (null == viewId) {
-	    throw new NullPointerException(
-		    "View id for build AJAX Action URL is null");
-	}
-	if (!viewId.startsWith("/")) {
-	    throw new IllegalArgumentException(
-		    "Illegal view Id for build AJAX Action URL: " + viewId);
-	}
-	ViewHandler viewHandler = context.getApplication().getViewHandler();
-	return context.getExternalContext().encodeActionURL(
-		viewHandler.getActionURL(context, viewId));
-    }
 
-    /**
-         * @return the commonAjaxParameters
-         */
-    public Map getCommonAjaxParameters() {
-	return commonAjaxParameters;
-    }
-
 }
\ No newline at end of file

Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/event/AjaxPhaseListener.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/event/AjaxPhaseListener.java	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/event/AjaxPhaseListener.java	2007-08-09 02:08:46 UTC (rev 2165)
@@ -53,12 +53,11 @@
 	private static final long serialVersionUID = -4087936963051339868L;
 
 	public static final String VIEW_BEAN_PREFIX = "org.ajax4jsf.viewbean:";
-	
-	public static final String VIEW_STATE_SAVED_PARAM = "org.ajax4jsf.VIEW_STATE_SAVED"; 
 
-	private static final Log log = LogFactory
-			.getLog(AjaxPhaseListener.class);
+	public static final String VIEW_STATE_SAVED_PARAM = "org.ajax4jsf.VIEW_STATE_SAVED";
 
+	private static final Log log = LogFactory.getLog(AjaxPhaseListener.class);
+
 	public static final String AJAX_BEAN_PREFIX = "org.ajax4jsf.ajaxviewbean:";
 
 	/*
@@ -68,44 +67,52 @@
 	 */
 	public void afterPhase(PhaseEvent event) {
 		PhaseId phaseId = event.getPhaseId();
-		if(log.isDebugEnabled()){
-			log.debug("Process after phase "+phaseId.toString());
+		if (log.isDebugEnabled()) {
+			log.debug("Process after phase " + phaseId.toString());
 		}
 		FacesContext context = event.getFacesContext();
 		Map requestMap = context.getExternalContext().getRequestMap();
 		AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
 		if (phaseId == PhaseId.RENDER_RESPONSE) {
-			if (ajaxContext.isAjaxRequest()) {
-				// JSF RI 1.1 hack - view state not saved in <f:view> tag.
-				if(null == requestMap.get(VIEW_STATE_SAVED_PARAM)){
-					try {
+			try {
+				if (ajaxContext.isAjaxRequest()) {
+					// JSF RI 1.1 hack - view state not saved in <f:view> tag.
+					if (null == requestMap.get(VIEW_STATE_SAVED_PARAM)) {
 						ajaxContext.saveViewState(context);
-					} catch (IOException e) {
-						throw new FacesException(e);
 					}
 				}
+			} catch (IOException e) {
+				throw new FacesException(e);
+			} finally {
+				ajaxContext.release();
 			}
-//			ajaxContext.processHeadResources(context);
+			// ajaxContext.processHeadResources(context);
 		} else if (phaseId == PhaseId.RESTORE_VIEW) {
 
 			UIViewRoot viewRoot = context.getViewRoot();
-			if(null != viewRoot){
-			boolean isAjax = ajaxContext.isAjaxRequest();
-			Map attributes = viewRoot.getAttributes();
-			for (Iterator it = attributes.keySet().iterator(); it.hasNext();) {
-				Object key =  it.next();
-				if (key instanceof String) {
-					String stringKey = (String) key;
-					if(stringKey.startsWith(VIEW_BEAN_PREFIX)){
-						requestMap.put(stringKey.substring(VIEW_BEAN_PREFIX.length()), attributes.get(key));
-					} else if(isAjax && stringKey.startsWith(AJAX_BEAN_PREFIX)){
-						requestMap.put(stringKey.substring(AJAX_BEAN_PREFIX.length()), attributes.get(key));
+			if (null != viewRoot) {
+				boolean isAjax = ajaxContext.isAjaxRequest();
+				Map attributes = viewRoot.getAttributes();
+				for (Iterator it = attributes.keySet().iterator(); it.hasNext();) {
+					Object key = it.next();
+					if (key instanceof String) {
+						String stringKey = (String) key;
+						if (stringKey.startsWith(VIEW_BEAN_PREFIX)) {
+							requestMap.put(stringKey.substring(VIEW_BEAN_PREFIX
+									.length()), attributes.get(key));
+						} else if (isAjax
+								&& stringKey.startsWith(AJAX_BEAN_PREFIX)) {
+							requestMap.put(stringKey.substring(AJAX_BEAN_PREFIX
+									.length()), attributes.get(key));
+						}
+
 					}
-
 				}
 			}
-			}
 		}
+		if(context.getResponseComplete()){
+			ajaxContext.release();
+		}
 	}
 
 	/*
@@ -115,14 +122,15 @@
 	 */
 	public void beforePhase(PhaseEvent event) {
 		PhaseId phaseId = event.getPhaseId();
-		if(log.isDebugEnabled()){
-			log.debug("Process before phase "+phaseId.toString());
+		if (log.isDebugEnabled()) {
+			log.debug("Process before phase " + phaseId.toString());
 		}
 		FacesContext context = event.getFacesContext();
 		if (phaseId == PhaseId.RENDER_RESPONSE) {
-			// Clear ViewId replacement, to avoid incorrect rendering of forms URI.
+			// Clear ViewId replacement, to avoid incorrect rendering of forms
+			// URI.
 			AjaxContext.getCurrentInstance(context).setViewIdHolder(null);
-			
+
 			UIViewRoot root = context.getViewRoot();
 			log.debug(Messages.getMessage(
 					Messages.ENTER_BEFORE_RENDER_VIEW_PHASE, root.getViewId(),
@@ -145,6 +153,7 @@
 
 		}
 	}
+
 	/*
 	 * (non-Javadoc)
 	 * 

Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseFilter.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseFilter.java	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseFilter.java	2007-08-09 02:08:46 UTC (rev 2165)
@@ -39,6 +39,7 @@
 import javax.servlet.http.HttpSession;
 
 import org.ajax4jsf.Messages;
+import org.ajax4jsf.context.AjaxContext;
 import org.ajax4jsf.renderkit.AjaxContainerRenderer;
 import org.ajax4jsf.resource.InternetResourceService;
 import org.apache.commons.logging.Log;
@@ -54,334 +55,349 @@
  */
 public abstract class BaseFilter implements Filter {
 
-    public static final String AJAX_PUSH_KEY_HEADER = "Ajax-Push-Key";
+	public static final String AJAX_PUSH_KEY_HEADER = "Ajax-Push-Key";
 
-    private static final Log log = LogFactory.getLog(BaseFilter.class);
+	private static final Log log = LogFactory.getLog(BaseFilter.class);
 
-    public static final boolean DEBUG = true;
+	public static final boolean DEBUG = true;
 
-    private FilterConfig filterConfig;
+	private FilterConfig filterConfig;
 
-    private static final String FUNCTION_NAME_PARAMETER = "function";
+	private static final String FUNCTION_NAME_PARAMETER = "function";
 
-    private String function = "alert('Data received');JSHttpRequest.dataReady";
+	private String function = "alert('Data received');JSHttpRequest.dataReady";
 
-    private String attributesNames;
+	private String attributesNames;
 
-    private boolean rewriteid = false;
+	private boolean rewriteid = false;
 
-    public static final String REWRITEID_PARAMETER = "rewriteid";
+	public static final String REWRITEID_PARAMETER = "rewriteid";
 
-    public static final String STYLESHEET_PARAMETER = "xsl";
+	public static final String STYLESHEET_PARAMETER = "xsl";
 
-    public static final String ABSOLUTE_TAGS_PARAMETER = "absolute-attributes";
+	public static final String ABSOLUTE_TAGS_PARAMETER = "absolute-attributes";
 
-    // private WebXml webXml;
-    // private String xsl;
-    // private Templates xslTemplates;
-    /**
-         * 
-         */
-    private static final long serialVersionUID = -2295534611886142935L;
+	// private WebXml webXml;
+	// private String xsl;
+	// private Templates xslTemplates;
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = -2295534611886142935L;
 
-    public static final String DATA_PARAMETER = "DATA";
+	public static final String DATA_PARAMETER = "DATA";
 
-    public static final String DEFAULT_SERVLET_PATH = "/resource";
+	public static final String DEFAULT_SERVLET_PATH = "/resource";
 
-    public static final String RENDERER_PREFIX = "/renderer";
+	public static final String RENDERER_PREFIX = "/renderer";
 
-    public static final String CACHEABLE_PREFIX = "/cache";
+	public static final String CACHEABLE_PREFIX = "/cache";
 
-    // private static final Pattern rendererPattern =
-    // Pattern.compile(RENDERER_PREFIX+"/([^/]+)/([^/]+)/([^/]+)/(.*)");
-    // private static final Pattern builderPattern =
-    // Pattern.compile(CACHEABLE_PREFIX+"/(.*)");
-    public static final String FILTER_PERFORMED = "com.exade.vcp.Filter.done";
+	// private static final Pattern rendererPattern =
+	// Pattern.compile(RENDERER_PREFIX+"/([^/]+)/([^/]+)/([^/]+)/(.*)");
+	// private static final Pattern builderPattern =
+	// Pattern.compile(CACHEABLE_PREFIX+"/(.*)");
+	public static final String FILTER_PERFORMED = "com.exade.vcp.Filter.done";
 
-    public static final String RESPONSE_WRAPPER_ATTRIBUTE = "com.exade.vcp.Filter.ResponseWrapper";
+	public static final String RESPONSE_WRAPPER_ATTRIBUTE = "com.exade.vcp.Filter.ResponseWrapper";
 
-    protected BaseXMLFilter xmlFilter = null;
+	protected BaseXMLFilter xmlFilter = null;
 
-    protected InternetResourceService resourceService = null;
+	protected InternetResourceService resourceService = null;
 
-    protected PollEventsManager eventsManager;
+	protected PollEventsManager eventsManager;
 
-    /**
-         * Initialize the filter.
-         */
-    public void init(FilterConfig config) throws ServletException {
-	if (log.isDebugEnabled()) {
-	    log.debug("Init ajax4jsf filter with nane: "
-		    + config.getFilterName());
-	    Enumeration parameterNames = config.getInitParameterNames();
-	    StringBuffer parameters = new StringBuffer("Init parameters :\n");
-	    while (parameterNames.hasMoreElements()) {
-		String name = (String) parameterNames.nextElement();
-		parameters.append(name).append(" : '").append(
-			config.getInitParameter(name)).append('\n');
-	    }
-	    log.debug(parameters);
-	    // log.debug("Stack Trace", new Exception());
-	}
-	// Save config
-	filterConfig = config;
-	setFunction((String) nz(filterConfig
-		.getInitParameter(FUNCTION_NAME_PARAMETER), getFunction()));
-	setAttributesNames(filterConfig
-		.getInitParameter(ABSOLUTE_TAGS_PARAMETER));
-	xmlFilter.init(config);
-	if ("true".equalsIgnoreCase(filterConfig
-		.getInitParameter(REWRITEID_PARAMETER))) {
-	    this.setRewriteid(true);
-	}
+	/**
+	 * Initialize the filter.
+	 */
+	public void init(FilterConfig config) throws ServletException {
+		if (log.isDebugEnabled()) {
+			log.debug("Init ajax4jsf filter with nane: "
+					+ config.getFilterName());
+			Enumeration parameterNames = config.getInitParameterNames();
+			StringBuffer parameters = new StringBuffer("Init parameters :\n");
+			while (parameterNames.hasMoreElements()) {
+				String name = (String) parameterNames.nextElement();
+				parameters.append(name).append(" : '").append(
+						config.getInitParameter(name)).append('\n');
+			}
+			log.debug(parameters);
+			// log.debug("Stack Trace", new Exception());
+		}
+		// Save config
+		filterConfig = config;
+		setFunction((String) nz(filterConfig
+				.getInitParameter(FUNCTION_NAME_PARAMETER), getFunction()));
+		setAttributesNames(filterConfig
+				.getInitParameter(ABSOLUTE_TAGS_PARAMETER));
+		xmlFilter.init(config);
+		if ("true".equalsIgnoreCase(filterConfig
+				.getInitParameter(REWRITEID_PARAMETER))) {
+			this.setRewriteid(true);
+		}
 
-	String prefix = filterConfig.getServletContext().getRealPath("/");
-	String file = filterConfig.getInitParameter("log4j-init-file");
-	// if the log4j-init-file is not set, then no point in trying
-	if (file != null) {
-	    Log4JConfigurator log4jconfig = new Log4JConfigurator(prefix);
-	    log4jconfig.doConfigure(file);
+		String prefix = filterConfig.getServletContext().getRealPath("/");
+		String file = filterConfig.getInitParameter("log4j-init-file");
+		// if the log4j-init-file is not set, then no point in trying
+		if (file != null) {
+			Log4JConfigurator log4jconfig = new Log4JConfigurator(prefix);
+			log4jconfig.doConfigure(file);
+		}
+		resourceService = new InternetResourceService();
+		// Caching initialization.
+		resourceService.init(filterConfig);
+		eventsManager = new PollEventsManager();
+		eventsManager.init(filterConfig.getServletContext());
 	}
-	resourceService = new InternetResourceService();
-	// Caching initialization.
-	resourceService.init(filterConfig);
-	eventsManager = new PollEventsManager();
-	eventsManager.init(filterConfig.getServletContext());
-    }
 
-    /**
-         * @param httpServletRequest
-         * @throws UnsupportedEncodingException
-         */
-    protected void setupRequestEncoding(HttpServletRequest httpServletRequest)
-	    throws UnsupportedEncodingException {
-	String contentType = httpServletRequest.getHeader("Content-Type");
+	/**
+	 * @param httpServletRequest
+	 * @throws UnsupportedEncodingException
+	 */
+	protected void setupRequestEncoding(HttpServletRequest httpServletRequest)
+			throws UnsupportedEncodingException {
+		String contentType = httpServletRequest.getHeader("Content-Type");
 
-	String characterEncoding = lookupCharacterEncoding(contentType);
+		String characterEncoding = lookupCharacterEncoding(contentType);
 
-	if (characterEncoding == null) {
-	    HttpSession session = httpServletRequest.getSession(false);
+		if (characterEncoding == null) {
+			HttpSession session = httpServletRequest.getSession(false);
 
-	    if (session != null) {
-		characterEncoding = (String) session
-			.getAttribute(ViewHandler.CHARACTER_ENCODING_KEY);
-	    }
+			if (session != null) {
+				characterEncoding = (String) session
+						.getAttribute(ViewHandler.CHARACTER_ENCODING_KEY);
+			}
 
-	    if (characterEncoding != null) {
-		httpServletRequest.setCharacterEncoding(characterEncoding);
-	    }
+			if (characterEncoding != null) {
+				httpServletRequest.setCharacterEncoding(characterEncoding);
+			}
+		}
 	}
-    }
 
-    /**
-         * Detect request encoding from Content-Type header
-         * 
-         * @param contentType
-         * @return - charset, if present.
-         */
-    private String lookupCharacterEncoding(String contentType) {
-	String characterEncoding = null;
+	/**
+	 * Detect request encoding from Content-Type header
+	 * 
+	 * @param contentType
+	 * @return - charset, if present.
+	 */
+	private String lookupCharacterEncoding(String contentType) {
+		String characterEncoding = null;
 
-	if (contentType != null) {
-	    int charsetFind = contentType.indexOf("charset=");
-	    if (charsetFind != -1) {
-		if (charsetFind == 0) {
-		    // charset at beginning of Content-Type, curious
-		    characterEncoding = contentType.substring(8);
-		} else {
-		    char charBefore = contentType.charAt(charsetFind - 1);
-		    if (charBefore == ';' || Character.isWhitespace(charBefore)) {
-			// Correct charset after mime type
-			characterEncoding = contentType
-				.substring(charsetFind + 8);
-		    }
+		if (contentType != null) {
+			int charsetFind = contentType.indexOf("charset=");
+			if (charsetFind != -1) {
+				if (charsetFind == 0) {
+					// charset at beginning of Content-Type, curious
+					characterEncoding = contentType.substring(8);
+				} else {
+					char charBefore = contentType.charAt(charsetFind - 1);
+					if (charBefore == ';' || Character.isWhitespace(charBefore)) {
+						// Correct charset after mime type
+						characterEncoding = contentType
+								.substring(charsetFind + 8);
+					}
+				}
+				if (log.isDebugEnabled())
+					log.debug(Messages.getMessage(
+							Messages.CONTENT_TYPE_ENCODING, characterEncoding));
+			} else {
+				if (log.isDebugEnabled())
+					log.debug(Messages.getMessage(
+							Messages.CONTENT_TYPE_NO_ENCODING, contentType));
+			}
 		}
-		if (log.isDebugEnabled())
-		    log.debug(Messages.getMessage(
-			    Messages.CONTENT_TYPE_ENCODING, characterEncoding));
-	    } else {
-		if (log.isDebugEnabled())
-		    log.debug(Messages.getMessage(
-			    Messages.CONTENT_TYPE_NO_ENCODING, contentType));
-	    }
+		return characterEncoding;
 	}
-	return characterEncoding;
-    }
 
-    /**
-         * @param initParameter
-         * @param function2
-         * @return
-         */
-    private Object nz(Object param, Object def) {
-	return param != null ? param : def;
-    }
-
-    /**
-         * Execute the filter.
-         */
-    public void doFilter(ServletRequest request, ServletResponse response,
-	    FilterChain chain) throws IOException, ServletException {
-	long startTimeMills = 0;
-	// Detect case of request - normal, AJAX, AJAX - JavaScript
-	// TODO - detect first processing in filter.
-	HttpServletRequest httpServletRequest = (HttpServletRequest) request;
-	HttpServletResponse httpServletResponse = (HttpServletResponse) response;
-	if (log.isDebugEnabled()) {
-	    startTimeMills = System.currentTimeMillis();
-	    log.debug(Messages.getMessage(Messages.FILTER_START_INFO, new Date(
-		    startTimeMills), httpServletRequest.getRequestURI()));
+	/**
+	 * @param initParameter
+	 * @param function2
+	 * @return
+	 */
+	private Object nz(Object param, Object def) {
+		return param != null ? param : def;
 	}
 
-	if (request.getAttribute(FILTER_PERFORMED) != Boolean.TRUE) {
-	    // mark - and not processing same request twice.
-	    request.setAttribute(FILTER_PERFORMED, Boolean.TRUE);
-	    String ajaxPushHeader = httpServletRequest.getHeader(AJAX_PUSH_KEY_HEADER);
-	    // check for a push check request.
-	    if (httpServletRequest.getMethod().equals("HEAD")
-		    && null != ajaxPushHeader) {
-			PushEventsCounter listener = eventsManager.getListener(ajaxPushHeader);
-			if(listener.isPerformed()){
-			    listener.processed();
-			    httpServletResponse.setStatus(200);
-			    if (log.isDebugEnabled()) {
-				log.debug("Occurs event for a id "+ajaxPushHeader);
-			    }
-			} else {
-			    // Response code - 'No content'
-			    httpServletResponse.setStatus(204);			    
-			    if (log.isDebugEnabled()) {
-				log.debug("No event for a id "+ajaxPushHeader);
-			    }
+	/**
+	 * Execute the filter.
+	 */
+	public void doFilter(ServletRequest request, ServletResponse response,
+			FilterChain chain) throws IOException, ServletException {
+		long startTimeMills = 0;
+		// Detect case of request - normal, AJAX, AJAX - JavaScript
+		// TODO - detect first processing in filter.
+		HttpServletRequest httpServletRequest = (HttpServletRequest) request;
+		HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+		if (log.isDebugEnabled()) {
+			startTimeMills = System.currentTimeMillis();
+			log.debug(Messages.getMessage(Messages.FILTER_START_INFO, new Date(
+					startTimeMills), httpServletRequest.getRequestURI()));
+		}
+
+		if (request.getAttribute(FILTER_PERFORMED) != Boolean.TRUE) {
+			// mark - and not processing same request twice.
+			try {
+				request.setAttribute(FILTER_PERFORMED, Boolean.TRUE);
+				String ajaxPushHeader = httpServletRequest
+						.getHeader(AJAX_PUSH_KEY_HEADER);
+				// check for a push check request.
+				if (httpServletRequest.getMethod().equals("HEAD")
+						&& null != ajaxPushHeader) {
+					PushEventsCounter listener = eventsManager
+							.getListener(ajaxPushHeader);
+					if (listener.isPerformed()) {
+						listener.processed();
+						httpServletResponse.setStatus(200);
+						if (log.isDebugEnabled()) {
+							log
+									.debug("Occurs event for a id "
+											+ ajaxPushHeader);
+						}
+					} else {
+						// Response code - 'No content'
+						httpServletResponse.setStatus(204);
+						if (log.isDebugEnabled()) {
+							log.debug("No event for a id " + ajaxPushHeader);
+						}
+					}
+				} else
+				// check for resource request
+				if (!getResourceService().serviceResource(httpServletRequest,
+						httpServletResponse)) {
+					// Not request to resource - perform filtering.
+					// first stage - detect/set encoding of request. Same as in
+					// Myfaces External Context.
+					setupRequestEncoding(httpServletRequest);
+					// check ajax request parameter
+					// TODO - check for JSF page.
+					if (true) {
+						if (log.isDebugEnabled()) {
+							log.debug(Messages
+									.getMessage(Messages.FILTER_XML_OUTPUT));
+						}
+
+						// Execute the rest of the filter chain, including the
+						// JSP
+						xmlFilter.doXmlFilter(chain, httpServletRequest,
+								httpServletResponse);
+					} else {
+						// normal request, execute chain ...
+						if (log.isDebugEnabled()) {
+							log.debug(Messages
+									.getMessage(Messages.FILTER_NO_XML_CHAIN));
+						}
+						chain.doFilter(request, response);
+
+					}
+				}
+
+			} finally {
+				// Remove filter marker from response, to enable sequence calls ( for example, forward to error page )
+				request.removeAttribute(FILTER_PERFORMED);
+				Object ajaxContext = request.getAttribute(AjaxContext.AJAX_CONTEXT_KEY);
+				if(null != ajaxContext && ajaxContext instanceof AjaxContext){
+					((AjaxContext)ajaxContext).release();
+					request.removeAttribute(AjaxContext.AJAX_CONTEXT_KEY);
+				}
 			}
-	    } else
-	    // check for resource request
-	    if (!getResourceService().serviceResource(httpServletRequest,
-		    httpServletResponse)) {
-		// Not request to resource - perform filtering.
-		// first stage - detect/set encoding of request. Same as in
-		// Myfaces External Context.
-		setupRequestEncoding(httpServletRequest);
-		// check ajax request parameter
-		// TODO - check for JSF page.
-		if (true) {
-		    if (log.isDebugEnabled()) {
-			log.debug(Messages
-				.getMessage(Messages.FILTER_XML_OUTPUT));
-		    }
-
-		    // Execute the rest of the filter chain, including the
-		    // JSP
-		    xmlFilter.doXmlFilter(chain, httpServletRequest,
-			    httpServletResponse);
 		} else {
-		    // normal request, execute chain ...
-		    if (log.isDebugEnabled()) {
-			log.debug(Messages
-				.getMessage(Messages.FILTER_NO_XML_CHAIN));
-		    }
-		    chain.doFilter(request, response);
+			if (log.isDebugEnabled()) {
+				log.debug(Messages.getMessage(Messages.FILTER_NO_XML_CHAIN_2));
+			}
+			chain.doFilter(request, response);
 
 		}
-	    }
-	} else {
-	    if (log.isDebugEnabled()) {
-		log.debug(Messages.getMessage(Messages.FILTER_NO_XML_CHAIN_2));
-	    }
-	    chain.doFilter(request, response);
+		if (log.isDebugEnabled()) {
+			startTimeMills = System.currentTimeMillis() - startTimeMills;
+			log.debug(Messages.getMessage(Messages.FILTER_STOP_INFO, ""
+					+ startTimeMills, httpServletRequest.getRequestURI()));
+		}
+	}
 
+	/**
+	 * @param request
+	 * @return
+	 */
+	protected boolean isAjaxRequest(ServletRequest request) {
+		try {
+			return null != request
+					.getParameter(AjaxContainerRenderer.AJAX_PARAMETER_NAME);
+		} catch (Exception e) {
+			// OCJ 10 - throw exception for static resources.
+			return false;
+		}
 	}
-	if (log.isDebugEnabled()) {
-	    startTimeMills = System.currentTimeMillis() - startTimeMills;
-	    log.debug(Messages.getMessage(Messages.FILTER_STOP_INFO, ""
-		    + startTimeMills, httpServletRequest.getRequestURI()));
+
+	/**
+	 * Destroy the filter.
+	 */
+	public void destroy() {
 	}
-    }
 
-    /**
-         * @param request
-         * @return
-         */
-    protected boolean isAjaxRequest(ServletRequest request) {
-	try {
-	    return null != request
-		    .getParameter(AjaxContainerRenderer.AJAX_PARAMETER_NAME);
-	} catch (Exception e) {
-	    // OCJ 10 - throw exception for static resources.
-	    return false;
+	/**
+	 * @return Returns the servletContext.
+	 */
+	ServletContext getServletContext() {
+		return filterConfig.getServletContext();
 	}
-    }
 
-    /**
-         * Destroy the filter.
-         */
-    public void destroy() {
-    }
+	/**
+	 * @return the resourceService
+	 * @throws ServletException
+	 */
+	protected synchronized InternetResourceService getResourceService()
+			throws ServletException {
+		// if (resourceService == null) {
+		// resourceService = new InternetResourceService();
+		// // Caching initialization.
+		// resourceService.init(filterConfig);
+		//
+		// }
+		return resourceService;
+	}
 
-    /**
-         * @return Returns the servletContext.
-         */
-    ServletContext getServletContext() {
-	return filterConfig.getServletContext();
-    }
+	/**
+	 * @param function
+	 *            The function to set.
+	 */
+	protected void setFunction(String function) {
+		this.function = function;
+	}
 
-    /**
-         * @return the resourceService
-         * @throws ServletException
-         */
-    protected synchronized InternetResourceService getResourceService()
-	    throws ServletException {
-	// if (resourceService == null) {
-	// resourceService = new InternetResourceService();
-	// // Caching initialization.
-	// resourceService.init(filterConfig);
-	//
-	// }
-	return resourceService;
-    }
+	/**
+	 * @return Returns the function.
+	 */
+	protected String getFunction() {
+		return function;
+	}
 
-    /**
-         * @param function
-         *                The function to set.
-         */
-    protected void setFunction(String function) {
-	this.function = function;
-    }
+	/**
+	 * @param rewriteid
+	 *            The rewriteid to set.
+	 */
+	protected void setRewriteid(boolean rewriteid) {
+		this.rewriteid = rewriteid;
+	}
 
-    /**
-         * @return Returns the function.
-         */
-    protected String getFunction() {
-	return function;
-    }
+	/**
+	 * @return Returns the rewriteid.
+	 */
+	protected boolean isRewriteid() {
+		return rewriteid;
+	}
 
-    /**
-         * @param rewriteid
-         *                The rewriteid to set.
-         */
-    protected void setRewriteid(boolean rewriteid) {
-	this.rewriteid = rewriteid;
-    }
+	/**
+	 * @param attributesNames
+	 *            The attributesNames to set.
+	 */
+	protected void setAttributesNames(String attributesNames) {
+		this.attributesNames = attributesNames;
+	}
 
-    /**
-         * @return Returns the rewriteid.
-         */
-    protected boolean isRewriteid() {
-	return rewriteid;
-    }
-
-    /**
-         * @param attributesNames
-         *                The attributesNames to set.
-         */
-    protected void setAttributesNames(String attributesNames) {
-	this.attributesNames = attributesNames;
-    }
-
-    /**
-         * @return Returns the attributesNames.
-         */
-    protected String getAttributesNames() {
-	return attributesNames;
-    }
+	/**
+	 * @return Returns the attributesNames.
+	 */
+	protected String getAttributesNames() {
+		return attributesNames;
+	}
 }

Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/webapp/BaseXMLFilter.java	2007-08-09 02:08:46 UTC (rev 2165)
@@ -46,388 +46,393 @@
 import org.apache.commons.logging.LogFactory;
 
 public abstract class BaseXMLFilter {
-    private static final Log log = LogFactory.getLog(BaseXMLFilter.class);
+	private static final Log log = LogFactory.getLog(BaseXMLFilter.class);
 
-    public static final String RESPONSE_WRAPPER_ATTRIBUTE = "com.exade.vcp.Filter.ResponseWrapper";
+	public static final String RESPONSE_WRAPPER_ATTRIBUTE = "com.exade.vcp.Filter.ResponseWrapper";
 
-    private String mimetype = "text/xml";
+	private String mimetype = "text/xml";
 
-    private String publicid = "-//W3C//DTD XHTML 1.0 Transitional//EN";
+	private String publicid = "-//W3C//DTD XHTML 1.0 Transitional//EN";
 
-    private String systemid = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
+	private String systemid = "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";
 
-    private String namespace = "http://www.w3.org/1999/xhtml";
+	private String namespace = "http://www.w3.org/1999/xhtml";
 
-    private static final String MIME_TYPE_PARAMETER = "mime-type";
+	private static final String MIME_TYPE_PARAMETER = "mime-type";
 
-    private static final String PUBLICID_PARAMETER = "publicid";
+	private static final String PUBLICID_PARAMETER = "publicid";
 
-    private static final String SYSTEMID_PARAMETER = "systemid";
+	private static final String SYSTEMID_PARAMETER = "systemid";
 
-    private static final String NAMESPACE_PARAMETER = "namespace";
+	private static final String NAMESPACE_PARAMETER = "namespace";
 
-    private boolean forcexml = false;
-    
+	private boolean forcexml = false;
 
-    private static final String FORCEXML_PARAMETER = "forceparser";
+	private static final String FORCEXML_PARAMETER = "forceparser";
 
-    private static final String INIT_PARAMETER_PREFIX = "org.ajax4jsf.xmlfilter.";
+	private static final String INIT_PARAMETER_PREFIX = "org.ajax4jsf.xmlfilter.";
 
 	public static final String TEXT_HTML = "text/html";
 
 	public static final String APPLICATION_XHTML_XML = "application/xhtml+xml";
 
-    public BaseFilter filter;
+	public BaseFilter filter;
 
-    public void setFilter(BaseFilter filter) {
-	this.filter = filter;
-    }
+	public void setFilter(BaseFilter filter) {
+		this.filter = filter;
+	}
 
-    public void init(FilterConfig config) throws ServletException {
-	if (log.isDebugEnabled()) {
-	    log.debug("init XML filter service with class "
-		    + this.getClass().getName());
+	public void init(FilterConfig config) throws ServletException {
+		if (log.isDebugEnabled()) {
+			log.debug("init XML filter service with class "
+					+ this.getClass().getName());
+		}
+		String forceXmlParameter = config.getInitParameter(FORCEXML_PARAMETER);
+		setupForceXml(forceXmlParameter);
+		forceXmlParameter = config.getServletContext().getInitParameter(
+				INIT_PARAMETER_PREFIX + FORCEXML_PARAMETER);
+		setMimetype((String) nz(config.getInitParameter(MIME_TYPE_PARAMETER),
+				"text/xml"));
+		setPublicid((String) nz(config.getInitParameter(PUBLICID_PARAMETER),
+				getPublicid()));
+		setSystemid((String) nz(config.getInitParameter(SYSTEMID_PARAMETER),
+				getSystemid()));
+		setNamespace((String) nz(config.getInitParameter(NAMESPACE_PARAMETER),
+				getNamespace()));
 	}
-	String forceXmlParameter = config
-		.getInitParameter(FORCEXML_PARAMETER);
-	setupForceXml(forceXmlParameter);
-	forceXmlParameter = config.getServletContext().getInitParameter(INIT_PARAMETER_PREFIX+FORCEXML_PARAMETER);
-	setMimetype((String) nz(config.getInitParameter(MIME_TYPE_PARAMETER),
-		"text/xml"));
-	setPublicid((String) nz(config.getInitParameter(PUBLICID_PARAMETER),
-		getPublicid()));
-	setSystemid((String) nz(config.getInitParameter(SYSTEMID_PARAMETER),
-		getSystemid()));
-	setNamespace((String) nz(config.getInitParameter(NAMESPACE_PARAMETER),
-		getNamespace()));
-    }
 
-    /**
-     * @param forceXmlParameter
-     */
-    private void setupForceXml(String forceXmlParameter) {
-	if ("false".equalsIgnoreCase(forceXmlParameter)) {
-	    this.forcexml = false;
+	/**
+	 * @param forceXmlParameter
+	 */
+	private void setupForceXml(String forceXmlParameter) {
+		if ("false".equalsIgnoreCase(forceXmlParameter)) {
+			this.forcexml = false;
+		}
+		if ("true".equalsIgnoreCase(forceXmlParameter)) {
+			this.forcexml = true;
+		}
 	}
-	if ("true"
-		.equalsIgnoreCase(forceXmlParameter)) {
-	    this.forcexml = true;
-	}
-    }
 
-    /**
-         * Perform filter chain with xml parsing and transformation. Subclasses
-         * must implement concrete HTML to XML parsing, nesseasary
-         * transformations and serialization.
-         * 
-         * @param chain
-         * @param httpServletRequest
-         * @param httpServletResponse
-         * @throws ServletException
-         * @throws IOException
-         */
-    protected void doXmlFilter(FilterChain chain, HttpServletRequest request,
-	    final HttpServletResponse response) throws IOException,
-	    ServletException {
-	if (log.isDebugEnabled()) {
-	    log.debug("XML filter service start processing request");
-	}
-	FilterServletResponseWrapper servletResponseWrapper = getWrapper(response);
-	// HACK - to avoid MyFaces <f:view> incompabilites and bypass
-        // intermediaty filters
-	// in chain, self-rendered region write directly to wrapper stored in
-        // request-scope attribute.
-	request
-		.setAttribute(RESPONSE_WRAPPER_ATTRIBUTE,
-			servletResponseWrapper);
-	chain.doFilter(request, servletResponseWrapper);
-	String viewId = (String) request.getAttribute(AjaxViewHandler.VIEW_ID_KEY);
-	HtmlParser parser = null;
-	// setup response
-	// Redirect in AJAX request - convert to special response recognized by
-        // client.
-	String redirectLocation = servletResponseWrapper.getRedirectLocation();
-	String characterEncoding = servletResponseWrapper
-		.getCharacterEncoding();
-	Writer output;
-	if (null != redirectLocation) {
-	    if (isAjaxRequest(request)) {
-		// Special handling of redirect - client-side script must
-		// Check for response and perform redirect by window.location
+	/**
+	 * Perform filter chain with xml parsing and transformation. Subclasses must
+	 * implement concrete HTML to XML parsing, nesseasary transformations and
+	 * serialization.
+	 * 
+	 * @param chain
+	 * @param httpServletRequest
+	 * @param httpServletResponse
+	 * @throws ServletException
+	 * @throws IOException
+	 */
+	protected void doXmlFilter(FilterChain chain, HttpServletRequest request,
+			final HttpServletResponse response) throws IOException,
+			ServletException {
 		if (log.isDebugEnabled()) {
-		    log.debug("Create AJAX redirect response to url: "
-			    + redirectLocation);
+			log.debug("XML filter service start processing request");
 		}
-		response.reset();
-		// Keep cookies.
-		for (Iterator iter = servletResponseWrapper.getCookies().iterator(); iter.hasNext();) {
-		    Cookie cookie = (Cookie) iter.next();
-		    response.addCookie(cookie);
+		FilterServletResponseWrapper servletResponseWrapper = getWrapper(response);
+		// HACK - to avoid MyFaces <f:view> incompabilites and bypass
+		// intermediaty filters
+		// in chain, self-rendered region write directly to wrapper stored in
+		// request-scope attribute.
+		try {
+			request.setAttribute(RESPONSE_WRAPPER_ATTRIBUTE,
+					servletResponseWrapper);
+			chain.doFilter(request, servletResponseWrapper);
+
+		} finally {
+			request.removeAttribute(RESPONSE_WRAPPER_ATTRIBUTE);
 		}
-		// Copy response headers
-		Map headers = servletResponseWrapper.getHeaders();
-		for (Iterator iter = headers.entrySet().iterator(); iter
-			.hasNext();) {
-		    Map.Entry header = (Map.Entry) iter.next();
-		    response.setHeader((String) header.getKey(),
-			    (String) header.getValue());
+		String viewId = (String) request
+				.getAttribute(AjaxViewHandler.VIEW_ID_KEY);
+		HtmlParser parser = null;
+		// setup response
+		// Redirect in AJAX request - convert to special response recognized by
+		// client.
+		String redirectLocation = servletResponseWrapper.getRedirectLocation();
+		String characterEncoding = servletResponseWrapper
+				.getCharacterEncoding();
+		Writer output;
+		if (null != redirectLocation) {
+			if (isAjaxRequest(request)) {
+				// Special handling of redirect - client-side script must
+				// Check for response and perform redirect by window.location
+				if (log.isDebugEnabled()) {
+					log.debug("Create AJAX redirect response to url: "
+							+ redirectLocation);
+				}
+				response.reset();
+				// Keep cookies.
+				for (Iterator iter = servletResponseWrapper.getCookies()
+						.iterator(); iter.hasNext();) {
+					Cookie cookie = (Cookie) iter.next();
+					response.addCookie(cookie);
+				}
+				// Copy response headers
+				Map headers = servletResponseWrapper.getHeaders();
+				for (Iterator iter = headers.entrySet().iterator(); iter
+						.hasNext();) {
+					Map.Entry header = (Map.Entry) iter.next();
+					response.setHeader((String) header.getKey(),
+							(String) header.getValue());
+				}
+				response.setHeader(AjaxContainerRenderer.AJAX_FLAG_HEADER,
+						"redirect");
+				// Not caching AJAX request
+				response.setHeader("Cache-Control",
+						"no-cache, must-revalidate, max_age=0, no-store");
+				response.setHeader("Expires", "0");
+				response.setHeader("Pragma", "no-cache");
+				response.setContentType(getMimetype() + ";charset=UTF-8");
+				response.setHeader(AjaxContainerRenderer.AJAX_LOCATION_HEADER,
+						redirectLocation);
+				output = createResponseWriter(response, "UTF-8");
+				// For buggy XmlHttpRequest realisations repeat headers in
+				// <meta>
+				output.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
+						+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head>"
+						+ "<meta name=\""
+						+ AjaxContainerRenderer.AJAX_FLAG_HEADER
+						+ "\" content=\"redirect\" />" + "<meta name=\""
+						+ AjaxContainerRenderer.AJAX_LOCATION_HEADER
+						+ "\" content=\"" + redirectLocation + "\" />"
+						+ "</head></html>");
+				output.flush();
+				response.flushBuffer();
+			} else {
+				response.sendRedirect(redirectLocation);
+			}
+			return;
+		} else if ("true".equals(servletResponseWrapper.getHeaders().get(
+				AjaxContainerRenderer.AJAX_FLAG_HEADER))) {
+			if (log.isDebugEnabled()) {
+				log
+						.debug("Process response to well-formed XML for AJAX XMLHttpRequest parser");
+			}
+			// Not caching AJAX request
+			response.setHeader("Cache-Control",
+					"no-cache, must-revalidate, max_age=0, no-store");
+			response.setHeader("Expires", "0");
+			response.setHeader("Pragma", "no-cache");
+			// response.setCharacterEncoding(servletResponseWrapper
+			// .getCharacterEncoding()); //
+			// JSContentHandler.DEFAULT_ENCODING);
+			// Set the content-type. For AJAX responses default encoding -
+			// UTF8.
+			// TODO - for null encoding, setup only Output encoding for
+			// filter ?
+			String outputEncoding = "UTF-8";
+			String contentType = getMimetype() + ";charset=" + outputEncoding;
+			response.setContentType(contentType);
+			parser = getParser(getMimetype(), true, viewId);
+			if (null == parser) {
+				throw new ServletException(Messages.getMessage(
+						Messages.PARSER_NOT_INSTANTIATED_ERROR, contentType));
+			}
+			output = createResponseWriter(response, outputEncoding);
+			parser.setDoctype(getPublicid());
+			parser.setInputEncoding(characterEncoding);
+			parser.setOutputEncoding(outputEncoding);
+			parser.setViewState((String) request
+					.getAttribute(AjaxViewHandler.SERIALIZED_STATE_KEY));
+		} else {
+			// setup conversion reules for output contentType, send directly
+			// if content not
+			// supported by tidy.
+			String contentType = servletResponseWrapper.getContentType();
+			if (log.isDebugEnabled()) {
+				log.debug("create HTML/XML parser for content type: "
+						+ contentType);
+			}
+			// if(contentType == null){
+			// contentType = request.getContentType();
+			// }
+			if (contentType != null) {
+				if (contentType.indexOf("charset") < 0
+						&& null != characterEncoding) {
+					contentType += ";charset=" + characterEncoding;
+				}
+				parser = getParser(contentType, false, viewId);
+				response.setContentType(contentType);
+			}
+			// null or unsupported content type
+			if (null == parser) {
+				if (log.isDebugEnabled()) {
+					log
+							.debug("Parser not have support for the such content type, send response as-is");
+				}
+				try {
+					if (servletResponseWrapper.isUseWriter()) {
+						output = createResponseWriter(response,
+								characterEncoding);
+						servletResponseWrapper.sendContent(output);
+					} else if (servletResponseWrapper.isUseStream()) {
+						ServletOutputStream out = response.getOutputStream();
+						servletResponseWrapper.sendContent(out);
+					}
+				} finally {
+					// reuseWrapper(servletResponseWrapper);
+				}
+				return;
+			}
+			output = createResponseWriter(response, characterEncoding);
+
+			parser.setInputEncoding(characterEncoding);
+			parser.setOutputEncoding(characterEncoding);
 		}
-		response.setHeader(AjaxContainerRenderer.AJAX_FLAG_HEADER,
-			"redirect");
-		// Not caching AJAX request
-		response.setHeader("Cache-Control",
-			"no-cache, must-revalidate, max_age=0, no-store");
-		response.setHeader("Expires", "0");
-		response.setHeader("Pragma", "no-cache");
-		response.setContentType(getMimetype() + ";charset=UTF-8");
-		response.setHeader(AjaxContainerRenderer.AJAX_LOCATION_HEADER,
-			redirectLocation);
-		output = createResponseWriter(response, "UTF-8");
-		// For buggy XmlHttpRequest realisations repeat headers in
-                // <meta>
-		output.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"
-			+ "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head>"
-			+ "<meta name=\""
-			+ AjaxContainerRenderer.AJAX_FLAG_HEADER
-			+ "\" content=\"redirect\" />" + "<meta name=\""
-			+ AjaxContainerRenderer.AJAX_LOCATION_HEADER
-			+ "\" content=\"" + redirectLocation + "\" />"
-			+ "</head></html>");
-		output.flush();
-		response.flushBuffer();
-	    } else {
-		response.sendRedirect(redirectLocation);
-	    }
-	    return;
-	} else if ("true".equals(servletResponseWrapper.getHeaders().get(
-		AjaxContainerRenderer.AJAX_FLAG_HEADER))) {
-	    if (log.isDebugEnabled()) {
-		log
-			.debug("Process response to well-formed XML for AJAX XMLHttpRequest parser");
-	    }
-	    // Not caching AJAX request
-	    response.setHeader("Cache-Control",
-		    "no-cache, must-revalidate, max_age=0, no-store");
-	    response.setHeader("Expires", "0");
-	    response.setHeader("Pragma", "no-cache");
-	    // response.setCharacterEncoding(servletResponseWrapper
-	    // .getCharacterEncoding()); //
-                // JSContentHandler.DEFAULT_ENCODING);
-	    // Set the content-type. For AJAX responses default encoding -
-                // UTF8.
-	    // TODO - for null encoding, setup only Output encoding for
-                // filter ?
-	    String outputEncoding = "UTF-8";
-	    String contentType = getMimetype() + ";charset=" + outputEncoding;
-	    response.setContentType(contentType);
-	    parser = getParser(getMimetype(), true, viewId);
-	    if (null == parser) {
-		throw new ServletException(Messages.getMessage(
-			Messages.PARSER_NOT_INSTANTIATED_ERROR, contentType));
-	    }
-	    output = createResponseWriter(response, outputEncoding);
-	    parser.setDoctype(getPublicid());
-	    parser.setInputEncoding(characterEncoding);
-	    parser.setOutputEncoding(outputEncoding);
-	    parser.setViewState((String) request
-		    .getAttribute(AjaxViewHandler.SERIALIZED_STATE_KEY));
-	} else {
-	    // setup conversion reules for output contentType, send directly
-                // if content not
-	    // supported by tidy.
-	    String contentType = servletResponseWrapper.getContentType();
-	    if (log.isDebugEnabled()) {
-		log.debug("create HTML/XML parser for content type: "
-			+ contentType);
-	    }
-	    // if(contentType == null){
-	    // contentType = request.getContentType();
-	    // }
-	    if (contentType != null) {
-		if (contentType.indexOf("charset") < 0
-			&& null != characterEncoding) {
-		    contentType += ";charset=" + characterEncoding;
-		}
-		parser = getParser(contentType, false, viewId);
-		response.setContentType(contentType);
-	    }
-	    // null or unsupported content type
-	    if (null == parser) {
-		if (log.isDebugEnabled()) {
-		    log
-			    .debug("Parser not have support for the such content type, send response as-is");
-		}
+
 		try {
-		    if (servletResponseWrapper.isUseWriter()) {
-			output = createResponseWriter(response,
-				characterEncoding);
-			servletResponseWrapper.sendContent(output);
-		    } else if (servletResponseWrapper.isUseStream()) {
-			ServletOutputStream out = response.getOutputStream();
-			servletResponseWrapper.sendContent(out);
-		    }
+			// Setup scripts and styles
+			parser.setScripts((Set) request
+					.getAttribute(AjaxContext.SCRIPTS_PARAMETER));
+			parser.setStyles((Set) request
+					.getAttribute(AjaxContext.STYLES_PARAMETER));
+			// Process parsing.
+			long startTimeMills = System.currentTimeMillis();
+			servletResponseWrapper.parseContent(output, parser);
+			if (log.isDebugEnabled()) {
+				startTimeMills = System.currentTimeMillis() - startTimeMills;
+				log.debug(Messages.getMessage(Messages.PARSING_TIME_INFO, ""
+						+ startTimeMills));
+			}
+		} catch (Exception e) {
+			throw new ServletException(Messages
+					.getMessage(Messages.JTIDY_PARSING_ERROR), e);
 		} finally {
-		    // reuseWrapper(servletResponseWrapper);
+			reuseParser(parser);
 		}
-		return;
-	    }
-	    output = createResponseWriter(response, characterEncoding);
-
-	    parser.setInputEncoding(characterEncoding);
-	    parser.setOutputEncoding(characterEncoding);
 	}
 
-	try {
-	    // Setup scripts and styles
-	    parser.setScripts((Set) request
-		    .getAttribute(AjaxContext.SCRIPTS_PARAMETER));
-	    parser.setStyles((Set) request
-		    .getAttribute(AjaxContext.STYLES_PARAMETER));
-	    // Process parsing.
-	    long startTimeMills = System.currentTimeMillis();
-	    servletResponseWrapper.parseContent(output, parser);
-	    if (log.isDebugEnabled()) {
-		startTimeMills = System.currentTimeMillis() - startTimeMills;
-		log.debug(Messages.getMessage(Messages.PARSING_TIME_INFO, ""
-			+ startTimeMills));
-	    }
-	} catch (Exception e) {
-	    throw new ServletException(Messages
-		    .getMessage(Messages.JTIDY_PARSING_ERROR), e);
-	} finally {
-	    reuseParser(parser);
+	/**
+	 * @param response
+	 * @return
+	 * @throws ServletException
+	 */
+	protected FilterServletResponseWrapper getWrapper(
+			HttpServletResponse response) throws ServletException {
+		return new FilterServletResponseWrapper(response);
 	}
-    }
 
-    /**
-         * @param response
-         * @return
-         * @throws ServletException
-         */
-    protected FilterServletResponseWrapper getWrapper(
-	    HttpServletResponse response) throws ServletException {
-	return new FilterServletResponseWrapper(response);
-    }
-
-    /**
-         * @param request
-         * @return
-         */
-    protected boolean isAjaxRequest(ServletRequest request) {
-	try {
-	    return null != request
-		    .getParameter(AjaxContainerRenderer.AJAX_PARAMETER_NAME);
-	} catch (Exception e) {
-	    // OCJ 10 - throw exception for static resources.
-	    return false;
+	/**
+	 * @param request
+	 * @return
+	 */
+	protected boolean isAjaxRequest(ServletRequest request) {
+		try {
+			return null != request
+					.getParameter(AjaxContainerRenderer.AJAX_PARAMETER_NAME);
+		} catch (Exception e) {
+			// OCJ 10 - throw exception for static resources.
+			return false;
+		}
 	}
-    }
 
-    /**
-         * @param response
-         * @param characterEncoding
-         * @return
-         * @throws IOException
-         * @throws UnsupportedEncodingException
-         */
-    private Writer createResponseWriter(final HttpServletResponse response,
-	    String characterEncoding) throws IOException,
-	    UnsupportedEncodingException {
-	Writer output;
-	try {
-	    output = response.getWriter();
-	} catch (IllegalStateException e) {
-	    if (null != characterEncoding) {
-		output = new OutputStreamWriter(response.getOutputStream(),
-			characterEncoding);
-	    } else {
-		output = new OutputStreamWriter(response.getOutputStream());
-	    }
+	/**
+	 * @param response
+	 * @param characterEncoding
+	 * @return
+	 * @throws IOException
+	 * @throws UnsupportedEncodingException
+	 */
+	private Writer createResponseWriter(final HttpServletResponse response,
+			String characterEncoding) throws IOException,
+			UnsupportedEncodingException {
+		Writer output;
+		try {
+			output = response.getWriter();
+		} catch (IllegalStateException e) {
+			if (null != characterEncoding) {
+				output = new OutputStreamWriter(response.getOutputStream(),
+						characterEncoding);
+			} else {
+				output = new OutputStreamWriter(response.getOutputStream());
+			}
+		}
+		return output;
 	}
-	return output;
-    }
 
-    protected abstract void reuseParser(HtmlParser parser);
+	protected abstract void reuseParser(HtmlParser parser);
 
-    protected abstract HtmlParser getParser(String mimetype, boolean isAjax, String viewId);
+	protected abstract HtmlParser getParser(String mimetype, boolean isAjax,
+			String viewId);
 
-    /**
-         * @param publicid
-         *                The publicid to set.
-         */
-    protected void setPublicid(String publicid) {
-	this.publicid = publicid;
-    }
+	/**
+	 * @param publicid
+	 *            The publicid to set.
+	 */
+	protected void setPublicid(String publicid) {
+		this.publicid = publicid;
+	}
 
-    /**
-         * @return Returns the publicid.
-         */
-    public String getPublicid() {
-	return publicid;
-    }
+	/**
+	 * @return Returns the publicid.
+	 */
+	public String getPublicid() {
+		return publicid;
+	}
 
-    /**
-         * @param systemid
-         *                The systemid to set.
-         */
-    protected void setSystemid(String systemid) {
-	this.systemid = systemid;
-    }
+	/**
+	 * @param systemid
+	 *            The systemid to set.
+	 */
+	protected void setSystemid(String systemid) {
+		this.systemid = systemid;
+	}
 
-    /**
-         * @return Returns the systemid.
-         */
-    public String getSystemid() {
-	return systemid;
-    }
+	/**
+	 * @return Returns the systemid.
+	 */
+	public String getSystemid() {
+		return systemid;
+	}
 
-    /**
-         * @param namespace
-         *                The namespace to set.
-         */
-    protected void setNamespace(String namespace) {
-	this.namespace = namespace;
-    }
+	/**
+	 * @param namespace
+	 *            The namespace to set.
+	 */
+	protected void setNamespace(String namespace) {
+		this.namespace = namespace;
+	}
 
-    /**
-         * @return Returns the namespace.
-         */
-    public String getNamespace() {
-	return namespace;
-    }
+	/**
+	 * @return Returns the namespace.
+	 */
+	public String getNamespace() {
+		return namespace;
+	}
 
-    /**
-         * @param mimetype
-         *                The mimetype to set.
-         */
-    protected void setMimetype(String mimetype) {
-	this.mimetype = mimetype;
-    }
+	/**
+	 * @param mimetype
+	 *            The mimetype to set.
+	 */
+	protected void setMimetype(String mimetype) {
+		this.mimetype = mimetype;
+	}
 
-    /**
-         * @return Returns the mimetype.
-         */
-    protected String getMimetype() {
-	return mimetype;
-    }
+	/**
+	 * @return Returns the mimetype.
+	 */
+	protected String getMimetype() {
+		return mimetype;
+	}
 
-    /**
-         * @return Returns the forcexml.
-         */
-    public boolean isForcexml() {
-	return this.forcexml;
-    }
+	/**
+	 * @return Returns the forcexml.
+	 */
+	public boolean isForcexml() {
+		return this.forcexml;
+	}
 
-    /**
-         * @param forcexml
-         *                The forcexml to set.
-         */
-    protected void setForcexml(boolean forcexml) {
-	this.forcexml = forcexml;
-    }
+	/**
+	 * @param forcexml
+	 *            The forcexml to set.
+	 */
+	protected void setForcexml(boolean forcexml) {
+		this.forcexml = forcexml;
+	}
 
-    private Object nz(Object param, Object def) {
-	return param != null ? param : def;
-    }
+	private Object nz(Object param, Object def) {
+		return param != null ? param : def;
+	}
 
 }

Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js	2007-08-08 23:00:09 UTC (rev 2164)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js	2007-08-09 02:08:46 UTC (rev 2165)
@@ -26,8 +26,9 @@
 	_errorMessage : "XML Response object not set",
 	_contentType : null,
 	_onerror : function(req,status,message) {
-         // Status not 200 - error !!!! TODO - I18N ???
-         	window.alert(message);
+         // Status not 200 - error !
+		// 	window.alert(message);
+			A4J.AJAX.replacePage(req);
         },
 	onfinish : null,
 	options : {},
@@ -651,41 +652,7 @@
 	         		} else if(ajaxResponse == "reload"){
        					window.location.reload(true);
 	         		} else {
-	         			var isIE = _SARISSA_IS_IE;
-						// maksimkaszynski
-						//Prevent "Permission denied in IE7"
-						//Reset calling principal
-						if (isIE) {
-							var oldDocOpen = window.document.open;
-							window.document.open = function() {
-								oldDocOpen.apply(this, arguments);
-							}
-						}
-						// /maksimkaszynski
-						window.setTimeout(function() {
-							var isDocOpen=false;
-							try {  	
-		          				window.document.open(req.getContentType(),true);
-		          				isDocOpen=true;
-		          				window.document.write(req.getResponseText());
-		          				window.document.close();
-	          				if(isIE){
-	          			// For Ie , scripts on page not activated.
-	          					window.location.reload(false);
-	          				}
-							} catch(e) {
-								if(isDocOpen){
-		          					window.document.close();
-								}
-								// Firefox/Mozilla in XHTML case don't support document.write()
-//								window.location = "data:"+req.getContentType()+";charset=utf-8," + encodeURIComponent(req.getResponseText())
-								// Use dom manipulation instead.
-								var	oDomDoc = (new DOMParser()).parseFromString(req.getResponseText(), "application/xhtml+xml");
-						    	var node = window.document.importNode(oDomDoc.documentElement, true);
-								window.document.replaceChild(node,window.document.documentElement);
-								// TODO - scripts reloading ?
-							}
-	          			},30);
+	         			A4J.AJAX.replacePage(req);
 	         		}
 	         	} catch(e){
 	         		LOG.error("Error redirect to new location ");
@@ -788,7 +755,47 @@
 	}
 };
          
+A4J.AJAX.replacePage = function(req){
+		         			var isIE = _SARISSA_IS_IE;
+						// maksimkaszynski
+						//Prevent "Permission denied in IE7"
+						//Reset calling principal
+						var oldDocOpen = window.document.open;
+						if (isIE) {
+							window.document.open = function() {
+								oldDocOpen.apply(this, arguments);
+							}
+						}
+						// /maksimkaszynski
+						window.setTimeout(function() {
+							var isDocOpen=false;
+							try {  	
+		          				window.document.open(req.getContentType(),true);
+		          				isDocOpen=true;
+		          				window.document.write(req.getResponseText());
+		          				window.document.close();
+	          				if(isIE){
+	          			// For Ie , scripts on page not activated.
+	          					window.location.reload(false);
+	          				}
+							} catch(e) {
+								if(isDocOpen){
+		          					window.document.close();
+								}
+								// Firefox/Mozilla in XHTML case don't support document.write()
+//								window.location = "data:"+req.getContentType()+";charset=utf-8," + encodeURIComponent(req.getResponseText())
+								// Use dom manipulation instead.
+								var	oDomDoc = (new DOMParser()).parseFromString(req.getResponseText(), "application/xhtml+xml");
+						    	var node = window.document.importNode(oDomDoc.documentElement, true);
+								window.document.replaceChild(node,window.document.documentElement);
+								// TODO - scripts reloading ?
+							} finally {
+								window.document.open = oldDocOpen;								
+							}
+	          			},30);	
+}
 
+
 A4J.AJAX.replaceViewState = function(inputs,newinputs){
 	      	  		LOG.debug("Replace value for inputs: "+inputs.length + " by new values: "+ newinputs.length);
         	  		if( (newinputs.length > 0) && (inputs.length > 0) ){




More information about the richfaces-svn-commits mailing list