[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