[ajax4jsf-svn-commits] JBoss Ajax4JSF SVN: r302 - in trunk: framework/src/main/java/org/ajax4jsf/framework/ajax and 13 other directories.

ajax4jsf-svn-commits at lists.jboss.org ajax4jsf-svn-commits at lists.jboss.org
Fri Jul 6 21:16:16 EDT 2007


Author: alexsmirnov
Date: 2007-07-06 21:16:15 -0400 (Fri, 06 Jul 2007)
New Revision: 302

Added:
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ParserConfig.java
   trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilterTestCase.java
   trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ParterConfigTestCase.java
   trunk/samples/useCases/src/main/java/beans/
   trunk/samples/useCases/src/main/java/beans/performance/
   trunk/samples/useCases/src/main/java/beans/performance/Data.java
   trunk/samples/useCases/src/main/webapp/META-INF/
   trunk/samples/useCases/src/main/webapp/META-INF/MANIFEST.MF
   trunk/samples/useCases/src/main/webapp/pages/performance.xhtml
Modified:
   trunk/framework/src/main/java/org/ajax4jsf/Filter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxContext.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxViewHandler.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseXMLFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/HtmlParser.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoParser.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoXMLFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyParser.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyXMLFilter.java
   trunk/framework/src/main/java/org/ajax4jsf/framework/resource/InternetResourceService.java
   trunk/framework/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java
   trunk/samples/useCases/src/main/webapp/WEB-INF/faces-config.xml
   trunk/samples/useCases/src/main/webapp/WEB-INF/web.xml
Log:
Create configurable XML filter, can use different parsers for a different URL.

Modified: trunk/framework/src/main/java/org/ajax4jsf/Filter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/Filter.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/Filter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -21,6 +21,7 @@
 
 package org.ajax4jsf;
 
+import org.ajax4jsf.framework.ajax.xmlfilter.ConfigurableFilter;
 import org.ajax4jsf.framework.ajax.xmlfilter.TidyFilter;
 
 /**
@@ -29,6 +30,6 @@
  * @version $Revision: 1.1.2.1 $ $Date: 2007/01/09 18:58:29 $
  *
  */
-public class Filter extends TidyFilter {
+public class Filter extends ConfigurableFilter {
 
 }

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxContext.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxContext.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxContext.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -431,6 +431,9 @@
 		}
 		// Mark as processed.
 		requestMap.put(RESOURCES_PROCESSED, Boolean.TRUE);
+		// Save viewId for a parser selection
+		requestMap.put(
+			AjaxViewHandler.VIEW_ID_KEY,root.getViewId());
 	    }
 
 	}
@@ -499,15 +502,16 @@
     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 !
-	}
+//	try {
+//	    Application.class.getMethod("getExpressionFactory", null);
+//	} catch (NoSuchMethodException e) {
+//	    // JSF 1.1 !
+//	}
 	ResponseWriter writer = context.getResponseWriter();
 	StateManager stateManager = context.getApplication().getStateManager();
 	SerializedView serializedView = stateManager
 		.saveSerializedView(context);
+	Map requestMap = context.getExternalContext().getRequestMap();
 	if (null != serializedView) {
 	    StringWriter bufWriter = new StringWriter();
 	    ResponseWriter cloneWithWriter = writer.cloneWithWriter(bufWriter);
@@ -515,7 +519,7 @@
 	    stateManager.writeState(context, serializedView);
 	    cloneWithWriter.flush();
 	    if (bufWriter.getBuffer().length() > 0) {
-		context.getExternalContext().getRequestMap().put(
+		requestMap.put(
 			AjaxViewHandler.SERIALIZED_STATE_KEY,
 			bufWriter.toString());
 	    }

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxViewHandler.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxViewHandler.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/AjaxViewHandler.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -58,6 +58,8 @@
 
 	private static final String REDIRECTED = "org.ajax4jsf.view.REDIRECTED";
 
+	public static final String VIEW_ID_KEY = "org.ajax4jsf.view.ID";
+
 	/**
 	 * @param parent
 	 */

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseFilter.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -39,7 +39,6 @@
 import javax.servlet.http.HttpSession;
 
 import org.ajax4jsf.ajax.PushEventsCounter;
-import org.ajax4jsf.cache.Cache;
 import org.ajax4jsf.framework.renderer.AjaxContainerRenderer;
 import org.ajax4jsf.framework.resource.InternetResourceService;
 import org.ajax4jsf.framework.util.message.Messages;

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseXMLFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseXMLFilter.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/BaseXMLFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -67,9 +67,12 @@
     private static final String NAMESPACE_PARAMETER = "namespace";
 
     private boolean forcexml = false;
+    
 
     private static final String FORCEXML_PARAMETER = "forceparser";
 
+    private static final String INIT_PARAMETER_PREFIX = "org.ajax4jsf.xmlfilter.";
+
     public BaseFilter filter;
 
     public void setFilter(BaseFilter filter) {
@@ -81,14 +84,10 @@
 	    log.debug("init XML filter service with class "
 		    + this.getClass().getName());
 	}
-	if ("false".equalsIgnoreCase(config
-		.getInitParameter(FORCEXML_PARAMETER))) {
-	    this.forcexml = false;
-	}
-	if ("true"
-		.equalsIgnoreCase(config.getInitParameter(FORCEXML_PARAMETER))) {
-	    this.forcexml = true;
-	}
+	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),
@@ -100,6 +99,19 @@
     }
 
     /**
+     * @param forceXmlParameter
+     */
+    private void setupForceXml(String forceXmlParameter) {
+	if ("false".equalsIgnoreCase(forceXmlParameter)) {
+	    this.forcexml = false;
+	}
+	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.
@@ -125,6 +137,7 @@
 		.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
@@ -203,7 +216,7 @@
 	    String outputEncoding = "UTF-8";
 	    String contentType = getMimetype() + ";charset=" + outputEncoding;
 	    response.setContentType(contentType);
-	    parser = getParser(getMimetype(), true);
+	    parser = getParser(getMimetype(), true, viewId);
 	    if (null == parser) {
 		throw new ServletException(Messages.getMessage(
 			Messages.PARSER_NOT_INSTANTIATED_ERROR, contentType));
@@ -231,7 +244,7 @@
 			&& null != characterEncoding) {
 		    contentType += ";charset=" + characterEncoding;
 		}
-		parser = getParser(contentType, false);
+		parser = getParser(contentType, false, viewId);
 		response.setContentType(contentType);
 	    }
 	    // null or unsupported content type
@@ -332,7 +345,7 @@
 
     protected abstract void reuseParser(HtmlParser parser);
 
-    protected abstract HtmlParser getParser(String mimetype, boolean isAjax);
+    protected abstract HtmlParser getParser(String mimetype, boolean isAjax, String viewId);
 
     /**
          * @param publicid

Added: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableFilter.java	                        (rev 0)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,20 @@
+/**
+ * 
+ */
+package org.ajax4jsf.framework.ajax.xmlfilter;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ConfigurableFilter extends BaseFilter {
+
+    /**
+     * 
+     */
+    public ConfigurableFilter() {
+	xmlFilter = new ConfigurableXMLFilter();
+	xmlFilter.setFilter(this);
+    }
+
+}

Added: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java	                        (rev 0)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,238 @@
+/**
+ * 
+ */
+package org.ajax4jsf.framework.ajax.xmlfilter;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.EmptyStackException;
+import java.util.Properties;
+import java.util.regex.PatternSyntaxException;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+import org.ajax4jsf.framework.ajax.xmlfilter.nekko.NekkoParser;
+import org.ajax4jsf.framework.ajax.xmlfilter.tidy.TidyParser;
+import org.ajax4jsf.framework.ajax.xmlfilter.tidy.TidyXMLFilter;
+import org.ajax4jsf.framework.util.message.Messages;
+import org.ajax4jsf.io.parser.FastHtmlParser;
+import org.apache.commons.collections.ArrayStack;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+/**
+ * @author asmirnov
+ * 
+ */
+public class ConfigurableXMLFilter extends BaseXMLFilter {
+
+    private static final Log log = LogFactory
+	    .getLog(ConfigurableXMLFilter.class);
+
+    private static final String PARSERS_LIST_PARAMETER = "org.ajax4jsf.xmlparsers";
+
+    private static final String VIEW_ID_PATTERN_PARAMETER = "org.ajax4jsf.xmlparser.";
+
+    /**
+     * map of the parsers names and viewId patterns for all parser type.
+     */
+    private ParserConfig parsers = new TidyParserConfig();
+
+    // private ParserConfig passParserConfig = new PassParserConfig();
+
+    public void init(FilterConfig config) throws ServletException {
+	super.init(config);
+	ServletContext servletContext = config.getServletContext();
+	String parsersParameter = servletContext
+		.getInitParameter(PARSERS_LIST_PARAMETER);
+	if (null != parsersParameter) {
+	    configureParsers(servletContext, parsersParameter);
+	}
+    }
+
+    /**
+     * @param servletContext
+     * @param parsersParameter
+     * @throws ServletException
+     */
+    public void configureParsers(ServletContext servletContext,
+	    String parsersParameter) throws ServletException {
+	String[] parsersNames = parsersParameter.split("\\s*,\\s*");
+	for (int i = parsersNames.length - 1; i >= 0; i--) {
+	    String parserName = parsersNames[i];
+	    ParserConfig parserConfig;
+	    if ("TIDY".equals(parserName)) {
+		parserConfig = new TidyParserConfig();
+	    } else if ("NEKO".equals(parserName)) {
+		parserConfig = new NekoParserConfig();
+	    } else if ("PASS".equals(parserName)) {
+		parserConfig = new PassParserConfig();
+	    } else {
+		throw new ServletException(
+			"Unknown XML parser type in config parameter "
+				+ parserName);
+	    }
+	    parserConfig.setNext(parsers);
+	    if (null != servletContext) {
+		try {
+		    String parserViewPattern = servletContext
+			    .getInitParameter(VIEW_ID_PATTERN_PARAMETER
+				    + parserName);
+		    parserConfig.setPatterns(parserViewPattern);
+
+		} catch (PatternSyntaxException e) {
+		    throw new ServletException("Invalid pattern for a parser "
+			    + parserName + " :" + e.getMessage());
+		}
+	    }
+	    parsers = parserConfig;
+	}
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter#getParser(java.lang.String,
+     *      boolean, java.lang.String)
+     */
+    protected HtmlParser getParser(String mimetype, boolean isAjax,
+	    String viewId) {
+	HtmlParser parser = null;
+	if (isAjax || isForcexml()) {
+	    parser = parsers.getParser(viewId, mimetype);
+	} else if (mimetype.startsWith("text/html")
+		|| mimetype.startsWith("application/xhtml+xml")) {
+	    parser = new FastHtmlParser();
+	}
+	return parser;
+    }
+
+    /*
+     * (non-Javadoc)
+     * 
+     * @see org.ajax4jsf.framework.ajax.xmlfilter.BaseXMLFilter#reuseParser(org.ajax4jsf.framework.ajax.xmlfilter.HtmlParser)
+     */
+    protected void reuseParser(HtmlParser parser) {
+	parsers.reuseParser(parser);
+
+    }
+
+    private static final int STACK_SIZE = 100;
+
+    private ArrayStack _xhtmlParsersPool = new ArrayStack(STACK_SIZE);
+
+    private class NekoParserConfig extends ParserConfig {
+
+	protected HtmlParser createParser(String mime) {
+	    NekkoParser parser;
+	    try {
+		synchronized (_xhtmlParsersPool) {
+		    parser = (NekkoParser) _xhtmlParsersPool.pop();
+		}
+	    } catch (EmptyStackException e) {
+		parser = new NekkoParser();
+		parser.setPublicId(getPublicid());
+		parser.setSystemid(getSystemid());
+		parser.setNamespace(getNamespace());
+		// If tidy not handle all requests, disable reorganising
+		// of html
+		// parser.setMoveElements(isForcexml());
+	    }
+	    // TODO - set header scripts/styles filter.
+	    return parser;
+	}
+
+	boolean storeParser(HtmlParser parser) {
+	    if (null != parser && parser instanceof NekkoParser) {
+		synchronized (_xhtmlParsersPool) {
+		    if (_xhtmlParsersPool.size() < STACK_SIZE) {
+			((NekkoParser) parser).reset();
+			_xhtmlParsersPool.push(parser);
+		    }
+
+		}
+		return true;
+	    }
+	    return false;
+	}
+    }
+
+    private class TidyParserConfig extends ParserConfig {
+
+	protected HtmlParser createParser(String mime) {
+	    // TODO Auto-generated method stub
+	    TidyParser tidyParser = new TidyParser(getTidyProperties());
+	    tidyParser.setMoveElements(isForcexml());
+	    tidyParser.setMime(mime);
+	    return tidyParser;
+	}
+
+    }
+
+    private class PassParserConfig extends ParserConfig {
+
+	protected HtmlParser createParser(String mime) {
+	    return new FastHtmlParser();
+	}
+
+    }
+
+    private Properties _tidyProperties;
+
+    private Properties getTidyProperties() {
+	if (null == _tidyProperties) {
+	    _tidyProperties = new Properties();
+	    InputStream defaultprops = null;
+	    InputStream props = null;
+	    try {
+		defaultprops = TidyParser.class
+			.getResourceAsStream("tidy.properties");
+		if (null != defaultprops) {
+		    _tidyProperties.load(defaultprops);
+		    if (log.isDebugEnabled()) {
+			log.debug("default tidy parser properties loaded");
+		    }
+		} else if (log.isDebugEnabled()) {
+			log.debug("No default tidy parser properties found");
+		    }
+
+		// Second part - user-defined properties.
+		props = Thread.currentThread().getContextClassLoader()
+			.getResourceAsStream("tidy.properties");
+		if (null != props) {
+		    _tidyProperties.load(props);
+		    if (log.isDebugEnabled()) {
+			log.debug("application-specific tidy parser properties loaded");
+		    }
+		}
+	    } catch (IOException e) {
+		// TODO Auto-generated catch block
+		log.warn(Messages
+			.getMessage(Messages.READING_TIDY_PROPERTIES_ERROR), e);
+	    } finally {
+		if (null != props) {
+		    try {
+			props.close();
+		    } catch (IOException e) {
+			// can be ignored
+		    }
+		}
+		if (null != defaultprops) {
+		    try {
+			defaultprops.close();
+		    } catch (IOException e) {
+			// can be ignored
+		    }
+		}
+	    }
+	}
+	return _tidyProperties;
+    }
+
+    public ParserConfig getParsers() {
+        return parsers;
+    }
+
+}

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/HtmlParser.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/HtmlParser.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/HtmlParser.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -66,4 +66,6 @@
 	 */
 	public abstract void setViewState(String viewState);
 
+	public abstract boolean setMime(String mimeType);
+
 }
\ No newline at end of file

Added: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ParserConfig.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ParserConfig.java	                        (rev 0)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/ParserConfig.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,67 @@
+/**
+ * 
+ */
+package org.ajax4jsf.framework.ajax.xmlfilter;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+abstract class ParserConfig {
+
+    private static final Pattern[] ALL_VIEWS_PATTERN = { Pattern.compile(".*") };
+    
+    private static final Pattern SEPARATOR_PATTERN = Pattern.compile("\\s*,\\s*"); 
+
+    private Pattern[] patterns = ALL_VIEWS_PATTERN;
+
+    private ParserConfig next;
+
+    protected abstract HtmlParser createParser(String mimetype);
+
+    boolean storeParser(HtmlParser parser) {
+	return false;
+    }
+
+    HtmlParser getParser(String viewId, String mimetype) {
+	HtmlParser result = null;
+	for (int i = 0; i < patterns.length && null == result; i++) {
+	    Matcher matcher = patterns[i].matcher(viewId);
+	    if (matcher.matches()) {
+		result = createParser(mimetype);
+	    }
+	}
+	if (null == result && null != next) {
+	    result = next.getParser(viewId, mimetype);
+	}
+	return result;
+    }
+
+    public void reuseParser(HtmlParser parser) {
+	if (!storeParser(parser) && null != next) {
+	    next.reuseParser(parser);
+	}
+    }
+
+    public ParserConfig getNext() {
+	return next;
+    }
+
+    public void setNext(ParserConfig next) {
+	this.next = next;
+    }
+
+    public void setPatterns(String patternsString) {
+	if (null != patternsString) {
+	    String[] split = SEPARATOR_PATTERN.split(patternsString);
+	    patterns = new Pattern[split.length];
+	    for (int i = 0; i < split.length; i++) {
+		patterns[i]=Pattern.compile(split[i].trim());
+	    }
+	} 
+    }
+
+    public Pattern[] getPatterns() {
+        return patterns;
+    }
+
+}
\ No newline at end of file

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoParser.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoParser.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoParser.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -108,7 +108,8 @@
 	 */
 	public NekkoParser() {
 		_parser=new HtmlSAXParser(getHtmlConfig());
-		Properties properties = OutputPropertiesFactory.getDefaultMethodProperties(Method.XHTML);
+//		Properties properties = OutputPropertiesFactory.getDefaultMethodProperties(Method.XHTML);
+		Properties properties = OutputPropertiesFactory.getDefaultMethodProperties(Method.XML);
 //		properties.put("encoding",_encoding);
 		_serializer = SerializerFactory.getSerializer(properties);
 //		serializer.setOutputStream(output);
@@ -641,4 +642,8 @@
 			_systemid = systemid;
 		}
 
+		public boolean setMime(String mimeType) {
+		    return false;
+		}
+
 }

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoXMLFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoXMLFilter.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/nekko/NekkoXMLFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -36,7 +36,7 @@
 	
 	public NekkoXMLFilter() {}
 
-	protected HtmlParser getParser(String mimetype, boolean isAjax) {
+	protected HtmlParser getParser(String mimetype, boolean isAjax, String viewId) {
 		HtmlParser parser = null;
 		if( isAjax ){
 			parser = getXmlParser();

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyParser.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyParser.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyParser.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -322,7 +322,9 @@
 					// setup html output
 					tidy.setXHTML(false);
 					tidy.setXmlOut(false);
-					// TODO - auto doctype ?
+					if (log.isDebugEnabled()) {
+					    log.debug("Print output as ordinary HTML");
+					}
 					return true;
 				}
 			}
@@ -332,6 +334,9 @@
 					// setup xhtml output
 					tidy.setXHTML(true);
 					tidy.setXmlOut(false);
+					if (log.isDebugEnabled()) {
+					    log.debug("Print output as XHTML");
+					}
 					return true;
 				}
 			}
@@ -344,6 +349,9 @@
 					tidy.setXmlPi(true);
 					tidy.setEscapeCdata(false);
 					tidy.setNumEntities(true);
+					if (log.isDebugEnabled()) {
+					    log.debug("Print output as XML");
+					}
 					return true;
 				}
 			}
@@ -384,7 +392,7 @@
 	 * @see org.ajax4jsf.framework.ajax.xmlfilter.HtmlParser#setDoctype(java.lang.String)
 	 */
 	public void setDoctype(String doctype) {
-		tidy.setDocType(doctype);
+		 tidy.setDocType("omit");//doctype);
 	}
 
 	/*

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyXMLFilter.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyXMLFilter.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/ajax/xmlfilter/tidy/TidyXMLFilter.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -66,7 +66,7 @@
      * @param string Encodings for parser
      * @return
 	 */
-	protected HtmlParser getParser(String mime, boolean isAjax) {
+	protected HtmlParser getParser(String mime, boolean isAjax, String viewId) {
 		// For non-ajax, parse only html types !
 			if (isAjax || mime.startsWith("text/html") || mime.startsWith("application/xhtml+xml")) {
 				if(isAjax || isForcexml()){

Modified: trunk/framework/src/main/java/org/ajax4jsf/framework/resource/InternetResourceService.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/framework/resource/InternetResourceService.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/framework/resource/InternetResourceService.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -53,8 +53,8 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
-
-public class InternetResourceService implements CacheLoader, CacheConfigurationLoader {
+public class InternetResourceService implements CacheLoader,
+	CacheConfigurationLoader {
     private static final Log log = LogFactory
 	    .getLog(InternetResourceService.class);
 
@@ -67,9 +67,9 @@
     private boolean cacheEnabled = true;
 
     private Cache cache = null;
-    
-    //private ServletCacheAdministrator cacheAdmin;
 
+    // private ServletCacheAdministrator cacheAdmin;
+
     private FacesContextFactory contextFactory;
 
     // private RenderKitFactory renderKitFactory;
@@ -78,7 +78,7 @@
     private ResourceLifecycle lifecycle;
 
     private InternetResourceBuilder resourceBuilder;
-    
+
     private WebXml webXml;
 
     public InternetResourceService() {
@@ -95,18 +95,18 @@
 		.getInitParameter(ENABLE_CACHING_PARAMETER))) {
 	    setCacheEnabled(false);
 	    // this.cacheEnabled = false;
-	    //this.cacheAdmin = null;
+	    // this.cacheAdmin = null;
 	} else {
-	    //this.cacheAdmin = ServletCacheAdministrator.getInstance(
-		//    servletContext, cacheProperties);
+	    // this.cacheAdmin = ServletCacheAdministrator.getInstance(
+	    // servletContext, cacheProperties);
 	    try {
-			CacheManager cacheManager = CacheManager.getInstance();
-			Map env = new ServletContextInitMap(servletContext);
-			CacheFactory cacheFactory = cacheManager.getCacheFactory(env);
-			this.cache = cacheFactory.createCache(env, this, this);
-		} catch (CacheException e) {
-			throw new FacesException(e.getMessage(), e);
-		}
+		CacheManager cacheManager = CacheManager.getInstance();
+		Map env = new ServletContextInitMap(servletContext);
+		CacheFactory cacheFactory = cacheManager.getCacheFactory(env);
+		this.cache = cacheFactory.createCache(env, this, this);
+	    } catch (CacheException e) {
+		throw new FacesException(e.getMessage(), e);
+	    }
 	}
 	// Create Resource-specific Faces Lifecycle instance.
 	lifecycleClass = servletContext
@@ -125,18 +125,22 @@
 	} else {
 	    lifecycle = new ResourceLifecycle();
 	}
-	webXml = new WebXml();
-	webXml.init(servletContext,filterConfig.getFilterName());
-	if (log.isDebugEnabled()) {
-	    log.debug("Resources service initialized");
+	// Check for existing configuration.
+	webXml = (WebXml) servletContext.getAttribute(WebXml.CONTEXT_ATTRIBUTE);
+	if (null == webXml) {
+	    webXml = new WebXml();
+	    webXml.init(servletContext, filterConfig.getFilterName());
+	    if (log.isDebugEnabled()) {
+		log.debug("Resources service initialized");
+	    }
+
 	}
     }
 
     public boolean serviceResource(HttpServletRequest httpServletRequest,
 	    HttpServletResponse httpServletResponse) throws ServletException,
 	    IOException {
-	String resourceKey = webXml
-		.getFacesResourceKey(httpServletRequest);
+	String resourceKey = webXml.getFacesResourceKey(httpServletRequest);
 	if (null != resourceKey) {
 	    serviceResource(resourceKey, httpServletRequest,
 		    httpServletResponse);
@@ -153,8 +157,8 @@
 	} catch (ResourceNotFoundException e) {
 	    throw new ServletException(e);
 	}
-	Object resourceDataForKey = getResourceBuilder()
-		.getResourceDataForKey(resourceKey);
+	Object resourceDataForKey = getResourceBuilder().getResourceDataForKey(
+		resourceKey);
 	if (resource.isCacheable(null) && this.cacheEnabled) {
 	    // Test for client request modification time.
 	    try {
@@ -162,7 +166,7 @@
 			.getDateHeader("If-Modified-Since");
 		if (ifModifiedSince >= 0) {
 		    // Test for modification. 1000 ms due to round
-                        // modification
+		    // modification
 		    // time to seconds.
 		    long lastModified = resource.getLastModified(null)
 			    .getTime() - 1000;
@@ -179,74 +183,64 @@
 				e);
 	    }
 	    String cacheKey = resourceKey;// + "?" +
-                                                // request.getQueryString();
+	    // request.getQueryString();
 	    // TODO - select session/application scope.
-	    //Cache cache = cacheAdmin.getAppScopeCache(getServletContext());
-//	    try {
-		// TODO - use last modified/expires time
-		
-	    CacheKey key = new CacheKey(resourceDataForKey, request, response, resource);
-	    
+	    // Cache cache = cacheAdmin.getAppScopeCache(getServletContext());
+	    // try {
+	    // TODO - use last modified/expires time
+
+	    CacheKey key = new CacheKey(resourceDataForKey, request, response,
+		    resource);
+
 	    CacheContent content;
-		try {
-			content = (CacheContent) cache
-				.get(cacheKey, key);
-			if (log.isDebugEnabled()) {
-			    log.debug(Messages.getMessage(
-				    Messages.GET_CONTENT_FROM_CACHE_INFO, cacheKey));
-			}
-			content.sendHeaders(response);
-			// Correct expires date for resource.
-			Date expired = resource.getExpired(null);
-			if (expired != null) {
-			    response.setDateHeader("Expires", expired.getTime());
-			} else {
-			    response.setDateHeader("Expires", System
-				    .currentTimeMillis()
-				    + InternetResource.DEFAULT_EXPIRE);
-			}
-			if (!request.getMethod().equals("HEAD")) {
-			    content.send(response);
-			}/*
-		    } catch (NeedsRefreshException e) {
-			try {
-			    if (log.isDebugEnabled()) {
-				log.debug(Messages.getMessage(
-					Messages.CONTENT_NOT_FOUND_ERROR, cacheKey));
-			    }
-			    CachedResourceContext context = (CachedResourceContext) sendResource(
-				    resource, request, response, resourceDataForKey);
-			    // TODO - set refresh interval ?
-			    cache.put(cacheKey, context.getContent());
-			} catch (Exception ex) {
-			    //cache.cancelUpdate(cacheKey);
-			    log.error(
-				    Messages.getMessage(Messages.SEND_RESOURCE_ERROR),
-				    ex);
-			    throw new ServletException(Messages.getMessage(
-				    Messages.SEND_RESOURCE_ERROR_2, ex.getMessage()),
-				    ex);
-			}
-		    }*/
-		} catch (CacheException e) {
-		    log.error(
-				    Messages.getMessage(Messages.SEND_RESOURCE_ERROR),
-				    e);
-			    throw new ServletException(Messages.getMessage(
-				    Messages.SEND_RESOURCE_ERROR_2, e.getMessage()),
-				    e);
+	    try {
+		content = (CacheContent) cache.get(cacheKey, key);
+		if (log.isDebugEnabled()) {
+		    log.debug(Messages.getMessage(
+			    Messages.GET_CONTENT_FROM_CACHE_INFO, cacheKey));
 		}
+		content.sendHeaders(response);
+		// Correct expires date for resource.
+		Date expired = resource.getExpired(null);
+		if (expired != null) {
+		    response.setDateHeader("Expires", expired.getTime());
+		} else {
+		    response.setDateHeader("Expires", System
+			    .currentTimeMillis()
+			    + InternetResource.DEFAULT_EXPIRE);
+		}
+		if (!request.getMethod().equals("HEAD")) {
+		    content.send(response);
+		}/*
+		     * } catch (NeedsRefreshException e) { try { if
+		     * (log.isDebugEnabled()) { log.debug(Messages.getMessage(
+		     * Messages.CONTENT_NOT_FOUND_ERROR, cacheKey)); }
+		     * CachedResourceContext context = (CachedResourceContext)
+		     * sendResource( resource, request, response,
+		     * resourceDataForKey); // TODO - set refresh interval ?
+		     * cache.put(cacheKey, context.getContent()); } catch
+		     * (Exception ex) { //cache.cancelUpdate(cacheKey);
+		     * log.error(
+		     * Messages.getMessage(Messages.SEND_RESOURCE_ERROR), ex);
+		     * throw new ServletException(Messages.getMessage(
+		     * Messages.SEND_RESOURCE_ERROR_2, ex.getMessage()), ex); } }
+		     */
+	    } catch (CacheException e) {
+		log.error(Messages.getMessage(Messages.SEND_RESOURCE_ERROR), e);
+		throw new ServletException(Messages.getMessage(
+			Messages.SEND_RESOURCE_ERROR_2, e.getMessage()), e);
+	    }
 	} else {
 	    sendResource(resource, request, response, resourceDataForKey);
 	}
     }
 
     /**
-         * @param resource
-         * @param request
-         * @param response
-         * @throws IOException
-         */
+     * @param resource
+     * @param request
+     * @param response
+     * @throws IOException
+     */
     protected ResourceContext sendResource(InternetResource resource,
 	    HttpServletRequest request, HttpServletResponse response,
 	    Object data) throws IOException {
@@ -259,13 +253,13 @@
     }
 
     /**
-         * @param resource
-         * @param request
-         * @param response
-         * @return
-         * @throws ServletException
-         * @throws FacesException
-         */
+     * @param resource
+     * @param request
+     * @param response
+     * @return
+     * @throws ServletException
+     * @throws FacesException
+     */
     protected ResourceContext getResourceContext(InternetResource resource,
 	    HttpServletRequest request, HttpServletResponse response)
 	    throws FacesException {
@@ -285,11 +279,11 @@
     }
 
     /**
-         * Get properties file from classpath
-         * 
-         * @param name
-         * @return
-         */
+     * Get properties file from classpath
+     * 
+     * @param name
+     * @return
+     */
     protected Properties getProperties(String name) {
 	Properties properties = new Properties();
 	InputStream props = BaseFilter.class.getResourceAsStream(name);
@@ -313,27 +307,27 @@
     }
 
     /**
-         * @return Returns the servletContext.
-         */
+     * @return Returns the servletContext.
+     */
     protected ServletContext getServletContext() {
 	return filterConfig.getServletContext();
     }
 
     /**
-         * @return the lifecycle
-         * @throws ServletException
-         */
+     * @return the lifecycle
+     * @throws ServletException
+     */
     protected ResourceLifecycle getLifecycle() throws FacesException {
 	return lifecycle;
     }
 
     /**
-         * @return the contextFactory
-         */
+     * @return the contextFactory
+     */
     protected synchronized FacesContextFactory getContextFactory() {
 	if (contextFactory == null) {
-		contextFactory = (FacesContextFactory) FactoryFinder
-		.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
+	    contextFactory = (FacesContextFactory) FactoryFinder
+		    .getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
 	}
 
 	return contextFactory;
@@ -346,36 +340,37 @@
     }
 
     /**
-         * @return the resourceBuilder
-         */
+     * @return the resourceBuilder
+     */
     protected InternetResourceBuilder getResourceBuilder() {
 	if (resourceBuilder == null) {
-		// Create resource builder for this filter.
-		resourceBuilder = InternetResourceBuilder.getInstance();
+	    // Create resource builder for this filter.
+	    resourceBuilder = InternetResourceBuilder.getInstance();
 	}
 	return resourceBuilder;
     }
 
-	public Object load(Object key, Object context) throws CacheException {
-		CacheKey cacheKey = (CacheKey) context;
-		
-		CachedResourceContext resourceContext = (CachedResourceContext) getResourceContext(cacheKey.getResource(), cacheKey.getRequest(),
-				cacheKey.getResponse());
-			resourceContext.setResourceData(cacheKey.getResourceData());
-			try {
-				getLifecycle().send(resourceContext, cacheKey.getResource());
-			} catch (IOException e) {
-				throw new CacheException(e.getMessage(), e);
-			}
-			resourceContext.release();
+    public Object load(Object key, Object context) throws CacheException {
+	CacheKey cacheKey = (CacheKey) context;
 
-		    // TODO - set refresh interval ?
-		    //cache.put(cacheKey, resourceContext.getContent());
-		return resourceContext.getContent();
+	CachedResourceContext resourceContext = (CachedResourceContext) getResourceContext(
+		cacheKey.getResource(), cacheKey.getRequest(), cacheKey
+			.getResponse());
+	resourceContext.setResourceData(cacheKey.getResourceData());
+	try {
+	    getLifecycle().send(resourceContext, cacheKey.getResource());
+	} catch (IOException e) {
+	    throw new CacheException(e.getMessage(), e);
 	}
+	resourceContext.release();
 
-	public Properties loadProperties(String name) {
-		return getProperties(name);
-	}
+	// TODO - set refresh interval ?
+	// cache.put(cacheKey, resourceContext.getContent());
+	return resourceContext.getContent();
+    }
 
+    public Properties loadProperties(String name) {
+	return getProperties(name);
+    }
+
 }

Modified: trunk/framework/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java
===================================================================
--- trunk/framework/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/framework/src/main/java/org/ajax4jsf/io/parser/FastHtmlParser.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -56,6 +56,8 @@
 
 	private String viewState;
 
+	private String mimeType;
+
 	public void parse(Reader in, Writer out) throws IOException {
 		boolean haveHtml = false;
 		boolean haveHead = false;
@@ -163,7 +165,7 @@
 	private void writeToHead(Writer out, boolean haveHtml, boolean haveHead)
 			throws IOException {
 		if (!haveHead && !haveHtml) {
-			out.write("<html>");
+			out.write("<html  xmlns=\"http://www.w3.org/1999/xhtml\">");
 		}
 		if (!haveHead) {
 			out.write("<head>");
@@ -252,4 +254,9 @@
 		this.viewState = viewState;
 
 	}
+
+	public boolean setMime(String mimeType) {
+	    this.mimeType=mimeType;
+	    return true;
+	}
 }

Added: trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilterTestCase.java
===================================================================
--- trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilterTestCase.java	                        (rev 0)
+++ trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ConfigurableXMLFilterTestCase.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,97 @@
+/**
+ * 
+ */
+package org.ajax4jsf.framework.ajax.xmlfilter;
+
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+
+import org.ajax4jsf.framework.ajax.xmlfilter.nekko.NekkoParser;
+import org.ajax4jsf.io.parser.FastHtmlParser;
+
+import junit.framework.TestCase;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ConfigurableXMLFilterTestCase extends TestCase {
+    
+    ServletContext servletContext;
+    
+    FilterConfig filterConfig;
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+	super.setUp();
+    }
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+	super.tearDown();
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ConfigurableXMLFilter#reuseParser(org.ajax4jsf.framework.ajax.xmlfilter.HtmlParser)}.
+     * @throws ServletException 
+     */
+    public void testReuseParser() throws ServletException {
+	ConfigurableXMLFilter filter = createFilter();
+	HtmlParser parser = filter.getParser("text/html", true, "/index.jsp");
+	assertNotNull(parser);
+	filter.reuseParser(parser);
+	HtmlParser reusedParser = filter.getParser("text/html", true, "/index.jsp");
+	assertSame(parser, reusedParser);
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ConfigurableXMLFilter#getParser(java.lang.String, boolean, java.lang.String)}.
+     * @throws ServletException 
+     */
+    public void testGetParser() throws ServletException {
+	ConfigurableXMLFilter filter = createFilter();
+	HtmlParser parser = filter.getParser("text/html", true, "/index.jsp");
+	assertNotNull(parser);
+	assertTrue(parser instanceof NekkoParser);
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ConfigurableXMLFilter#getParser(java.lang.String, boolean, java.lang.String)}.
+     * @throws ServletException 
+     */
+    public void testGetFastParser() throws ServletException {
+	ConfigurableXMLFilter filter = createFilter();
+	HtmlParser parser = filter.getParser("text/html", true, "/index.xhtml");
+	assertNotNull(parser);
+	assertTrue(parser instanceof FastHtmlParser);
+    }
+    /**
+     * @return
+     * @throws ServletException
+     */
+    private ConfigurableXMLFilter createFilter() throws ServletException {
+	ConfigurableXMLFilter filter = new ConfigurableXMLFilter();
+	filter.configureParsers(servletContext, "PASS,NEKO");
+	filter.getParsers().setPatterns(".*\\.xhtml");
+	return filter;
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ConfigurableXMLFilter#configureParsers(javax.servlet.ServletContext, java.lang.String)}.
+     * @throws ServletException 
+     */
+    public void testConfigureParsers() throws ServletException {
+	ConfigurableXMLFilter filter = new ConfigurableXMLFilter();
+	filter.configureParsers(servletContext, "PASS");
+	ParserConfig parsers = filter.getParsers();
+	HtmlParser createParser = parsers.createParser(null);
+	assertNotNull(createParser);
+	assertTrue(createParser instanceof FastHtmlParser);
+    }
+
+}

Added: trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ParterConfigTestCase.java
===================================================================
--- trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ParterConfigTestCase.java	                        (rev 0)
+++ trunk/framework/src/test/java/org/ajax4jsf/framework/ajax/xmlfilter/ParterConfigTestCase.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,156 @@
+/**
+ * 
+ */
+package org.ajax4jsf.framework.ajax.xmlfilter;
+
+import java.util.regex.Pattern;
+
+import org.ajax4jsf.io.parser.FastHtmlParser;
+
+import junit.framework.TestCase;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ParterConfigTestCase extends TestCase {
+    
+    private ParserConfig testConfig;
+    
+    private boolean parserCreated;
+    
+    private boolean parserReused;
+
+    private String mimetype;
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#setUp()
+     */
+    protected void setUp() throws Exception {
+	super.setUp();
+	parserCreated = false;
+	parserReused = false;
+	testConfig = new ParserConfig(){
+
+	    protected HtmlParser createParser(String mime) {
+		parserCreated = true;
+		return new FastHtmlParser();
+	    }
+	    
+	    boolean storeParser(HtmlParser parser) {
+	        parserReused = true;
+	        return super.storeParser(parser);
+	    }
+	    
+	};
+    }
+
+    /* (non-Javadoc)
+     * @see junit.framework.TestCase#tearDown()
+     */
+    protected void tearDown() throws Exception {
+	testConfig = null;
+	super.tearDown();
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#getParser(java.lang.String, String)}.
+     */
+    public void testGetParser() {
+	HtmlParser parser = testConfig.getParser("/default.jsp", mimetype);
+	assertNotNull(parser);
+	assertTrue(parserCreated);
+    }
+    
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#getParser(java.lang.String, String)}.
+     */
+    public void testGetParserWithPattern() {
+	testConfig.setPatterns(".*\\.jsp");
+	HtmlParser parser = testConfig.getParser("/default.jsp", mimetype);
+	assertNotNull(parser);
+	assertTrue(parserCreated);
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#getParser(java.lang.String, String)}.
+     */
+    public void testGetParserWithPattern1() {
+	testConfig.setPatterns(".*\\.xhtml");
+	HtmlParser parser = testConfig.getParser("/default.jsp", mimetype);
+	assertNull(parser);
+	assertFalse(parserCreated);
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#getParser(java.lang.String, String)}.
+     */
+    public void testGetParserWithPatternAndChain() {
+	ParserConfig firstConfig = new ParserConfig(){
+
+	    protected HtmlParser createParser(String mime) {
+		return null;
+	    }
+	    
+	};
+	firstConfig.setPatterns("^.*\\.jspx$");
+	firstConfig.setNext(testConfig);
+	testConfig.setPatterns(".*\\.xhtml,.*\\.jsp");
+	HtmlParser parser = firstConfig.getParser("/default.jsp", mimetype);
+	assertNotNull(parser);
+	assertTrue(parserCreated);
+    }
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#reuseParser(org.ajax4jsf.framework.ajax.xmlfilter.HtmlParser)}.
+     */
+    public void testReuseParserChain() {
+	ParserConfig firstConfig = new ParserConfig(){
+
+	    protected HtmlParser createParser(String mime) {
+		return null;
+	    }
+	    
+	};
+	firstConfig.setNext(testConfig);
+	HtmlParser parser = testConfig.getParser("/default.jsp", mimetype);
+	firstConfig.reuseParser(parser);
+	assertTrue(parserReused);
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#setPatterns(java.lang.String)}.
+     */
+    public void testSetPatterns() {
+	testConfig.setPatterns("a.*");
+	Pattern[] patterns = testConfig.getPatterns();
+	assertEquals(1, patterns.length);
+	assertTrue(patterns[0].matcher("abb").matches());
+	assertFalse(patterns[0].matcher("bbb").matches());
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#setPatterns(java.lang.String)}.
+     */
+    public void testSetPatterns2() {
+	testConfig.setPatterns("a.*,b.*");
+	Pattern[] patterns = testConfig.getPatterns();
+	assertEquals(2, patterns.length);
+	assertTrue(patterns[0].matcher("abb").matches());
+	assertFalse(patterns[0].matcher("bbb").matches());
+	assertTrue(patterns[1].matcher("bbb").matches());
+	assertFalse(patterns[1].matcher("abb").matches());
+    }
+
+    /**
+     * Test method for {@link org.ajax4jsf.framework.ajax.xmlfilter.ParserConfig#setPatterns(java.lang.String)}.
+     */
+    public void testSetPatterns3() {
+	testConfig.setPatterns(" a.*\t, b.* ");
+	Pattern[] patterns = testConfig.getPatterns();
+	assertEquals(2, patterns.length);
+	assertTrue(patterns[0].matcher("abb").matches());
+	assertFalse(patterns[0].matcher("bbb").matches());
+	assertTrue(patterns[1].matcher("bbb").matches());
+	assertFalse(patterns[1].matcher("abb").matches());
+    }
+}

Added: trunk/samples/useCases/src/main/java/beans/performance/Data.java
===================================================================
--- trunk/samples/useCases/src/main/java/beans/performance/Data.java	                        (rev 0)
+++ trunk/samples/useCases/src/main/java/beans/performance/Data.java	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,40 @@
+package beans.performance;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class Data {
+	private Collection<Map<String,String>> buffer = null;
+	public Collection<Map<String,String>> getData() {
+		if (buffer==null) {
+			List<Map<String,String>> ret = new ArrayList<Map<String,String>>();
+			for (int row = 0;row<500;row++) {
+				Map<String, String> rowData = new HashMap<String,String>();
+				for (int col=0; col<5; col++) {
+					String key = "col"+col;
+					String data = "column data ["+row+"]["+col+"]";
+					rowData.put(key,data);
+					ret.add(rowData);
+				}
+			}
+			buffer = ret;
+			return ret;
+		} else {
+			return buffer;
+		}
+	}
+	private String param;
+	public String getParam() {
+		return param;
+	}
+	public void setParam(String param) {
+		this.param = param;
+	}
+	public String action() {
+		System.out.println("param="+param);
+		return null;
+	}
+}

Added: trunk/samples/useCases/src/main/webapp/META-INF/MANIFEST.MF
===================================================================
--- trunk/samples/useCases/src/main/webapp/META-INF/MANIFEST.MF	                        (rev 0)
+++ trunk/samples/useCases/src/main/webapp/META-INF/MANIFEST.MF	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,2 @@
+Manifest-Version: 1.0
+

Modified: trunk/samples/useCases/src/main/webapp/WEB-INF/faces-config.xml
===================================================================
--- trunk/samples/useCases/src/main/webapp/WEB-INF/faces-config.xml	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/samples/useCases/src/main/webapp/WEB-INF/faces-config.xml	2007-07-07 01:16:15 UTC (rev 302)
@@ -32,6 +32,11 @@
         <managed-bean-class>control.test.ControlBackingBean</managed-bean-class>
         <managed-bean-scope>request</managed-bean-scope>
   </managed-bean>
+    <managed-bean>
+        <managed-bean-name>performance</managed-bean-name>
+        <managed-bean-class>beans.performance.Data</managed-bean-class>
+        <managed-bean-scope>request</managed-bean-scope>
+  </managed-bean>
 
  <navigation-rule>
   <navigation-case>

Modified: trunk/samples/useCases/src/main/webapp/WEB-INF/web.xml
===================================================================
--- trunk/samples/useCases/src/main/webapp/WEB-INF/web.xml	2007-07-06 14:48:03 UTC (rev 301)
+++ trunk/samples/useCases/src/main/webapp/WEB-INF/web.xml	2007-07-07 01:16:15 UTC (rev 302)
@@ -34,12 +34,24 @@
   <param-name>org.ajax4jsf.COMPRESS_SCRIPT</param-name>
   <param-value>false</param-value>
  </context-param>
+ <context-param>
+    <param-name>org.ajax4jsf.xmlparsers</param-name>
+    <param-value>PASS,NEKO,TIDY</param-value>
+ </context-param>
+ <context-param>
+    <param-name>org.ajax4jsf.xmlparser.PASS</param-name>
+    <param-value>/pages/performance.xhtml</param-value>
+ </context-param>
+ <context-param>
+    <param-name>org.ajax4jsf.xmlparser.NEKO</param-name>
+    <param-value>/pages/repeat.xhtml</param-value>
+ </context-param>
  <!-- 
  --> 
  <filter>
   <display-name>Ajax4jsf Filter</display-name>
   <filter-name>ajax4jsf</filter-name>
-  <filter-class>org.ajax4jsf.FastFilter</filter-class>
+  <filter-class>org.ajax4jsf.Filter</filter-class>
  </filter>
  <filter-mapping>
   <filter-name>ajax4jsf</filter-name>

Added: trunk/samples/useCases/src/main/webapp/pages/performance.xhtml
===================================================================
--- trunk/samples/useCases/src/main/webapp/pages/performance.xhtml	                        (rev 0)
+++ trunk/samples/useCases/src/main/webapp/pages/performance.xhtml	2007-07-07 01:16:15 UTC (rev 302)
@@ -0,0 +1,55 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml"
+	  xmlns:f="http://java.sun.com/jsf/core"
+      xmlns:h="http://java.sun.com/jsf/html"
+      xmlns:ui="http://java.sun.com/jsf/facelets"
+      xmlns:a4j="https://ajax4jsf.dev.java.net/ajax"
+      xmlns:c="http://java.sun.com/jsp/jstl/core"  
+	  xmlns:rich="http://richfaces.ajax4jsf.org/rich"  		
+      >
+    <head>
+    </head>  	
+    <body>
+	<h:form>
+		<h:dataTable id="tbl" value="#{performance.data}" var="row">
+			<h:column>
+				<f:facet name="header">
+					<h:outputText value="Col0" />
+				</f:facet>
+				<h:outputText value="#{row.col0}" />
+				<a4j:commandLink action="#{performance.action}" value="command" reRender="tbl">
+					<a4j:actionparam value="#{row.col0}" name="param" assignTo="#{performance.param}"/>
+				</a4j:commandLink>
+			</h:column>
+			<h:column>
+				<f:facet name="header">
+					<h:outputText value="Col1" />
+				</f:facet>
+				<h:outputText value="#{row.col1}" />
+				<a4j:commandLink action="#{performance.action}" value="command" reRender="tbl">
+					<a4j:actionparam value="#{row.col1}" name="param" assignTo="#{performance.param}"/>
+				</a4j:commandLink>
+			</h:column>
+			<h:column>
+				<f:facet name="header">
+					<h:outputText value="Col2" />
+				</f:facet>
+				<h:outputText value="#{row.col2}" />
+				<a4j:commandLink action="#{performance.action}" value="command" reRender="tbl">
+					<a4j:actionparam value="#{row.col2}" name="param" assignTo="#{performance.param}"/>
+				</a4j:commandLink>
+			</h:column>
+			<h:column>
+				<f:facet name="header">
+					<h:outputText value="Col3" />
+				</f:facet>
+				<h:outputText value="#{row.col3}" />
+				<a4j:commandLink action="#{performance.action}" value="command" reRender="tbl">
+					<a4j:actionparam value="#{row.col3}" name="param" assignTo="#{performance.param}"/>
+				</a4j:commandLink>
+			</h:column>
+		</h:dataTable>
+	   </h:form>	
+    <a4j:log hotkey="M"/>
+	</body>
+</html>	
\ No newline at end of file




More information about the ajax4jsf-svn-commits mailing list