JBoss Rich Faces SVN: r11100 - trunk/sandbox/ui/editor/src/main/antlr.
by richfaces-svn-commits@lists.jboss.org
Author: abelevich
Date: 2008-11-12 03:51:36 -0500 (Wed, 12 Nov 2008)
New Revision: 11100
Modified:
trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
Log:
Modified: trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g
===================================================================
--- trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-12 07:15:09 UTC (rev 11099)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-12 08:51:36 UTC (rev 11100)
@@ -1,6 +1,6 @@
header
{
- package org.richfaces.antlr;
+ package org.richfaces;
}
{
@@ -61,7 +61,7 @@
private final String SEAMTEXT_BACKTICK = "`";
- private final String SEAMTEXT_PARAGRAPH = "\n\n";
+ private final String BLANK_LINE = "\n\n";
private final String SEAM_DOUBLEQUOTE = "\"";
@@ -74,17 +74,17 @@
protected java.util.Set<String> seamTextSymbols = new java.util.HashSet(java.util.Arrays.asList(
SEAMTEXT_MONOSPACE, SEAMTEXT_TWIDDLE, SEAMTEXT_HASH, SEAMTEXT_HAT, SEAMTEXT_PLUS, SEAMTEXT_STAR,
- SEAMTEXT_UNDERSCORE, SEAMTEXT_EQ, SEAMTEXT_BACKTICK, SEAMTEXT_PARAGRAPH, SEAM_DOUBLEQUOTE, SEAM_OPEN,
+ SEAMTEXT_UNDERSCORE, SEAMTEXT_EQ, SEAMTEXT_BACKTICK, BLANK_LINE, SEAM_DOUBLEQUOTE, SEAM_OPEN,
SEAM_CLOSE, SEAM_GT
));
protected java.util.Set<String> htmlSeamTextElements = new java.util.HashSet(java.util.Arrays.asList(
- "del", "sup", "pre","p", "q" ,"h1" ,"h2" ,"h3" ,"h4" ,"ul" ,"ol" ,"li" ,"i" ,"tt" ,"u" ,"a"));
+ "del", "sup", "pre","p", "q" ,"h1" ,"h2" ,"h3" ,"h4" ,"ul" ,"ol" ,"li" ,"i" ,"tt" ,"u" ,"a","blockqoute"));
protected java.util.Set<String> simpleHtmlSeamTextElements = new java.util.HashSet(java.util.Arrays.asList(
- "del", "sup", "pre","p", "q" ,"i" ,"tt" ,"u"));
+ "del", "sup", "pre", "q", "i" ,"tt" ,"u"));
protected java.util.Set<String> formattedHtmlSeamTextElements = new java.util.HashSet(java.util.Arrays.asList(
- "ul", "ol", "li", "h1", "h2", "h3", "h4", "a"));
+ "ul", "ol", "li", "h1", "h2", "h3", "h4", "a", "p", "blockqoute"));
private Sanitizer sanitizer = new DefaultSanitizer();
@@ -92,13 +92,13 @@
private StringBuilder mainBuilder = new StringBuilder();
- private StringBuilder linkValueCollector = new StringBuilder();
-
private String linkHolder;
private StringBuilder builder = mainBuilder;
+ public StringBuilder valueCollector;
+
public void setSanitizer(Sanitizer sanitizer) {
this.sanitizer = sanitizer;
}
@@ -168,7 +168,7 @@
return seamHeader.toString();
}
- public void healingHeaderMarkup(java.util.Stack <Token> htmlElementStack) throws TokenStreamException{
+ public void healingHeaderMarkup() throws TokenStreamException{
int EOF = 1;
int ALPHANUMERICWORD = 4;
int i = 0;
@@ -195,15 +195,20 @@
}
}
- public String getSeamParagraphMarkup() throws TokenStreamException{
+ public boolean isParagraph(Token token) {
+ String name = token.getText().toLowerCase();
+ return "p".equals(name) ;
+ }
+
+ public String healingParagraphMarkup() throws TokenStreamException{
int i = 0;
Token token;
do {
i++;
token = LT(i);
if (token.getType() == ALPHANUMERICWORD) {
- if("p".equals(token.getText())) {
- return SEAMTEXT_PARAGRAPH;
+ if(isParagraph(token) || isList(token)) {
+ return BLANK_LINE;
} else if(isHeader(token)) {
return "\n";
}
@@ -231,9 +236,9 @@
Token parent = htmlElementStack.peek();
String parentName = parent.getText().toLowerCase();
if(parentName.equals("ul")) {
+ seamText = SEAMTEXT_EQ;
+ } else if (parentName.equals("ol")){
seamText = SEAMTEXT_HASH;
- } else if (parentName.equals("ol")){
- seamText = SEAMTEXT_EQ;
} else {
String message = "<li> must follow <ol> or <ul> not <" + parent.getText() + ">";
throw new SemanticException( message, parent.getFilename(), parent.getLine(), parent.getColumn());
@@ -244,20 +249,25 @@
public boolean isPlainHMTLRequired(Token name, java.util.Stack <Token> htmlElementStack) throws SemanticException {
boolean required = false;
- if(!htmlElementStack.isEmpty()) {
- for(Token token : htmlElementStack) {
- if(token.getText().equals("h1") || token.getText().equals("h2") || token.getText().equals("h3")
- || token.getText().equals("h4") || token.getText().equals("li")) {
- required = true;
- }
- }
+
+ if(!isSeamTextElement(name)) {
+ return true;
}
-
- return required;
+
+ if(!htmlElementStack.isEmpty() && !"a".equals(name.getText().toLowerCase()) && !"p".equals(name.getText().toLowerCase())) {
+ for(Token token : htmlElementStack) {
+ if(token.getText().equals("h1") || token.getText().equals("h2") || token.getText().equals("h3")
+ || token.getText().equals("h4") || token.getText().equals("li")) {
+ return true;
+ }
+ }
+ }
+
+ return false;
}
- public String createSimpleSeamText(Token token) throws SemanticException,TokenStreamException{
+ public String getSimpleSeamText(Token token) throws SemanticException,TokenStreamException{
String name = token.getText().toLowerCase();
StringBuilder seamText = new StringBuilder();
@@ -274,14 +284,9 @@
seamText.append(SEAMTEXT_UNDERSCORE);
} else if("pre".equals(name)) {
seamText.append(SEAMTEXT_BACKTICK);
- } else if("p".equals(name)) {
- seamText.append(getSeamParagraphMarkup());
} else if("q".equals(name)) {
seamText.append(SEAM_DOUBLEQUOTE);
- } else if("blockquote".equals(name)) {
- seamText.append(SEAM_DOUBLEQUOTE);
- }
-
+ }
return seamText.toString();
}
@@ -330,24 +335,7 @@
String name = element.getText().toLowerCase();
return formattedHtmlSeamTextElements.contains(name);
}
-
- public void validateFormattedHtmlSeamText(Token token) {
-
- Token token;
- int next = 0;
-
- do {
- next++;
- token = LT(next);
-
-
-
- } while (token.getType() != EOF);
-
- }
-
- public void validateSimpleHtmlSeamText(Token token) {
- }
+
}
@@ -413,7 +401,7 @@
if(!isSeamTextElement(token)) {
append(s.getText());
}
- }
+ }
}
;
@@ -433,34 +421,39 @@
{
Token token = htmlElementStack.peek();
boolean isLink = isLink(token);
- linkValueCollector = new StringBuilder();
+
}
(
seamCharacters|
{
- if(isLink) {
- beginCapture();
- }
-
+ beginCapture();
}
plain
{
- if(isLink) {
- String plain = endCapture();
- linkValueCollector.append(plain);
- }
+ String plain = endCapture();
+ if(valueCollector == null) {
+ valueCollector = new StringBuilder();
+ }
+ valueCollector.append(plain);
}
|html
- |htmlSpecialChars
+ |
{
+ append(valueCollector.toString());
+ valueCollector=null;
+ }
+ htmlSpecialChars
+ {
if(isLink) {
String message = "unexpected token";
throw new SemanticException(message);
}
+
+
}
|NEWLINE
)*)
@@ -473,18 +466,40 @@
sanitizer.validateHtmlElement(name);
Token token = null;
-
- if (isFormattedHtmlSeamTextElement(name) && !isPlainHMTLRequired(name, htmlElementStack)) {
- if (isListItem(name)) {
- append(createSeamTextList(name, htmlElementStack));
- } else if (isHeader(name)) {
- append(createSeamTextHeader(name));
+
+ if (isFormattedHtmlSeamTextElement(name)) {
+ if(!isPlainHMTLRequired(name, htmlElementStack)) {
+ if (isListItem(name)) {
+ append(createSeamTextList(name, htmlElementStack));
+ }else if (isHeader(name)) {
+ append(createSeamTextHeader(name));
+ }
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ } else {
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ append("<");
+ append(name.getText());
}
-
+
+
} else if(isSimpleSeamTextElement(name)){
- createSimpleSeamText(name)
+ if(valueCollector != null) {
+ append(valueCollector.toString());
+ valueCollector = null;
+ }
+ append(getSimpleSeamText(name));
} else {
- append("<");
+ if(valueCollector != null) {
+ append(valueCollector.toString().trim());
+ valueCollector = null;
+ }
+ append("<");
append(name.getText());
}
@@ -506,9 +521,10 @@
beforeBody: GT {
Token name = htmlElementStack.pop();
- if(!isSimpleSeamTextElement && !isPlainHMTLRequired(name,htmlElementStack)) {
+ if((isFormattedHtmlSeamTextElement(name) && isPlainHMTLRequired(name,htmlElementStack)) || !isSeamTextElement(name)) {
append(">");
- }
+ }
+
htmlElementStack.push(name);
}
;
@@ -527,39 +543,52 @@
LT SLASH name:ALPHANUMERICWORD GT
{
htmlElementStack.pop();
-
- if(isSimpleSeamTextElement(name)) {
- append(createSimpleSeamText(name));
+ String value = "";
+ if(valueCollector != null) {
+ value = valueCollector.toString();
}
-
- if(isFormattedSeamTextElement) {
+
+ if(isFormattedHtmlSeamTextElement(name)) {
if(isLink(name)){
- append(createSeamTextLink(linkHolder,linkValueCollector.toString().trim()));
+ append(createSeamTextLink(linkHolder,value.trim()));
+ } else if(isParagraph(name)) {
+ append(value);
+ append(healingParagraphMarkup());
+ }else {
+ append(value.trim());
}
-
+
if(!isPlainHMTLRequired(name, htmlElementStack)) {
-
- if(isHeader(name)) {
+ if(isHeader(name)) {
append("\n");
- healingHeaderMarkup(htmlElementStack);
+ healingHeaderMarkup();
}
+
+ if(isList(name)) {
+ append("\n");
+ }
if(isListItem(name)){
append("\n");
}
-
} else {
append("</");
- append(name.getText());
+ append(name.getText());
append(">");
}
- } else {
+ } else if(isSimpleSeamTextElement(name)) {
+ append(value.trim());
+ append(getSimpleSeamText(name));
+ } else {
+ append(value);
append("</");
append(name.getText());
append(">");
}
+ valueCollector = null;
+
}
;
17 years, 5 months
JBoss Rich Faces SVN: r11099 - in trunk/framework/jsf-test: src/main/java/org/richfaces and 5 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-12 02:15:09 -0500 (Wed, 12 Nov 2008)
New Revision: 11099
Added:
trunk/framework/jsf-test/src/main/resources/org/richfaces/test/ajax-web.xml
trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/
Removed:
trunk/framework/jsf-test/src/main/java/org/richfaces/collections/
trunk/framework/jsf-test/src/test/java/org/richfaces/test/stub/
Modified:
trunk/framework/jsf-test/pom.xml
trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java
trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourcePathTest.java
trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourceTest.java
trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java
Log:
Add ajax4jsf filter check.
Modified: trunk/framework/jsf-test/pom.xml
===================================================================
--- trunk/framework/jsf-test/pom.xml 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/pom.xml 2008-11-12 07:15:09 UTC (rev 11099)
@@ -21,16 +21,16 @@
<artifactId>htmlunit</artifactId>
<version>2.3</version>
</dependency>
- <dependency>
- <groupId>javax.faces</groupId>
+ <dependency>
+ <groupId>javax.faces</groupId>
- <artifactId>jsf-impl</artifactId>
+ <artifactId>jsf-impl</artifactId>
- <version>1.2_10</version>
+ <version>1.2_10</version>
- <scope>provided</scope>
- </dependency>
- <dependency>
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>el-impl</groupId>
<artifactId>el-impl</artifactId>
<version>1.0</version>
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 07:15:09 UTC (rev 11099)
@@ -20,9 +20,13 @@
import javax.faces.lifecycle.Lifecycle;
import javax.faces.lifecycle.LifecycleFactory;
import javax.faces.webapp.FacesServlet;
+import javax.servlet.Filter;
import org.junit.After;
import org.junit.Before;
+import org.richfaces.test.staging.FilterContainer;
+import org.richfaces.test.staging.RequestChain;
+import org.richfaces.test.staging.ServletContainer;
/**
* @author asmirnov
@@ -67,22 +71,37 @@
}
}
facesServer = new StagingServer();
- facesServer.addServlet("*.jsf", new FacesServlet());
- facesServer.addResource("/WEB-INF/web.xml",
- "org/richfaces/test/web.xml");
+ ServletContainer facesServletContainer = new ServletContainer("*.jsf", new FacesServlet());
+ facesServletContainer.setName("Faces Servlet");
+ try {
+ // Check for an ajax4jsf filter.
+ Class<? extends Filter> ajaxFilterClass = contextClassLoader
+ .loadClass("org.ajax4jsf.Filter")
+ .asSubclass(Filter.class);
+ Filter ajaxFilter = ajaxFilterClass.newInstance();
+ FilterContainer filterContainer = new FilterContainer(ajaxFilter,facesServletContainer);
+ filterContainer.setName("ajax4jsf");
+ facesServer.addResource("/WEB-INF/web.xml",
+ "org/richfaces/test/ajax-web.xml");
+ facesServer.addServlet(filterContainer);
+ } catch (ClassNotFoundException e) {
+ // No Richfaces filter, uses servlet directly.
+ facesServer.addResource("/WEB-INF/web.xml",
+ "org/richfaces/test/web.xml");
+ facesServer.addServlet(facesServletContainer);
+ }
facesServer.addInitParameter(
StateManager.STATE_SAVING_METHOD_PARAM_NAME,
StateManager.STATE_SAVING_METHOD_SERVER);
facesServer.addInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME,
".xhtml");
- facesServer.addInitParameter("com.sun.faces.validateXml", "true");
- facesServer.addInitParameter("com.sun.faces.verifyObjects", "true");
EventListener listener = null;
try {
Class<? extends EventListener> listenerClass = contextClassLoader
.loadClass("com.sun.faces.config.ConfigureListener")
.asSubclass(EventListener.class);
listener = listenerClass.newInstance();
+ setupSunFaces();
} catch (ClassNotFoundException e) {
// No JSF RI listener
Class<? extends EventListener> listenerClass;
@@ -92,6 +111,7 @@
"org.apache.myfaces.webapp.StartupServletContextListener")
.asSubclass(EventListener.class);
listener = listenerClass.newInstance();
+ setupMyFaces();
} catch (ClassNotFoundException e1) {
throw new TestException("No JSF listeners have been found", e1);
} catch (Exception e2) {
@@ -105,6 +125,15 @@
facesServer.init();
}
+ protected void setupMyFaces() {
+ // Do nothing by default.
+ }
+
+ protected void setupSunFaces() {
+ facesServer.addInitParameter("com.sun.faces.validateXml", "true");
+ facesServer.addInitParameter("com.sun.faces.verifyObjects", "true");
+ }
+
protected void setupWebContent(StagingServer facesServer){
}
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java 2008-11-12 07:15:09 UTC (rev 11099)
@@ -34,6 +34,14 @@
this.initParameters = new HashMap<String, String>();
}
+ public String getName() {
+ return name;
+ }
+
+ public void setName(String name) {
+ this.name = name;
+ }
+
public void execute(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
FilterChain chain = new FilterChain(){
Added: trunk/framework/jsf-test/src/main/resources/org/richfaces/test/ajax-web.xml
===================================================================
--- trunk/framework/jsf-test/src/main/resources/org/richfaces/test/ajax-web.xml (rev 0)
+++ trunk/framework/jsf-test/src/main/resources/org/richfaces/test/ajax-web.xml 2008-11-12 07:15:09 UTC (rev 11099)
@@ -0,0 +1,71 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
+
+ <display-name>Stub test</display-name>
+ <description>
+ Stub testing server
+ </description>
+ <context-param>
+ <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
+ <param-value>server</param-value>
+ </context-param>
+ <context-param>
+ <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+ <param-value>.xhtml</param-value>
+ </context-param>
+ <context-param>
+ <description>
+ Set this flag to true if you want the JavaServer Faces
+ Reference Implementation to validate the XML in your
+ faces-config.xml resources against the DTD. Default
+ value is false.
+ </description>
+ <param-name>com.sun.faces.validateXml</param-name>
+ <param-value>true</param-value>
+ </context-param>
+ <context-param>
+ <description>
+ Set this flag to true if you want the JavaServer Faces
+ Reference Implementation to verify that all of the application
+ objects you have configured (components, converters,
+ renderers, and validators) can be successfully created.
+ Default value is false.
+ </description>
+ <param-name>com.sun.faces.verifyObjects</param-name>
+ <param-value>true</param-value>
+ </context-param>
+ <filter>
+ <display-name>Ajax4jsf Filter</display-name>
+ <filter-name>ajax4jsf</filter-name>
+ <filter-class>org.ajax4jsf.Filter</filter-class>
+ </filter>
+ <filter-mapping>
+ <filter-name>ajax4jsf</filter-name>
+ <servlet-name>Faces Servlet</servlet-name>
+ <dispatcher>REQUEST</dispatcher>
+ <dispatcher>FORWARD</dispatcher>
+ <dispatcher>INCLUDE</dispatcher>
+ <dispatcher>ERROR</dispatcher>
+ </filter-mapping>
+
+ <!-- Faces Servlet -->
+ <servlet>
+ <servlet-name>Faces Servlet</servlet-name>
+ <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+ </servlet>
+
+
+ <!-- Faces Servlet Mapping -->
+
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>*.jsf</url-pattern>
+ </servlet-mapping>
+
+
+</web-app>
+
+
Property changes on: trunk/framework/jsf-test/src/main/resources/org/richfaces/test/ajax-web.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:eol-style
+ native
Copied: trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging (from rev 11098, trunk/framework/jsf-test/src/test/java/org/richfaces/test/stub)
Modified: trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourcePathTest.java
===================================================================
--- trunk/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourcePathTest.java 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourcePathTest.java 2008-11-12 07:15:09 UTC (rev 11099)
@@ -1,7 +1,7 @@
/**
*
*/
-package org.richfaces.test.stub;
+package org.richfaces.test.staging;
import static org.junit.Assert.*;
Modified: trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourceTest.java
===================================================================
--- trunk/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourceTest.java 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServerResourceTest.java 2008-11-12 07:15:09 UTC (rev 11099)
@@ -1,7 +1,7 @@
/**
*
*/
-package org.richfaces.test.stub;
+package org.richfaces.test.staging;
import static org.junit.Assert.*;
Modified: trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java
===================================================================
--- trunk/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServletTest.java 2008-11-12 02:11:00 UTC (rev 11098)
+++ trunk/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java 2008-11-12 07:15:09 UTC (rev 11099)
@@ -1,4 +1,4 @@
-package org.richfaces.test.stub;
+package org.richfaces.test.staging;
import static org.junit.Assert.*;
17 years, 5 months
JBoss Rich Faces SVN: r11098 - in trunk/framework/jsf-test/src: main/java/org/richfaces/test and 4 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-11 21:11:00 -0500 (Tue, 11 Nov 2008)
New Revision: 11098
Added:
trunk/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml
Removed:
trunk/framework/jsf-test/src/main/java/org/richfaces/collections/base/
trunk/framework/jsf-test/src/main/java/org/richfaces/collections/collect/
trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml
Modified:
trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java
trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java
trunk/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java
Log:
Fix teste with JSF 1.2
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 01:28:07 UTC (rev 11097)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 02:11:00 UTC (rev 11098)
@@ -70,8 +70,6 @@
facesServer.addServlet("*.jsf", new FacesServlet());
facesServer.addResource("/WEB-INF/web.xml",
"org/richfaces/test/web.xml");
- facesServer.addResource("/WEB-INF/faces-config.xml",
- "org/richfaces/test/faces-config.xml");
facesServer.addInitParameter(
StateManager.STATE_SAVING_METHOD_PARAM_NAME,
StateManager.STATE_SAVING_METHOD_SERVER);
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java 2008-11-12 01:28:07 UTC (rev 11097)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java 2008-11-12 02:11:00 UTC (rev 11098)
@@ -7,6 +7,7 @@
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
+import java.util.Arrays;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
@@ -17,15 +18,8 @@
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
-import javax.servlet.ServletRequestListener;
-import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-import org.richfaces.collections.collect.ImmutableCollection;
-import org.richfaces.collections.collect.ImmutableList;
-import org.richfaces.collections.collect.Multimap;
-import org.richfaces.collections.collect.Multimaps;
import org.richfaces.test.ServerLogger;
/**
@@ -255,7 +249,7 @@
* @see javax.servlet.ServletRequest#getCharacterEncoding()
*/
public String getCharacterEncoding() {
- return UTF8;
+ return characterEncoding;
}
/*
@@ -324,7 +318,7 @@
return Locale.US;
}
- private final ImmutableCollection<Locale> locales = ImmutableList.of(
+ private Collection<Locale> locales = Arrays.asList(
Locale.US, Locale.GERMANY);
/*
@@ -337,7 +331,7 @@
return Collections.enumeration(locales);
}
- private String characterEncoding;
+ private String characterEncoding = UTF8;
/*
* (non-Javadoc)
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java 2008-11-12 01:28:07 UTC (rev 11097)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java 2008-11-12 02:11:00 UTC (rev 11098)
@@ -17,6 +17,7 @@
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.httpclient.HttpStatus;
+import org.junit.internal.matchers.SubstringMatcher;
import org.richfaces.test.ServerLogger;
/**
@@ -399,7 +400,19 @@
* @see javax.servlet.ServletResponse#setContentType(java.lang.String)
*/
public void setContentType(String type) {
- contentType = type;
+ if(null == type){
+ throw new NullPointerException();
+ }
+ int i = type.indexOf(';');
+ if(i>=0){
+ contentType = type.substring(0, i).trim();
+ i=type.lastIndexOf('=');
+ if(i>=0){
+ setCharacterEncoding(type.substring(i+1).trim());
+ }
+ } else {
+ contentType = type;
+ }
}
/*
Deleted: trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml
===================================================================
--- trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml 2008-11-12 01:28:07 UTC (rev 11097)
+++ trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml 2008-11-12 02:11:00 UTC (rev 11098)
@@ -1,68 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License"). You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code. If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license." If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above. However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
- version="1.2">
- <!-- our NumberBean we created before -->
- <managed-bean>
- <managed-bean-name>HelloBean</managed-bean-name>
- <managed-bean-class>org.richfaces.test.HelloBean</managed-bean-class>
- <managed-bean-scope>session</managed-bean-scope>
- </managed-bean>
-
- <!-- going from guess.xhtml to response.xhtml -->
- <navigation-rule>
- <from-view-id>/hello.xhtml</from-view-id>
- <navigation-case>
- <from-outcome>success</from-outcome>
- <to-view-id>/response.xhtml</to-view-id>
- </navigation-case>
- </navigation-rule>
-
- <!-- going from response.xhtml to guess.xhtml -->
- <navigation-rule>
- <from-view-id>/response.xhtml</from-view-id>
- <navigation-case>
- <from-outcome>success</from-outcome>
- <to-view-id>/hello.xhtml</to-view-id>
- </navigation-case>
- </navigation-rule>
-
-</faces-config>
Modified: trunk/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java
===================================================================
--- trunk/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java 2008-11-12 01:28:07 UTC (rev 11097)
+++ trunk/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java 2008-11-12 02:11:00 UTC (rev 11098)
@@ -49,6 +49,8 @@
@Override
protected void setupWebContent(StagingServer facesServer) {
+ facesServer.addResource("/WEB-INF/faces-config.xml",
+ "org/richfaces/test/faces-config.xml");
facesServer.addResource("/hello.xhtml", "org/richfaces/test/hello.xhtml");
facesServer.addResource("/response.xhtml", "org/richfaces/test/response.xhtml");
facesServer.addResource("/wave.med.gif", "org/richfaces/test/wave.med.gif");
Added: trunk/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml
===================================================================
--- trunk/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml (rev 0)
+++ trunk/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml 2008-11-12 02:11:00 UTC (rev 11098)
@@ -0,0 +1,72 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!--
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+ Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
+
+ The contents of this file are subject to the terms of either the GNU
+ General Public License Version 2 only ("GPL") or the Common Development
+ and Distribution License("CDDL") (collectively, the "License"). You
+ may not use this file except in compliance with the License. You can obtain
+ a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
+ or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
+ language governing permissions and limitations under the License.
+
+ When distributing the software, include this License Header Notice in each
+ file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
+ Sun designates this particular file as subject to the "Classpath" exception
+ as provided by Sun in the GPL Version 2 section of the License file that
+ accompanied this code. If applicable, add the following below the License
+ Header, with the fields enclosed by brackets [] replaced by your own
+ identifying information: "Portions Copyrighted [year]
+ [name of copyright owner]"
+
+ Contributor(s):
+
+ If you wish your version of this file to be governed by only the CDDL or
+ only the GPL Version 2, indicate your decision by adding "[Contributor]
+ elects to include this software in this distribution under the [CDDL or GPL
+ Version 2] license." If you don't indicate a single choice of license, a
+ recipient has the option to distribute your version of this file under
+ either the CDDL, the GPL Version 2 or to extend the choice of license to
+ its licensees as provided above. However, if you add GPL Version 2 code
+ and therefore, elected the GPL Version 2 license, then the option applies
+ only if the new code is made subject to such option by the copyright
+ holder.
+-->
+
+<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
+ version="1.2">
+ <application>
+ <!-- Enables Facelets -->
+ <view-handler>com.sun.facelets.FaceletViewHandler</view-handler>
+ </application>
+ <!-- our NumberBean we created before -->
+ <managed-bean>
+ <managed-bean-name>HelloBean</managed-bean-name>
+ <managed-bean-class>org.richfaces.test.HelloBean</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
+ </managed-bean>
+
+ <!-- going from guess.xhtml to response.xhtml -->
+ <navigation-rule>
+ <from-view-id>/hello.xhtml</from-view-id>
+ <navigation-case>
+ <from-outcome>success</from-outcome>
+ <to-view-id>/response.xhtml</to-view-id>
+ </navigation-case>
+ </navigation-rule>
+
+ <!-- going from response.xhtml to guess.xhtml -->
+ <navigation-rule>
+ <from-view-id>/response.xhtml</from-view-id>
+ <navigation-case>
+ <from-outcome>success</from-outcome>
+ <to-view-id>/hello.xhtml</to-view-id>
+ </navigation-case>
+ </navigation-rule>
+
+</faces-config>
Property changes on: trunk/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
17 years, 5 months
JBoss Rich Faces SVN: r11097 - in trunk/framework/jsf-test: src/main/java/org/richfaces/test and 1 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-11 20:28:07 -0500 (Tue, 11 Nov 2008)
New Revision: 11097
Modified:
trunk/framework/jsf-test/pom.xml
trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml
Log:
switch to jsf 1.2
Modified: trunk/framework/jsf-test/pom.xml
===================================================================
--- trunk/framework/jsf-test/pom.xml 2008-11-12 01:00:39 UTC (rev 11096)
+++ trunk/framework/jsf-test/pom.xml 2008-11-12 01:28:07 UTC (rev 11097)
@@ -3,32 +3,34 @@
<parent>
<artifactId>framework</artifactId>
<groupId>org.richfaces</groupId>
- <version>4.0.0-SNAPSHOT</version>
+ <version>3.3.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>org.richfaces.framework</groupId>
<artifactId>jsf-test</artifactId>
<name>jsf-test</name>
- <version>4.0.0-SNAPSHOT</version>
- <url>http://maven.apache.org</url>
+ <version>3.3.0-SNAPSHOT</version>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.5</version>
- <scope>test</scope>
</dependency>
<dependency>
<groupId>net.sourceforge.htmlunit</groupId>
<artifactId>htmlunit</artifactId>
<version>2.3</version>
</dependency>
- <dependency>
- <groupId>com.sun.faces</groupId>
- <artifactId>mojarra-jsf-impl</artifactId>
- <version>2.0.0-SNAPSHOT</version>
- </dependency>
- <dependency>
+ <dependency>
+ <groupId>javax.faces</groupId>
+
+ <artifactId>jsf-impl</artifactId>
+
+ <version>1.2_10</version>
+
+ <scope>provided</scope>
+ </dependency>
+ <dependency>
<groupId>el-impl</groupId>
<artifactId>el-impl</artifactId>
<version>1.0</version>
Modified: trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
===================================================================
--- trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 01:00:39 UTC (rev 11096)
+++ trunk/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 01:28:07 UTC (rev 11097)
@@ -51,7 +51,7 @@
contextClassLoader = Thread.currentThread().getContextClassLoader();
Thread.currentThread().setContextClassLoader(
this.getClass().getClassLoader());
- InputStream stream = FacesServerTest.class
+ InputStream stream = this.getClass()
.getResourceAsStream("logging.properties");
if (null != stream) {
try {
Modified: trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml
===================================================================
--- trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml 2008-11-12 01:00:39 UTC (rev 11096)
+++ trunk/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml 2008-11-12 01:28:07 UTC (rev 11097)
@@ -38,9 +38,8 @@
<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
- version="2.0">
-
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
+ version="1.2">
<!-- our NumberBean we created before -->
<managed-bean>
<managed-bean-name>HelloBean</managed-bean-name>
17 years, 5 months
JBoss Rich Faces SVN: r11096 - trunk/framework.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-11 20:00:39 -0500 (Tue, 11 Nov 2008)
New Revision: 11096
Added:
trunk/framework/jsf-test/
Log:
copy JSF 2.0 test framework into trunk
Copied: trunk/framework/jsf-test (from rev 11095, branches/jsf2.0/framework/jsf-test)
17 years, 5 months
JBoss Rich Faces SVN: r11095 - in branches/jsf2.0/framework/jsf-test/src: main/java/org/richfaces/test/staging and 4 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-11 19:43:49 -0500 (Tue, 11 Nov 2008)
New Revision: 11095
Added:
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingConnection.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingServer.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/NotImplementedException.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpSession.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServletContext.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java
branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml
branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/web.xml
branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/response.xhtml
branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/wave.med.gif
Removed:
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalServer.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerConnection.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpRequest.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpResponse.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpSession.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletConfig.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletContext.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/
branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml
branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/web.xml
Modified:
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebClient.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebConnection.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebResponse.java
branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java
branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourcePathTest.java
branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourceTest.java
branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServletTest.java
Log:
Finish test framework implementation
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,159 @@
+/**
+ *
+ */
+package org.richfaces.test;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.EventListener;
+import java.util.logging.LogManager;
+
+import javax.faces.FactoryFinder;
+import javax.faces.application.Application;
+import javax.faces.application.ApplicationFactory;
+import javax.faces.application.StateManager;
+import javax.faces.application.ViewHandler;
+import javax.faces.component.UIViewRoot;
+import javax.faces.context.FacesContext;
+import javax.faces.context.FacesContextFactory;
+import javax.faces.lifecycle.Lifecycle;
+import javax.faces.lifecycle.LifecycleFactory;
+import javax.faces.webapp.FacesServlet;
+
+import org.junit.After;
+import org.junit.Before;
+
+/**
+ * @author asmirnov
+ *
+ */
+public abstract class AbstractFacesTest {
+
+ private ClassLoader contextClassLoader;
+
+ protected StagingServer facesServer;
+
+ protected StagingConnection connection;
+
+ protected FacesContext facesContext;
+
+ protected Lifecycle lifecycle;
+
+ protected Application application;
+
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @Before
+ public void setUpServer() throws Exception {
+ contextClassLoader = Thread.currentThread().getContextClassLoader();
+ Thread.currentThread().setContextClassLoader(
+ this.getClass().getClassLoader());
+ InputStream stream = FacesServerTest.class
+ .getResourceAsStream("logging.properties");
+ if (null != stream) {
+ try {
+ LogManager.getLogManager().readConfiguration(stream);
+ } catch (Exception e) {
+ // Ignore it.
+ } finally {
+ try {
+ stream.close();
+ } catch (IOException e) {
+ // Ignore it.
+ }
+ }
+ }
+ facesServer = new StagingServer();
+ facesServer.addServlet("*.jsf", new FacesServlet());
+ facesServer.addResource("/WEB-INF/web.xml",
+ "org/richfaces/test/web.xml");
+ facesServer.addResource("/WEB-INF/faces-config.xml",
+ "org/richfaces/test/faces-config.xml");
+ facesServer.addInitParameter(
+ StateManager.STATE_SAVING_METHOD_PARAM_NAME,
+ StateManager.STATE_SAVING_METHOD_SERVER);
+ facesServer.addInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME,
+ ".xhtml");
+ facesServer.addInitParameter("com.sun.faces.validateXml", "true");
+ facesServer.addInitParameter("com.sun.faces.verifyObjects", "true");
+ EventListener listener = null;
+ try {
+ Class<? extends EventListener> listenerClass = contextClassLoader
+ .loadClass("com.sun.faces.config.ConfigureListener")
+ .asSubclass(EventListener.class);
+ listener = listenerClass.newInstance();
+ } catch (ClassNotFoundException e) {
+ // No JSF RI listener
+ Class<? extends EventListener> listenerClass;
+ try {
+ listenerClass = contextClassLoader
+ .loadClass(
+ "org.apache.myfaces.webapp.StartupServletContextListener")
+ .asSubclass(EventListener.class);
+ listener = listenerClass.newInstance();
+ } catch (ClassNotFoundException e1) {
+ throw new TestException("No JSF listeners have been found", e1);
+ } catch (Exception e2) {
+ throw new TestException("Error instantiate MyFaces listener", e2);
+ }
+ } catch (Exception e) {
+ throw new TestException("Error instantiate JSF RI listener", e);
+ }
+ facesServer.addWebListener(listener);
+ setupWebContent(facesServer);
+ facesServer.init();
+ }
+
+ protected void setupWebContent(StagingServer facesServer){
+
+ }
+
+
+
+ protected void setupFacesRequest() throws Exception {
+ connection = facesServer.getConnection(new URL("http://localhost/index.jsf"));
+ setupConnection(connection);
+ connection.start();
+ ApplicationFactory applicationFactory = (ApplicationFactory) FactoryFinder.getFactory(FactoryFinder.APPLICATION_FACTORY);
+ application = applicationFactory.getApplication();
+ LifecycleFactory lifecycleFactory = (LifecycleFactory) FactoryFinder.getFactory(FactoryFinder.LIFECYCLE_FACTORY);
+ lifecycle = lifecycleFactory.getLifecycle(LifecycleFactory.DEFAULT_LIFECYCLE);
+ FacesContextFactory facesContextFactory = (FacesContextFactory) FactoryFinder.getFactory(FactoryFinder.FACES_CONTEXT_FACTORY);
+ facesContext = facesContextFactory.getFacesContext(facesServer.getContext(), connection.getRequest(), connection.getResponse(), lifecycle);
+ facesContext.setViewRoot(setupView());
+ }
+
+ protected UIViewRoot setupView() {
+ return null;
+ }
+
+ protected void setupConnection(StagingConnection connection) {
+
+ }
+
+ /**
+ * @throws java.lang.Exception
+ */
+ @After
+ public void tearDownServer() throws Exception {
+ if(null != facesContext){
+ facesContext.release();
+ facesContext = null;
+ }
+ if(null != connection){
+ if(!connection.isFinished()){
+ connection.finish();
+ }
+ connection = null;
+ }
+ facesServer.destroy();
+ Thread.currentThread().setContextClassLoader(contextClassLoader);
+ facesServer = null;
+ application = null;
+ lifecycle = null;
+ }
+
+}
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,10 @@
+/**
+ *
+ */
+package org.richfaces.test;
+
+import java.util.EventListener;
+
+public interface EventInvoker<T extends EventListener> {
+ public void invoke(T listener);
+}
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalServer.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalServer.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalServer.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,234 +0,0 @@
-package org.richfaces.test;
-
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.EventListener;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletContextAttributeEvent;
-import javax.servlet.ServletContextAttributeListener;
-import javax.servlet.ServletContextEvent;
-import javax.servlet.ServletContextListener;
-import javax.servlet.ServletException;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpSessionAttributeListener;
-import javax.servlet.http.HttpSessionBindingEvent;
-import javax.servlet.http.HttpSessionEvent;
-import javax.servlet.http.HttpSessionListener;
-
-import org.richfaces.test.stub.ClasspathServerResource;
-import org.richfaces.test.stub.ServerResource;
-import org.richfaces.test.stub.ServerResourcePath;
-import org.richfaces.test.stub.ServerResourcesDirectory;
-import org.richfaces.test.stub.ServletContainer;
-import org.richfaces.test.stub.StaticServlet;
-import org.richfaces.test.stub.StubHttpSession;
-import org.richfaces.test.stub.StubServletContext;
-
-
-/**
- * Hello world!
- *
- */
-public class LocalServer {
-
-
- private List<ServletContainer> servlets = new ArrayList<ServletContainer>();
-
- private ServletContainer defaultServlet;
-
- private List<EventListener> contextListeners = new ArrayList<EventListener>();
-
- private Map<String,String> initParameters=new HashMap<String, String>();
-
- private ServerResource serverRoot = new ServerResourcesDirectory();
-
- private class LocalContext extends StubServletContext{
-
- @Override
- protected void valueBound(ServletContextAttributeEvent event) {
- // inform listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof ServletContextAttributeListener) {
- ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
- contextListener.attributeAdded(event);
- }
- }
- }
-
- @Override
- protected void valueReplaced(ServletContextAttributeEvent event) {
- // inform listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof ServletContextAttributeListener) {
- ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
- contextListener.attributeReplaced(event);
- }
- }
- }
-
- @Override
- protected void valueUnbound(
- ServletContextAttributeEvent event) {
- // inform listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof ServletContextAttributeListener) {
- ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
- contextListener.attributeRemoved(event);
- }
- }
- }
-
- @Override
- /**
- * @param path
- * @return
- */
- protected ServerResource getServerResource(String path) {
- return serverRoot.getResource(new ServerResourcePath(path));
- }
-
- }
-
- private StubServletContext context;
-
- private class ServerHttpSession extends StubHttpSession {
-
- public ServletContext getServletContext() {
- return context;
- }
-
- @Override
- protected void valueBound(HttpSessionBindingEvent sessionBindingEvent) {
- // inform session listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof HttpSessionAttributeListener) {
- HttpSessionAttributeListener contextListener = (HttpSessionAttributeListener) listener;
- contextListener.attributeAdded(sessionBindingEvent);
- }
- }
- }
-
- @Override
- protected void valueUnbound(HttpSessionBindingEvent sessionBindingEvent) {
- // inform session listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof HttpSessionAttributeListener) {
- HttpSessionAttributeListener contextListener = (HttpSessionAttributeListener) listener;
- contextListener.attributeRemoved(sessionBindingEvent);
- }
- }
- }
-
- }
-
- private ServerHttpSession session;
-
-
- public void addServlet(String mapping,Servlet servlet){
- servlets.add(new ServletContainer(mapping,servlet));
- }
-
- public ServletContainer getServlet(String path) {
- ServletContainer result = defaultServlet;
- for (ServletContainer servlet : servlets) {
- if(servlet.isApplicable(path)){
- result = servlet;
- break;
- }
- }
- return result;
- }
-
- public void addInitParameter(String name, String value) {
- initParameters.put(name, value);
- }
-
- public void addResource(String path, String resource){
- serverRoot.addResource(new ServerResourcePath(path), new ClasspathServerResource(resource));
- }
-
- public void addWebListener(EventListener listener) {
- contextListeners.add(listener);
- }
-
- public HttpSession getSession(){
- return getSession(true);
- }
-
- public HttpSession getSession(boolean create){
- if(null == this.session && create){
- this.session = new ServerHttpSession();
- // inform session listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof HttpSessionListener) {
- HttpSessionListener contextListener = (HttpSessionListener) listener;
- contextListener.sessionCreated(new HttpSessionEvent(session));
- }
- }
- }
- return session;
- }
-
- public void init() throws ServletException {
- // Create context.
- this.context = new LocalContext();
- // Create init parameters
- context.addInitParameters(initParameters);
- // Inform listeners
- for (EventListener listener : contextListeners) {
- if (listener instanceof ServletContextListener) {
- ServletContextListener contextListener = (ServletContextListener) listener;
- contextListener.contextInitialized(new ServletContextEvent(context));
-
- }
- }
- // Init servlets
- for (ServletContainer servlet : servlets) {
- // init servlet
- servlet.init(this.context);
- }
- defaultServlet = new ServletContainer(null,new StaticServlet());
- defaultServlet.init(getContext());
-
- }
-
- public void destroy(){
- // Destroy session
- if (null != this.session) {
- // inform session listeners.
- for (EventListener listener : contextListeners) {
- if (listener instanceof HttpSessionListener) {
- HttpSessionListener contextListener = (HttpSessionListener) listener;
- contextListener.sessionDestroyed(new HttpSessionEvent(session));
- }
- }
- session.destroy();
- }
- // Inform listeners
- for (EventListener listener : contextListeners) {
- if (listener instanceof ServletContextListener) {
- ServletContextListener contextListener = (ServletContextListener) listener;
- contextListener.contextDestroyed(new ServletContextEvent(context));
-
- }
- }
- // Destroy servlets
- for (ServletContainer servlet : servlets) {
- servlet.destroy();
- }
- defaultServlet.destroy();
- }
-
- public ServerConnection getConnection(URL url) {
- return new ServerConnection(this,url);
- }
-
- public StubServletContext getContext() {
- return context;
- }
-}
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebClient.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebClient.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebClient.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -14,14 +14,14 @@
@SuppressWarnings("serial")
public class LocalWebClient extends WebClient {
- private final LocalServer server;
+ private final StagingServer server;
private transient WebConnection webConnection;
/**
*
*/
- public LocalWebClient(LocalServer server) {
+ public LocalWebClient(StagingServer server) {
super();
this.server = server;
}
@@ -29,7 +29,7 @@
/**
* @param browserVersion
*/
- public LocalWebClient(LocalServer server,BrowserVersion browserVersion) {
+ public LocalWebClient(StagingServer server,BrowserVersion browserVersion) {
super(browserVersion);
this.server = server;
}
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebConnection.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebConnection.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebConnection.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -7,23 +7,28 @@
import javax.servlet.ServletException;
+import org.apache.commons.httpclient.NameValuePair;
+
import com.gargoylesoftware.htmlunit.WebConnection;
import com.gargoylesoftware.htmlunit.WebRequestSettings;
import com.gargoylesoftware.htmlunit.WebResponse;
public final class LocalWebConnection implements WebConnection {
- private final LocalServer localServer;
+ private final StagingServer localServer;
/**
* @param localServer
*/
- public LocalWebConnection(LocalServer localServer) {
+ public LocalWebConnection(StagingServer localServer) {
this.localServer = localServer;
}
public WebResponse getResponse(WebRequestSettings settings)
throws IOException {
- ServerConnection connection = localServer.getConnection(settings.getUrl());
+ StagingConnection connection = localServer.getConnection(settings.getUrl());
+ for (NameValuePair param : settings.getRequestParameters()) {
+ connection.addRequestParameter(param.getName(), param.getValue());
+ }
try {
connection.execute();
} catch (ServletException e) {
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebResponse.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebResponse.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebResponse.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -18,9 +18,9 @@
public final class LocalWebResponse implements WebResponse {
private final WebRequestSettings settings;
- private final ServerConnection serverConnection;
+ private final StagingConnection serverConnection;
- public LocalWebResponse(WebRequestSettings settings,ServerConnection serverConnection) {
+ public LocalWebResponse(WebRequestSettings settings,StagingConnection serverConnection) {
this.settings = settings;
this.serverConnection = serverConnection;
}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerConnection.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerConnection.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerConnection.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,355 +0,0 @@
-/**
- *
- */
-package org.richfaces.test;
-
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.richfaces.test.stub.ServletContainer;
-import org.richfaces.test.stub.StubHttpRequest;
-import org.richfaces.test.stub.StubHttpResponse;
-import org.richfaces.test.stub.StubServletContext;
-
-import com.gargoylesoftware.htmlunit.WebRequestSettings;
-import com.gargoylesoftware.htmlunit.WebResponse;
-
-/**
- * This class represent single connection to the server.
- *
- * @author asmirnov
- *
- */
-public class ServerConnection {
-
- private final LocalServer server;
-
- final URL url;
-
- private ConnectionRequest request;
-
- ConnectionResponse response;
-
- private final ServletContainer servlet;
-
- private HttpMethod method = HttpMethod.GET;
-
- private static final Cookie[] COOKIE = new Cookie[] {};
-
- private List<Cookie> cookies = new ArrayList<Cookie>();
-
- private Map<String, String[]> requestParameters = new HashMap<String, String[]>();
-
- private final String pathInfo;
-
- private final String servletPath;
-
- private boolean finished = false;
-
- public ServerConnection(LocalServer localServer, URL url) {
- this.server = localServer;
- this.url = url;
- String path = url.getPath();
- servlet = localServer.getServlet(path);
- if (null == servlet) {
- throw new IllegalArgumentException();
- }
- this.pathInfo = servlet.getPathInfo(path);
- this.servletPath = servlet.getServletPath(path);
- this.request = new ConnectionRequest();
- this.response = new ConnectionResponse();
- this.request.setAttribute("javax.servlet.include.path_info",
- this.pathInfo);
- this.request.setAttribute("javax.servlet.include.servlet_path",
- this.servletPath);
- }
-
- /**
- * @return the finished
- */
- public boolean isFinished() {
- return finished;
- }
-
- /**
- * @param finished
- * the finished to set
- */
- public void setFinished(boolean finished) {
- this.finished = finished;
- }
-
- private void checkFinished() {
- if (!isFinished()) {
- throw new IllegalStateException("request have not been executed");
- }
- }
-
- public void execute() throws ServletException, IOException {
- if (isFinished()) {
- throw new IllegalStateException(
- "request already have been executed");
- }
- this.servlet.execute(request, response);
- setFinished(true);
- }
-
- /**
- * @return the method
- */
- public HttpMethod getMethod() {
- return method;
- }
-
- /**
- * @param method
- * the method to set
- */
- public void setMethod(HttpMethod method) {
- this.method = method;
- }
-
- /**
- * @return the url
- */
- public URL getUrl() {
- return url;
- }
-
- public void addRequestParameter(String name, String value) {
- String[] values = requestParameters.get(name);
- if (null == values) {
- values = new String[1];
- } else {
- String[] newValues = new String[values.length + 1];
- System.arraycopy(values, 0, newValues, 0, values.length);
- values = newValues;
- }
- values[values.length - 1] = value;
- requestParameters.put(name, values);
- }
-
- public String getContentAsString() {
- checkFinished();
- String content = response.getWriterContent();
- if (null == content) {
- byte[] streamContent = response.getStreamContent();
- if (null != streamContent) {
- String encoding = response.getCharacterEncoding();
- if (null != encoding) {
- try {
- content = new String(streamContent, encoding);
- } catch (UnsupportedEncodingException e) {
- // TODO Auto-generated catch block
- }
- } else {
- content = new String(streamContent);
- }
- }
- }
- return content;
- }
-
- public byte[] getResponseBody() {
- checkFinished();
- byte[] content = response.getStreamContent();
- if (null == content) {
- String writerContent = response.getWriterContent();
- if (null != writerContent) {
- try {
- content = writerContent.getBytes(response
- .getCharacterEncoding());
- } catch (UnsupportedEncodingException e) {
- content = writerContent.getBytes();
- }
- } else {
- content = new byte[0];
- }
- }
- return content;
- }
-
- /**
- * @return the cookies
- */
- public List<Cookie> getCookies() {
- return cookies;
- }
-
- /**
- * @return the request
- */
- public StubHttpRequest getRequest() {
- return request;
- }
-
- /**
- * @return the response
- */
- public StubHttpResponse getResponse() {
- return response;
- }
-
- private class ConnectionRequest extends StubHttpRequest {
-
- public Cookie[] getCookies() {
- return cookies.toArray(COOKIE);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getMethod()
- */
- public String getMethod() {
- return method.toString();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getServletPath()
- */
- public String getServletPath() {
- return servletPath;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getPathInfo()
- */
- public String getPathInfo() {
- return pathInfo;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getQueryString()
- */
- public String getQueryString() {
- return url.getQuery();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getRequestURI()
- */
- public String getRequestURI() {
- return url.getPath();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
- */
- public String getParameter(String name) {
- String[] values = requestParameters.get(name);
- if (null != values && values.length > 0) {
- return values[0];
- }
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getParameterMap()
- */
- @SuppressWarnings("unchecked")
- public Map getParameterMap() {
- return Collections.unmodifiableMap(requestParameters);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getParameterNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getParameterNames() {
- return Collections.enumeration(requestParameters.keySet());
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.ServletRequest#getParameterValues(java.lang.String)
- */
- public String[] getParameterValues(String name) {
- return requestParameters.get(name);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getSession()
- */
- public HttpSession getSession() {
- return server.getSession();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
- */
- public HttpSession getSession(boolean create) {
- return server.getSession(create);
- }
-
- }
-
- private class ConnectionResponse extends StubHttpResponse {
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http
- * .Cookie )
- */
- public void addCookie(Cookie cookie) {
- cookies.add(cookie);
-
- }
-
- }
-
- public String getCharacterEncoding() {
- checkFinished();
- return response.getCharacterEncoding();
- }
-
- public String getContentType() {
- checkFinished();
- return response.getContentType();
- }
-
- public int getStatus() {
- checkFinished();
- return response.getStatus();
- }
-
- public String getErrorMessage() {
- checkFinished();
- return response.getErrorMessage();
- }
-
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingConnection.java (from rev 11071, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerConnection.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingConnection.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingConnection.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,440 @@
+/**
+ *
+ */
+package org.richfaces.test;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.richfaces.test.staging.RequestChain;
+import org.richfaces.test.staging.StagingHttpRequest;
+import org.richfaces.test.staging.StagingHttpResponse;
+import org.richfaces.test.staging.StagingServletContext;
+
+import com.gargoylesoftware.htmlunit.WebRequestSettings;
+import com.gargoylesoftware.htmlunit.WebResponse;
+
+/**
+ * This class represent single connection to the server.
+ *
+ * @author asmirnov
+ *
+ */
+public class StagingConnection {
+
+ private final StagingServer server;
+
+ final URL url;
+
+ private ConnectionRequest request;
+
+ ConnectionResponse response;
+
+ private final RequestChain servlet;
+
+ private HttpMethod method = HttpMethod.GET;
+
+ private static final Cookie[] COOKIE = new Cookie[] {};
+
+ private List<Cookie> cookies = new ArrayList<Cookie>();
+
+ private Map<String, String[]> requestParameters = new HashMap<String, String[]>();
+
+ private final String pathInfo;
+
+ private final String servletPath;
+
+ private boolean finished = false;
+
+ private boolean started = false;
+
+ private String queryString;
+
+ public StagingConnection(StagingServer localServer, URL url) {
+ this.server = localServer;
+ this.url = url;
+ String path = url.getPath();
+ servlet = localServer.getServlet(path);
+ if (null == servlet) {
+ throw new IllegalArgumentException();
+ }
+ this.pathInfo = servlet.getPathInfo(path);
+ this.servletPath = servlet.getServletPath(path);
+ this.request = new ConnectionRequest();
+ this.response = new ConnectionResponse();
+ this.request.setAttribute("javax.servlet.include.path_info",
+ this.pathInfo);
+ this.request.setAttribute("javax.servlet.include.servlet_path",
+ this.servletPath);
+ queryString = url.getQuery();
+ if (null != queryString) {
+ String[] queryParams = queryString.split("&");
+ for (int i = 0; i < queryParams.length; i++) {
+ String par = queryParams[i];
+ int eqIndex = par.indexOf('=');
+ if(eqIndex>=0){
+ addRequestParameter(par.substring(0, eqIndex), par.substring(eqIndex+1));
+ } else {
+ addRequestParameter(par, null);
+ }
+ }
+ }
+
+ }
+
+ /**
+ * @return the finished
+ */
+ public boolean isFinished() {
+ return finished;
+ }
+
+ /**
+ * @return the started
+ */
+ public boolean isStarted() {
+ return started;
+ }
+
+
+
+ private void checkStarted() {
+ if (!isFinished()) {
+ throw new IllegalStateException("request have not been started");
+ }
+ }
+
+ public void execute() throws ServletException, IOException {
+ if (isStarted() || isFinished()) {
+ throw new IllegalStateException("request have already been executed");
+ }
+ start();
+ this.servlet.execute(request, response);
+ finish();
+ }
+
+ public void finish() {
+ server.requestFinished(request);
+ finished = true;
+ }
+
+ public void start() {
+ server.requestStarted(request);
+ started = true;
+ }
+
+ /**
+ * @return the method
+ */
+ public HttpMethod getMethod() {
+ return method;
+ }
+
+ /**
+ * @param method
+ * the method to set
+ */
+ public void setMethod(HttpMethod method) {
+ this.method = method;
+ }
+
+ /**
+ * @return the url
+ */
+ public URL getUrl() {
+ return url;
+ }
+
+ public void addRequestParameter(String name, String value) {
+ String[] values = requestParameters.get(name);
+ if (null == values) {
+ values = new String[1];
+ } else {
+ String[] newValues = new String[values.length + 1];
+ System.arraycopy(values, 0, newValues, 0, values.length);
+ values = newValues;
+ }
+ values[values.length - 1] = value;
+ requestParameters.put(name, values);
+ }
+
+ public String getContentAsString() {
+ checkStarted();
+ String content = response.getWriterContent();
+ if (null == content) {
+ byte[] streamContent = response.getStreamContent();
+ if (null != streamContent) {
+ String encoding = response.getCharacterEncoding();
+ if (null != encoding) {
+ try {
+ content = new String(streamContent, encoding);
+ } catch (UnsupportedEncodingException e) {
+ // TODO Auto-generated catch block
+ }
+ } else {
+ content = new String(streamContent);
+ }
+ }
+ }
+ return content;
+ }
+
+ public byte[] getResponseBody() {
+ checkStarted();
+ byte[] content = response.getStreamContent();
+ if (null == content) {
+ String writerContent = response.getWriterContent();
+ if (null != writerContent) {
+ try {
+ content = writerContent.getBytes(response
+ .getCharacterEncoding());
+ } catch (UnsupportedEncodingException e) {
+ content = writerContent.getBytes();
+ }
+ } else {
+ content = new byte[0];
+ }
+ }
+ return content;
+ }
+
+ /**
+ * @return the cookies
+ */
+ public List<Cookie> getCookies() {
+ return cookies;
+ }
+
+ /**
+ * @return the request
+ */
+ public StagingHttpRequest getRequest() {
+ return request;
+ }
+
+ /**
+ * @return the response
+ */
+ public StagingHttpResponse getResponse() {
+ return response;
+ }
+
+ private class ConnectionRequest extends StagingHttpRequest {
+
+ public Cookie[] getCookies() {
+ return cookies.toArray(COOKIE);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getMethod()
+ */
+ public String getMethod() {
+ return method.toString();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getServletPath()
+ */
+ public String getServletPath() {
+ return servletPath;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getPathInfo()
+ */
+ public String getPathInfo() {
+ return pathInfo;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getQueryString()
+ */
+ public String getQueryString() {
+ return queryString;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getRequestURI()
+ */
+ public String getRequestURI() {
+ return url.getPath();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
+ */
+ public String getParameter(String name) {
+ String[] values = requestParameters.get(name);
+ if (null != values && values.length > 0) {
+ return values[0];
+ }
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getParameterMap()
+ */
+ @SuppressWarnings("unchecked")
+ public Map getParameterMap() {
+ return Collections.unmodifiableMap(requestParameters);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getParameterNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getParameterNames() {
+ return Collections.enumeration(requestParameters.keySet());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.ServletRequest#getParameterValues(java.lang.String)
+ */
+ public String[] getParameterValues(String name) {
+ return requestParameters.get(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getSession()
+ */
+ public HttpSession getSession() {
+ return server.getSession();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
+ */
+ public HttpSession getSession(boolean create) {
+ return server.getSession(create);
+ }
+
+ @Override
+ public RequestDispatcher getRequestDispatcher(String path) {
+ RequestDispatcher dispatcher = null;
+ if(!path.startsWith("/")){
+ try {
+ URL absoluteUrl = new URL(url,path);
+ path = absoluteUrl.getFile();
+ } catch (MalformedURLException e) {
+ return null;
+ }
+ }
+ final RequestChain dispatchedServlet = server.getServlet(path);
+ if(null != dispatchedServlet){
+ dispatcher = new RequestDispatcher(){
+
+ public void forward(ServletRequest request,
+ ServletResponse response) throws ServletException,
+ IOException {
+ response.reset();
+ dispatchedServlet.execute(request, response);
+ }
+
+ public void include(ServletRequest request,
+ ServletResponse response) throws ServletException,
+ IOException {
+ dispatchedServlet.execute(request, response);
+ }
+
+ };
+ }
+ return dispatcher;
+ }
+
+ @Override
+ protected void attributeAdded(String name, Object o) {
+ server.requestAttributeAdded(this,name,o);
+
+ }
+
+ @Override
+ protected void attributeRemoved(String name, Object removed) {
+ server.requestAttributeRemoved(this,name,removed);
+
+ }
+
+ @Override
+ protected void attributeReplaced(String name, Object o) {
+ server.requestAttributeReplaced(this,name,o);
+
+ }
+
+ }
+
+ private class ConnectionResponse extends StagingHttpResponse {
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#addCookie(javax.servlet.http
+ * .Cookie )
+ */
+ public void addCookie(Cookie cookie) {
+ cookies.add(cookie);
+
+ }
+
+ }
+
+ public String getCharacterEncoding() {
+ checkStarted();
+ return response.getCharacterEncoding();
+ }
+
+ public String getContentType() {
+ checkStarted();
+ return response.getContentType();
+ }
+
+ public int getStatus() {
+ checkStarted();
+ return response.getStatus();
+ }
+
+ public String getErrorMessage() {
+ checkStarted();
+ return response.getErrorMessage();
+ }
+
+}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingServer.java (from rev 11071, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalServer.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingServer.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingServer.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,336 @@
+package org.richfaces.test;
+
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletContextEvent;
+import javax.servlet.ServletContextListener;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletRequestAttributeEvent;
+import javax.servlet.ServletRequestAttributeListener;
+import javax.servlet.ServletRequestEvent;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionAttributeListener;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionEvent;
+import javax.servlet.http.HttpSessionListener;
+
+import org.richfaces.test.staging.ClasspathServerResource;
+import org.richfaces.test.staging.RequestChain;
+import org.richfaces.test.staging.ServerResource;
+import org.richfaces.test.staging.ServerResourcePath;
+import org.richfaces.test.staging.ServerResourcesDirectory;
+import org.richfaces.test.staging.RequestChain;
+import org.richfaces.test.staging.ServletContainer;
+import org.richfaces.test.staging.StaticServlet;
+import org.richfaces.test.staging.StagingHttpSession;
+import org.richfaces.test.staging.StagingServletContext;
+
+
+/**
+ * Hello world!
+ *
+ */
+public class StagingServer {
+
+
+ private static final Class<ServletRequestListener> REQUEST_LISTENER_CLASS = ServletRequestListener.class;
+
+ private static final Class<ServletRequestAttributeListener> REQUEST_ATTRIBUTE_LISTENER_CLASS = ServletRequestAttributeListener.class;
+
+ private static final Class<ServletContextListener> CONTEXT_LISTENER_CLASS = ServletContextListener.class;
+
+ private static final Class<HttpSessionListener> SESSION_LISTENER_CLASS = HttpSessionListener.class;
+
+ private static final Class<HttpSessionAttributeListener> SESSION_ATTRIBUTE_LISTENER_CLASS = HttpSessionAttributeListener.class;
+
+ private List<RequestChain> servlets = new ArrayList<RequestChain>();
+
+ private RequestChain defaultServlet;
+
+ private List<EventListener> contextListeners = new ArrayList<EventListener>();
+
+ private Map<String,String> initParameters=new HashMap<String, String>();
+
+ private ServerResource serverRoot = new ServerResourcesDirectory();
+
+ private class LocalContext extends StagingServletContext{
+
+ @Override
+ protected void valueBound(ServletContextAttributeEvent event) {
+ // inform listeners.
+ for (EventListener listener : contextListeners) {
+ if (listener instanceof ServletContextAttributeListener) {
+ ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
+ contextListener.attributeAdded(event);
+ }
+ }
+ }
+
+ @Override
+ protected void valueReplaced(ServletContextAttributeEvent event) {
+ // inform listeners.
+ for (EventListener listener : contextListeners) {
+ if (listener instanceof ServletContextAttributeListener) {
+ ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
+ contextListener.attributeReplaced(event);
+ }
+ }
+ }
+
+ @Override
+ protected void valueUnbound(
+ ServletContextAttributeEvent event) {
+ // inform listeners.
+ for (EventListener listener : contextListeners) {
+ if (listener instanceof ServletContextAttributeListener) {
+ ServletContextAttributeListener contextListener = (ServletContextAttributeListener) listener;
+ contextListener.attributeRemoved(event);
+ }
+ }
+ }
+
+ @Override
+ /**
+ * @param path
+ * @return
+ */
+ protected ServerResource getServerResource(String path) {
+ return serverRoot.getResource(new ServerResourcePath(path));
+ }
+
+ }
+
+ private StagingServletContext context;
+
+ private class ServerHttpSession extends StagingHttpSession {
+
+
+ public ServletContext getServletContext() {
+ return context;
+ }
+
+ @Override
+ protected void valueBound(final HttpSessionBindingEvent sessionBindingEvent) {
+ // inform session listeners.
+ fireEvent(SESSION_ATTRIBUTE_LISTENER_CLASS,new EventInvoker<HttpSessionAttributeListener>(){
+ public void invoke(HttpSessionAttributeListener listener) {
+ listener.attributeAdded(sessionBindingEvent);
+ }
+ });
+ }
+
+ @Override
+ protected void valueUnbound(final HttpSessionBindingEvent sessionBindingEvent) {
+ // inform session listeners.
+ fireEvent(SESSION_ATTRIBUTE_LISTENER_CLASS,new EventInvoker<HttpSessionAttributeListener>(){
+ public void invoke(HttpSessionAttributeListener listener) {
+ listener.attributeRemoved(sessionBindingEvent);
+ }
+ });
+ }
+
+ @Override
+ protected void valueReplaced(final HttpSessionBindingEvent sessionBindingEvent) {
+ // inform session listeners.
+ fireEvent(SESSION_ATTRIBUTE_LISTENER_CLASS,new EventInvoker<HttpSessionAttributeListener>(){
+ public void invoke(HttpSessionAttributeListener listener) {
+ listener.attributeReplaced(sessionBindingEvent);
+ }
+ });
+ }
+ }
+
+ private ServerHttpSession session;
+
+
+ public void addServlet(RequestChain servlet) {
+ servlets.add(servlet);
+ }
+
+ public void addServlet(String mapping,Servlet servlet){
+ servlets.add(new ServletContainer(mapping,servlet));
+ }
+
+ public RequestChain getServlet(String path) {
+ RequestChain result = null;
+ for (RequestChain servlet : servlets) {
+ if(servlet.isApplicable(path)){
+ result = servlet;
+ break;
+ }
+ }
+ if(null == result){
+ try {
+ URL resource = context.getResource(path);
+ if(null != resource){
+ result = defaultServlet;
+ }
+ } catch (MalformedURLException e) {
+ // do nothing, just return no servlet.
+ }
+ }
+ return result;
+ }
+
+ public void addInitParameter(String name, String value) {
+ initParameters.put(name, value);
+ }
+
+ public void addResource(String path, String resource){
+ serverRoot.addResource(new ServerResourcePath(path), new ClasspathServerResource(resource));
+ }
+
+ public void addWebListener(EventListener listener) {
+ contextListeners.add(listener);
+ }
+
+ public HttpSession getSession(){
+ return getSession(true);
+ }
+
+ public HttpSession getSession(boolean create){
+ if(null == this.session && create){
+ this.session = new ServerHttpSession();
+ // inform session listeners.
+ final HttpSessionEvent event = new HttpSessionEvent(session);
+ fireEvent(SESSION_LISTENER_CLASS,new EventInvoker<HttpSessionListener>(){
+ public void invoke(HttpSessionListener listener) {
+ listener.sessionCreated(event);
+ }
+ });
+ }
+ return session;
+ }
+
+ /**
+ *
+ */
+ @SuppressWarnings("unchecked")
+ private <T extends EventListener> void fireEvent(Class<T> listenerClass,EventInvoker<T> invoker) {
+ for (EventListener listener : contextListeners) {
+ if (listenerClass.isInstance(listener)) {
+ invoker.invoke((T) listener);
+ }
+ }
+ }
+
+ public void init() {
+ // Create context.
+ this.context = new LocalContext();
+ // Create init parameters
+ context.addInitParameters(initParameters);
+ // Inform listeners
+ final ServletContextEvent event = new ServletContextEvent(context);
+ fireEvent(CONTEXT_LISTENER_CLASS,new EventInvoker<ServletContextListener>(){
+ public void invoke(ServletContextListener listener) {
+ listener.contextInitialized(event);
+ }
+ });
+ // Init servlets
+ try {
+ for (RequestChain servlet : servlets) {
+ // init servlet
+ servlet.init(this.context);
+ }
+ defaultServlet = new ServletContainer(null,new StaticServlet());
+ defaultServlet.init(getContext());
+ } catch(ServletException e){
+ throw new TestException(e);
+ }
+ }
+
+ public void destroy(){
+ // Destroy session
+ if (null != this.session) {
+ // inform session listeners.
+ final HttpSessionEvent event = new HttpSessionEvent(session);
+ fireEvent(SESSION_LISTENER_CLASS,new EventInvoker<HttpSessionListener>(){
+ public void invoke(HttpSessionListener listener) {
+ listener.sessionDestroyed(event);
+ }
+ });
+ session.destroy();
+ }
+ // Inform listeners
+ final ServletContextEvent event = new ServletContextEvent(context);
+ fireEvent(CONTEXT_LISTENER_CLASS,new EventInvoker<ServletContextListener>(){
+ public void invoke(ServletContextListener listener) {
+ listener.contextDestroyed(event);
+ }
+ });
+ // Destroy servlets
+ for (RequestChain servlet : servlets) {
+ servlet.destroy();
+ }
+ defaultServlet.destroy();
+ }
+
+ public StagingConnection getConnection(URL url) {
+ return new StagingConnection(this,url);
+ }
+
+ public StagingServletContext getContext() {
+ return context;
+ }
+
+ public void requestStarted(ServletRequest request) {
+ final ServletRequestEvent event = new ServletRequestEvent(context,request);
+ fireEvent(REQUEST_LISTENER_CLASS, new EventInvoker<ServletRequestListener>(){
+ public void invoke(ServletRequestListener listener) {
+ listener.requestInitialized(event);
+
+ }
+ });
+ }
+
+ public void requestFinished(ServletRequest request) {
+ final ServletRequestEvent event = new ServletRequestEvent(context,request);
+ fireEvent(REQUEST_LISTENER_CLASS, new EventInvoker<ServletRequestListener>(){
+ public void invoke(ServletRequestListener listener) {
+ listener.requestDestroyed(event);
+ }
+ });
+ }
+
+ public void requestAttributeAdded(ServletRequest request,
+ String name, Object o) {
+ final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(context,request,name,o);
+ fireEvent(REQUEST_ATTRIBUTE_LISTENER_CLASS, new EventInvoker<ServletRequestAttributeListener>(){
+ public void invoke(ServletRequestAttributeListener listener) {
+ listener.attributeAdded(event);
+ }
+ });
+ }
+
+ public void requestAttributeRemoved(ServletRequest request,
+ String name, Object removed) {
+ final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(context,request,name,removed);
+ fireEvent(REQUEST_ATTRIBUTE_LISTENER_CLASS, new EventInvoker<ServletRequestAttributeListener>(){
+ public void invoke(ServletRequestAttributeListener listener) {
+ listener.attributeRemoved(event);
+ }
+ });
+ }
+
+ public void requestAttributeReplaced(ServletRequest request,
+ String name, Object value) {
+ final ServletRequestAttributeEvent event = new ServletRequestAttributeEvent(context,request,name,value);
+ fireEvent(REQUEST_ATTRIBUTE_LISTENER_CLASS, new EventInvoker<ServletRequestAttributeListener>(){
+ public void invoke(ServletRequestAttributeListener listener) {
+ listener.attributeReplaced(event);
+ }
+ });
+ }
+}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging (from rev 10973, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub)
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ClasspathServerResource.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,97 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.net.URLConnection;
-import java.util.Collections;
-import java.util.Set;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-
-import javax.servlet.ServletResponse;
-
-import org.richfaces.test.ServerLogger;
-
-/**
- * @author asmirnov
- *
- */
-public class ClasspathServerResource implements ServerResource {
-
- private final String classpath;
-
- private static final Logger log = ServerLogger.RESOURCE.getLogger();
-
-
- /**
- * @param name
- * @param classpath
- */
- public ClasspathServerResource(String classpath) {
- this.classpath = classpath;
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#addResource(org.richfaces.test.stub.ServerResource)
- */
- public void addResource(ServerResourcePath path, ServerResource resource) {
- throw new UnsupportedOperationException();
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getResource(org.richfaces.test.stub.ServerResourcePath)
- */
- public ServerResource getResource(ServerResourcePath path) {
- if(null == path){
- throw new NullPointerException();
- }
- if(path.isFile()){
- return this;
- }
- return null;
- }
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getPaths()
- */
- public Set<String> getPaths() {
- return Collections.emptySet();
- }
-
-
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getAsStream()
- */
- public InputStream getAsStream() throws IOException {
- URL url = getURL();
- if (url != null) {
- URLConnection connection = url.openConnection();
- try {
- connection.setUseCaches(false);
- } catch (IllegalArgumentException e) {
- log.info("RESOURCE_NOT_CACHEABLE");
- }
- return connection.getInputStream();
- } else {
- return null;
- }
- }
-
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getURL()
- */
- public URL getURL() {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- if(null == classLoader){
- classLoader = this.getClass().getClassLoader();
- }
- return classLoader.getResource(classpath);
- }
-
-
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ClasspathServerResource.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,97 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Collections;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletResponse;
+
+import org.richfaces.test.ServerLogger;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ClasspathServerResource implements ServerResource {
+
+ private final String classpath;
+
+ private static final Logger log = ServerLogger.RESOURCE.getLogger();
+
+
+ /**
+ * @param name
+ * @param classpath
+ */
+ public ClasspathServerResource(String classpath) {
+ this.classpath = classpath;
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#addResource(org.richfaces.test.staging.ServerResource)
+ */
+ public void addResource(ServerResourcePath path, ServerResource resource) {
+ throw new UnsupportedOperationException();
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getResource(org.richfaces.test.staging.ServerResourcePath)
+ */
+ public ServerResource getResource(ServerResourcePath path) {
+ if(null == path){
+ throw new NullPointerException();
+ }
+ if(path.isFile()){
+ return this;
+ }
+ return null;
+ }
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getPaths()
+ */
+ public Set<String> getPaths() {
+ return Collections.emptySet();
+ }
+
+
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getAsStream()
+ */
+ public InputStream getAsStream() throws IOException {
+ URL url = getURL();
+ if (url != null) {
+ URLConnection connection = url.openConnection();
+ try {
+ connection.setUseCaches(false);
+ } catch (IllegalArgumentException e) {
+ log.info("RESOURCE_NOT_CACHEABLE");
+ }
+ return connection.getInputStream();
+ } else {
+ return null;
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getURL()
+ */
+ public URL getURL() {
+ ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
+ if(null == classLoader){
+ classLoader = this.getClass().getClassLoader();
+ }
+ return classLoader.getResource(classpath);
+ }
+
+
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,98 @@
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public class FilterContainer implements RequestChain {
+
+ private final Filter filter;
+
+ private final RequestChain next;
+
+ private String name = "Default";
+
+ private final Map<String, String> initParameters;
+
+ /**
+ * @param filter
+ * @param next
+ */
+ public FilterContainer(Filter filter, RequestChain next) {
+ this.filter = filter;
+ this.next = next;
+ this.initParameters = new HashMap<String, String>();
+ }
+
+ public void execute(ServletRequest request, ServletResponse response)
+ throws ServletException, IOException {
+ FilterChain chain = new FilterChain(){
+
+ public void doFilter(ServletRequest request,
+ ServletResponse response) throws IOException,
+ ServletException {
+ next.execute(request, response);
+
+ }
+
+ };
+ filter.doFilter(request, response, chain);
+
+ }
+
+ public void addInitParameter(String name, String value){
+ initParameters.put(name, value);
+ }
+
+ public boolean isApplicable(String path) {
+ return next.isApplicable(path);
+ }
+
+ public void destroy() {
+ next.destroy();
+ filter.destroy();
+ }
+
+ public void init(final StagingServletContext context) throws ServletException {
+ filter.init(new FilterConfig(){
+
+ public String getFilterName() {
+ return name;
+ }
+
+ public String getInitParameter(String name) {
+ return initParameters.get(name);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Enumeration getInitParameterNames() {
+ return Collections.enumeration(initParameters.keySet());
+ }
+
+ public ServletContext getServletContext() {
+ return context;
+ }
+
+ });
+ next.init(context);
+ }
+
+ public String getPathInfo(String path) {
+ return next.getPathInfo(path);
+ }
+
+ public String getServletPath(String path) {
+ return next.getServletPath(path);
+ }
+
+}
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/NotImplementedException.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/NotImplementedException.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/NotImplementedException.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/NotImplementedException.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,46 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+/**
+ * This exception indicates feature not yet implemented in the stub server.
+ * @author asmirnov
+ *
+ */
+@SuppressWarnings("serial")
+public class NotImplementedException extends RuntimeException {
+
+ /**
+ *
+ */
+ public NotImplementedException() {
+ super("This feature not yet implemented");
+ }
+
+ /**
+ * @param message
+ */
+ public NotImplementedException(String message) {
+ super(message);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param cause
+ */
+ public NotImplementedException(Throwable cause) {
+ super(cause);
+ // TODO Auto-generated constructor stub
+ }
+
+ /**
+ * @param message
+ * @param cause
+ */
+ public NotImplementedException(String message, Throwable cause) {
+ super(message, cause);
+ // TODO Auto-generated constructor stub
+ }
+
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,24 @@
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+public interface RequestChain {
+
+ public abstract boolean isApplicable(String path);
+
+ public abstract void execute(ServletRequest request,
+ ServletResponse response) throws ServletException, IOException;
+
+ public abstract void destroy();
+
+ public abstract void init(StagingServletContext context) throws ServletException;
+
+ public abstract String getPathInfo(String path);
+
+ public abstract String getServletPath(String path);
+
+}
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResource.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,50 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.URL;
-import java.util.Set;
-
-/**
- * @author asmirnov
- *
- */
-public interface ServerResource {
-
-
- /**
- * Get URL for a test server resource content. Directories should return null or "stub"
- * @return
- */
- public URL getURL();
-
- /**
- * Create input stream to read content. Directories returns {@code null}
- * @return
- * @throws IOException
- */
- public InputStream getAsStream() throws IOException;
-
- /**
- * @return strings representing directory content. File-like resources return null.
- */
- public Set<String> getPaths();
-
- /**
- * Append resource to the current directory-like structure.
- * @param path
- * @param resource
- */
- public void addResource(ServerResourcePath path, ServerResource resource);
-
- /**
- * Get resource from the current directory or its subdirectories.
- * @param path
- * @return
- */
- public ServerResource getResource(ServerResourcePath path);
-
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResource.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResource.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,50 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URL;
+import java.util.Set;
+
+/**
+ * @author asmirnov
+ *
+ */
+public interface ServerResource {
+
+
+ /**
+ * Get URL for a test server resource content. Directories should return null or "stub"
+ * @return
+ */
+ public URL getURL();
+
+ /**
+ * Create input stream to read content. Directories returns {@code null}
+ * @return
+ * @throws IOException
+ */
+ public InputStream getAsStream() throws IOException;
+
+ /**
+ * @return strings representing directory content. File-like resources return null.
+ */
+ public Set<String> getPaths();
+
+ /**
+ * Append resource to the current directory-like structure.
+ * @param path
+ * @param resource
+ */
+ public void addResource(ServerResourcePath path, ServerResource resource);
+
+ /**
+ * Get resource from the current directory or its subdirectories.
+ * @param path
+ * @return
+ */
+ public ServerResource getResource(ServerResourcePath path);
+
+}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResourcePath.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,100 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.util.regex.Pattern;
-
-import javax.servlet.ServletContext;
-
-/**
- * Class to represent web server resources directory path.
- * @author asmirnov
- *
- */
-public class ServerResourcePath {
-
- private static final Pattern SLASH = Pattern.compile("/");
-
- public static final ServerResourcePath WEB_INF=new ServerResourcePath("/WEB-INF");
-
- public static final ServerResourcePath META_INF=new ServerResourcePath("/META-INF");
- public static final ServerResourcePath WEB_XML=new ServerResourcePath("/WEB-INF/web.xml");
- public static final ServerResourcePath FACES_CONFIG=new ServerResourcePath("/WEB-INF/faces-config.xml");
-
-
- private final String[] pathElements;
-
- /**
- * Private constructor for next sub - path.
- * @param pathElements
- */
- private ServerResourcePath(String[] pathElements) {
- this.pathElements = pathElements;
- }
-
- /**
- * Create path from string representation. Path have to started with training slash, as required for
- * {@link ServletContext#getResource(String)}
- * @param path
- */
- public ServerResourcePath(String path) {
- if (null == path) {
- throw new NullPointerException();
- }
- if (!path.startsWith("/")) {
- throw new IllegalArgumentException();
- }
- pathElements = SLASH.split(path);
- }
-
- /**
- * Method to detect last element in the path.
- * @return true for a last element in the path.
- */
- public boolean isFile() {
- return pathElements.length <= 1;
- }
-
- /**
- * Name of the next element ( directory or file ) name.
- * For the "/foo/bar/baz" it should be "foo" , /bar/baz : "bar" , "/" : null.
- * @return name of the next element or null if it is last element in the chain ( file ).
- */
- public String getNextElementName() {
- if (pathElements.length > 1) {
- return pathElements[1];
- } else {
- return null;
- }
- }
-
- /**
- * Create next path of the path chain.
- * Path /foo/bar/baz should be converted to /bar/baz , /bar/baz -> /baz -> / ( empty path )
- * @return next subdirectory path or null.
- */
- public ServerResourcePath getNextPath() {
- if (pathElements.length > 1) {
- String[] nextElenemts = new String[pathElements.length - 1];
- System.arraycopy(pathElements, 1, nextElenemts, 0, nextElenemts.length);
- return new ServerResourcePath(nextElenemts);
- } else {
- return null;
- }
- }
-
- @Override
- public String toString() {
- StringBuilder str = new StringBuilder();
- if (pathElements.length > 1) {
- for (int i = 1; i < pathElements.length; i++) {
- String element = pathElements[i];
- str.append("/").append(element);
- }
- } else {
- str.append("/");
- }
- return str.toString();
- }
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResourcePath.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcePath.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,100 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.util.regex.Pattern;
+
+import javax.servlet.ServletContext;
+
+/**
+ * Class to represent web server resources directory path.
+ * @author asmirnov
+ *
+ */
+public class ServerResourcePath {
+
+ private static final Pattern SLASH = Pattern.compile("/");
+
+ public static final ServerResourcePath WEB_INF=new ServerResourcePath("/WEB-INF");
+
+ public static final ServerResourcePath META_INF=new ServerResourcePath("/META-INF");
+ public static final ServerResourcePath WEB_XML=new ServerResourcePath("/WEB-INF/web.xml");
+ public static final ServerResourcePath FACES_CONFIG=new ServerResourcePath("/WEB-INF/faces-config.xml");
+
+
+ private final String[] pathElements;
+
+ /**
+ * Private constructor for next sub - path.
+ * @param pathElements
+ */
+ private ServerResourcePath(String[] pathElements) {
+ this.pathElements = pathElements;
+ }
+
+ /**
+ * Create path from string representation. Path have to started with training slash, as required for
+ * {@link ServletContext#getResource(String)}
+ * @param path
+ */
+ public ServerResourcePath(String path) {
+ if (null == path) {
+ throw new NullPointerException();
+ }
+ if (!path.startsWith("/")) {
+ throw new IllegalArgumentException();
+ }
+ pathElements = SLASH.split(path);
+ }
+
+ /**
+ * Method to detect last element in the path.
+ * @return true for a last element in the path.
+ */
+ public boolean isFile() {
+ return pathElements.length <= 1;
+ }
+
+ /**
+ * Name of the next element ( directory or file ) name.
+ * For the "/foo/bar/baz" it should be "foo" , /bar/baz : "bar" , "/" : null.
+ * @return name of the next element or null if it is last element in the chain ( file ).
+ */
+ public String getNextElementName() {
+ if (pathElements.length > 1) {
+ return pathElements[1];
+ } else {
+ return null;
+ }
+ }
+
+ /**
+ * Create next path of the path chain.
+ * Path /foo/bar/baz should be converted to /bar/baz , /bar/baz -> /baz -> / ( empty path )
+ * @return next subdirectory path or null.
+ */
+ public ServerResourcePath getNextPath() {
+ if (pathElements.length > 1) {
+ String[] nextElenemts = new String[pathElements.length - 1];
+ System.arraycopy(pathElements, 1, nextElenemts, 0, nextElenemts.length);
+ return new ServerResourcePath(nextElenemts);
+ } else {
+ return null;
+ }
+ }
+
+ @Override
+ public String toString() {
+ StringBuilder str = new StringBuilder();
+ if (pathElements.length > 1) {
+ for (int i = 1; i < pathElements.length; i++) {
+ String element = pathElements[i];
+ str.append("/").append(element);
+ }
+ } else {
+ str.append("/");
+ }
+ return str.toString();
+ }
+}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResourcesDirectory.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,86 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.InputStream;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * @author asmirnov
- *
- */
-public class ServerResourcesDirectory implements ServerResource {
-
-
-
- private final Map<String,ServerResource> children = new HashMap<String,ServerResource>();
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#addResource(org.richfaces.test.stub.ServerResource)
- */
- public void addResource(ServerResourcePath path,ServerResource resource) {
-
- if(null == path || path.isFile()){
- throw new IllegalArgumentException();
- } else if(path.getNextPath().isFile()) {
- children.put(path.getNextElementName(), resource);
- } else {
- ServerResource nextDirectory = children.get(path.getNextElementName());
- if(null == nextDirectory){
- nextDirectory = new ServerResourcesDirectory();
- children.put(path.getNextElementName(), nextDirectory);
- }
- nextDirectory.addResource(path.getNextPath(), resource);
- }
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getResource(org.richfaces.test.stub.ServerResourcePath)
- */
- public ServerResource getResource(ServerResourcePath path) {
- if(null == path){
- throw new NullPointerException();
- }
- ServerResource resource = null; //children.get(path.getName());
- if(path.isFile()){
- resource=this;
- } else {
- resource = children.get(path.getNextElementName());
- if(!path.getNextPath().isFile() && null!=resource){
- resource = resource.getResource(path.getNextPath());
- }
- }
- return resource;
- }
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getAsStream()
- */
- public InputStream getAsStream() {
- // can't read directory.
- return null;
- }
-
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getPaths()
- */
- public Set<String> getPaths() {
- return children.keySet();
- }
-
- /* (non-Javadoc)
- * @see org.richfaces.test.stub.ServerResource#getURL()
- */
- public URL getURL() {
- // Directory don't have url.
- return null;
- }
-
-
-
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServerResourcesDirectory.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,86 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ServerResourcesDirectory implements ServerResource {
+
+
+
+ private final Map<String,ServerResource> children = new HashMap<String,ServerResource>();
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#addResource(org.richfaces.test.staging.ServerResource)
+ */
+ public void addResource(ServerResourcePath path,ServerResource resource) {
+
+ if(null == path || path.isFile()){
+ throw new IllegalArgumentException();
+ } else if(path.getNextPath().isFile()) {
+ children.put(path.getNextElementName(), resource);
+ } else {
+ ServerResource nextDirectory = children.get(path.getNextElementName());
+ if(null == nextDirectory){
+ nextDirectory = new ServerResourcesDirectory();
+ children.put(path.getNextElementName(), nextDirectory);
+ }
+ nextDirectory.addResource(path.getNextPath(), resource);
+ }
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getResource(org.richfaces.test.staging.ServerResourcePath)
+ */
+ public ServerResource getResource(ServerResourcePath path) {
+ if(null == path){
+ throw new NullPointerException();
+ }
+ ServerResource resource = null; //children.get(path.getName());
+ if(path.isFile()){
+ resource=this;
+ } else {
+ resource = children.get(path.getNextElementName());
+ if(!path.getNextPath().isFile() && null!=resource){
+ resource = resource.getResource(path.getNextPath());
+ }
+ }
+ return resource;
+ }
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getAsStream()
+ */
+ public InputStream getAsStream() {
+ // can't read directory.
+ return null;
+ }
+
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getPaths()
+ */
+ public Set<String> getPaths() {
+ return children.keySet();
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.ServerResource#getURL()
+ */
+ public URL getURL() {
+ // Directory don't have url.
+ return null;
+ }
+
+
+
+}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServletContainer.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,97 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.IOException;
-import java.util.Collections;
-import java.util.Map;
-
-import javax.servlet.Servlet;
-import javax.servlet.ServletException;
-import javax.servlet.ServletRequest;
-import javax.servlet.ServletResponse;
-
-
-/**
- * @author asmirnov
- *
- */
-public class ServletContainer {
-
- private final Servlet servlet;
-
- private final boolean prefixMapped;
-
- private final String mapping;
-
- private final Map<String, String> initParameters;
-
- /**
- * @param mapping
- * @param servlet
- */
- public ServletContainer(String mapping, Servlet servlet, Map<String, String> initParameters) {
- if(null == mapping){
- this.prefixMapped = true;
- this.mapping = "";
- } else if (mapping.startsWith("*")) {
- this.prefixMapped = false;
- this.mapping = mapping.substring(1);
- } else if (mapping.endsWith("*")) {
- this.prefixMapped = true;
- this.mapping = mapping.substring(0,mapping.length()-1);
- } else {
- throw new IllegalArgumentException("Invalid mapping "+mapping);
- }
- this.servlet = servlet;
- this.initParameters = initParameters;
- }
-
- public ServletContainer(String mapping, Servlet servlet) {
- this(mapping, servlet, Collections.<String, String>emptyMap());
- }
-
- public boolean isApplicable(String path) {
- if(prefixMapped && path.startsWith(mapping)){
- return true;
- } else if(!prefixMapped && path.endsWith(mapping)){
- return true;
- } else {
- return false;
- }
- }
-
- public String getServletPath(String path){
- if (!isApplicable(path)) {
- return null;
- }
- if(prefixMapped){
- return mapping;
- } else {
- return path;
- }
- }
-
- public String getPathInfo(String path) {
- if (!isApplicable(path)) {
- return null;
- }
- if(prefixMapped){
- return path.substring(mapping.length());
- } else {
- return null;
- }
-
- }
-
- public void init(StubServletContext context) throws ServletException {
- StubServletConfig config = new StubServletConfig(context, this.initParameters);
- servlet.init(config);
- }
-
- public void execute(ServletRequest request, ServletResponse response) throws ServletException, IOException {
- this.servlet.service(request, response);
-
- }
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/ServletContainer.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,150 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.Servlet;
+import javax.servlet.ServletConfig;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+
+import org.richfaces.test.ServerLogger;
+
+
+/**
+ * @author asmirnov
+ *
+ */
+public class ServletContainer implements RequestChain {
+
+ private static final Logger log = ServerLogger.SERVER.getLogger();
+
+ private final Servlet servlet;
+
+ private final boolean prefixMapped;
+
+ private final String mapping;
+
+ private final Map<String, String> initParameters;
+
+ private String name = "Default";
+
+ /**
+ * @param mapping
+ * @param servlet
+ */
+ public ServletContainer(String mapping, Servlet servlet) {
+ if(null == mapping){
+ this.prefixMapped = true;
+ this.mapping = "";
+ } else if (mapping.startsWith("*")) {
+ this.prefixMapped = false;
+ this.mapping = mapping.substring(1);
+ } else if (mapping.endsWith("*")) {
+ this.prefixMapped = true;
+ this.mapping = mapping.substring(0,mapping.length()-1);
+ } else {
+ throw new IllegalArgumentException("Invalid mapping "+mapping);
+ }
+ this.servlet = servlet;
+ this.initParameters = new HashMap<String, String>();
+ }
+
+
+ public void addInitParameter(String name, String value){
+ initParameters.put(name, value);
+ }
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * @param name the name to set
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#isApplicable(java.lang.String)
+ */
+ public boolean isApplicable(String path) {
+ if(prefixMapped && path.startsWith(mapping)){
+ return true;
+ } else if(!prefixMapped && path.endsWith(mapping)){
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+ public String getServletPath(String path){
+ if (!isApplicable(path)) {
+ return null;
+ }
+ if(prefixMapped){
+ return mapping;
+ } else {
+ return path;
+ }
+ }
+
+ public String getPathInfo(String path) {
+ if (!isApplicable(path)) {
+ return null;
+ }
+ if(prefixMapped){
+ return path.substring(mapping.length());
+ } else {
+ return null;
+ }
+
+ }
+
+ public void init(final StagingServletContext context) throws ServletException {
+ servlet.init(new ServletConfig(){
+
+ public String getInitParameter(String name) {
+ return initParameters.get(name);
+ }
+
+ @SuppressWarnings("unchecked")
+ public Enumeration getInitParameterNames() {
+ return Collections.enumeration(initParameters.keySet());
+ }
+
+ public ServletContext getServletContext() {
+ return context;
+ }
+
+ public String getServletName() {
+ return name;
+ }
+
+ });
+ }
+
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#execute(javax.servlet.ServletRequest, javax.servlet.ServletResponse)
+ */
+ public void execute(ServletRequest request, ServletResponse response) throws ServletException, IOException {
+ this.servlet.service(request, response);
+
+ }
+
+ public void destroy() {
+ this.servlet.destroy();
+ }
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,495 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.security.Principal;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Locale;
+import java.util.Map;
+import java.util.logging.Logger;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletInputStream;
+import javax.servlet.ServletRequestListener;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+
+import org.richfaces.collections.collect.ImmutableCollection;
+import org.richfaces.collections.collect.ImmutableList;
+import org.richfaces.collections.collect.Multimap;
+import org.richfaces.collections.collect.Multimaps;
+import org.richfaces.test.ServerLogger;
+
+/**
+ * @author asmirnov
+ *
+ */
+public abstract class StagingHttpRequest implements HttpServletRequest {
+
+ private static final Logger log = ServerLogger.CONNECTION.getLogger();
+
+ public static final String LOCALHOST = "localhost";
+ public static final String HTTP = "http";
+ public static final String LOCALHOST_IP = "127.0.0.1";
+ public static final String UTF8 = "UTF-8";
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getAuthType()
+ */
+ public String getAuthType() {
+ // TODO configure test auth.
+ log.info("unimplemented request method getAuthType");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getContextPath()
+ */
+ public String getContextPath() {
+ return StagingServletContext.CONTEXT_PATH;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
+ */
+ public long getDateHeader(String name) {
+ // TODO create headers support
+ log.info("unimplemented request method getDateHeader");
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
+ */
+ public String getHeader(String name) {
+ // TODO create headers support
+ log.info("unimplemented request method getHeader");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getHeaderNames() {
+ // TODO create headers support
+ log.info("unimplemented request method getHeaderNames");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getHeaders(java.lang.String)
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getHeaders(String name) {
+ // TODO create headers support
+ log.info("unimplemented request method getHeaders");
+ return Collections.enumeration(Collections.EMPTY_LIST);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
+ */
+ public int getIntHeader(String name) {
+ // TODO create headers support
+ log.info("unimplemented request method getIntHeader");
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
+ */
+ public String getPathTranslated() {
+ // we have only 'virtual' server.
+ return null;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
+ */
+ public String getRemoteUser() {
+ // TODO configure test auth.
+ log.info("unimplemented request method getRemoteUser");
+ return null;
+ }
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getRequestURL()
+ */
+ public StringBuffer getRequestURL() {
+ StringBuffer requestURL = new StringBuffer(HTTP + "://" + LOCALHOST
+ + getRequestURI());
+ return requestURL;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
+ */
+ public String getRequestedSessionId() {
+ return StagingHttpSession.SESSION_ID;
+ }
+
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
+ */
+ public Principal getUserPrincipal() {
+ // TODO implement test auth.
+ log.info("unimplemented request method getUserPrincipal");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
+ */
+ public boolean isRequestedSessionIdFromCookie() {
+ // test do not supports cookie
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
+ */
+ public boolean isRequestedSessionIdFromURL() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
+ */
+ public boolean isRequestedSessionIdFromUrl() {
+ return true;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
+ */
+ public boolean isRequestedSessionIdValid() {
+ // TODO - check session.
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
+ */
+ public boolean isUserInRole(String role) {
+ // TODO implement test auth.
+ log.info("unimplemented request method isUserInRole");
+ return false;
+ }
+
+ private Map<String, Object> attributes = new HashMap<String, Object>();
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
+ */
+ public Object getAttribute(String name) {
+ return attributes.get(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getAttributeNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getAttributeNames() {
+ return Collections.enumeration(attributes.keySet());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getCharacterEncoding()
+ */
+ public String getCharacterEncoding() {
+ return UTF8;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getContentLength()
+ */
+ public int getContentLength() {
+ return -1;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getContentType()
+ */
+ public String getContentType() {
+ log.info("unimplemented request method getContentType");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getInputStream()
+ */
+ public ServletInputStream getInputStream() throws IOException {
+ // TODO implement post stream.
+ log.info("unimplemented request method getInputStream");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getLocalAddr()
+ */
+ public String getLocalAddr() {
+ return LOCALHOST_IP;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getLocalName()
+ */
+ public String getLocalName() {
+ return LOCALHOST;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getLocalPort()
+ */
+ public int getLocalPort() {
+ return 80;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getLocale()
+ */
+ public Locale getLocale() {
+ return Locale.US;
+ }
+
+ private final ImmutableCollection<Locale> locales = ImmutableList.of(
+ Locale.US, Locale.GERMANY);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getLocales()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getLocales() {
+ return Collections.enumeration(locales);
+ }
+
+ private String characterEncoding;
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getProtocol()
+ */
+ public String getProtocol() {
+ return "HTTP/1.1";
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getReader()
+ */
+ public BufferedReader getReader() throws IOException {
+ // TODO implements request buffer.
+ log.info("unimplemented request method getReader");
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
+ */
+ public String getRealPath(String path) {
+ return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getRemoteAddr()
+ */
+ public String getRemoteAddr() {
+ return LOCALHOST_IP;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getRemoteHost()
+ */
+ public String getRemoteHost() {
+ return LOCALHOST;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getRemotePort()
+ */
+ public int getRemotePort() {
+ return 1223340;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
+ */
+ public RequestDispatcher getRequestDispatcher(String path) {
+ // TODO Auto-generated method stub
+ throw new NotImplementedException();
+ // return null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getScheme()
+ */
+ public String getScheme() {
+ return HTTP;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getServerName()
+ */
+ public String getServerName() {
+ return LOCALHOST;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#getServerPort()
+ */
+ public int getServerPort() {
+ return 80;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#isSecure()
+ */
+ public boolean isSecure() {
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
+ */
+ public void removeAttribute(String name) {
+ // TODO - inform listeners
+ Object removed = attributes.remove(name);
+ if(null != removed){
+ attributeRemoved(name,removed);
+ }
+ }
+
+ protected abstract void attributeRemoved(String name, Object removed);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#setAttribute(java.lang.String,
+ * java.lang.Object)
+ */
+ public void setAttribute(String name, Object o) {
+ if(null == o){
+ removeAttribute(name);
+ } else {
+ Object oldValue = attributes.put(name, o);
+ if(null != oldValue){
+ attributeReplaced(name,o);
+ } else {
+ attributeAdded(name,o);
+ }
+ }
+
+ }
+
+ protected abstract void attributeAdded(String name, Object o);
+
+ protected abstract void attributeReplaced(String name, Object o);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
+ */
+ public void setCharacterEncoding(String env)
+ throws UnsupportedEncodingException {
+ this.characterEncoding=env;
+
+ }
+
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,436 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Locale;
+import java.util.logging.Logger;
+
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.commons.httpclient.HttpStatus;
+import org.richfaces.test.ServerLogger;
+
+/**
+ * @author asmirnov
+ *
+ */
+public abstract class StagingHttpResponse implements HttpServletResponse {
+
+
+ private static final Logger log = ServerLogger.CONNECTION.getLogger();
+
+
+ private int status = 200;
+
+ private String redirectLocation = null;
+
+ private String errorMessage = null;
+
+ private int bufferSize = 8196;
+
+ private StringWriter outputWriter;
+
+ private ByteArrayOutputStream outputStream;
+
+ private PrintWriter printWriter;
+
+ private ServletOutputStream servletOutputStream;
+
+ private Locale locale = Locale.US;
+
+ private String contentType="text";
+
+ private String encoding = StagingHttpRequest.UTF8;
+
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String,
+ * long)
+ */
+ public void addDateHeader(String name, long date) {
+ log.info("unimplemented response method addDateHeader");
+ // TODO Auto-generated method stub
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String,
+ * java.lang.String)
+ */
+ public void addHeader(String name, String value) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method addHeader");
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String,
+ * int)
+ */
+ public void addIntHeader(String name, int value) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method addIntHeader");
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String)
+ */
+ public boolean containsHeader(String name) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method containsHeader");
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String
+ * )
+ */
+ public String encodeRedirectURL(String url) {
+ return url;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String
+ * )
+ */
+ public String encodeRedirectUrl(String url) {
+ return encodeRedirectURL(url);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String)
+ */
+ public String encodeURL(String url) {
+ return url;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String)
+ */
+ public String encodeUrl(String url) {
+ return encodeURL(url);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#sendError(int)
+ */
+ public void sendError(int sc) throws IOException {
+ status = sc;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#sendError(int,
+ * java.lang.String)
+ */
+ public void sendError(int sc, String msg) throws IOException {
+ status = sc;
+ errorMessage = msg;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
+ */
+ public void sendRedirect(String location) throws IOException {
+ redirectLocation = location;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String,
+ * long)
+ */
+ public void setDateHeader(String name, long date) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method setDateHeader");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String,
+ * java.lang.String)
+ */
+ public void setHeader(String name, String value) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method setHeader");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String,
+ * int)
+ */
+ public void setIntHeader(String name, int value) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method setIntHeader");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#setStatus(int)
+ */
+ public void setStatus(int sc) {
+ status = sc;
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpServletResponse#setStatus(int,
+ * java.lang.String)
+ */
+ public void setStatus(int sc, String sm) {
+ status = sc;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#flushBuffer()
+ */
+ public void flushBuffer() throws IOException {
+ // do nothing
+ log.info("unimplemented response method flushBuffer");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getBufferSize()
+ */
+ public int getBufferSize() {
+ return bufferSize;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getCharacterEncoding()
+ */
+ public String getCharacterEncoding() {
+ return encoding;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getContentType()
+ */
+ public String getContentType() {
+ return contentType;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getLocale()
+ */
+ public Locale getLocale() {
+ return locale;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getOutputStream()
+ */
+ public ServletOutputStream getOutputStream() throws IOException {
+ if (null != this.outputWriter) {
+ throw new IllegalStateException();
+ }
+ if (this.outputStream == null) {
+ this.outputStream = new ByteArrayOutputStream(getBufferSize());
+ servletOutputStream = new ServletOutputStream(){
+
+ @Override
+ public void write(int b) throws IOException {
+ StagingHttpResponse.this.outputStream.write(b);
+ }
+
+ };
+ }
+ return servletOutputStream;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#getWriter()
+ */
+ public PrintWriter getWriter() throws IOException {
+ if (null != this.outputStream) {
+ throw new IllegalStateException();
+ }
+ if (this.outputWriter == null) {
+ this.outputWriter = new StringWriter(getBufferSize());
+ printWriter = new PrintWriter(outputWriter);
+ }
+ return printWriter;
+ }
+
+
+ public String getWriterContent() {
+ if(null != this.outputWriter){
+ return this.outputWriter.toString();
+ }
+ return null;
+ }
+
+ public byte[] getStreamContent() {
+ if(null!=outputStream){
+ return outputStream.toByteArray();
+ }
+ return null;
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#isCommitted()
+ */
+ public boolean isCommitted() {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method isCommited");
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#reset()
+ */
+ public void reset() {
+ if(isCommitted()){
+ throw new IllegalStateException();
+ }
+ resetBuffer();
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#resetBuffer()
+ */
+ public void resetBuffer() {
+ if(isCommitted()){
+ throw new IllegalStateException();
+ }
+ this.servletOutputStream = null;
+ this.outputStream = null;
+ this.printWriter = null;
+ this.outputWriter = null;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#setBufferSize(int)
+ */
+ public void setBufferSize(int size) {
+ this.bufferSize = size;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#setCharacterEncoding(java.lang.String)
+ */
+ public void setCharacterEncoding(String charset) {
+ encoding = charset;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#setContentLength(int)
+ */
+ public void setContentLength(int len) {
+ // TODO Auto-generated method stub
+ log.info("unimplemented response method setContentLenght");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#setContentType(java.lang.String)
+ */
+ public void setContentType(String type) {
+ contentType = type;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletResponse#setLocale(java.util.Locale)
+ */
+ public void setLocale(Locale loc) {
+ this.locale = loc;
+
+ }
+
+ /**
+ * @return the status
+ */
+ public int getStatus() {
+ return status;
+ }
+
+ /**
+ * @return the redirectLocation
+ */
+ public String getRedirectLocation() {
+ return redirectLocation;
+ }
+
+ /**
+ * @return the errorMessage
+ */
+ public String getErrorMessage() {
+ return errorMessage;
+ }
+
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpSession.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpSession.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpSession.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,281 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.servlet.ServletContext;
+import javax.servlet.http.HttpSession;
+import javax.servlet.http.HttpSessionBindingEvent;
+import javax.servlet.http.HttpSessionBindingListener;
+import javax.servlet.http.HttpSessionContext;
+
+/**
+ * @author asmirnov
+ *
+ */
+public abstract class StagingHttpSession implements HttpSession {
+
+ private static final int DEFAULT_INACTIVE_TIME = 30;
+
+ public static final String SESSION_ID = "1234567890";
+
+ private final Map<String, Object> attributes = new HashMap<String, Object>();
+
+ private final long creationTime;
+
+ private int inactiveTime = DEFAULT_INACTIVE_TIME;
+
+ private boolean valid;
+
+ public StagingHttpSession() {
+ this.creationTime = System.currentTimeMillis();
+ this.valid = true;
+ }
+
+ /**
+ *
+ */
+ public void destroy() {
+ // Destroy all session attributes.
+ unboundAttributes();
+ }
+
+ private void unboundAttributes() {
+ for (String name : getValueNames()) {
+ removeAttribute(name);
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getAttribute(java.lang.String)
+ */
+ public Object getAttribute(String name) {
+ checkValid();
+ return attributes.get(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getAttributeNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getAttributeNames() {
+ checkValid();
+ return Collections.enumeration(attributes.keySet());
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getCreationTime()
+ */
+ public long getCreationTime() {
+ checkValid();
+ return creationTime;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getId()
+ */
+ public String getId() {
+ return SESSION_ID;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getLastAccessedTime()
+ */
+ public long getLastAccessedTime() {
+ checkValid();
+ // TODO fix accessing time
+ return 0;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getMaxInactiveInterval()
+ */
+ public int getMaxInactiveInterval() {
+ return inactiveTime;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getSessionContext()
+ */
+ @SuppressWarnings("deprecation")
+ public HttpSessionContext getSessionContext() {
+ throw new NotImplementedException("Session context is not implemented");
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getValue(java.lang.String)
+ */
+ public Object getValue(String name) {
+ return getAttribute(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#getValueNames()
+ */
+ public String[] getValueNames() {
+ checkValid();
+ ArrayList<String> names = new ArrayList<String>(attributes.keySet());
+ return names.toArray(new String[names.size()]);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#invalidate()
+ */
+ public void invalidate() {
+ checkValid();
+ unboundAttributes();
+ this.valid=false;
+
+ }
+
+ protected void checkValid(){
+ if(!valid){
+ throw new IllegalStateException("Session have been invalidated");
+ }
+ }
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#isNew()
+ */
+ public boolean isNew() {
+ checkValid();
+ // TODO Auto-generated method stub
+ return false;
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#putValue(java.lang.String,
+ * java.lang.Object)
+ */
+ public void putValue(String name, Object value) {
+ setAttribute(name, value);
+
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)
+ */
+ public void removeAttribute(String name) {
+ checkValid();
+ Object removed = this.attributes.remove(name);
+ if (null != removed) {
+ removedFromSession(name, removed);
+ }
+
+ }
+
+ protected void removedFromSession(String name, Object removed) {
+ HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
+ this, name, removed);
+ if (removed instanceof HttpSessionBindingListener) {
+ HttpSessionBindingListener listener = (HttpSessionBindingListener) removed;
+ listener.valueUnbound(sessionBindingEvent);
+ }
+ valueUnbound(sessionBindingEvent);
+ }
+
+ protected abstract void valueUnbound(
+ HttpSessionBindingEvent sessionBindingEvent);
+
+ protected void boundToSession(String name, Object value) {
+ HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
+ this, name, value);
+ if (value instanceof HttpSessionBindingListener) {
+ HttpSessionBindingListener listener = (HttpSessionBindingListener) value;
+ listener.valueBound(sessionBindingEvent);
+ }
+ valueBound(sessionBindingEvent);
+ }
+
+ protected abstract void valueBound(
+ HttpSessionBindingEvent sessionBindingEvent);
+
+ protected void replacedInSession(String name, Object oldValue, Object value) {
+ HttpSessionBindingEvent sessionBindingEvent = new HttpSessionBindingEvent(
+ this, name, value);
+ if (oldValue instanceof HttpSessionBindingListener) {
+ HttpSessionBindingListener listener = (HttpSessionBindingListener) oldValue;
+ listener.valueUnbound(sessionBindingEvent);
+ }
+ if (value instanceof HttpSessionBindingListener) {
+ HttpSessionBindingListener listener = (HttpSessionBindingListener) value;
+ listener.valueBound(sessionBindingEvent);
+ }
+ valueReplaced(sessionBindingEvent);
+ }
+
+ protected abstract void valueReplaced(
+ HttpSessionBindingEvent sessionBindingEvent);
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#removeValue(java.lang.String)
+ */
+ public void removeValue(String name) {
+ removeAttribute(name);
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#setAttribute(java.lang.String,
+ * java.lang.Object)
+ */
+ public void setAttribute(String name, Object value) {
+ checkValid();
+ if (null == value) {
+ removeAttribute(name);
+ } else {
+ Object oldValue = attributes.put(name, value);
+ if (null != oldValue) {
+ replacedInSession(name, oldValue, value);
+ } else {
+ boundToSession(name, value);
+ }
+ }
+ }
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.http.HttpSession#setMaxInactiveInterval(int)
+ */
+ public void setMaxInactiveInterval(int interval) {
+ this.inactiveTime = interval;
+
+ }
+
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServletContext.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServletContext.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServletContext.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,297 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Set;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.Servlet;
+import javax.servlet.ServletContext;
+import javax.servlet.ServletContextAttributeEvent;
+import javax.servlet.ServletContextAttributeListener;
+import javax.servlet.ServletException;
+
+import org.richfaces.test.ServerLogger;
+
+/**
+ * @author asmirnov
+ *
+ */
+public abstract class StagingServletContext implements ServletContext {
+
+ private static final Logger log = ServerLogger.SERVER.getLogger();
+
+ public static final String CONTEXT_PATH = "";
+
+ private static final String APPLICATION_NAME = "stub";
+ private final Map<String, Object> attributes = new HashMap<String, Object>();
+ private Map<String,String> initParameters = new HashMap<String, String>();
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
+ */
+ public Object getAttribute(String name) {
+ return attributes.get(name);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getAttributeNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getAttributeNames() {
+ return Collections.enumeration(attributes.keySet());
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getContext(java.lang.String)
+ */
+ public ServletContext getContext(String uripath) {
+ // stub server has only one context.
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getContextPath()
+ */
+ public String getContextPath() {
+ // Test always run in the root context.
+ return CONTEXT_PATH;
+ }
+
+ public void addInitParameters(Map<String,String>parameters) {
+ initParameters.putAll(parameters);
+ }
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
+ */
+ public String getInitParameter(String name) {
+ return initParameters.get(name);
+ }
+
+
+ /**
+ * Put new init parameter to the Map.
+ * @param name
+ * @param value
+ */
+ public void setInitParameter(String name, String value) {
+ initParameters.put(name, value);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getInitParameterNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getInitParameterNames() {
+ return Collections.enumeration(initParameters.keySet());
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getMajorVersion()
+ */
+ public int getMajorVersion() {
+ return 2;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
+ */
+ public String getMimeType(String file) {
+ // TODO create mime-types table.
+ log.info("unimplemented servlet context method getMimeType");
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getMinorVersion()
+ */
+ public int getMinorVersion() {
+ return 5;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
+ */
+ public RequestDispatcher getNamedDispatcher(String name) {
+ // TODO create stub dispatcher.
+ log.info("unimplemented response method getNamedDispatcher");
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
+ */
+ public String getRealPath(String path) {
+ // we always use 'virtual' configuration.
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
+ */
+ public RequestDispatcher getRequestDispatcher(String path) {
+ // TODO implement stub dispatcher.
+ log.info("unimplemented response method getRequestDispatcher");
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getResource(java.lang.String)
+ */
+ public URL getResource(String path) throws MalformedURLException {
+ URL url = null;
+ ServerResource resource = getServerResource(path);
+ if(null != resource){
+ url = resource.getURL();
+ }
+ return url;
+ }
+
+ /**
+ * @param path
+ * @return
+ */
+ protected abstract ServerResource getServerResource(String path);
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
+ */
+ public InputStream getResourceAsStream(String path) {
+ ServerResource resource = getServerResource(path);
+ if(null != resource){
+ try {
+ return resource.getAsStream();
+ } catch (IOException e) {
+ return null;
+ }
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
+ */
+ @SuppressWarnings("unchecked")
+ public Set getResourcePaths(String path) {
+ ServerResource resource = getServerResource(path);
+ if(null != resource){
+ return resource.getPaths();
+ }
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getServerInfo()
+ */
+ public String getServerInfo() {
+ return "Stub test server";
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getServlet(java.lang.String)
+ */
+ public Servlet getServlet(String name) throws ServletException {
+ // always return null.
+ log.info("unimplemented response method getServlet");
+ return null;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getServletContextName()
+ */
+ public String getServletContextName() {
+ // Stub server has no declared name.
+ return APPLICATION_NAME;
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getServletNames()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getServletNames() {
+ log.info("unimplemented response method getServletNames");
+ return Collections.enumeration(Collections.EMPTY_LIST);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#getServlets()
+ */
+ @SuppressWarnings("unchecked")
+ public Enumeration getServlets() {
+ log.info("unimplemented response method getServlets");
+ return Collections.enumeration(Collections.EMPTY_LIST);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#log(java.lang.String)
+ */
+ public void log(String msg) {
+ log.finest(msg);
+
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String)
+ */
+ public void log(Exception exception, String msg) {
+ log.log(Level.FINEST, msg, exception);
+
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable)
+ */
+ public void log(String message, Throwable throwable) {
+ log.log(Level.FINEST, message, throwable);
+ }
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
+ */
+ public void removeAttribute(String name) {
+ // TODO - inform listeners
+ Object removed = attributes.remove(name);
+ if(null != removed){
+ valueUnbound(new ServletContextAttributeEvent(this,name,removed));
+ }
+ }
+
+
+ /* (non-Javadoc)
+ * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
+ */
+ public void setAttribute(String name, Object object) {
+ // TODO - inform listeners
+ if (null == object) {
+ removeAttribute(name);
+ } else {
+ Object oldValue = attributes.put(name, object);
+ ServletContextAttributeEvent event = new ServletContextAttributeEvent(this,name,object);
+ if(null != oldValue){
+ valueReplaced(event);
+ } else {
+ valueBound(event);
+ }
+ }
+ }
+
+ protected abstract void valueBound(ServletContextAttributeEvent event);
+
+ protected abstract void valueReplaced(ServletContextAttributeEvent event);
+
+ protected abstract void valueUnbound(
+ ServletContextAttributeEvent servletContextAttributeEvent);
+
+}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StaticServlet.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,44 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import javax.servlet.ServletException;
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.HttpServlet;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author asmirnov
- *
- */
-@SuppressWarnings("serial")
-public class StaticServlet extends HttpServlet {
-
- @Override
- protected void doGet(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- InputStream inputStream = getServletContext().getResourceAsStream(req.getServletPath());
- if(null != inputStream){
- ServletOutputStream outputStream = resp.getOutputStream();
- int c;
- while((c = inputStream.read())>0){
- outputStream.write(c);
- }
- inputStream.close();
- outputStream.close();
- } else {
- resp.sendError(404, "not found");
- }
- }
-
- @Override
- protected void doPost(HttpServletRequest req, HttpServletResponse resp)
- throws ServletException, IOException {
- doGet(req, resp);
- }
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java (from rev 11094, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StaticServlet.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaticServlet.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,44 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.io.InputStream;
+
+import javax.servlet.ServletException;
+import javax.servlet.ServletOutputStream;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * @author asmirnov
+ *
+ */
+@SuppressWarnings("serial")
+public class StaticServlet extends HttpServlet {
+
+ @Override
+ protected void doGet(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ InputStream inputStream = getServletContext().getResourceAsStream(req.getServletPath());
+ if(null != inputStream){
+ ServletOutputStream outputStream = resp.getOutputStream();
+ int c;
+ while((c = inputStream.read())>0){
+ outputStream.write(c);
+ }
+ inputStream.close();
+ outputStream.close();
+ } else {
+ resp.sendError(404, "not found");
+ }
+ }
+
+ @Override
+ protected void doPost(HttpServletRequest req, HttpServletResponse resp)
+ throws ServletException, IOException {
+ doGet(req, resp);
+ }
+}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpRequest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StubHttpRequest.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpRequest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,483 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.UnsupportedEncodingException;
-import java.security.Principal;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.ServletInputStream;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletRequest;
-import javax.servlet.http.HttpSession;
-
-import org.richfaces.collections.collect.ImmutableCollection;
-import org.richfaces.collections.collect.ImmutableList;
-import org.richfaces.collections.collect.Multimap;
-import org.richfaces.collections.collect.Multimaps;
-
-/**
- * @author asmirnov
- *
- */
-public abstract class StubHttpRequest implements HttpServletRequest {
-
- public static final String LOCALHOST = "localhost";
- public static final String HTTP = "http";
- public static final String LOCALHOST_IP = "127.0.0.1";
- public static final String UTF8 = "UTF-8";
-
-
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getAuthType()
- */
- public String getAuthType() {
- // TODO configure test auth.
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getContextPath()
- */
- public String getContextPath() {
- return StubServletContext.CONTEXT_PATH;
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletRequest#getDateHeader(java.lang.String)
- */
- public long getDateHeader(String name) {
- // TODO create headers support
- return -1;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getHeader(java.lang.String)
- */
- public String getHeader(String name) {
- // TODO create headers support
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getHeaderNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getHeaderNames() {
- // TODO create headers support
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getHeaders(java.lang.String)
- */
- @SuppressWarnings("unchecked")
- public Enumeration getHeaders(String name) {
- // TODO create headers support
- return Collections.enumeration(Collections.EMPTY_LIST);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getIntHeader(java.lang.String)
- */
- public int getIntHeader(String name) {
- // TODO create headers support
- return -1;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getPathTranslated()
- */
- public String getPathTranslated() {
- // we have only 'virtual' server.
- return null;
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getRemoteUser()
- */
- public String getRemoteUser() {
- // TODO configure test auth.
- return null;
- }
-
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getRequestURL()
- */
- public StringBuffer getRequestURL() {
- StringBuffer requestURL = new StringBuffer(HTTP + "://" + LOCALHOST
- + getRequestURI());
- return requestURL;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getRequestedSessionId()
- */
- public String getRequestedSessionId() {
- return StubHttpSession.SESSION_ID;
- }
-
-
- private StubHttpSession session;
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getSession()
- */
- public HttpSession getSession() {
- if (session == null) {
- session = new StubHttpSession();
- }
- return session;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getSession(boolean)
- */
- public HttpSession getSession(boolean create) {
- if (session == null && create) {
- session = new StubHttpSession();
- }
- return session;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#getUserPrincipal()
- */
- public Principal getUserPrincipal() {
- // TODO implement test auth.
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromCookie()
- */
- public boolean isRequestedSessionIdFromCookie() {
- // test do not supports cookie
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromURL()
- */
- public boolean isRequestedSessionIdFromURL() {
- return true;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdFromUrl()
- */
- public boolean isRequestedSessionIdFromUrl() {
- return true;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#isRequestedSessionIdValid()
- */
- public boolean isRequestedSessionIdValid() {
- return session != null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletRequest#isUserInRole(java.lang.String)
- */
- public boolean isUserInRole(String role) {
- // TODO implement test auth.
- return false;
- }
-
- private Map<String, Object> attributes = new HashMap<String, Object>();
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getAttribute(java.lang.String)
- */
- public Object getAttribute(String name) {
- return attributes.get(name);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getAttributeNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getAttributeNames() {
- return Collections.enumeration(attributes.keySet());
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getCharacterEncoding()
- */
- public String getCharacterEncoding() {
- return UTF8;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getContentLength()
- */
- public int getContentLength() {
- return -1;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getContentType()
- */
- public String getContentType() {
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getInputStream()
- */
- public ServletInputStream getInputStream() throws IOException {
- // TODO implement post stream.
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getLocalAddr()
- */
- public String getLocalAddr() {
- return LOCALHOST_IP;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getLocalName()
- */
- public String getLocalName() {
- return LOCALHOST;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getLocalPort()
- */
- public int getLocalPort() {
- return 80;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getLocale()
- */
- public Locale getLocale() {
- return Locale.US;
- }
-
- private final ImmutableCollection<Locale> locales = ImmutableList.of(
- Locale.US, Locale.GERMANY);
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getLocales()
- */
- public Enumeration getLocales() {
- // TODO Auto-generated method stub
- return Collections.enumeration(locales);
- }
-
- private String characterEncoding;
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getProtocol()
- */
- public String getProtocol() {
- return "HTTP/1.1";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getReader()
- */
- public BufferedReader getReader() throws IOException {
- // TODO implements request buffer.
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getRealPath(java.lang.String)
- */
- public String getRealPath(String path) {
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getRemoteAddr()
- */
- public String getRemoteAddr() {
- return LOCALHOST_IP;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getRemoteHost()
- */
- public String getRemoteHost() {
- return LOCALHOST;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getRemotePort()
- */
- public int getRemotePort() {
- return 1223340;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getRequestDispatcher(java.lang.String)
- */
- public RequestDispatcher getRequestDispatcher(String path) {
- // TODO Auto-generated method stub
- return null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getScheme()
- */
- public String getScheme() {
- return HTTP;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getServerName()
- */
- public String getServerName() {
- return LOCALHOST;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#getServerPort()
- */
- public int getServerPort() {
- return 80;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#isSecure()
- */
- public boolean isSecure() {
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#removeAttribute(java.lang.String)
- */
- public void removeAttribute(String name) {
- attributes.remove(name);
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#setAttribute(java.lang.String,
- * java.lang.Object)
- */
- public void setAttribute(String name, Object o) {
- attributes.put(name, o);
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletRequest#setCharacterEncoding(java.lang.String)
- */
- public void setCharacterEncoding(String env)
- throws UnsupportedEncodingException {
- this.characterEncoding=env;
-
- }
-
-}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpResponse.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StubHttpResponse.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpResponse.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,402 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Locale;
-
-import javax.servlet.ServletOutputStream;
-import javax.servlet.http.Cookie;
-import javax.servlet.http.HttpServletResponse;
-
-/**
- * @author asmirnov
- *
- */
-public abstract class StubHttpResponse implements HttpServletResponse {
-
-
- private int status = 0;
-
- private String redirectLocation = null;
-
- private String errorMessage = null;
-
- private int bufferSize = 8196;
-
- private StringWriter outputWriter;
-
- private ByteArrayOutputStream outputStream;
-
- private PrintWriter printWriter;
-
- private ServletOutputStream servletOutputStream;
-
- private Locale locale = Locale.US;
-
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#addDateHeader(java.lang.String,
- * long)
- */
- public void addDateHeader(String name, long date) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#addHeader(java.lang.String,
- * java.lang.String)
- */
- public void addHeader(String name, String value) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#addIntHeader(java.lang.String,
- * int)
- */
- public void addIntHeader(String name, int value) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#containsHeader(java.lang.String)
- */
- public boolean containsHeader(String name) {
- // TODO Auto-generated method stub
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#encodeRedirectURL(java.lang.String
- * )
- */
- public String encodeRedirectURL(String url) {
- return url;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#encodeRedirectUrl(java.lang.String
- * )
- */
- public String encodeRedirectUrl(String url) {
- // TODO Auto-generated method stub
- return encodeRedirectURL(url);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#encodeURL(java.lang.String)
- */
- public String encodeURL(String url) {
- return url;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#encodeUrl(java.lang.String)
- */
- public String encodeUrl(String url) {
- return encodeURL(url);
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#sendError(int)
- */
- public void sendError(int sc) throws IOException {
- status = sc;
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#sendError(int,
- * java.lang.String)
- */
- public void sendError(int sc, String msg) throws IOException {
- status = sc;
- errorMessage = msg;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#sendRedirect(java.lang.String)
- */
- public void sendRedirect(String location) throws IOException {
- redirectLocation = location;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#setDateHeader(java.lang.String,
- * long)
- */
- public void setDateHeader(String name, long date) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#setHeader(java.lang.String,
- * java.lang.String)
- */
- public void setHeader(String name, String value) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see
- * javax.servlet.http.HttpServletResponse#setIntHeader(java.lang.String,
- * int)
- */
- public void setIntHeader(String name, int value) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#setStatus(int)
- */
- public void setStatus(int sc) {
- status = sc;
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.http.HttpServletResponse#setStatus(int,
- * java.lang.String)
- */
- public void setStatus(int sc, String sm) {
- status = sc;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#flushBuffer()
- */
- public void flushBuffer() throws IOException {
- // do nothing
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getBufferSize()
- */
- public int getBufferSize() {
- return bufferSize;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getCharacterEncoding()
- */
- public String getCharacterEncoding() {
- return StubHttpRequest.UTF8;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getContentType()
- */
- public String getContentType() {
- return "text/html;charset=UTF-8";
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getLocale()
- */
- public Locale getLocale() {
- return locale;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getOutputStream()
- */
- public ServletOutputStream getOutputStream() throws IOException {
- if (null != this.outputWriter) {
- throw new IllegalStateException();
- }
- if (this.outputStream == null) {
- this.outputStream = new ByteArrayOutputStream(getBufferSize());
- servletOutputStream = new ServletOutputStream(){
-
- @Override
- public void write(int b) throws IOException {
- StubHttpResponse.this.outputStream.write(b);
- }
-
- };
- }
- return servletOutputStream;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#getWriter()
- */
- public PrintWriter getWriter() throws IOException {
- if (null != this.outputStream) {
- throw new IllegalStateException();
- }
- if (this.outputWriter == null) {
- this.outputWriter = new StringWriter(getBufferSize());
- printWriter = new PrintWriter(outputWriter);
- }
- return printWriter;
- }
-
-
- public String getWriterContent() {
- if(null != this.outputWriter){
- return this.outputWriter.toString();
- }
- return null;
- }
-
- public byte[] getStreamContent() {
- if(null!=outputStream){
- return outputStream.toByteArray();
- }
- return null;
- }
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#isCommitted()
- */
- public boolean isCommitted() {
- // TODO Auto-generated method stub
- return false;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#reset()
- */
- public void reset() {
- if(isCommitted()){
- throw new IllegalStateException();
- }
- resetBuffer();
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#resetBuffer()
- */
- public void resetBuffer() {
- if(isCommitted()){
- throw new IllegalStateException();
- }
- this.servletOutputStream = null;
- this.outputStream = null;
- this.printWriter = null;
- this.outputWriter = null;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#setBufferSize(int)
- */
- public void setBufferSize(int size) {
- this.bufferSize = size;
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#setCharacterEncoding(java.lang.String)
- */
- public void setCharacterEncoding(String charset) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#setContentLength(int)
- */
- public void setContentLength(int len) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#setContentType(java.lang.String)
- */
- public void setContentType(String type) {
- // TODO Auto-generated method stub
-
- }
-
- /*
- * (non-Javadoc)
- *
- * @see javax.servlet.ServletResponse#setLocale(java.util.Locale)
- */
- public void setLocale(Locale loc) {
- this.locale = loc;
-
- }
-
-}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpSession.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StubHttpSession.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubHttpSession.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,156 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.util.Enumeration;
-
-import javax.servlet.ServletContext;
-import javax.servlet.http.HttpSession;
-import javax.servlet.http.HttpSessionContext;
-
-/**
- * @author asmirnov
- *
- */
-public class StubHttpSession implements HttpSession {
-
- public static final String SESSION_ID="1234567890";
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getAttribute(java.lang.String)
- */
- public Object getAttribute(String name) {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getAttributeNames()
- */
- public Enumeration getAttributeNames() {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getCreationTime()
- */
- public long getCreationTime() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getId()
- */
- public String getId() {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getLastAccessedTime()
- */
- public long getLastAccessedTime() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getMaxInactiveInterval()
- */
- public int getMaxInactiveInterval() {
- // TODO Auto-generated method stub
- return 0;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getServletContext()
- */
- public ServletContext getServletContext() {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getSessionContext()
- */
- public HttpSessionContext getSessionContext() {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getValue(java.lang.String)
- */
- public Object getValue(String name) {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#getValueNames()
- */
- public String[] getValueNames() {
- // TODO Auto-generated method stub
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#invalidate()
- */
- public void invalidate() {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#isNew()
- */
- public boolean isNew() {
- // TODO Auto-generated method stub
- return false;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#putValue(java.lang.String, java.lang.Object)
- */
- public void putValue(String name, Object value) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#removeAttribute(java.lang.String)
- */
- public void removeAttribute(String name) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#removeValue(java.lang.String)
- */
- public void removeValue(String name) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#setAttribute(java.lang.String, java.lang.Object)
- */
- public void setAttribute(String name, Object value) {
- // TODO Auto-generated method stub
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.http.HttpSession#setMaxInactiveInterval(int)
- */
- public void setMaxInactiveInterval(int interval) {
- // TODO Auto-generated method stub
-
- }
-
-}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletConfig.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StubServletConfig.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletConfig.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,70 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.servlet.ServletConfig;
-import javax.servlet.ServletContext;
-
-/**
- * @author asmirnov
- *
- */
-public class StubServletConfig implements ServletConfig {
-
- public static final String FACES_SERVLET = "Faces Servlet";
-
- private final ServletContext context;
-
- private Map<String, String> initParameters ;
-
-
-
- public StubServletConfig(ServletContext context) {
- this.context = context;
- this.initParameters = new HashMap<String, String>();
- }
-
- public StubServletConfig(ServletContext context,Map<String, String> initParameters) {
- this.context = context;
- this.initParameters = initParameters;
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletConfig#getInitParameter(java.lang.String)
- */
- public String getInitParameter(String name) {
- return initParameters.get(name);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletConfig#getInitParameterNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getInitParameterNames() {
- return Collections.enumeration(initParameters.keySet());
- }
-
- public void setInitParameter(String name, String value) {
- initParameters.put(name, value);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletConfig#getServletContext()
- */
- public ServletContext getServletContext() {
- return context;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletConfig#getServletName()
- */
- public String getServletName() {
- return FACES_SERVLET;
- }
-
-}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletContext.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/stub/StubServletContext.java 2008-10-30 00:26:08 UTC (rev 10973)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StubServletContext.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,267 +0,0 @@
-/**
- *
- */
-package org.richfaces.test.stub;
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Set;
-
-import javax.servlet.RequestDispatcher;
-import javax.servlet.Servlet;
-import javax.servlet.ServletContext;
-import javax.servlet.ServletException;
-
-/**
- * @author asmirnov
- *
- */
-public class StubServletContext implements ServletContext {
-
- public static final String CONTEXT_PATH = "";
- private final Map<String, Object> attributes = new HashMap<String, Object>();
- private final ServerResource serverRoot;
-
- private Map<String,String> initParameters = new HashMap<String, String>();
-
- public StubServletContext(ServerResource serverRoot) {
- this.serverRoot = serverRoot;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getAttribute(java.lang.String)
- */
- public Object getAttribute(String name) {
- return attributes.get(name);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getAttributeNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getAttributeNames() {
- return Collections.enumeration(attributes.keySet());
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getContext(java.lang.String)
- */
- public ServletContext getContext(String uripath) {
- // stub server has only one context.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getContextPath()
- */
- public String getContextPath() {
- // Test always run in the root context.
- return CONTEXT_PATH;
- }
-
- public void addInitParameters(Map<String,String>parameters) {
- initParameters.putAll(parameters);
- }
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getInitParameter(java.lang.String)
- */
- public String getInitParameter(String name) {
- return initParameters.get(name);
- }
-
-
- /**
- * Put new init parameter to the Map.
- * @param name
- * @param value
- */
- public void setInitParameter(String name, String value) {
- initParameters.put(name, value);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getInitParameterNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getInitParameterNames() {
- return Collections.enumeration(initParameters.keySet());
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getMajorVersion()
- */
- public int getMajorVersion() {
- return 2;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
- */
- public String getMimeType(String file) {
- // TODO create mime-types table.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getMinorVersion()
- */
- public int getMinorVersion() {
- return 5;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getNamedDispatcher(java.lang.String)
- */
- public RequestDispatcher getNamedDispatcher(String name) {
- // TODO create stub dispatcher.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getRealPath(java.lang.String)
- */
- public String getRealPath(String path) {
- // we always use 'virtual' configuration.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getRequestDispatcher(java.lang.String)
- */
- public RequestDispatcher getRequestDispatcher(String path) {
- // TODO implement stub dispatcher.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getResource(java.lang.String)
- */
- public URL getResource(String path) throws MalformedURLException {
- URL url = null;
- ServerResource resource = getServerResource(path);
- if(null != resource){
- url = resource.getURL();
- }
- return url;
- }
-
- /**
- * @param path
- * @return
- */
- protected ServerResource getServerResource(String path) {
- return serverRoot.getResource(new ServerResourcePath(path));
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getResourceAsStream(java.lang.String)
- */
- public InputStream getResourceAsStream(String path) {
- ServerResource resource = getServerResource(path);
- if(null != resource){
- try {
- return resource.getAsStream();
- } catch (IOException e) {
- return null;
- }
- }
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getResourcePaths(java.lang.String)
- */
- @SuppressWarnings("unchecked")
- public Set getResourcePaths(String path) {
- ServerResource resource = getServerResource(path);
- if(null != resource){
- return resource.getPaths();
- }
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getServerInfo()
- */
- public String getServerInfo() {
- return "Stub test server";
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getServlet(java.lang.String)
- */
- public Servlet getServlet(String name) throws ServletException {
- // always return null.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getServletContextName()
- */
- public String getServletContextName() {
- // Stub server has no declared name.
- return null;
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getServletNames()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getServletNames() {
- return Collections.enumeration(Collections.EMPTY_LIST);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#getServlets()
- */
- @SuppressWarnings("unchecked")
- public Enumeration getServlets() {
- return Collections.enumeration(Collections.EMPTY_LIST);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#log(java.lang.String)
- */
- public void log(String msg) {
- // TODO implement logging.
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#log(java.lang.Exception, java.lang.String)
- */
- public void log(Exception exception, String msg) {
- // TODO implement logging.
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#log(java.lang.String, java.lang.Throwable)
- */
- public void log(String message, Throwable throwable) {
- // TODO implement logging.
-
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#removeAttribute(java.lang.String)
- */
- public void removeAttribute(String name) {
- attributes.remove(name);
- }
-
- /* (non-Javadoc)
- * @see javax.servlet.ServletContext#setAttribute(java.lang.String, java.lang.Object)
- */
- public void setAttribute(String name, Object object) {
- attributes.put(name, object);
- }
-
-}
Copied: branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml (from rev 11026, branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/faces-config.xml 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,69 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<!--
+ DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
+
+ Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
+
+ The contents of this file are subject to the terms of either the GNU
+ General Public License Version 2 only ("GPL") or the Common Development
+ and Distribution License("CDDL") (collectively, the "License"). You
+ may not use this file except in compliance with the License. You can obtain
+ a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
+ or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
+ language governing permissions and limitations under the License.
+
+ When distributing the software, include this License Header Notice in each
+ file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
+ Sun designates this particular file as subject to the "Classpath" exception
+ as provided by Sun in the GPL Version 2 section of the License file that
+ accompanied this code. If applicable, add the following below the License
+ Header, with the fields enclosed by brackets [] replaced by your own
+ identifying information: "Portions Copyrighted [year]
+ [name of copyright owner]"
+
+ Contributor(s):
+
+ If you wish your version of this file to be governed by only the CDDL or
+ only the GPL Version 2, indicate your decision by adding "[Contributor]
+ elects to include this software in this distribution under the [CDDL or GPL
+ Version 2] license." If you don't indicate a single choice of license, a
+ recipient has the option to distribute your version of this file under
+ either the CDDL, the GPL Version 2 or to extend the choice of license to
+ its licensees as provided above. However, if you add GPL Version 2 code
+ and therefore, elected the GPL Version 2 license, then the option applies
+ only if the new code is made subject to such option by the copyright
+ holder.
+-->
+
+<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
+ version="2.0">
+
+ <!-- our NumberBean we created before -->
+ <managed-bean>
+ <managed-bean-name>HelloBean</managed-bean-name>
+ <managed-bean-class>org.richfaces.test.HelloBean</managed-bean-class>
+ <managed-bean-scope>session</managed-bean-scope>
+ </managed-bean>
+
+ <!-- going from guess.xhtml to response.xhtml -->
+ <navigation-rule>
+ <from-view-id>/hello.xhtml</from-view-id>
+ <navigation-case>
+ <from-outcome>success</from-outcome>
+ <to-view-id>/response.xhtml</to-view-id>
+ </navigation-case>
+ </navigation-rule>
+
+ <!-- going from response.xhtml to guess.xhtml -->
+ <navigation-rule>
+ <from-view-id>/response.xhtml</from-view-id>
+ <navigation-case>
+ <from-outcome>success</from-outcome>
+ <to-view-id>/hello.xhtml</to-view-id>
+ </navigation-case>
+ </navigation-rule>
+
+</faces-config>
Copied: branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/web.xml (from rev 10995, branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/web.xml)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/web.xml (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/resources/org/richfaces/test/web.xml 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,59 @@
+<?xml version='1.0' encoding='UTF-8'?>
+
+<web-app version="2.5"
+ xmlns="http://java.sun.com/xml/ns/javaee"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
+
+ <display-name>Stub test</display-name>
+ <description>
+ Stub testing server
+ </description>
+ <context-param>
+ <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
+ <param-value>server</param-value>
+ </context-param>
+ <context-param>
+ <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
+ <param-value>.xhtml</param-value>
+ </context-param>
+ <context-param>
+ <param-name>com.sun.faces.validateXml</param-name>
+ <param-value>true</param-value>
+ <description>
+ Set this flag to true if you want the JavaServer Faces
+ Reference Implementation to validate the XML in your
+ faces-config.xml resources against the DTD. Default
+ value is false.
+ </description>
+ </context-param>
+ <context-param>
+ <param-name>com.sun.faces.verifyObjects</param-name>
+ <param-value>true</param-value>
+ <description>
+ Set this flag to true if you want the JavaServer Faces
+ Reference Implementation to verify that all of the application
+ objects you have configured (components, converters,
+ renderers, and validators) can be successfully created.
+ Default value is false.
+ </description>
+ </context-param>
+
+ <!-- Faces Servlet -->
+ <servlet>
+ <servlet-name>Faces Servlet</servlet-name>
+ <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
+ </servlet>
+
+
+ <!-- Faces Servlet Mapping -->
+
+ <servlet-mapping>
+ <servlet-name>Faces Servlet</servlet-name>
+ <url-pattern>*.jsf</url-pattern>
+ </servlet-mapping>
+
+
+</web-app>
+
+
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -15,16 +15,21 @@
import javax.faces.application.StateManager;
import javax.faces.application.ViewHandler;
import javax.faces.webapp.FacesServlet;
+import javax.servlet.http.HttpSession;
import org.junit.After;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
+import org.w3c.dom.Element;
import com.gargoylesoftware.htmlunit.Page;
import com.gargoylesoftware.htmlunit.WebClient;
+import com.gargoylesoftware.htmlunit.html.HtmlForm;
+import com.gargoylesoftware.htmlunit.html.HtmlInput;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
+import com.gargoylesoftware.htmlunit.html.SubmittableElement;
import com.sun.faces.config.ConfigureListener;
import com.sun.faces.util.FacesLogger;
@@ -32,60 +37,22 @@
* @author asmirnov
*
*/
-public class FacesServerTest {
+public class FacesServerTest extends AbstractFacesTest {
- private static ClassLoader contextClassLoader;
- private static LocalServer facesServer;
-
/**
* @throws java.lang.Exception
*/
- @BeforeClass
- public static void setUpBeforeClass() throws Exception {
- contextClassLoader = Thread.currentThread().getContextClassLoader();
- Thread.currentThread().setContextClassLoader(
- LocalServer.class.getClassLoader());
- InputStream stream = FacesServerTest.class
- .getResourceAsStream("logging.properties");
- if (null != stream) {
- try {
- LogManager.getLogManager().readConfiguration(stream);
- } finally {
- stream.close();
- }
- }
- facesServer = new LocalServer();
- facesServer.addServlet("*.jsf", new FacesServlet());
- facesServer.addResource("/WEB-INF/web.xml",
- "org/richfaces/test/web.xml");
- facesServer.addResource("/WEB-INF/faces-config.xml",
- "org/richfaces/test/faces-config.xml");
- facesServer.addResource("/hello.xhtml", "org/richfaces/test/hello.xhtml");
- facesServer.addInitParameter(StateManager.STATE_SAVING_METHOD_PARAM_NAME, StateManager.STATE_SAVING_METHOD_SERVER);
- facesServer.addInitParameter(ViewHandler.DEFAULT_SUFFIX_PARAM_NAME, ".xhtml");
- facesServer.addInitParameter("com.sun.faces.validateXml", "true");
- facesServer.addInitParameter("com.sun.faces.verifyObjects", "true");
- facesServer.addWebListener(new ConfigureListener());
- facesServer.init();
- }
-
- /**
- * @throws java.lang.Exception
- */
- @AfterClass
- public static void tearDownAfterClass() throws Exception {
- facesServer.destroy();
- Thread.currentThread().setContextClassLoader(contextClassLoader);
- }
-
- /**
- * @throws java.lang.Exception
- */
@Before
public void setUp() throws Exception {
}
+ @Override
+ protected void setupWebContent(StagingServer facesServer) {
+ facesServer.addResource("/hello.xhtml", "org/richfaces/test/hello.xhtml");
+ facesServer.addResource("/response.xhtml", "org/richfaces/test/response.xhtml");
+ facesServer.addResource("/wave.med.gif", "org/richfaces/test/wave.med.gif");
+ }
/**
* @throws java.lang.Exception
*/
@@ -95,15 +62,33 @@
/**
* Test method for
- * {@link org.richfaces.test.LocalServer#getConnection(java.net.URL)}.
+ * {@link org.richfaces.test.StagingServer#getConnection(java.net.URL)}.
*
* @throws Exception
*/
@Test
- public void testGetConnection() throws Exception {
+ public void testHelloFacelets() throws Exception {
WebClient webClient = new LocalWebClient(facesServer);
HtmlPage page = webClient.getPage("http://localhost/hello.jsf");
- System.out.println(page.asXml());
+ System.out.println(page.asXml());
+ Element submitElement = page.getElementById("helloForm:submit");
+ HtmlForm htmlForm = page.getFormByName("helloForm");
+ htmlForm.getInputByName("helloForm:username");
+ assertNotNull(htmlForm);
+ HtmlInput input = htmlForm.getInputByName("helloForm:username");
+ assertNotNull(input);
+ input.setValueAttribute("foo");
+ HtmlPage responsePage = (HtmlPage) htmlForm.submit((SubmittableElement) submitElement);
+ assertNotNull(responsePage);
+ System.out.println(responsePage.asXml());
+ HttpSession session = facesServer.getSession(false);
+ assertNotNull(session);
+ HelloBean bean = (HelloBean) session.getAttribute("HelloBean");
+ assertNotNull(bean);
+ assertEquals("foo", bean.getName());
+ Element span = responsePage.getElementById("responseform:userLabel");
+ assertNotNull(span);
+ assertEquals("foo", span.getTextContent().trim());
}
}
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourcePathTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourcePathTest.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourcePathTest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -6,6 +6,7 @@
import static org.junit.Assert.*;
import org.junit.Test;
+import org.richfaces.test.staging.ServerResourcePath;
/**
* @author asmirnov
@@ -14,7 +15,7 @@
public class ServerResourcePathTest {
/**
- * Test method for {@link org.richfaces.test.stub.ServerResourcePath#ServerResourcePath(java.lang.String)}.
+ * Test method for {@link org.richfaces.test.staging.ServerResourcePath#ServerResourcePath(java.lang.String)}.
*/
@Test
public void testRootPath() {
@@ -26,7 +27,7 @@
}
/**
- * Test method for {@link org.richfaces.test.stub.ServerResourcePath#ServerResourcePath(java.lang.String)}.
+ * Test method for {@link org.richfaces.test.staging.ServerResourcePath#ServerResourcePath(java.lang.String)}.
*/
@Test
public void testWebInfPath() {
@@ -44,7 +45,7 @@
}
/**
- * Test method for {@link org.richfaces.test.stub.ServerResourcePath#ServerResourcePath(java.lang.String)}.
+ * Test method for {@link org.richfaces.test.staging.ServerResourcePath#ServerResourcePath(java.lang.String)}.
*/
@Test
public void testWebInfTrainingSlashPath() {
@@ -63,7 +64,7 @@
/**
- * Test method for {@link org.richfaces.test.stub.ServerResourcePath#ServerResourcePath(java.lang.String)}.
+ * Test method for {@link org.richfaces.test.staging.ServerResourcePath#ServerResourcePath(java.lang.String)}.
*/
@Test
public void testWebXmlPath() {
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourceTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourceTest.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServerResourceTest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -11,6 +11,10 @@
import java.util.Set;
import org.junit.Test;
+import org.richfaces.test.staging.ClasspathServerResource;
+import org.richfaces.test.staging.ServerResource;
+import org.richfaces.test.staging.ServerResourcePath;
+import org.richfaces.test.staging.ServerResourcesDirectory;
/**
* @author asmirnov
@@ -46,7 +50,7 @@
/**
* Test method for
- * {@link org.richfaces.test.stub.ServerResourcesDirectory#addResource(org.richfaces.test.stub.ServerResourcePath, org.richfaces.test.stub.ServerResource)}
+ * {@link org.richfaces.test.staging.ServerResourcesDirectory#addResource(org.richfaces.test.staging.ServerResourcePath, org.richfaces.test.staging.ServerResource)}
* .
*/
@Test
@@ -69,7 +73,7 @@
/**
* Test method for
- * {@link org.richfaces.test.stub.ServerResourcesDirectory#getResource(org.richfaces.test.stub.ServerResourcePath)}
+ * {@link org.richfaces.test.staging.ServerResourcesDirectory#getResource(org.richfaces.test.staging.ServerResourcePath)}
* .
*/
@Test
@@ -90,7 +94,7 @@
/**
* Test method for
- * {@link org.richfaces.test.stub.ServerResourcesDirectory#getResource(org.richfaces.test.stub.ServerResourcePath)}
+ * {@link org.richfaces.test.staging.ServerResourcesDirectory#getResource(org.richfaces.test.staging.ServerResourcePath)}
* .
*/
@Test
@@ -107,7 +111,7 @@
/**
* Test method for
- * {@link org.richfaces.test.stub.ServerResourcesDirectory#getAsStream()}.
+ * {@link org.richfaces.test.staging.ServerResourcesDirectory#getAsStream()}.
*
* @throws IOException
*/
@@ -129,7 +133,7 @@
/**
* Test method for
- * {@link org.richfaces.test.stub.ServerResourcesDirectory#getURL()}.
+ * {@link org.richfaces.test.staging.ServerResourcesDirectory#getURL()}.
*/
@Test
public void testGetURL() {
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServletTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServletTest.java 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/stub/ServletTest.java 2008-11-12 00:43:49 UTC (rev 11095)
@@ -6,13 +6,18 @@
import javax.servlet.ServletException;
import org.junit.Test;
+import org.richfaces.test.staging.RequestChain;
+import org.richfaces.test.staging.ServerResource;
+import org.richfaces.test.staging.ServletContainer;
+import org.richfaces.test.staging.StaticServlet;
+import org.richfaces.test.staging.StagingServletContext;
public class ServletTest {
@Test
public void testIsApplicable() {
StaticServlet staticServlet = new StaticServlet();
- ServletContainer servlet = new ServletContainer("/foo/*",staticServlet);
+ RequestChain servlet = new ServletContainer("/foo/*",staticServlet);
assertTrue(servlet.isApplicable("/foo/bar.jsf"));
assertFalse(servlet.isApplicable("/foz/bar.jsf"));
assertFalse(servlet.isApplicable("bar"));
@@ -30,7 +35,7 @@
@Test
public void testGetServletPath() {
StaticServlet staticServlet = new StaticServlet();
- ServletContainer servlet = new ServletContainer("/foo/*",staticServlet);
+ RequestChain servlet = new ServletContainer("/foo/*",staticServlet);
assertEquals("/foo/", servlet.getServletPath("/foo/bar.jsf"));
assertNull(servlet.getServletPath("/foz/bar.jsf"));
servlet = new ServletContainer("*.jsf",staticServlet);
@@ -40,7 +45,7 @@
@Test
public void testGetPathInfo() {
StaticServlet staticServlet = new StaticServlet();
- ServletContainer servlet = new ServletContainer("/foo/*",staticServlet);
+ RequestChain servlet = new ServletContainer("/foo/*",staticServlet);
assertEquals("bar.jsf", servlet.getPathInfo("/foo/bar.jsf"));
assertNull(servlet.getPathInfo("/foz/bar.jsf"));
servlet = new ServletContainer("*.jsf",staticServlet);
@@ -51,8 +56,8 @@
@Test
public void testInit() throws ServletException {
StaticServlet staticServlet = new StaticServlet();
- ServletContainer servlet = new ServletContainer("/foo/*",staticServlet);
- StubServletContext context = new StubServletContext(){
+ RequestChain servlet = new ServletContainer("/foo/*",staticServlet);
+ StagingServletContext context = new StagingServletContext(){
@Override
protected ServerResource getServerResource(String path) {
Deleted: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/faces-config.xml 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,69 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<!--
- DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
-
- Copyright 1997-2007 Sun Microsystems, Inc. All rights reserved.
-
- The contents of this file are subject to the terms of either the GNU
- General Public License Version 2 only ("GPL") or the Common Development
- and Distribution License("CDDL") (collectively, the "License"). You
- may not use this file except in compliance with the License. You can obtain
- a copy of the License at https://glassfish.dev.java.net/public/CDDL+GPL.html
- or glassfish/bootstrap/legal/LICENSE.txt. See the License for the specific
- language governing permissions and limitations under the License.
-
- When distributing the software, include this License Header Notice in each
- file and include the License file at glassfish/bootstrap/legal/LICENSE.txt.
- Sun designates this particular file as subject to the "Classpath" exception
- as provided by Sun in the GPL Version 2 section of the License file that
- accompanied this code. If applicable, add the following below the License
- Header, with the fields enclosed by brackets [] replaced by your own
- identifying information: "Portions Copyrighted [year]
- [name of copyright owner]"
-
- Contributor(s):
-
- If you wish your version of this file to be governed by only the CDDL or
- only the GPL Version 2, indicate your decision by adding "[Contributor]
- elects to include this software in this distribution under the [CDDL or GPL
- Version 2] license." If you don't indicate a single choice of license, a
- recipient has the option to distribute your version of this file under
- either the CDDL, the GPL Version 2 or to extend the choice of license to
- its licensees as provided above. However, if you add GPL Version 2 code
- and therefore, elected the GPL Version 2 license, then the option applies
- only if the new code is made subject to such option by the copyright
- holder.
--->
-
-<faces-config xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd"
- version="2.0">
-
- <!-- our NumberBean we created before -->
- <managed-bean>
- <managed-bean-name>HelloBean</managed-bean-name>
- <managed-bean-class>org.richfaces.test.HelloBean</managed-bean-class>
- <managed-bean-scope>session</managed-bean-scope>
- </managed-bean>
-
- <!-- going from guess.xhtml to response.xhtml -->
- <navigation-rule>
- <from-view-id>/hello.xhtml</from-view-id>
- <navigation-case>
- <from-outcome>success</from-outcome>
- <to-view-id>/response.xhtml</to-view-id>
- </navigation-case>
- </navigation-rule>
-
- <!-- going from response.xhtml to guess.xhtml -->
- <navigation-rule>
- <from-view-id>/response.xhtml</from-view-id>
- <navigation-case>
- <from-outcome>success</from-outcome>
- <to-view-id>/hello.xhtml</to-view-id>
- </navigation-case>
- </navigation-rule>
-
-</faces-config>
Added: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/response.xhtml
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/response.xhtml (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/response.xhtml 2008-11-12 00:43:49 UTC (rev 11095)
@@ -0,0 +1,13 @@
+<!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:ui="http://java.sun.com/jsf/facelets"
+ xmlns:h="http://java.sun.com/jsf/html">
+<body>
+
+ <h:form id="responseform">
+ <h:graphicImage id="waveImg" url="/wave.med.gif" />
+ <h2>Hi, <h:outputText id="userLabel" value=" #{HelloBean.name}" /> </h2>
+ <h:commandButton id="back" value="Back" action="success" />
+ </h:form>
+</body>
+</html>
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/response.xhtml
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/wave.med.gif
===================================================================
(Binary files differ)
Property changes on: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/wave.med.gif
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Deleted: branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/web.xml
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/web.xml 2008-11-11 20:12:38 UTC (rev 11094)
+++ branches/jsf2.0/framework/jsf-test/src/test/resources/org/richfaces/test/web.xml 2008-11-12 00:43:49 UTC (rev 11095)
@@ -1,59 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-
-<web-app version="2.5"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" >
-
- <display-name>Stub test</display-name>
- <description>
- Stub testing server
- </description>
- <context-param>
- <param-name>javax.faces.STATE_SAVING_METHOD</param-name>
- <param-value>server</param-value>
- </context-param>
- <context-param>
- <param-name>javax.faces.DEFAULT_SUFFIX</param-name>
- <param-value>.xhtml</param-value>
- </context-param>
- <context-param>
- <param-name>com.sun.faces.validateXml</param-name>
- <param-value>true</param-value>
- <description>
- Set this flag to true if you want the JavaServer Faces
- Reference Implementation to validate the XML in your
- faces-config.xml resources against the DTD. Default
- value is false.
- </description>
- </context-param>
- <context-param>
- <param-name>com.sun.faces.verifyObjects</param-name>
- <param-value>true</param-value>
- <description>
- Set this flag to true if you want the JavaServer Faces
- Reference Implementation to verify that all of the application
- objects you have configured (components, converters,
- renderers, and validators) can be successfully created.
- Default value is false.
- </description>
- </context-param>
-
- <!-- Faces Servlet -->
- <servlet>
- <servlet-name>Faces Servlet</servlet-name>
- <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
- </servlet>
-
-
- <!-- Faces Servlet Mapping -->
-
- <servlet-mapping>
- <servlet-name>Faces Servlet</servlet-name>
- <url-pattern>*.jsf</url-pattern>
- </servlet-mapping>
-
-
-</web-app>
-
-
17 years, 5 months
JBoss Rich Faces SVN: r11094 - in trunk/docs/migrationguide/en/src/main/resources: images and 2 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: artdaw
Date: 2008-11-11 15:12:38 -0500 (Tue, 11 Nov 2008)
New Revision: 11094
Added:
trunk/docs/migrationguide/en/src/main/resources/images/close.png
trunk/docs/migrationguide/en/src/main/resources/images/feedback_logo.png
trunk/docs/migrationguide/en/src/main/resources/script/effects.js
trunk/docs/migrationguide/en/src/main/resources/script/prototype-1.6.0.2.js
trunk/docs/migrationguide/en/src/main/resources/script/scriptaculous.js
trunk/docs/migrationguide/en/src/main/resources/script/send_mail.php
Modified:
trunk/docs/migrationguide/en/src/main/resources/css/html.css
trunk/docs/migrationguide/en/src/main/resources/script/toggle.js
trunk/docs/migrationguide/en/src/main/resources/xslt/org/jboss/richfaces/xhtml.xsl
Log:
https://jira.jboss.org/jira/browse/RF-4644 - feedback was implemented in the multipage guide
Modified: trunk/docs/migrationguide/en/src/main/resources/css/html.css
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/css/html.css 2008-11-11 19:51:34 UTC (rev 11093)
+++ trunk/docs/migrationguide/en/src/main/resources/css/html.css 2008-11-11 20:12:38 UTC (rev 11094)
@@ -148,4 +148,120 @@
}
div.table-contents table{
font-size:12px;
+}
+
+* html div#feedback-wrapper {position: absolute;
+top:expression(eval(document.compatMode &&
+document.compatMode=='CSS1Compat') ?
+documentElement.scrollTop
++(documentElement.clientHeight-this.clientHeight)
+: document.body.scrollTop
++(document.body.clientHeight-this.clientHeight));}
+
+
+#feedback-wrapper{
+ margin: 0px;
+ padding: 0px;
+ position:fixed;
+ bottom:0px;
+ right:0px;
+ height:322px;
+ width: 136px;
+ overflow: hidden;
+}
+
+#feedback-link{
+ float: left;
+ display: block;
+}
+
+#feedback-state{
+ font-weight: bold;
+ height: 20px;
+ width: 460px;
+ overflow: hidden;
+ float: left;
+}
+/*
+#feedback-maincontainer{
+ width: 520px;
+ height: 320px;
+ border: 1px dotted #CCC;
+ font-size: 12px;
+ font-family: Arial, Helvetica, sans-serif;
+ margin-left: 132px;
+ text-align:center;
+ background: #F5F5F5;
+ padding:0 50px 30px 10px;
+}
+*/
+
+#feedback-maincontainer{
+ z-index:2000;
+ padding: 5px;
+ text-align: center;
+
+ background: #F5F5F5;
+ border: 1px solid #CCC;
+ position: fixed;
+ top: 250px;
+ left: 350px;
+
+}
+*html #feedback-maincontainer{
+ width: 550px;
+}
+#feedback-slidedown{
+ z-index:2000;
+ padding: 5px;
+ text-align: left;
+ width:300px;
+ height:100px;
+ background: #F5F5F5;
+ border: 1px solid #CCC;
+ position: absolute;
+ top: -250px;
+ right:-400px;
+ overflow: hidden;
+}
+
+.feedback-textbox-div{
+ font-weight: bold;
+ padding-right: 20px;
+ margin: 5px 0px 5px 0px;
+ text-align: right;
+ color: #415973;
+ vertical-align: middle;
+}
+
+#message{
+ width: 200px;
+ height: 150px;
+ padding: 2px;
+}
+
+.feedback-formbutton{
+font-size: 12px;
+font-family: Arial, Helvetica, sans-serif;
+color: #415973;
+}
+
+.feedback-textbox, #message{
+background-color:#FFFFFF;
+border:1px solid #A5ACB2;
+padding:2px 1px 3px 5px;
+width: 400px;
+font-size: 12px;
+font-family: Arial, Helvetica, sans-serif;
+color: #000;
+}
+
+.feedback-button-container{
+margin: 0px 5px 0px 0px;
+}
+
+.feedback-images{
+border:0;
+margin:0;
+display: inline;
}
\ No newline at end of file
Added: trunk/docs/migrationguide/en/src/main/resources/images/close.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/migrationguide/en/src/main/resources/images/close.png
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/migrationguide/en/src/main/resources/images/feedback_logo.png
===================================================================
(Binary files differ)
Property changes on: trunk/docs/migrationguide/en/src/main/resources/images/feedback_logo.png
___________________________________________________________________
Name: svn:executable
+ *
Name: svn:mime-type
+ application/octet-stream
Added: trunk/docs/migrationguide/en/src/main/resources/script/effects.js
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/script/effects.js (rev 0)
+++ trunk/docs/migrationguide/en/src/main/resources/script/effects.js 2008-11-11 20:12:38 UTC (rev 11094)
@@ -0,0 +1,1122 @@
+// script.aculo.us effects.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+// Contributors:
+// Justin Palmer (http://encytemedia.com/)
+// Mark Pilgrim (http://diveintomark.org/)
+// Martin Bialasinki
+//
+// script.aculo.us is freely distributable under the terms of an MIT-style license.
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+// converts rgb() and #xxx to #xxxxxx format,
+// returns self (or first argument) if not convertable
+String.prototype.parseColor = function() {
+ var color = '#';
+ if (this.slice(0,4) == 'rgb(') {
+ var cols = this.slice(4,this.length-1).split(',');
+ var i=0; do { color += parseInt(cols[i]).toColorPart() } while (++i<3);
+ } else {
+ if (this.slice(0,1) == '#') {
+ if (this.length==4) for(var i=1;i<4;i++) color += (this.charAt(i) + this.charAt(i)).toLowerCase();
+ if (this.length==7) color = this.toLowerCase();
+ }
+ }
+ return (color.length==7 ? color : (arguments[0] || this));
+};
+
+/*--------------------------------------------------------------------------*/
+
+Element.collectTextNodes = function(element) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ (node.hasChildNodes() ? Element.collectTextNodes(node) : ''));
+ }).flatten().join('');
+};
+
+Element.collectTextNodesIgnoreClass = function(element, className) {
+ return $A($(element).childNodes).collect( function(node) {
+ return (node.nodeType==3 ? node.nodeValue :
+ ((node.hasChildNodes() && !Element.hasClassName(node,className)) ?
+ Element.collectTextNodesIgnoreClass(node, className) : ''));
+ }).flatten().join('');
+};
+
+Element.setContentZoom = function(element, percent) {
+ element = $(element);
+ element.setStyle({fontSize: (percent/100) + 'em'});
+ if (Prototype.Browser.WebKit) window.scrollBy(0,0);
+ return element;
+};
+
+Element.getInlineOpacity = function(element){
+ return $(element).style.opacity || '';
+};
+
+Element.forceRerendering = function(element) {
+ try {
+ element = $(element);
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch(e) { }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Effect = {
+ _elementDoesNotExistError: {
+ name: 'ElementDoesNotExistError',
+ message: 'The specified DOM element does not exist, but is required for this effect to operate'
+ },
+ Transitions: {
+ linear: Prototype.K,
+ sinoidal: function(pos) {
+ return (-Math.cos(pos*Math.PI)/2) + 0.5;
+ },
+ reverse: function(pos) {
+ return 1-pos;
+ },
+ flicker: function(pos) {
+ var pos = ((-Math.cos(pos*Math.PI)/4) + 0.75) + Math.random()/4;
+ return pos > 1 ? 1 : pos;
+ },
+ wobble: function(pos) {
+ return (-Math.cos(pos*Math.PI*(9*pos))/2) + 0.5;
+ },
+ pulse: function(pos, pulses) {
+ pulses = pulses || 5;
+ return (
+ ((pos % (1/pulses)) * pulses).round() == 0 ?
+ ((pos * pulses * 2) - (pos * pulses * 2).floor()) :
+ 1 - ((pos * pulses * 2) - (pos * pulses * 2).floor())
+ );
+ },
+ spring: function(pos) {
+ return 1 - (Math.cos(pos * 4.5 * Math.PI) * Math.exp(-pos * 6));
+ },
+ none: function(pos) {
+ return 0;
+ },
+ full: function(pos) {
+ return 1;
+ }
+ },
+ DefaultOptions: {
+ duration: 1.0, // seconds
+ fps: 100, // 100= assume 66fps max.
+ sync: false, // true for combining
+ from: 0.0,
+ to: 1.0,
+ delay: 0.0,
+ queue: 'parallel'
+ },
+ tagifyText: function(element) {
+ var tagifyStyle = 'position:relative';
+ if (Prototype.Browser.IE) tagifyStyle += ';zoom:1';
+
+ element = $(element);
+ $A(element.childNodes).each( function(child) {
+ if (child.nodeType==3) {
+ child.nodeValue.toArray().each( function(character) {
+ element.insertBefore(
+ new Element('span', {style: tagifyStyle}).update(
+ character == ' ' ? String.fromCharCode(160) : character),
+ child);
+ });
+ Element.remove(child);
+ }
+ });
+ },
+ multiple: function(element, effect) {
+ var elements;
+ if (((typeof element == 'object') ||
+ Object.isFunction(element)) &&
+ (element.length))
+ elements = element;
+ else
+ elements = $(element).childNodes;
+
+ var options = Object.extend({
+ speed: 0.1,
+ delay: 0.0
+ }, arguments[2] || { });
+ var masterDelay = options.delay;
+
+ $A(elements).each( function(element, index) {
+ new effect(element, Object.extend(options, { delay: index * options.speed + masterDelay }));
+ });
+ },
+ PAIRS: {
+ 'slide': ['SlideDown','SlideUp'],
+ 'blind': ['BlindDown','BlindUp'],
+ 'appear': ['Appear','Fade']
+ },
+ toggle: function(element, effect) {
+ element = $(element);
+ effect = (effect || 'appear').toLowerCase();
+ var options = Object.extend({
+ queue: { position:'end', scope:(element.id || 'global'), limit: 1 }
+ }, arguments[2] || { });
+ Effect[element.visible() ?
+ Effect.PAIRS[effect][1] : Effect.PAIRS[effect][0]](element, options);
+ }
+};
+
+Effect.DefaultOptions.transition = Effect.Transitions.sinoidal;
+
+/* ------------- core effects ------------- */
+
+Effect.ScopedQueue = Class.create(Enumerable, {
+ initialize: function() {
+ this.effects = [];
+ this.interval = null;
+ },
+ _each: function(iterator) {
+ this.effects._each(iterator);
+ },
+ add: function(effect) {
+ var timestamp = new Date().getTime();
+
+ var position = Object.isString(effect.options.queue) ?
+ effect.options.queue : effect.options.queue.position;
+
+ switch(position) {
+ case 'front':
+ // move unstarted effects after this effect
+ this.effects.findAll(function(e){ return e.state=='idle' }).each( function(e) {
+ e.startOn += effect.finishOn;
+ e.finishOn += effect.finishOn;
+ });
+ break;
+ case 'with-last':
+ timestamp = this.effects.pluck('startOn').max() || timestamp;
+ break;
+ case 'end':
+ // start effect after last queued effect has finished
+ timestamp = this.effects.pluck('finishOn').max() || timestamp;
+ break;
+ }
+
+ effect.startOn += timestamp;
+ effect.finishOn += timestamp;
+
+ if (!effect.options.queue.limit || (this.effects.length < effect.options.queue.limit))
+ this.effects.push(effect);
+
+ if (!this.interval)
+ this.interval = setInterval(this.loop.bind(this), 15);
+ },
+ remove: function(effect) {
+ this.effects = this.effects.reject(function(e) { return e==effect });
+ if (this.effects.length == 0) {
+ clearInterval(this.interval);
+ this.interval = null;
+ }
+ },
+ loop: function() {
+ var timePos = new Date().getTime();
+ for(var i=0, len=this.effects.length;i<len;i++)
+ this.effects[i] && this.effects[i].loop(timePos);
+ }
+});
+
+Effect.Queues = {
+ instances: $H(),
+ get: function(queueName) {
+ if (!Object.isString(queueName)) return queueName;
+
+ return this.instances.get(queueName) ||
+ this.instances.set(queueName, new Effect.ScopedQueue());
+ }
+};
+Effect.Queue = Effect.Queues.get('global');
+
+Effect.Base = Class.create({
+ position: null,
+ start: function(options) {
+ function codeForEvent(options,eventName){
+ return (
+ (options[eventName+'Internal'] ? 'this.options.'+eventName+'Internal(this);' : '') +
+ (options[eventName] ? 'this.options.'+eventName+'(this);' : '')
+ );
+ }
+ if (options && options.transition === false) options.transition = Effect.Transitions.linear;
+ this.options = Object.extend(Object.extend({ },Effect.DefaultOptions), options || { });
+ this.currentFrame = 0;
+ this.state = 'idle';
+ this.startOn = this.options.delay*1000;
+ this.finishOn = this.startOn+(this.options.duration*1000);
+ this.fromToDelta = this.options.to-this.options.from;
+ this.totalTime = this.finishOn-this.startOn;
+ this.totalFrames = this.options.fps*this.options.duration;
+
+ eval('this.render = function(pos){ '+
+ 'if (this.state=="idle"){this.state="running";'+
+ codeForEvent(this.options,'beforeSetup')+
+ (this.setup ? 'this.setup();':'')+
+ codeForEvent(this.options,'afterSetup')+
+ '};if (this.state=="running"){'+
+ 'pos=this.options.transition(pos)*'+this.fromToDelta+'+'+this.options.from+';'+
+ 'this.position=pos;'+
+ codeForEvent(this.options,'beforeUpdate')+
+ (this.update ? 'this.update(pos);':'')+
+ codeForEvent(this.options,'afterUpdate')+
+ '}}');
+
+ this.event('beforeStart');
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).add(this);
+ },
+ loop: function(timePos) {
+ if (timePos >= this.startOn) {
+ if (timePos >= this.finishOn) {
+ this.render(1.0);
+ this.cancel();
+ this.event('beforeFinish');
+ if (this.finish) this.finish();
+ this.event('afterFinish');
+ return;
+ }
+ var pos = (timePos - this.startOn) / this.totalTime,
+ frame = (pos * this.totalFrames).round();
+ if (frame > this.currentFrame) {
+ this.render(pos);
+ this.currentFrame = frame;
+ }
+ }
+ },
+ cancel: function() {
+ if (!this.options.sync)
+ Effect.Queues.get(Object.isString(this.options.queue) ?
+ 'global' : this.options.queue.scope).remove(this);
+ this.state = 'finished';
+ },
+ event: function(eventName) {
+ if (this.options[eventName + 'Internal']) this.options[eventName + 'Internal'](this);
+ if (this.options[eventName]) this.options[eventName](this);
+ },
+ inspect: function() {
+ var data = $H();
+ for(property in this)
+ if (!Object.isFunction(this[property])) data.set(property, this[property]);
+ return '#<Effect:' + data.inspect() + ',options:' + $H(this.options).inspect() + '>';
+ }
+});
+
+Effect.Parallel = Class.create(Effect.Base, {
+ initialize: function(effects) {
+ this.effects = effects || [];
+ this.start(arguments[1]);
+ },
+ update: function(position) {
+ this.effects.invoke('render', position);
+ },
+ finish: function(position) {
+ this.effects.each( function(effect) {
+ effect.render(1.0);
+ effect.cancel();
+ effect.event('beforeFinish');
+ if (effect.finish) effect.finish(position);
+ effect.event('afterFinish');
+ });
+ }
+});
+
+Effect.Tween = Class.create(Effect.Base, {
+ initialize: function(object, from, to) {
+ object = Object.isString(object) ? $(object) : object;
+ var args = $A(arguments), method = args.last(),
+ options = args.length == 5 ? args[3] : null;
+ this.method = Object.isFunction(method) ? method.bind(object) :
+ Object.isFunction(object[method]) ? object[method].bind(object) :
+ function(value) { object[method] = value };
+ this.start(Object.extend({ from: from, to: to }, options || { }));
+ },
+ update: function(position) {
+ this.method(position);
+ }
+});
+
+Effect.Event = Class.create(Effect.Base, {
+ initialize: function() {
+ this.start(Object.extend({ duration: 0 }, arguments[0] || { }));
+ },
+ update: Prototype.emptyFunction
+});
+
+Effect.Opacity = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ // make this work on IE on elements without 'layout'
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ var options = Object.extend({
+ from: this.element.getOpacity() || 0.0,
+ to: 1.0
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ update: function(position) {
+ this.element.setOpacity(position);
+ }
+});
+
+Effect.Move = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ x: 0,
+ y: 0,
+ mode: 'relative'
+ }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.element.makePositioned();
+ this.originalLeft = parseFloat(this.element.getStyle('left') || '0');
+ this.originalTop = parseFloat(this.element.getStyle('top') || '0');
+ if (this.options.mode == 'absolute') {
+ this.options.x = this.options.x - this.originalLeft;
+ this.options.y = this.options.y - this.originalTop;
+ }
+ },
+ update: function(position) {
+ this.element.setStyle({
+ left: (this.options.x * position + this.originalLeft).round() + 'px',
+ top: (this.options.y * position + this.originalTop).round() + 'px'
+ });
+ }
+});
+
+// for backwards compatibility
+Effect.MoveBy = function(element, toTop, toLeft) {
+ return new Effect.Move(element,
+ Object.extend({ x: toLeft, y: toTop }, arguments[3] || { }));
+};
+
+Effect.Scale = Class.create(Effect.Base, {
+ initialize: function(element, percent) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ scaleX: true,
+ scaleY: true,
+ scaleContent: true,
+ scaleFromCenter: false,
+ scaleMode: 'box', // 'box' or 'contents' or { } with provided values
+ scaleFrom: 100.0,
+ scaleTo: percent
+ }, arguments[2] || { });
+ this.start(options);
+ },
+ setup: function() {
+ this.restoreAfterFinish = this.options.restoreAfterFinish || false;
+ this.elementPositioning = this.element.getStyle('position');
+
+ this.originalStyle = { };
+ ['top','left','width','height','fontSize'].each( function(k) {
+ this.originalStyle[k] = this.element.style[k];
+ }.bind(this));
+
+ this.originalTop = this.element.offsetTop;
+ this.originalLeft = this.element.offsetLeft;
+
+ var fontSize = this.element.getStyle('font-size') || '100%';
+ ['em','px','%','pt'].each( function(fontSizeType) {
+ if (fontSize.indexOf(fontSizeType)>0) {
+ this.fontSize = parseFloat(fontSize);
+ this.fontSizeType = fontSizeType;
+ }
+ }.bind(this));
+
+ this.factor = (this.options.scaleTo - this.options.scaleFrom)/100;
+
+ this.dims = null;
+ if (this.options.scaleMode=='box')
+ this.dims = [this.element.offsetHeight, this.element.offsetWidth];
+ if (/^content/.test(this.options.scaleMode))
+ this.dims = [this.element.scrollHeight, this.element.scrollWidth];
+ if (!this.dims)
+ this.dims = [this.options.scaleMode.originalHeight,
+ this.options.scaleMode.originalWidth];
+ },
+ update: function(position) {
+ var currentScale = (this.options.scaleFrom/100.0) + (this.factor * position);
+ if (this.options.scaleContent && this.fontSize)
+ this.element.setStyle({fontSize: this.fontSize * currentScale + this.fontSizeType });
+ this.setDimensions(this.dims[0] * currentScale, this.dims[1] * currentScale);
+ },
+ finish: function(position) {
+ if (this.restoreAfterFinish) this.element.setStyle(this.originalStyle);
+ },
+ setDimensions: function(height, width) {
+ var d = { };
+ if (this.options.scaleX) d.width = width.round() + 'px';
+ if (this.options.scaleY) d.height = height.round() + 'px';
+ if (this.options.scaleFromCenter) {
+ var topd = (height - this.dims[0])/2;
+ var leftd = (width - this.dims[1])/2;
+ if (this.elementPositioning == 'absolute') {
+ if (this.options.scaleY) d.top = this.originalTop-topd + 'px';
+ if (this.options.scaleX) d.left = this.originalLeft-leftd + 'px';
+ } else {
+ if (this.options.scaleY) d.top = -topd + 'px';
+ if (this.options.scaleX) d.left = -leftd + 'px';
+ }
+ }
+ this.element.setStyle(d);
+ }
+});
+
+Effect.Highlight = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({ startcolor: '#ffff99' }, arguments[1] || { });
+ this.start(options);
+ },
+ setup: function() {
+ // Prevent executing on elements not in the layout flow
+ if (this.element.getStyle('display')=='none') { this.cancel(); return; }
+ // Disable background image during the effect
+ this.oldStyle = { };
+ if (!this.options.keepBackgroundImage) {
+ this.oldStyle.backgroundImage = this.element.getStyle('background-image');
+ this.element.setStyle({backgroundImage: 'none'});
+ }
+ if (!this.options.endcolor)
+ this.options.endcolor = this.element.getStyle('background-color').parseColor('#ffffff');
+ if (!this.options.restorecolor)
+ this.options.restorecolor = this.element.getStyle('background-color');
+ // init color calculations
+ this._base = $R(0,2).map(function(i){ return parseInt(this.options.startcolor.slice(i*2+1,i*2+3),16) }.bind(this));
+ this._delta = $R(0,2).map(function(i){ return parseInt(this.options.endcolor.slice(i*2+1,i*2+3),16)-this._base[i] }.bind(this));
+ },
+ update: function(position) {
+ this.element.setStyle({backgroundColor: $R(0,2).inject('#',function(m,v,i){
+ return m+((this._base[i]+(this._delta[i]*position)).round().toColorPart()); }.bind(this)) });
+ },
+ finish: function() {
+ this.element.setStyle(Object.extend(this.oldStyle, {
+ backgroundColor: this.options.restorecolor
+ }));
+ }
+});
+
+Effect.ScrollTo = function(element) {
+ var options = arguments[1] || { },
+ scrollOffsets = document.viewport.getScrollOffsets(),
+ elementOffsets = $(element).cumulativeOffset(),
+ max = (window.height || document.body.scrollHeight) - document.viewport.getHeight();
+
+ if (options.offset) elementOffsets[1] += options.offset;
+
+ return new Effect.Tween(null,
+ scrollOffsets.top,
+ elementOffsets[1] > max ? max : elementOffsets[1],
+ options,
+ function(p){ scrollTo(scrollOffsets.left, p.round()) }
+ );
+};
+
+/* ------------- combination effects ------------- */
+
+Effect.Fade = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ var options = Object.extend({
+ from: element.getOpacity() || 1.0,
+ to: 0.0,
+ afterFinishInternal: function(effect) {
+ if (effect.options.to!=0) return;
+ effect.element.hide().setStyle({opacity: oldOpacity});
+ }
+ }, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Appear = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ from: (element.getStyle('display') == 'none' ? 0.0 : element.getOpacity() || 0.0),
+ to: 1.0,
+ // force Safari to render floated elements properly
+ afterFinishInternal: function(effect) {
+ effect.element.forceRerendering();
+ },
+ beforeSetup: function(effect) {
+ effect.element.setOpacity(effect.options.from).show();
+ }}, arguments[1] || { });
+ return new Effect.Opacity(element,options);
+};
+
+Effect.Puff = function(element) {
+ element = $(element);
+ var oldStyle = {
+ opacity: element.getInlineOpacity(),
+ position: element.getStyle('position'),
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height
+ };
+ return new Effect.Parallel(
+ [ new Effect.Scale(element, 200,
+ { sync: true, scaleFromCenter: true, scaleContent: true, restoreAfterFinish: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 } ) ],
+ Object.extend({ duration: 1.0,
+ beforeSetupInternal: function(effect) {
+ Position.absolutize(effect.effects[0].element)
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().setStyle(oldStyle); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindUp = function(element) {
+ element = $(element);
+ element.makeClipping();
+ return new Effect.Scale(element, 0,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ restoreAfterFinish: true,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.BlindDown = function(element) {
+ element = $(element);
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: 0,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping();
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.SwitchOff = function(element) {
+ element = $(element);
+ var oldOpacity = element.getInlineOpacity();
+ return new Effect.Appear(element, Object.extend({
+ duration: 0.4,
+ from: 0,
+ transition: Effect.Transitions.flicker,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(effect.element, 1, {
+ duration: 0.3, scaleFromCenter: true,
+ scaleX: false, scaleContent: false, restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned().setStyle({opacity: oldOpacity});
+ }
+ })
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.DropOut = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left'),
+ opacity: element.getInlineOpacity() };
+ return new Effect.Parallel(
+ [ new Effect.Move(element, {x: 0, y: 100, sync: true }),
+ new Effect.Opacity(element, { sync: true, to: 0.0 }) ],
+ Object.extend(
+ { duration: 0.5,
+ beforeSetup: function(effect) {
+ effect.effects[0].element.makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoPositioned().setStyle(oldStyle);
+ }
+ }, arguments[1] || { }));
+};
+
+Effect.Shake = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ distance: 20,
+ duration: 0.5
+ }, arguments[1] || {});
+ var distance = parseFloat(options.distance);
+ var split = parseFloat(options.duration) / 10.0;
+ var oldStyle = {
+ top: element.getStyle('top'),
+ left: element.getStyle('left') };
+ return new Effect.Move(element,
+ { x: distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: distance*2, y: 0, duration: split*2, afterFinishInternal: function(effect) {
+ new Effect.Move(effect.element,
+ { x: -distance, y: 0, duration: split, afterFinishInternal: function(effect) {
+ effect.element.undoPositioned().setStyle(oldStyle);
+ }}) }}) }}) }}) }}) }});
+};
+
+Effect.SlideDown = function(element) {
+ element = $(element).cleanWhitespace();
+ // SlideDown need to have the content of the element wrapped in a container element with fixed height!
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, 100, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ scaleFrom: window.opera ? 0 : 1,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().setStyle({height: '0px'}).show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom}); }
+ }, arguments[1] || { })
+ );
+};
+
+Effect.SlideUp = function(element) {
+ element = $(element).cleanWhitespace();
+ var oldInnerBottom = element.down().getStyle('bottom');
+ var elementDimensions = element.getDimensions();
+ return new Effect.Scale(element, window.opera ? 0 : 1,
+ Object.extend({ scaleContent: false,
+ scaleX: false,
+ scaleMode: 'box',
+ scaleFrom: 100,
+ scaleMode: {originalHeight: elementDimensions.height, originalWidth: elementDimensions.width},
+ restoreAfterFinish: true,
+ afterSetup: function(effect) {
+ effect.element.makePositioned();
+ effect.element.down().makePositioned();
+ if (window.opera) effect.element.setStyle({top: ''});
+ effect.element.makeClipping().show();
+ },
+ afterUpdateInternal: function(effect) {
+ effect.element.down().setStyle({bottom:
+ (effect.dims[0] - effect.element.clientHeight) + 'px' });
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().undoPositioned();
+ effect.element.down().undoPositioned().setStyle({bottom: oldInnerBottom});
+ }
+ }, arguments[1] || { })
+ );
+};
+
+// Bug in opera makes the TD containing this element expand for a instance after finish
+Effect.Squish = function(element) {
+ return new Effect.Scale(element, window.opera ? 1 : 0, {
+ restoreAfterFinish: true,
+ beforeSetup: function(effect) {
+ effect.element.makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping();
+ }
+ });
+};
+
+Effect.Grow = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.full
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var initialMoveX, initialMoveY;
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ initialMoveX = initialMoveY = moveX = moveY = 0;
+ break;
+ case 'top-right':
+ initialMoveX = dims.width;
+ initialMoveY = moveY = 0;
+ moveX = -dims.width;
+ break;
+ case 'bottom-left':
+ initialMoveX = moveX = 0;
+ initialMoveY = dims.height;
+ moveY = -dims.height;
+ break;
+ case 'bottom-right':
+ initialMoveX = dims.width;
+ initialMoveY = dims.height;
+ moveX = -dims.width;
+ moveY = -dims.height;
+ break;
+ case 'center':
+ initialMoveX = dims.width / 2;
+ initialMoveY = dims.height / 2;
+ moveX = -dims.width / 2;
+ moveY = -dims.height / 2;
+ break;
+ }
+
+ return new Effect.Move(element, {
+ x: initialMoveX,
+ y: initialMoveY,
+ duration: 0.01,
+ beforeSetup: function(effect) {
+ effect.element.hide().makeClipping().makePositioned();
+ },
+ afterFinishInternal: function(effect) {
+ new Effect.Parallel(
+ [ new Effect.Opacity(effect.element, { sync: true, to: 1.0, from: 0.0, transition: options.opacityTransition }),
+ new Effect.Move(effect.element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition }),
+ new Effect.Scale(effect.element, 100, {
+ scaleMode: { originalHeight: dims.height, originalWidth: dims.width },
+ sync: true, scaleFrom: window.opera ? 1 : 0, transition: options.scaleTransition, restoreAfterFinish: true})
+ ], Object.extend({
+ beforeSetup: function(effect) {
+ effect.effects[0].element.setStyle({height: '0px'}).show();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.undoClipping().undoPositioned().setStyle(oldStyle);
+ }
+ }, options)
+ )
+ }
+ });
+};
+
+Effect.Shrink = function(element) {
+ element = $(element);
+ var options = Object.extend({
+ direction: 'center',
+ moveTransition: Effect.Transitions.sinoidal,
+ scaleTransition: Effect.Transitions.sinoidal,
+ opacityTransition: Effect.Transitions.none
+ }, arguments[1] || { });
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ height: element.style.height,
+ width: element.style.width,
+ opacity: element.getInlineOpacity() };
+
+ var dims = element.getDimensions();
+ var moveX, moveY;
+
+ switch (options.direction) {
+ case 'top-left':
+ moveX = moveY = 0;
+ break;
+ case 'top-right':
+ moveX = dims.width;
+ moveY = 0;
+ break;
+ case 'bottom-left':
+ moveX = 0;
+ moveY = dims.height;
+ break;
+ case 'bottom-right':
+ moveX = dims.width;
+ moveY = dims.height;
+ break;
+ case 'center':
+ moveX = dims.width / 2;
+ moveY = dims.height / 2;
+ break;
+ }
+
+ return new Effect.Parallel(
+ [ new Effect.Opacity(element, { sync: true, to: 0.0, from: 1.0, transition: options.opacityTransition }),
+ new Effect.Scale(element, window.opera ? 1 : 0, { sync: true, transition: options.scaleTransition, restoreAfterFinish: true}),
+ new Effect.Move(element, { x: moveX, y: moveY, sync: true, transition: options.moveTransition })
+ ], Object.extend({
+ beforeStartInternal: function(effect) {
+ effect.effects[0].element.makePositioned().makeClipping();
+ },
+ afterFinishInternal: function(effect) {
+ effect.effects[0].element.hide().undoClipping().undoPositioned().setStyle(oldStyle); }
+ }, options)
+ );
+};
+
+Effect.Pulsate = function(element) {
+ element = $(element);
+ var options = arguments[1] || { };
+ var oldOpacity = element.getInlineOpacity();
+ var transition = options.transition || Effect.Transitions.sinoidal;
+ var reverser = function(pos){ return transition(1-Effect.Transitions.pulse(pos, options.pulses)) };
+ reverser.bind(transition);
+ return new Effect.Opacity(element,
+ Object.extend(Object.extend({ duration: 2.0, from: 0,
+ afterFinishInternal: function(effect) { effect.element.setStyle({opacity: oldOpacity}); }
+ }, options), {transition: reverser}));
+};
+
+Effect.Fold = function(element) {
+ element = $(element);
+ var oldStyle = {
+ top: element.style.top,
+ left: element.style.left,
+ width: element.style.width,
+ height: element.style.height };
+ element.makeClipping();
+ return new Effect.Scale(element, 5, Object.extend({
+ scaleContent: false,
+ scaleX: false,
+ afterFinishInternal: function(effect) {
+ new Effect.Scale(element, 1, {
+ scaleContent: false,
+ scaleY: false,
+ afterFinishInternal: function(effect) {
+ effect.element.hide().undoClipping().setStyle(oldStyle);
+ } });
+ }}, arguments[1] || { }));
+};
+
+Effect.Morph = Class.create(Effect.Base, {
+ initialize: function(element) {
+ this.element = $(element);
+ if (!this.element) throw(Effect._elementDoesNotExistError);
+ var options = Object.extend({
+ style: { }
+ }, arguments[1] || { });
+
+ if (!Object.isString(options.style)) this.style = $H(options.style);
+ else {
+ if (options.style.include(':'))
+ this.style = options.style.parseStyle();
+ else {
+ this.element.addClassName(options.style);
+ this.style = $H(this.element.getStyles());
+ this.element.removeClassName(options.style);
+ var css = this.element.getStyles();
+ this.style = this.style.reject(function(style) {
+ return style.value == css[style.key];
+ });
+ options.afterFinishInternal = function(effect) {
+ effect.element.addClassName(effect.options.style);
+ effect.transforms.each(function(transform) {
+ effect.element.style[transform.style] = '';
+ });
+ }
+ }
+ }
+ this.start(options);
+ },
+
+ setup: function(){
+ function parseColor(color){
+ if (!color || ['rgba(0, 0, 0, 0)','transparent'].include(color)) color = '#ffffff';
+ color = color.parseColor();
+ return $R(0,2).map(function(i){
+ return parseInt( color.slice(i*2+1,i*2+3), 16 )
+ });
+ }
+ this.transforms = this.style.map(function(pair){
+ var property = pair[0], value = pair[1], unit = null;
+
+ if (value.parseColor('#zzzzzz') != '#zzzzzz') {
+ value = value.parseColor();
+ unit = 'color';
+ } else if (property == 'opacity') {
+ value = parseFloat(value);
+ if (Prototype.Browser.IE && (!this.element.currentStyle.hasLayout))
+ this.element.setStyle({zoom: 1});
+ } else if (Element.CSS_LENGTH.test(value)) {
+ var components = value.match(/^([\+\-]?[0-9\.]+)(.*)$/);
+ value = parseFloat(components[1]);
+ unit = (components.length == 3) ? components[2] : null;
+ }
+
+ var originalValue = this.element.getStyle(property);
+ return {
+ style: property.camelize(),
+ originalValue: unit=='color' ? parseColor(originalValue) : parseFloat(originalValue || 0),
+ targetValue: unit=='color' ? parseColor(value) : value,
+ unit: unit
+ };
+ }.bind(this)).reject(function(transform){
+ return (
+ (transform.originalValue == transform.targetValue) ||
+ (
+ transform.unit != 'color' &&
+ (isNaN(transform.originalValue) || isNaN(transform.targetValue))
+ )
+ )
+ });
+ },
+ update: function(position) {
+ var style = { }, transform, i = this.transforms.length;
+ while(i--)
+ style[(transform = this.transforms[i]).style] =
+ transform.unit=='color' ? '#'+
+ (Math.round(transform.originalValue[0]+
+ (transform.targetValue[0]-transform.originalValue[0])*position)).toColorPart() +
+ (Math.round(transform.originalValue[1]+
+ (transform.targetValue[1]-transform.originalValue[1])*position)).toColorPart() +
+ (Math.round(transform.originalValue[2]+
+ (transform.targetValue[2]-transform.originalValue[2])*position)).toColorPart() :
+ (transform.originalValue +
+ (transform.targetValue - transform.originalValue) * position).toFixed(3) +
+ (transform.unit === null ? '' : transform.unit);
+ this.element.setStyle(style, true);
+ }
+});
+
+Effect.Transform = Class.create({
+ initialize: function(tracks){
+ this.tracks = [];
+ this.options = arguments[1] || { };
+ this.addTracks(tracks);
+ },
+ addTracks: function(tracks){
+ tracks.each(function(track){
+ track = $H(track);
+ var data = track.values().first();
+ this.tracks.push($H({
+ ids: track.keys().first(),
+ effect: Effect.Morph,
+ options: { style: data }
+ }));
+ }.bind(this));
+ return this;
+ },
+ play: function(){
+ return new Effect.Parallel(
+ this.tracks.map(function(track){
+ var ids = track.get('ids'), effect = track.get('effect'), options = track.get('options');
+ var elements = [$(ids) || $$(ids)].flatten();
+ return elements.map(function(e){ return new effect(e, Object.extend({ sync:true }, options)) });
+ }).flatten(),
+ this.options
+ );
+ }
+});
+
+Element.CSS_PROPERTIES = $w(
+ 'backgroundColor backgroundPosition borderBottomColor borderBottomStyle ' +
+ 'borderBottomWidth borderLeftColor borderLeftStyle borderLeftWidth ' +
+ 'borderRightColor borderRightStyle borderRightWidth borderSpacing ' +
+ 'borderTopColor borderTopStyle borderTopWidth bottom clip color ' +
+ 'fontSize fontWeight height left letterSpacing lineHeight ' +
+ 'marginBottom marginLeft marginRight marginTop markerOffset maxHeight '+
+ 'maxWidth minHeight minWidth opacity outlineColor outlineOffset ' +
+ 'outlineWidth paddingBottom paddingLeft paddingRight paddingTop ' +
+ 'right textIndent top width wordSpacing zIndex');
+
+Element.CSS_LENGTH = /^(([\+\-]?[0-9\.]+)(em|ex|px|in|cm|mm|pt|pc|\%))|0$/;
+
+String.__parseStyleElement = document.createElement('div');
+String.prototype.parseStyle = function(){
+ var style, styleRules = $H();
+ if (Prototype.Browser.WebKit)
+ style = new Element('div',{style:this}).style;
+ else {
+ String.__parseStyleElement.innerHTML = '<div style="' + this + '"></div>';
+ style = String.__parseStyleElement.childNodes[0].style;
+ }
+
+ Element.CSS_PROPERTIES.each(function(property){
+ if (style[property]) styleRules.set(property, style[property]);
+ });
+
+ if (Prototype.Browser.IE && this.include('opacity'))
+ styleRules.set('opacity', this.match(/opacity:\s*((?:0|1)?(?:\.\d*)?)/)[1]);
+
+ return styleRules;
+};
+
+if (document.defaultView && document.defaultView.getComputedStyle) {
+ Element.getStyles = function(element) {
+ var css = document.defaultView.getComputedStyle($(element), null);
+ return Element.CSS_PROPERTIES.inject({ }, function(styles, property) {
+ styles[property] = css[property];
+ return styles;
+ });
+ };
+} else {
+ Element.getStyles = function(element) {
+ element = $(element);
+ var css = element.currentStyle, styles;
+ styles = Element.CSS_PROPERTIES.inject({ }, function(results, property) {
+ results[property] = css[property];
+ return results;
+ });
+ if (!styles.opacity) styles.opacity = element.getOpacity();
+ return styles;
+ };
+};
+
+Effect.Methods = {
+ morph: function(element, style) {
+ element = $(element);
+ new Effect.Morph(element, Object.extend({ style: style }, arguments[2] || { }));
+ return element;
+ },
+ visualEffect: function(element, effect, options) {
+ element = $(element)
+ var s = effect.dasherize().camelize(), klass = s.charAt(0).toUpperCase() + s.substring(1);
+ new Effect[klass](element, options);
+ return element;
+ },
+ highlight: function(element, options) {
+ element = $(element);
+ new Effect.Highlight(element, options);
+ return element;
+ }
+};
+
+$w('fade appear grow shrink fold blindUp blindDown slideUp slideDown '+
+ 'pulsate shake puff squish switchOff dropOut').each(
+ function(effect) {
+ Effect.Methods[effect] = function(element, options){
+ element = $(element);
+ Effect[effect.charAt(0).toUpperCase() + effect.substring(1)](element, options);
+ return element;
+ }
+ }
+);
+
+$w('getInlineOpacity forceRerendering setContentZoom collectTextNodes collectTextNodesIgnoreClass getStyles').each(
+ function(f) { Effect.Methods[f] = Element[f]; }
+);
+
+Element.addMethods(Effect.Methods);
Property changes on: trunk/docs/migrationguide/en/src/main/resources/script/effects.js
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/docs/migrationguide/en/src/main/resources/script/prototype-1.6.0.2.js
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/script/prototype-1.6.0.2.js (rev 0)
+++ trunk/docs/migrationguide/en/src/main/resources/script/prototype-1.6.0.2.js 2008-11-11 20:12:38 UTC (rev 11094)
@@ -0,0 +1,4240 @@
+/* Prototype JavaScript framework, version 1.6.0.2
+ * (c) 2005-2008 Sam Stephenson
+ *
+ * Prototype is freely distributable under the terms of an MIT-style license.
+ * For details, see the Prototype web site: http://www.prototypejs.org/
+ *
+ *--------------------------------------------------------------------------*/
+
+var Prototype = {
+ Version: '1.6.0.2',
+
+ Browser: {
+ IE: !!(window.attachEvent && !window.opera),
+ Opera: !!window.opera,
+ WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
+ Gecko: navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
+ MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
+ },
+
+ BrowserFeatures: {
+ XPath: !!document.evaluate,
+ ElementExtensions: !!window.HTMLElement,
+ SpecificElementExtensions:
+ document.createElement('div').__proto__ &&
+ document.createElement('div').__proto__ !==
+ document.createElement('form').__proto__
+ },
+
+ ScriptFragment: '<script[^>]*>([\\S\\s]*?)<\/script>',
+ JSONFilter: /^\/\*-secure-([\s\S]*)\*\/\s*$/,
+
+ emptyFunction: function() { },
+ K: function(x) { return x }
+};
+
+if (Prototype.Browser.MobileSafari)
+ Prototype.BrowserFeatures.SpecificElementExtensions = false;
+
+
+/* Based on Alex Arnell's inheritance implementation. */
+var Class = {
+ create: function() {
+ var parent = null, properties = $A(arguments);
+ if (Object.isFunction(properties[0]))
+ parent = properties.shift();
+
+ function klass() {
+ this.initialize.apply(this, arguments);
+ }
+
+ Object.extend(klass, Class.Methods);
+ klass.superclass = parent;
+ klass.subclasses = [];
+
+ if (parent) {
+ var subclass = function() { };
+ subclass.prototype = parent.prototype;
+ klass.prototype = new subclass;
+ parent.subclasses.push(klass);
+ }
+
+ for (var i = 0; i < properties.length; i++)
+ klass.addMethods(properties[i]);
+
+ if (!klass.prototype.initialize)
+ klass.prototype.initialize = Prototype.emptyFunction;
+
+ klass.prototype.constructor = klass;
+
+ return klass;
+ }
+};
+
+Class.Methods = {
+ addMethods: function(source) {
+ var ancestor = this.superclass && this.superclass.prototype;
+ var properties = Object.keys(source);
+
+ if (!Object.keys({ toString: true }).length)
+ properties.push("toString", "valueOf");
+
+ for (var i = 0, length = properties.length; i < length; i++) {
+ var property = properties[i], value = source[property];
+ if (ancestor && Object.isFunction(value) &&
+ value.argumentNames().first() == "$super") {
+ var method = value, value = Object.extend((function(m) {
+ return function() { return ancestor[m].apply(this, arguments) };
+ })(property).wrap(method), {
+ valueOf: function() { return method },
+ toString: function() { return method.toString() }
+ });
+ }
+ this.prototype[property] = value;
+ }
+
+ return this;
+ }
+};
+
+var Abstract = { };
+
+Object.extend = function(destination, source) {
+ for (var property in source)
+ destination[property] = source[property];
+ return destination;
+};
+
+Object.extend(Object, {
+ inspect: function(object) {
+ try {
+ if (Object.isUndefined(object)) return 'undefined';
+ if (object === null) return 'null';
+ return object.inspect ? object.inspect() : String(object);
+ } catch (e) {
+ if (e instanceof RangeError) return '...';
+ throw e;
+ }
+ },
+
+ toJSON: function(object) {
+ var type = typeof object;
+ switch (type) {
+ case 'undefined':
+ case 'function':
+ case 'unknown': return;
+ case 'boolean': return object.toString();
+ }
+
+ if (object === null) return 'null';
+ if (object.toJSON) return object.toJSON();
+ if (Object.isElement(object)) return;
+
+ var results = [];
+ for (var property in object) {
+ var value = Object.toJSON(object[property]);
+ if (!Object.isUndefined(value))
+ results.push(property.toJSON() + ': ' + value);
+ }
+
+ return '{' + results.join(', ') + '}';
+ },
+
+ toQueryString: function(object) {
+ return $H(object).toQueryString();
+ },
+
+ toHTML: function(object) {
+ return object && object.toHTML ? object.toHTML() : String.interpret(object);
+ },
+
+ keys: function(object) {
+ var keys = [];
+ for (var property in object)
+ keys.push(property);
+ return keys;
+ },
+
+ values: function(object) {
+ var values = [];
+ for (var property in object)
+ values.push(object[property]);
+ return values;
+ },
+
+ clone: function(object) {
+ return Object.extend({ }, object);
+ },
+
+ isElement: function(object) {
+ return object && object.nodeType == 1;
+ },
+
+ isArray: function(object) {
+ return object != null && typeof object == "object" &&
+ 'splice' in object && 'join' in object;
+ },
+
+ isHash: function(object) {
+ return object instanceof Hash;
+ },
+
+ isFunction: function(object) {
+ return typeof object == "function";
+ },
+
+ isString: function(object) {
+ return typeof object == "string";
+ },
+
+ isNumber: function(object) {
+ return typeof object == "number";
+ },
+
+ isUndefined: function(object) {
+ return typeof object == "undefined";
+ }
+});
+
+Object.extend(Function.prototype, {
+ argumentNames: function() {
+ var names = this.toString().match(/^[\s\(]*function[^(]*\((.*?)\)/)[1].split(",").invoke("strip");
+ return names.length == 1 && !names[0] ? [] : names;
+ },
+
+ bind: function() {
+ if (arguments.length < 2 && Object.isUndefined(arguments[0])) return this;
+ var __method = this, args = $A(arguments), object = args.shift();
+ return function() {
+ return __method.apply(object, args.concat($A(arguments)));
+ }
+ },
+
+ bindAsEventListener: function() {
+ var __method = this, args = $A(arguments), object = args.shift();
+ return function(event) {
+ return __method.apply(object, [event || window.event].concat(args));
+ }
+ },
+
+ curry: function() {
+ if (!arguments.length) return this;
+ var __method = this, args = $A(arguments);
+ return function() {
+ return __method.apply(this, args.concat($A(arguments)));
+ }
+ },
+
+ delay: function() {
+ var __method = this, args = $A(arguments), timeout = args.shift() * 1000;
+ return window.setTimeout(function() {
+ return __method.apply(__method, args);
+ }, timeout);
+ },
+
+ wrap: function(wrapper) {
+ var __method = this;
+ return function() {
+ return wrapper.apply(this, [__method.bind(this)].concat($A(arguments)));
+ }
+ },
+
+ methodize: function() {
+ if (this._methodized) return this._methodized;
+ var __method = this;
+ return this._methodized = function() {
+ return __method.apply(null, [this].concat($A(arguments)));
+ };
+ }
+});
+
+Function.prototype.defer = Function.prototype.delay.curry(0.01);
+
+Date.prototype.toJSON = function() {
+ return '"' + this.getUTCFullYear() + '-' +
+ (this.getUTCMonth() + 1).toPaddedString(2) + '-' +
+ this.getUTCDate().toPaddedString(2) + 'T' +
+ this.getUTCHours().toPaddedString(2) + ':' +
+ this.getUTCMinutes().toPaddedString(2) + ':' +
+ this.getUTCSeconds().toPaddedString(2) + 'Z"';
+};
+
+var Try = {
+ these: function() {
+ var returnValue;
+
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ var lambda = arguments[i];
+ try {
+ returnValue = lambda();
+ break;
+ } catch (e) { }
+ }
+
+ return returnValue;
+ }
+};
+
+RegExp.prototype.match = RegExp.prototype.test;
+
+RegExp.escape = function(str) {
+ return String(str).replace(/([.*+?^=!:${}()|[\]\/\\])/g, '\\$1');
+};
+
+/*--------------------------------------------------------------------------*/
+
+var PeriodicalExecuter = Class.create({
+ initialize: function(callback, frequency) {
+ this.callback = callback;
+ this.frequency = frequency;
+ this.currentlyExecuting = false;
+
+ this.registerCallback();
+ },
+
+ registerCallback: function() {
+ this.timer = setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
+ },
+
+ execute: function() {
+ this.callback(this);
+ },
+
+ stop: function() {
+ if (!this.timer) return;
+ clearInterval(this.timer);
+ this.timer = null;
+ },
+
+ onTimerEvent: function() {
+ if (!this.currentlyExecuting) {
+ try {
+ this.currentlyExecuting = true;
+ this.execute();
+ } finally {
+ this.currentlyExecuting = false;
+ }
+ }
+ }
+});
+Object.extend(String, {
+ interpret: function(value) {
+ return value == null ? '' : String(value);
+ },
+ specialChar: {
+ '\b': '\\b',
+ '\t': '\\t',
+ '\n': '\\n',
+ '\f': '\\f',
+ '\r': '\\r',
+ '\\': '\\\\'
+ }
+});
+
+Object.extend(String.prototype, {
+ gsub: function(pattern, replacement) {
+ var result = '', source = this, match;
+ replacement = arguments.callee.prepareReplacement(replacement);
+
+ while (source.length > 0) {
+ if (match = source.match(pattern)) {
+ result += source.slice(0, match.index);
+ result += String.interpret(replacement(match));
+ source = source.slice(match.index + match[0].length);
+ } else {
+ result += source, source = '';
+ }
+ }
+ return result;
+ },
+
+ sub: function(pattern, replacement, count) {
+ replacement = this.gsub.prepareReplacement(replacement);
+ count = Object.isUndefined(count) ? 1 : count;
+
+ return this.gsub(pattern, function(match) {
+ if (--count < 0) return match[0];
+ return replacement(match);
+ });
+ },
+
+ scan: function(pattern, iterator) {
+ this.gsub(pattern, iterator);
+ return String(this);
+ },
+
+ truncate: function(length, truncation) {
+ length = length || 30;
+ truncation = Object.isUndefined(truncation) ? '...' : truncation;
+ return this.length > length ?
+ this.slice(0, length - truncation.length) + truncation : String(this);
+ },
+
+ strip: function() {
+ return this.replace(/^\s+/, '').replace(/\s+$/, '');
+ },
+
+ stripTags: function() {
+ return this.replace(/<\/?[^>]+>/gi, '');
+ },
+
+ stripScripts: function() {
+ return this.replace(new RegExp(Prototype.ScriptFragment, 'img'), '');
+ },
+
+ extractScripts: function() {
+ var matchAll = new RegExp(Prototype.ScriptFragment, 'img');
+ var matchOne = new RegExp(Prototype.ScriptFragment, 'im');
+ return (this.match(matchAll) || []).map(function(scriptTag) {
+ var result = (scriptTag.match(matchOne) || ['', ''])[1];
+ result = result.replace(/</,"<").replace(/\s*<!--[^\r\n]*/, "");
+ return result;
+ });
+ },
+
+ evalScripts: function() {
+ return this.extractScripts().map(function(script) { return eval(script) });
+ },
+
+ escapeHTML: function() {
+ var self = arguments.callee;
+ self.text.data = this;
+ return self.div.innerHTML;
+ },
+
+ unescapeHTML: function() {
+ var div = new Element('div');
+ div.innerHTML = this.stripTags();
+ return div.childNodes[0] ? (div.childNodes.length > 1 ?
+ $A(div.childNodes).inject('', function(memo, node) { return memo+node.nodeValue }) :
+ div.childNodes[0].nodeValue) : '';
+ },
+
+ toQueryParams: function(separator) {
+ var match = this.strip().match(/([^?#]*)(#.*)?$/);
+ if (!match) return { };
+
+ return match[1].split(separator || '&').inject({ }, function(hash, pair) {
+ if ((pair = pair.split('='))[0]) {
+ var key = decodeURIComponent(pair.shift());
+ var value = pair.length > 1 ? pair.join('=') : pair[0];
+ if (value != undefined) value = decodeURIComponent(value);
+
+ if (key in hash) {
+ if (!Object.isArray(hash[key])) hash[key] = [hash[key]];
+ hash[key].push(value);
+ }
+ else hash[key] = value;
+ }
+ return hash;
+ });
+ },
+
+ toArray: function() {
+ return this.split('');
+ },
+
+ succ: function() {
+ return this.slice(0, this.length - 1) +
+ String.fromCharCode(this.charCodeAt(this.length - 1) + 1);
+ },
+
+ times: function(count) {
+ return count < 1 ? '' : new Array(count + 1).join(this);
+ },
+
+ camelize: function() {
+ var parts = this.split('-'), len = parts.length;
+ if (len == 1) return parts[0];
+
+ var camelized = this.charAt(0) == '-'
+ ? parts[0].charAt(0).toUpperCase() + parts[0].substring(1)
+ : parts[0];
+
+ for (var i = 1; i < len; i++)
+ camelized += parts[i].charAt(0).toUpperCase() + parts[i].substring(1);
+
+ return camelized;
+ },
+
+ capitalize: function() {
+ return this.charAt(0).toUpperCase() + this.substring(1).toLowerCase();
+ },
+
+ underscore: function() {
+ return this.gsub(/::/, '/').gsub(/([A-Z]+)([A-Z][a-z])/,'#{1}_#{2}').gsub(/([a-z\d])([A-Z])/,'#{1}_#{2}').gsub(/-/,'_').toLowerCase();
+ },
+
+ dasherize: function() {
+ return this.gsub(/_/,'-');
+ },
+
+ inspect: function(useDoubleQuotes) {
+ var escapedString = this.gsub(/[\x00-\x1f\\]/, function(match) {
+ var character = String.specialChar[match[0]];
+ return character ? character : '\\u00' + match[0].charCodeAt().toPaddedString(2, 16);
+ });
+ if (useDoubleQuotes) return '"' + escapedString.replace(/"/g, '\\"') + '"';
+ return "'" + escapedString.replace(/'/g, '\\\'') + "'";
+ },
+
+ toJSON: function() {
+ return this.inspect(true);
+ },
+
+ unfilterJSON: function(filter) {
+ return this.sub(filter || Prototype.JSONFilter, '#{1}');
+ },
+
+ isJSON: function() {
+ var str = this;
+ if (str.blank()) return false;
+ str = this.replace(/\\./g, '@').replace(/"[^"\\\n\r]*"/g, '');
+ return (/^[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t]*$/).test(str);
+ },
+
+ evalJSON: function(sanitize) {
+ var json = this.unfilterJSON();
+ try {
+ if (!sanitize || json.isJSON()) return eval('(' + json + ')');
+ } catch (e) { }
+ throw new SyntaxError('Badly formed JSON string: ' + this.inspect());
+ },
+
+ include: function(pattern) {
+ return this.indexOf(pattern) > -1;
+ },
+
+ startsWith: function(pattern) {
+ return this.indexOf(pattern) === 0;
+ },
+
+ endsWith: function(pattern) {
+ var d = this.length - pattern.length;
+ return d >= 0 && this.lastIndexOf(pattern) === d;
+ },
+
+ empty: function() {
+ return this == '';
+ },
+
+ blank: function() {
+ return /^\s*$/.test(this);
+ },
+
+ interpolate: function(object, pattern) {
+ return new Template(this, pattern).evaluate(object);
+ }
+});
+
+if (Prototype.Browser.WebKit || Prototype.Browser.IE) Object.extend(String.prototype, {
+ escapeHTML: function() {
+ return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
+ },
+ unescapeHTML: function() {
+ return this.replace(/&/g,'&').replace(/</g,'<').replace(/>/g,'>');
+ }
+});
+
+String.prototype.gsub.prepareReplacement = function(replacement) {
+ if (Object.isFunction(replacement)) return replacement;
+ var template = new Template(replacement);
+ return function(match) { return template.evaluate(match) };
+};
+
+String.prototype.parseQuery = String.prototype.toQueryParams;
+
+Object.extend(String.prototype.escapeHTML, {
+ div: document.createElement('div'),
+ text: document.createTextNode('')
+});
+
+with (String.prototype.escapeHTML) div.appendChild(text);
+
+var Template = Class.create({
+ initialize: function(template, pattern) {
+ this.template = template.toString();
+ this.pattern = pattern || Template.Pattern;
+ },
+
+ evaluate: function(object) {
+ if (Object.isFunction(object.toTemplateReplacements))
+ object = object.toTemplateReplacements();
+
+ return this.template.gsub(this.pattern, function(match) {
+ if (object == null) return '';
+
+ var before = match[1] || '';
+ if (before == '\\') return match[2];
+
+ var ctx = object, expr = match[3];
+ var pattern = /^([^.[]+|\[((?:.*?[^\\])?)\])(\.|\[|$)/;
+ match = pattern.exec(expr);
+ if (match == null) return before;
+
+ while (match != null) {
+ var comp = match[1].startsWith('[') ? match[2].gsub('\\\\]', ']') : match[1];
+ ctx = ctx[comp];
+ if (null == ctx || '' == match[3]) break;
+ expr = expr.substring('[' == match[3] ? match[1].length : match[0].length);
+ match = pattern.exec(expr);
+ }
+
+ return before + String.interpret(ctx);
+ });
+ }
+});
+Template.Pattern = /(^|.|\r|\n)(#\{(.*?)\})/;
+
+var $break = { };
+
+var Enumerable = {
+ each: function(iterator, context) {
+ var index = 0;
+ iterator = iterator.bind(context);
+ try {
+ this._each(function(value) {
+ iterator(value, index++);
+ });
+ } catch (e) {
+ if (e != $break) throw e;
+ }
+ return this;
+ },
+
+ eachSlice: function(number, iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var index = -number, slices = [], array = this.toArray();
+ while ((index += number) < array.length)
+ slices.push(array.slice(index, index+number));
+ return slices.collect(iterator, context);
+ },
+
+ all: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var result = true;
+ this.each(function(value, index) {
+ result = result && !!iterator(value, index);
+ if (!result) throw $break;
+ });
+ return result;
+ },
+
+ any: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var result = false;
+ this.each(function(value, index) {
+ if (result = !!iterator(value, index))
+ throw $break;
+ });
+ return result;
+ },
+
+ collect: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var results = [];
+ this.each(function(value, index) {
+ results.push(iterator(value, index));
+ });
+ return results;
+ },
+
+ detect: function(iterator, context) {
+ iterator = iterator.bind(context);
+ var result;
+ this.each(function(value, index) {
+ if (iterator(value, index)) {
+ result = value;
+ throw $break;
+ }
+ });
+ return result;
+ },
+
+ findAll: function(iterator, context) {
+ iterator = iterator.bind(context);
+ var results = [];
+ this.each(function(value, index) {
+ if (iterator(value, index))
+ results.push(value);
+ });
+ return results;
+ },
+
+ grep: function(filter, iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var results = [];
+
+ if (Object.isString(filter))
+ filter = new RegExp(filter);
+
+ this.each(function(value, index) {
+ if (filter.match(value))
+ results.push(iterator(value, index));
+ });
+ return results;
+ },
+
+ include: function(object) {
+ if (Object.isFunction(this.indexOf))
+ if (this.indexOf(object) != -1) return true;
+
+ var found = false;
+ this.each(function(value) {
+ if (value == object) {
+ found = true;
+ throw $break;
+ }
+ });
+ return found;
+ },
+
+ inGroupsOf: function(number, fillWith) {
+ fillWith = Object.isUndefined(fillWith) ? null : fillWith;
+ return this.eachSlice(number, function(slice) {
+ while(slice.length < number) slice.push(fillWith);
+ return slice;
+ });
+ },
+
+ inject: function(memo, iterator, context) {
+ iterator = iterator.bind(context);
+ this.each(function(value, index) {
+ memo = iterator(memo, value, index);
+ });
+ return memo;
+ },
+
+ invoke: function(method) {
+ var args = $A(arguments).slice(1);
+ return this.map(function(value) {
+ return value[method].apply(value, args);
+ });
+ },
+
+ max: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator(value, index);
+ if (result == null || value >= result)
+ result = value;
+ });
+ return result;
+ },
+
+ min: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var result;
+ this.each(function(value, index) {
+ value = iterator(value, index);
+ if (result == null || value < result)
+ result = value;
+ });
+ return result;
+ },
+
+ partition: function(iterator, context) {
+ iterator = iterator ? iterator.bind(context) : Prototype.K;
+ var trues = [], falses = [];
+ this.each(function(value, index) {
+ (iterator(value, index) ?
+ trues : falses).push(value);
+ });
+ return [trues, falses];
+ },
+
+ pluck: function(property) {
+ var results = [];
+ this.each(function(value) {
+ results.push(value[property]);
+ });
+ return results;
+ },
+
+ reject: function(iterator, context) {
+ iterator = iterator.bind(context);
+ var results = [];
+ this.each(function(value, index) {
+ if (!iterator(value, index))
+ results.push(value);
+ });
+ return results;
+ },
+
+ sortBy: function(iterator, context) {
+ iterator = iterator.bind(context);
+ return this.map(function(value, index) {
+ return {value: value, criteria: iterator(value, index)};
+ }).sort(function(left, right) {
+ var a = left.criteria, b = right.criteria;
+ return a < b ? -1 : a > b ? 1 : 0;
+ }).pluck('value');
+ },
+
+ toArray: function() {
+ return this.map();
+ },
+
+ zip: function() {
+ var iterator = Prototype.K, args = $A(arguments);
+ if (Object.isFunction(args.last()))
+ iterator = args.pop();
+
+ var collections = [this].concat(args).map($A);
+ return this.map(function(value, index) {
+ return iterator(collections.pluck(index));
+ });
+ },
+
+ size: function() {
+ return this.toArray().length;
+ },
+
+ inspect: function() {
+ return '#<Enumerable:' + this.toArray().inspect() + '>';
+ }
+};
+
+Object.extend(Enumerable, {
+ map: Enumerable.collect,
+ find: Enumerable.detect,
+ select: Enumerable.findAll,
+ filter: Enumerable.findAll,
+ member: Enumerable.include,
+ entries: Enumerable.toArray,
+ every: Enumerable.all,
+ some: Enumerable.any
+});
+function $A(iterable) {
+ if (!iterable) return [];
+ if (iterable.toArray) return iterable.toArray();
+ var length = iterable.length || 0, results = new Array(length);
+ while (length--) results[length] = iterable[length];
+ return results;
+}
+
+if (Prototype.Browser.WebKit) {
+ $A = function(iterable) {
+ if (!iterable) return [];
+ if (!(Object.isFunction(iterable) && iterable == '[object NodeList]') &&
+ iterable.toArray) return iterable.toArray();
+ var length = iterable.length || 0, results = new Array(length);
+ while (length--) results[length] = iterable[length];
+ return results;
+ };
+}
+
+Array.from = $A;
+
+Object.extend(Array.prototype, Enumerable);
+
+if (!Array.prototype._reverse) Array.prototype._reverse = Array.prototype.reverse;
+
+Object.extend(Array.prototype, {
+ _each: function(iterator) {
+ for (var i = 0, length = this.length; i < length; i++)
+ iterator(this[i]);
+ },
+
+ clear: function() {
+ this.length = 0;
+ return this;
+ },
+
+ first: function() {
+ return this[0];
+ },
+
+ last: function() {
+ return this[this.length - 1];
+ },
+
+ compact: function() {
+ return this.select(function(value) {
+ return value != null;
+ });
+ },
+
+ flatten: function() {
+ return this.inject([], function(array, value) {
+ return array.concat(Object.isArray(value) ?
+ value.flatten() : [value]);
+ });
+ },
+
+ without: function() {
+ var values = $A(arguments);
+ return this.select(function(value) {
+ return !values.include(value);
+ });
+ },
+
+ reverse: function(inline) {
+ return (inline !== false ? this : this.toArray())._reverse();
+ },
+
+ reduce: function() {
+ return this.length > 1 ? this : this[0];
+ },
+
+ uniq: function(sorted) {
+ return this.inject([], function(array, value, index) {
+ if (0 == index || (sorted ? array.last() != value : !array.include(value)))
+ array.push(value);
+ return array;
+ });
+ },
+
+ intersect: function(array) {
+ return this.uniq().findAll(function(item) {
+ return array.detect(function(value) { return item === value });
+ });
+ },
+
+ clone: function() {
+ return [].concat(this);
+ },
+
+ size: function() {
+ return this.length;
+ },
+
+ inspect: function() {
+ return '[' + this.map(Object.inspect).join(', ') + ']';
+ },
+
+ toJSON: function() {
+ var results = [];
+ this.each(function(object) {
+ var value = Object.toJSON(object);
+ if (!Object.isUndefined(value)) results.push(value);
+ });
+ return '[' + results.join(', ') + ']';
+ }
+});
+
+// use native browser JS 1.6 implementation if available
+if (Object.isFunction(Array.prototype.forEach))
+ Array.prototype._each = Array.prototype.forEach;
+
+if (!Array.prototype.indexOf) Array.prototype.indexOf = function(item, i) {
+ i || (i = 0);
+ var length = this.length;
+ if (i < 0) i = length + i;
+ for (; i < length; i++)
+ if (this[i] === item) return i;
+ return -1;
+};
+
+if (!Array.prototype.lastIndexOf) Array.prototype.lastIndexOf = function(item, i) {
+ i = isNaN(i) ? this.length : (i < 0 ? this.length + i : i) + 1;
+ var n = this.slice(0, i).reverse().indexOf(item);
+ return (n < 0) ? n : i - n - 1;
+};
+
+Array.prototype.toArray = Array.prototype.clone;
+
+function $w(string) {
+ if (!Object.isString(string)) return [];
+ string = string.strip();
+ return string ? string.split(/\s+/) : [];
+}
+
+if (Prototype.Browser.Opera){
+ Array.prototype.concat = function() {
+ var array = [];
+ for (var i = 0, length = this.length; i < length; i++) array.push(this[i]);
+ for (var i = 0, length = arguments.length; i < length; i++) {
+ if (Object.isArray(arguments[i])) {
+ for (var j = 0, arrayLength = arguments[i].length; j < arrayLength; j++)
+ array.push(arguments[i][j]);
+ } else {
+ array.push(arguments[i]);
+ }
+ }
+ return array;
+ };
+}
+Object.extend(Number.prototype, {
+ toColorPart: function() {
+ return this.toPaddedString(2, 16);
+ },
+
+ succ: function() {
+ return this + 1;
+ },
+
+ times: function(iterator) {
+ $R(0, this, true).each(iterator);
+ return this;
+ },
+
+ toPaddedString: function(length, radix) {
+ var string = this.toString(radix || 10);
+ return '0'.times(length - string.length) + string;
+ },
+
+ toJSON: function() {
+ return isFinite(this) ? this.toString() : 'null';
+ }
+});
+
+$w('abs round ceil floor').each(function(method){
+ Number.prototype[method] = Math[method].methodize();
+});
+function $H(object) {
+ return new Hash(object);
+};
+
+var Hash = Class.create(Enumerable, (function() {
+
+ function toQueryPair(key, value) {
+ if (Object.isUndefined(value)) return key;
+ return key + '=' + encodeURIComponent(String.interpret(value));
+ }
+
+ return {
+ initialize: function(object) {
+ this._object = Object.isHash(object) ? object.toObject() : Object.clone(object);
+ },
+
+ _each: function(iterator) {
+ for (var key in this._object) {
+ var value = this._object[key], pair = [key, value];
+ pair.key = key;
+ pair.value = value;
+ iterator(pair);
+ }
+ },
+
+ set: function(key, value) {
+ return this._object[key] = value;
+ },
+
+ get: function(key) {
+ return this._object[key];
+ },
+
+ unset: function(key) {
+ var value = this._object[key];
+ delete this._object[key];
+ return value;
+ },
+
+ toObject: function() {
+ return Object.clone(this._object);
+ },
+
+ keys: function() {
+ return this.pluck('key');
+ },
+
+ values: function() {
+ return this.pluck('value');
+ },
+
+ index: function(value) {
+ var match = this.detect(function(pair) {
+ return pair.value === value;
+ });
+ return match && match.key;
+ },
+
+ merge: function(object) {
+ return this.clone().update(object);
+ },
+
+ update: function(object) {
+ return new Hash(object).inject(this, function(result, pair) {
+ result.set(pair.key, pair.value);
+ return result;
+ });
+ },
+
+ toQueryString: function() {
+ return this.map(function(pair) {
+ var key = encodeURIComponent(pair.key), values = pair.value;
+
+ if (values && typeof values == 'object') {
+ if (Object.isArray(values))
+ return values.map(toQueryPair.curry(key)).join('&');
+ }
+ return toQueryPair(key, values);
+ }).join('&');
+ },
+
+ inspect: function() {
+ return '#<Hash:{' + this.map(function(pair) {
+ return pair.map(Object.inspect).join(': ');
+ }).join(', ') + '}>';
+ },
+
+ toJSON: function() {
+ return Object.toJSON(this.toObject());
+ },
+
+ clone: function() {
+ return new Hash(this);
+ }
+ }
+})());
+
+Hash.prototype.toTemplateReplacements = Hash.prototype.toObject;
+Hash.from = $H;
+var ObjectRange = Class.create(Enumerable, {
+ initialize: function(start, end, exclusive) {
+ this.start = start;
+ this.end = end;
+ this.exclusive = exclusive;
+ },
+
+ _each: function(iterator) {
+ var value = this.start;
+ while (this.include(value)) {
+ iterator(value);
+ value = value.succ();
+ }
+ },
+
+ include: function(value) {
+ if (value < this.start)
+ return false;
+ if (this.exclusive)
+ return value < this.end;
+ return value <= this.end;
+ }
+});
+
+var $R = function(start, end, exclusive) {
+ return new ObjectRange(start, end, exclusive);
+};
+
+var Ajax = {
+ getTransport: function() {
+ return Try.these(
+ function() {return new XMLHttpRequest()},
+ function() {return new ActiveXObject('Msxml2.XMLHTTP')},
+ function() {return new ActiveXObject('Microsoft.XMLHTTP')}
+ ) || false;
+ },
+
+ activeRequestCount: 0
+};
+
+Ajax.Responders = {
+ responders: [],
+
+ _each: function(iterator) {
+ this.responders._each(iterator);
+ },
+
+ register: function(responder) {
+ if (!this.include(responder))
+ this.responders.push(responder);
+ },
+
+ unregister: function(responder) {
+ this.responders = this.responders.without(responder);
+ },
+
+ dispatch: function(callback, request, transport, json) {
+ this.each(function(responder) {
+ if (Object.isFunction(responder[callback])) {
+ try {
+ responder[callback].apply(responder, [request, transport, json]);
+ } catch (e) { }
+ }
+ });
+ }
+};
+
+Object.extend(Ajax.Responders, Enumerable);
+
+Ajax.Responders.register({
+ onCreate: function() { Ajax.activeRequestCount++ },
+ onComplete: function() { Ajax.activeRequestCount-- }
+});
+
+Ajax.Base = Class.create({
+ initialize: function(options) {
+ this.options = {
+ method: 'post',
+ asynchronous: true,
+ contentType: 'application/x-www-form-urlencoded',
+ encoding: 'UTF-8',
+ parameters: '',
+ evalJSON: true,
+ evalJS: true
+ };
+ Object.extend(this.options, options || { });
+
+ this.options.method = this.options.method.toLowerCase();
+
+ if (Object.isString(this.options.parameters))
+ this.options.parameters = this.options.parameters.toQueryParams();
+ else if (Object.isHash(this.options.parameters))
+ this.options.parameters = this.options.parameters.toObject();
+ }
+});
+
+Ajax.Request = Class.create(Ajax.Base, {
+ _complete: false,
+
+ initialize: function($super, url, options) {
+ $super(options);
+ this.transport = Ajax.getTransport();
+ this.request(url);
+ },
+
+ request: function(url) {
+ this.url = url;
+ this.method = this.options.method;
+ var params = Object.clone(this.options.parameters);
+
+ if (!['get', 'post'].include(this.method)) {
+ // simulate other verbs over post
+ params['_method'] = this.method;
+ this.method = 'post';
+ }
+
+ this.parameters = params;
+
+ if (params = Object.toQueryString(params)) {
+ // when GET, append parameters to URL
+ if (this.method == 'get')
+ this.url += (this.url.include('?') ? '&' : '?') + params;
+ else if (/Konqueror|Safari|KHTML/.test(navigator.userAgent))
+ params += '&_=';
+ }
+
+ try {
+ var response = new Ajax.Response(this);
+ if (this.options.onCreate) this.options.onCreate(response);
+ Ajax.Responders.dispatch('onCreate', this, response);
+
+ this.transport.open(this.method.toUpperCase(), this.url,
+ this.options.asynchronous);
+
+ if (this.options.asynchronous) this.respondToReadyState.bind(this).defer(1);
+
+ this.transport.onreadystatechange = this.onStateChange.bind(this);
+ this.setRequestHeaders();
+
+ this.body = this.method == 'post' ? (this.options.postBody || params) : null;
+ this.transport.send(this.body);
+
+ /* Force Firefox to handle ready state 4 for synchronous requests */
+ if (!this.options.asynchronous && this.transport.overrideMimeType)
+ this.onStateChange();
+
+ }
+ catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ onStateChange: function() {
+ var readyState = this.transport.readyState;
+ if (readyState > 1 && !((readyState == 4) && this._complete))
+ this.respondToReadyState(this.transport.readyState);
+ },
+
+ setRequestHeaders: function() {
+ var headers = {
+ 'X-Requested-With': 'XMLHttpRequest',
+ 'X-Prototype-Version': Prototype.Version,
+ 'Accept': 'text/javascript, text/html, application/xml, text/xml, */*'
+ };
+
+ if (this.method == 'post') {
+ headers['Content-type'] = this.options.contentType +
+ (this.options.encoding ? '; charset=' + this.options.encoding : '');
+
+ /* Force "Connection: close" for older Mozilla browsers to work
+ * around a bug where XMLHttpRequest sends an incorrect
+ * Content-length header. See Mozilla Bugzilla #246651.
+ */
+ if (this.transport.overrideMimeType &&
+ (navigator.userAgent.match(/Gecko\/(\d{4})/) || [0,2005])[1] < 2005)
+ headers['Connection'] = 'close';
+ }
+
+ // user-defined headers
+ if (typeof this.options.requestHeaders == 'object') {
+ var extras = this.options.requestHeaders;
+
+ if (Object.isFunction(extras.push))
+ for (var i = 0, length = extras.length; i < length; i += 2)
+ headers[extras[i]] = extras[i+1];
+ else
+ $H(extras).each(function(pair) { headers[pair.key] = pair.value });
+ }
+
+ for (var name in headers)
+ this.transport.setRequestHeader(name, headers[name]);
+ },
+
+ success: function() {
+ var status = this.getStatus();
+ return !status || (status >= 200 && status < 300);
+ },
+
+ getStatus: function() {
+ try {
+ return this.transport.status || 0;
+ } catch (e) { return 0 }
+ },
+
+ respondToReadyState: function(readyState) {
+ var state = Ajax.Request.Events[readyState], response = new Ajax.Response(this);
+
+ if (state == 'Complete') {
+ try {
+ this._complete = true;
+ (this.options['on' + response.status]
+ || this.options['on' + (this.success() ? 'Success' : 'Failure')]
+ || Prototype.emptyFunction)(response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ var contentType = response.getHeader('Content-type');
+ if (this.options.evalJS == 'force'
+ || (this.options.evalJS && this.isSameOrigin() && contentType
+ && contentType.match(/^\s*(text|application)\/(x-)?(java|ecma)script(;.*)?\s*$/i)))
+ this.evalResponse();
+ }
+
+ try {
+ (this.options['on' + state] || Prototype.emptyFunction)(response, response.headerJSON);
+ Ajax.Responders.dispatch('on' + state, this, response, response.headerJSON);
+ } catch (e) {
+ this.dispatchException(e);
+ }
+
+ if (state == 'Complete') {
+ // avoid memory leak in MSIE: clean up
+ this.transport.onreadystatechange = Prototype.emptyFunction;
+ }
+ },
+
+ isSameOrigin: function() {
+ var m = this.url.match(/^\s*https?:\/\/[^\/]*/);
+ return !m || (m[0] == '#{protocol}//#{domain}#{port}'.interpolate({
+ protocol: location.protocol,
+ domain: document.domain,
+ port: location.port ? ':' + location.port : ''
+ }));
+ },
+
+ getHeader: function(name) {
+ try {
+ return this.transport.getResponseHeader(name) || null;
+ } catch (e) { return null }
+ },
+
+ evalResponse: function() {
+ try {
+ return eval((this.transport.responseText || '').unfilterJSON());
+ } catch (e) {
+ this.dispatchException(e);
+ }
+ },
+
+ dispatchException: function(exception) {
+ (this.options.onException || Prototype.emptyFunction)(this, exception);
+ Ajax.Responders.dispatch('onException', this, exception);
+ }
+});
+
+Ajax.Request.Events =
+ ['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
+
+Ajax.Response = Class.create({
+ initialize: function(request){
+ this.request = request;
+ var transport = this.transport = request.transport,
+ readyState = this.readyState = transport.readyState;
+
+ if((readyState > 2 && !Prototype.Browser.IE) || readyState == 4) {
+ this.status = this.getStatus();
+ this.statusText = this.getStatusText();
+ this.responseText = String.interpret(transport.responseText);
+ this.headerJSON = this._getHeaderJSON();
+ }
+
+ if(readyState == 4) {
+ var xml = transport.responseXML;
+ this.responseXML = Object.isUndefined(xml) ? null : xml;
+ this.responseJSON = this._getResponseJSON();
+ }
+ },
+
+ status: 0,
+ statusText: '',
+
+ getStatus: Ajax.Request.prototype.getStatus,
+
+ getStatusText: function() {
+ try {
+ return this.transport.statusText || '';
+ } catch (e) { return '' }
+ },
+
+ getHeader: Ajax.Request.prototype.getHeader,
+
+ getAllHeaders: function() {
+ try {
+ return this.getAllResponseHeaders();
+ } catch (e) { return null }
+ },
+
+ getResponseHeader: function(name) {
+ return this.transport.getResponseHeader(name);
+ },
+
+ getAllResponseHeaders: function() {
+ return this.transport.getAllResponseHeaders();
+ },
+
+ _getHeaderJSON: function() {
+ var json = this.getHeader('X-JSON');
+ if (!json) return null;
+ json = decodeURIComponent(escape(json));
+ try {
+ return json.evalJSON(this.request.options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ },
+
+ _getResponseJSON: function() {
+ var options = this.request.options;
+ if (!options.evalJSON || (options.evalJSON != 'force' &&
+ !(this.getHeader('Content-type') || '').include('application/json')) ||
+ this.responseText.blank())
+ return null;
+ try {
+ return this.responseText.evalJSON(options.sanitizeJSON ||
+ !this.request.isSameOrigin());
+ } catch (e) {
+ this.request.dispatchException(e);
+ }
+ }
+});
+
+Ajax.Updater = Class.create(Ajax.Request, {
+ initialize: function($super, container, url, options) {
+ this.container = {
+ success: (container.success || container),
+ failure: (container.failure || (container.success ? null : container))
+ };
+
+ options = Object.clone(options);
+ var onComplete = options.onComplete;
+ options.onComplete = (function(response, json) {
+ this.updateContent(response.responseText);
+ if (Object.isFunction(onComplete)) onComplete(response, json);
+ }).bind(this);
+
+ $super(url, options);
+ },
+
+ updateContent: function(responseText) {
+ var receiver = this.container[this.success() ? 'success' : 'failure'],
+ options = this.options;
+
+ if (!options.evalScripts) responseText = responseText.stripScripts();
+
+ if (receiver = $(receiver)) {
+ if (options.insertion) {
+ if (Object.isString(options.insertion)) {
+ var insertion = { }; insertion[options.insertion] = responseText;
+ receiver.insert(insertion);
+ }
+ else options.insertion(receiver, responseText);
+ }
+ else receiver.update(responseText);
+ }
+ }
+});
+
+Ajax.PeriodicalUpdater = Class.create(Ajax.Base, {
+ initialize: function($super, container, url, options) {
+ $super(options);
+ this.onComplete = this.options.onComplete;
+
+ this.frequency = (this.options.frequency || 2);
+ this.decay = (this.options.decay || 1);
+
+ this.updater = { };
+ this.container = container;
+ this.url = url;
+
+ this.start();
+ },
+
+ start: function() {
+ this.options.onComplete = this.updateComplete.bind(this);
+ this.onTimerEvent();
+ },
+
+ stop: function() {
+ this.updater.options.onComplete = undefined;
+ clearTimeout(this.timer);
+ (this.onComplete || Prototype.emptyFunction).apply(this, arguments);
+ },
+
+ updateComplete: function(response) {
+ if (this.options.decay) {
+ this.decay = (response.responseText == this.lastText ?
+ this.decay * this.options.decay : 1);
+
+ this.lastText = response.responseText;
+ }
+ this.timer = this.onTimerEvent.bind(this).delay(this.decay * this.frequency);
+ },
+
+ onTimerEvent: function() {
+ this.updater = new Ajax.Updater(this.container, this.url, this.options);
+ }
+});
+function $(element) {
+ if (arguments.length > 1) {
+ for (var i = 0, elements = [], length = arguments.length; i < length; i++)
+ elements.push($(arguments[i]));
+ return elements;
+ }
+ if (Object.isString(element))
+ element = document.getElementById(element);
+ return Element.extend(element);
+}
+
+if (Prototype.BrowserFeatures.XPath) {
+ document._getElementsByXPath = function(expression, parentElement) {
+ var results = [];
+ var query = document.evaluate(expression, $(parentElement) || document,
+ null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
+ for (var i = 0, length = query.snapshotLength; i < length; i++)
+ results.push(Element.extend(query.snapshotItem(i)));
+ return results;
+ };
+}
+
+/*--------------------------------------------------------------------------*/
+
+if (!window.Node) var Node = { };
+
+if (!Node.ELEMENT_NODE) {
+ // DOM level 2 ECMAScript Language Binding
+ Object.extend(Node, {
+ ELEMENT_NODE: 1,
+ ATTRIBUTE_NODE: 2,
+ TEXT_NODE: 3,
+ CDATA_SECTION_NODE: 4,
+ ENTITY_REFERENCE_NODE: 5,
+ ENTITY_NODE: 6,
+ PROCESSING_INSTRUCTION_NODE: 7,
+ COMMENT_NODE: 8,
+ DOCUMENT_NODE: 9,
+ DOCUMENT_TYPE_NODE: 10,
+ DOCUMENT_FRAGMENT_NODE: 11,
+ NOTATION_NODE: 12
+ });
+}
+
+(function() {
+ var element = this.Element;
+ this.Element = function(tagName, attributes) {
+ attributes = attributes || { };
+ tagName = tagName.toLowerCase();
+ var cache = Element.cache;
+ if (Prototype.Browser.IE && attributes.name) {
+ tagName = '<' + tagName + ' name="' + attributes.name + '">';
+ delete attributes.name;
+ return Element.writeAttribute(document.createElement(tagName), attributes);
+ }
+ if (!cache[tagName]) cache[tagName] = Element.extend(document.createElement(tagName));
+ return Element.writeAttribute(cache[tagName].cloneNode(false), attributes);
+ };
+ Object.extend(this.Element, element || { });
+}).call(window);
+
+Element.cache = { };
+
+Element.Methods = {
+ visible: function(element) {
+ return $(element).style.display != 'none';
+ },
+
+ toggle: function(element) {
+ element = $(element);
+ Element[Element.visible(element) ? 'hide' : 'show'](element);
+ return element;
+ },
+
+ hide: function(element) {
+ $(element).style.display = 'none';
+ return element;
+ },
+
+ show: function(element) {
+ $(element).style.display = '';
+ return element;
+ },
+
+ remove: function(element) {
+ element = $(element);
+ element.parentNode.removeChild(element);
+ return element;
+ },
+
+ update: function(element, content) {
+ element = $(element);
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) return element.update().insert(content);
+ content = Object.toHTML(content);
+ element.innerHTML = content.stripScripts();
+ content.evalScripts.bind(content).defer();
+ return element;
+ },
+
+ replace: function(element, content) {
+ element = $(element);
+ if (content && content.toElement) content = content.toElement();
+ else if (!Object.isElement(content)) {
+ content = Object.toHTML(content);
+ var range = element.ownerDocument.createRange();
+ range.selectNode(element);
+ content.evalScripts.bind(content).defer();
+ content = range.createContextualFragment(content.stripScripts());
+ }
+ element.parentNode.replaceChild(content, element);
+ return element;
+ },
+
+ insert: function(element, insertions) {
+ element = $(element);
+
+ if (Object.isString(insertions) || Object.isNumber(insertions) ||
+ Object.isElement(insertions) || (insertions && (insertions.toElement || insertions.toHTML)))
+ insertions = {bottom:insertions};
+
+ var content, insert, tagName, childNodes;
+
+ for (var position in insertions) {
+ content = insertions[position];
+ position = position.toLowerCase();
+ insert = Element._insertionTranslations[position];
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ insert(element, content);
+ continue;
+ }
+
+ content = Object.toHTML(content);
+
+ tagName = ((position == 'before' || position == 'after')
+ ? element.parentNode : element).tagName.toUpperCase();
+
+ childNodes = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+
+ if (position == 'top' || position == 'after') childNodes.reverse();
+ childNodes.each(insert.curry(element));
+
+ content.evalScripts.bind(content).defer();
+ }
+
+ return element;
+ },
+
+ wrap: function(element, wrapper, attributes) {
+ element = $(element);
+ if (Object.isElement(wrapper))
+ $(wrapper).writeAttribute(attributes || { });
+ else if (Object.isString(wrapper)) wrapper = new Element(wrapper, attributes);
+ else wrapper = new Element('div', wrapper);
+ if (element.parentNode)
+ element.parentNode.replaceChild(wrapper, element);
+ wrapper.appendChild(element);
+ return wrapper;
+ },
+
+ inspect: function(element) {
+ element = $(element);
+ var result = '<' + element.tagName.toLowerCase();
+ $H({'id': 'id', 'className': 'class'}).each(function(pair) {
+ var property = pair.first(), attribute = pair.last();
+ var value = (element[property] || '').toString();
+ if (value) result += ' ' + attribute + '=' + value.inspect(true);
+ });
+ return result + '>';
+ },
+
+ recursivelyCollect: function(element, property) {
+ element = $(element);
+ var elements = [];
+ while (element = element[property])
+ if (element.nodeType == 1)
+ elements.push(Element.extend(element));
+ return elements;
+ },
+
+ ancestors: function(element) {
+ return $(element).recursivelyCollect('parentNode');
+ },
+
+ descendants: function(element) {
+ return $(element).select("*");
+ },
+
+ firstDescendant: function(element) {
+ element = $(element).firstChild;
+ while (element && element.nodeType != 1) element = element.nextSibling;
+ return $(element);
+ },
+
+ immediateDescendants: function(element) {
+ if (!(element = $(element).firstChild)) return [];
+ while (element && element.nodeType != 1) element = element.nextSibling;
+ if (element) return [element].concat($(element).nextSiblings());
+ return [];
+ },
+
+ previousSiblings: function(element) {
+ return $(element).recursivelyCollect('previousSibling');
+ },
+
+ nextSiblings: function(element) {
+ return $(element).recursivelyCollect('nextSibling');
+ },
+
+ siblings: function(element) {
+ element = $(element);
+ return element.previousSiblings().reverse().concat(element.nextSiblings());
+ },
+
+ match: function(element, selector) {
+ if (Object.isString(selector))
+ selector = new Selector(selector);
+ return selector.match($(element));
+ },
+
+ up: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return $(element.parentNode);
+ var ancestors = element.ancestors();
+ return Object.isNumber(expression) ? ancestors[expression] :
+ Selector.findElement(ancestors, expression, index);
+ },
+
+ down: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return element.firstDescendant();
+ return Object.isNumber(expression) ? element.descendants()[expression] :
+ element.select(expression)[index || 0];
+ },
+
+ previous: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return $(Selector.handlers.previousElementSibling(element));
+ var previousSiblings = element.previousSiblings();
+ return Object.isNumber(expression) ? previousSiblings[expression] :
+ Selector.findElement(previousSiblings, expression, index);
+ },
+
+ next: function(element, expression, index) {
+ element = $(element);
+ if (arguments.length == 1) return $(Selector.handlers.nextElementSibling(element));
+ var nextSiblings = element.nextSiblings();
+ return Object.isNumber(expression) ? nextSiblings[expression] :
+ Selector.findElement(nextSiblings, expression, index);
+ },
+
+ select: function() {
+ var args = $A(arguments), element = $(args.shift());
+ return Selector.findChildElements(element, args);
+ },
+
+ adjacent: function() {
+ var args = $A(arguments), element = $(args.shift());
+ return Selector.findChildElements(element.parentNode, args).without(element);
+ },
+
+ identify: function(element) {
+ element = $(element);
+ var id = element.readAttribute('id'), self = arguments.callee;
+ if (id) return id;
+ do { id = 'anonymous_element_' + self.counter++ } while ($(id));
+ element.writeAttribute('id', id);
+ return id;
+ },
+
+ readAttribute: function(element, name) {
+ element = $(element);
+ if (Prototype.Browser.IE) {
+ var t = Element._attributeTranslations.read;
+ if (t.values[name]) return t.values[name](element, name);
+ if (t.names[name]) name = t.names[name];
+ if (name.include(':')) {
+ return (!element.attributes || !element.attributes[name]) ? null :
+ element.attributes[name].value;
+ }
+ }
+ return element.getAttribute(name);
+ },
+
+ writeAttribute: function(element, name, value) {
+ element = $(element);
+ var attributes = { }, t = Element._attributeTranslations.write;
+
+ if (typeof name == 'object') attributes = name;
+ else attributes[name] = Object.isUndefined(value) ? true : value;
+
+ for (var attr in attributes) {
+ name = t.names[attr] || attr;
+ value = attributes[attr];
+ if (t.values[attr]) name = t.values[attr](element, value);
+ if (value === false || value === null)
+ element.removeAttribute(name);
+ else if (value === true)
+ element.setAttribute(name, name);
+ else element.setAttribute(name, value);
+ }
+ return element;
+ },
+
+ getHeight: function(element) {
+ return $(element).getDimensions().height;
+ },
+
+ getWidth: function(element) {
+ return $(element).getDimensions().width;
+ },
+
+ classNames: function(element) {
+ return new Element.ClassNames(element);
+ },
+
+ hasClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ var elementClassName = element.className;
+ return (elementClassName.length > 0 && (elementClassName == className ||
+ new RegExp("(^|\\s)" + className + "(\\s|$)").test(elementClassName)));
+ },
+
+ addClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ if (!element.hasClassName(className))
+ element.className += (element.className ? ' ' : '') + className;
+ return element;
+ },
+
+ removeClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ element.className = element.className.replace(
+ new RegExp("(^|\\s+)" + className + "(\\s+|$)"), ' ').strip();
+ return element;
+ },
+
+ toggleClassName: function(element, className) {
+ if (!(element = $(element))) return;
+ return element[element.hasClassName(className) ?
+ 'removeClassName' : 'addClassName'](className);
+ },
+
+ // removes whitespace-only text node children
+ cleanWhitespace: function(element) {
+ element = $(element);
+ var node = element.firstChild;
+ while (node) {
+ var nextNode = node.nextSibling;
+ if (node.nodeType == 3 && !/\S/.test(node.nodeValue))
+ element.removeChild(node);
+ node = nextNode;
+ }
+ return element;
+ },
+
+ empty: function(element) {
+ return $(element).innerHTML.blank();
+ },
+
+ descendantOf: function(element, ancestor) {
+ element = $(element), ancestor = $(ancestor);
+ var originalAncestor = ancestor;
+
+ if (element.compareDocumentPosition)
+ return (element.compareDocumentPosition(ancestor) & 8) === 8;
+
+ if (element.sourceIndex && !Prototype.Browser.Opera) {
+ var e = element.sourceIndex, a = ancestor.sourceIndex,
+ nextAncestor = ancestor.nextSibling;
+ if (!nextAncestor) {
+ do { ancestor = ancestor.parentNode; }
+ while (!(nextAncestor = ancestor.nextSibling) && ancestor.parentNode);
+ }
+ if (nextAncestor && nextAncestor.sourceIndex)
+ return (e > a && e < nextAncestor.sourceIndex);
+ }
+
+ while (element = element.parentNode)
+ if (element == originalAncestor) return true;
+ return false;
+ },
+
+ scrollTo: function(element) {
+ element = $(element);
+ var pos = element.cumulativeOffset();
+ window.scrollTo(pos[0], pos[1]);
+ return element;
+ },
+
+ getStyle: function(element, style) {
+ element = $(element);
+ style = style == 'float' ? 'cssFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value) {
+ var css = document.defaultView.getComputedStyle(element, null);
+ value = css ? css[style] : null;
+ }
+ if (style == 'opacity') return value ? parseFloat(value) : 1.0;
+ return value == 'auto' ? null : value;
+ },
+
+ getOpacity: function(element) {
+ return $(element).getStyle('opacity');
+ },
+
+ setStyle: function(element, styles) {
+ element = $(element);
+ var elementStyle = element.style, match;
+ if (Object.isString(styles)) {
+ element.style.cssText += ';' + styles;
+ return styles.include('opacity') ?
+ element.setOpacity(styles.match(/opacity:\s*(\d?\.?\d*)/)[1]) : element;
+ }
+ for (var property in styles)
+ if (property == 'opacity') element.setOpacity(styles[property]);
+ else
+ elementStyle[(property == 'float' || property == 'cssFloat') ?
+ (Object.isUndefined(elementStyle.styleFloat) ? 'cssFloat' : 'styleFloat') :
+ property] = styles[property];
+
+ return element;
+ },
+
+ setOpacity: function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+ return element;
+ },
+
+ getDimensions: function(element) {
+ element = $(element);
+ var display = $(element).getStyle('display');
+ if (display != 'none' && display != null) // Safari bug
+ return {width: element.offsetWidth, height: element.offsetHeight};
+
+ // All *Width and *Height properties give 0 on elements with display none,
+ // so enable the element temporarily
+ var els = element.style;
+ var originalVisibility = els.visibility;
+ var originalPosition = els.position;
+ var originalDisplay = els.display;
+ els.visibility = 'hidden';
+ els.position = 'absolute';
+ els.display = 'block';
+ var originalWidth = element.clientWidth;
+ var originalHeight = element.clientHeight;
+ els.display = originalDisplay;
+ els.position = originalPosition;
+ els.visibility = originalVisibility;
+ return {width: originalWidth, height: originalHeight};
+ },
+
+ makePositioned: function(element) {
+ element = $(element);
+ var pos = Element.getStyle(element, 'position');
+ if (pos == 'static' || !pos) {
+ element._madePositioned = true;
+ element.style.position = 'relative';
+ // Opera returns the offset relative to the positioning context, when an
+ // element is position relative but top and left have not been defined
+ if (window.opera) {
+ element.style.top = 0;
+ element.style.left = 0;
+ }
+ }
+ return element;
+ },
+
+ undoPositioned: function(element) {
+ element = $(element);
+ if (element._madePositioned) {
+ element._madePositioned = undefined;
+ element.style.position =
+ element.style.top =
+ element.style.left =
+ element.style.bottom =
+ element.style.right = '';
+ }
+ return element;
+ },
+
+ makeClipping: function(element) {
+ element = $(element);
+ if (element._overflow) return element;
+ element._overflow = Element.getStyle(element, 'overflow') || 'auto';
+ if (element._overflow !== 'hidden')
+ element.style.overflow = 'hidden';
+ return element;
+ },
+
+ undoClipping: function(element) {
+ element = $(element);
+ if (!element._overflow) return element;
+ element.style.overflow = element._overflow == 'auto' ? '' : element._overflow;
+ element._overflow = null;
+ return element;
+ },
+
+ cumulativeOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ } while (element);
+ return Element._returnOffset(valueL, valueT);
+ },
+
+ positionedOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ element = element.offsetParent;
+ if (element) {
+ if (element.tagName == 'BODY') break;
+ var p = Element.getStyle(element, 'position');
+ if (p !== 'static') break;
+ }
+ } while (element);
+ return Element._returnOffset(valueL, valueT);
+ },
+
+ absolutize: function(element) {
+ element = $(element);
+ if (element.getStyle('position') == 'absolute') return;
+ // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+ var offsets = element.positionedOffset();
+ var top = offsets[1];
+ var left = offsets[0];
+ var width = element.clientWidth;
+ var height = element.clientHeight;
+
+ element._originalLeft = left - parseFloat(element.style.left || 0);
+ element._originalTop = top - parseFloat(element.style.top || 0);
+ element._originalWidth = element.style.width;
+ element._originalHeight = element.style.height;
+
+ element.style.position = 'absolute';
+ element.style.top = top + 'px';
+ element.style.left = left + 'px';
+ element.style.width = width + 'px';
+ element.style.height = height + 'px';
+ return element;
+ },
+
+ relativize: function(element) {
+ element = $(element);
+ if (element.getStyle('position') == 'relative') return;
+ // Position.prepare(); // To be done manually by Scripty when it needs it.
+
+ element.style.position = 'relative';
+ var top = parseFloat(element.style.top || 0) - (element._originalTop || 0);
+ var left = parseFloat(element.style.left || 0) - (element._originalLeft || 0);
+
+ element.style.top = top + 'px';
+ element.style.left = left + 'px';
+ element.style.height = element._originalHeight;
+ element.style.width = element._originalWidth;
+ return element;
+ },
+
+ cumulativeScrollOffset: function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.scrollTop || 0;
+ valueL += element.scrollLeft || 0;
+ element = element.parentNode;
+ } while (element);
+ return Element._returnOffset(valueL, valueT);
+ },
+
+ getOffsetParent: function(element) {
+ if (element.offsetParent) return $(element.offsetParent);
+ if (element == document.body) return $(element);
+
+ while ((element = element.parentNode) && element != document.body
+ && Object.isElement(element)/* changed by Nick - http://dev.rubyonrails.org/ticket/11007 */)
+ if (Element.getStyle(element, 'position') != 'static')
+ return $(element);
+
+ return $(document.body);
+ },
+
+ viewportOffset: function(forElement) {
+ var valueT = 0, valueL = 0;
+
+ var element = forElement;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+
+ // Safari fix
+ if (element.offsetParent == document.body &&
+ Element.getStyle(element, 'position') == 'absolute') break;
+
+ } while (element = element.offsetParent);
+
+ element = forElement;
+ do {
+ if (!Prototype.Browser.Opera || element.tagName == 'BODY') {
+ valueT -= element.scrollTop || 0;
+ valueL -= element.scrollLeft || 0;
+ }
+ } while (element = element.parentNode);
+
+ return Element._returnOffset(valueL, valueT);
+ },
+
+ clonePosition: function(element, source) {
+ var options = Object.extend({
+ setLeft: true,
+ setTop: true,
+ setWidth: true,
+ setHeight: true,
+ offsetTop: 0,
+ offsetLeft: 0
+ }, arguments[2] || { });
+
+ // find page position of source
+ source = $(source);
+ var p = source.viewportOffset();
+
+ // find coordinate system to use
+ element = $(element);
+ var delta = [0, 0];
+ var parent = null;
+ // delta [0,0] will do fine with position: fixed elements,
+ // position:absolute needs offsetParent deltas
+ if (Element.getStyle(element, 'position') == 'absolute') {
+ parent = element.getOffsetParent();
+ delta = parent.viewportOffset();
+ }
+
+ // correct by body offsets (fixes Safari)
+ if (parent == document.body) {
+ delta[0] -= document.body.offsetLeft;
+ delta[1] -= document.body.offsetTop;
+ }
+
+ // set position
+ if (options.setLeft) element.style.left = (p[0] - delta[0] + options.offsetLeft) + 'px';
+ if (options.setTop) element.style.top = (p[1] - delta[1] + options.offsetTop) + 'px';
+ if (options.setWidth) element.style.width = source.offsetWidth + 'px';
+ if (options.setHeight) element.style.height = source.offsetHeight + 'px';
+ return element;
+ }
+};
+
+Element.Methods.identify.counter = 1;
+
+Object.extend(Element.Methods, {
+ getElementsBySelector: Element.Methods.select,
+ childElements: Element.Methods.immediateDescendants
+});
+
+Element._attributeTranslations = {
+ write: {
+ names: {
+ className: 'class',
+ htmlFor: 'for'
+ },
+ values: { }
+ }
+};
+
+if (Prototype.Browser.Opera) {
+ Element.Methods.getStyle = Element.Methods.getStyle.wrap(
+ function(proceed, element, style) {
+ switch (style) {
+ case 'left': case 'top': case 'right': case 'bottom':
+ if (proceed(element, 'position') === 'static') return null;
+ case 'height': case 'width':
+ // returns '0px' for hidden elements; we want it to return null
+ if (!Element.visible(element)) return null;
+
+ // returns the border-box dimensions rather than the content-box
+ // dimensions, so we subtract padding and borders from the value
+ var dim = parseInt(proceed(element, style), 10);
+
+ if (dim !== element['offset' + style.capitalize()])
+ return dim + 'px';
+
+ var properties;
+ if (style === 'height') {
+ properties = ['border-top-width', 'padding-top',
+ 'padding-bottom', 'border-bottom-width'];
+ }
+ else {
+ properties = ['border-left-width', 'padding-left',
+ 'padding-right', 'border-right-width'];
+ }
+ return properties.inject(dim, function(memo, property) {
+ var val = proceed(element, property);
+ return val === null ? memo : memo - parseInt(val, 10);
+ }) + 'px';
+ default: return proceed(element, style);
+ }
+ }
+ );
+
+ Element.Methods.readAttribute = Element.Methods.readAttribute.wrap(
+ function(proceed, element, attribute) {
+ if (attribute === 'title') return element.title;
+ return proceed(element, attribute);
+ }
+ );
+}
+
+else if (Prototype.Browser.IE) {
+ // IE doesn't report offsets correctly for static elements, so we change them
+ // to "relative" to get the values, then change them back.
+ Element.Methods.getOffsetParent = Element.Methods.getOffsetParent.wrap(
+ function(proceed, element) {
+ element = $(element);
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ }
+ );
+
+ $w('positionedOffset viewportOffset').each(function(method) {
+ Element.Methods[method] = Element.Methods[method].wrap(
+ function(proceed, element) {
+ element = $(element);
+ var position = element.getStyle('position');
+ if (position !== 'static') return proceed(element);
+ // Trigger hasLayout on the offset parent so that IE6 reports
+ // accurate offsetTop and offsetLeft values for position: fixed.
+ var offsetParent = element.getOffsetParent();
+ if (offsetParent && offsetParent.getStyle('position') === 'fixed')
+ offsetParent.setStyle({ zoom: 1 });
+ element.setStyle({ position: 'relative' });
+ var value = proceed(element);
+ element.setStyle({ position: position });
+ return value;
+ }
+ );
+ });
+
+ Element.Methods.getStyle = function(element, style) {
+ element = $(element);
+ style = (style == 'float' || style == 'cssFloat') ? 'styleFloat' : style.camelize();
+ var value = element.style[style];
+ if (!value && element.currentStyle) value = element.currentStyle[style];
+
+ if (style == 'opacity') {
+ if (value = (element.getStyle('filter') || '').match(/alpha\(opacity=(.*)\)/))
+ if (value[1]) return parseFloat(value[1]) / 100;
+ return 1.0;
+ }
+
+ if (value == 'auto') {
+ if ((style == 'width' || style == 'height') && (element.getStyle('display') != 'none'))
+ return element['offset' + style.capitalize()] + 'px';
+ return null;
+ }
+ return value;
+ };
+
+ Element.Methods.setOpacity = function(element, value) {
+ function stripAlpha(filter){
+ return filter.replace(/alpha\([^\)]*\)/gi,'');
+ }
+ element = $(element);
+ var currentStyle = element.currentStyle;
+ if ((currentStyle && !currentStyle.hasLayout) ||
+ (!currentStyle && element.style.zoom == 'normal'))
+ element.style.zoom = 1;
+
+ var filter = element.getStyle('filter'), style = element.style;
+ if (value == 1 || value === '') {
+ (filter = stripAlpha(filter)) ?
+ style.filter = filter : style.removeAttribute('filter');
+ return element;
+ } else if (value < 0.00001) value = 0;
+ style.filter = stripAlpha(filter) +
+ 'alpha(opacity=' + (value * 100) + ')';
+ return element;
+ };
+
+ Element._attributeTranslations = {
+ read: {
+ names: {
+ 'class': 'className',
+ 'for': 'htmlFor'
+ },
+ values: {
+ _getAttr: function(element, attribute) {
+ return element.getAttribute(attribute, 2);
+ },
+ _getAttrNode: function(element, attribute) {
+ var node = element.getAttributeNode(attribute);
+ return node ? node.value : "";
+ },
+ _getEv: function(element, attribute) {
+ attribute = element.getAttribute(attribute);
+ return attribute ? attribute.toString().slice(23, -2) : null;
+ },
+ _flag: function(element, attribute) {
+ return $(element).hasAttribute(attribute) ? attribute : null;
+ },
+ style: function(element) {
+ return element.style.cssText.toLowerCase();
+ },
+ title: function(element) {
+ return element.title;
+ }
+ }
+ }
+ };
+
+ Element._attributeTranslations.write = {
+ names: Object.extend({
+ cellpadding: 'cellPadding',
+ cellspacing: 'cellSpacing'
+ }, Element._attributeTranslations.read.names),
+ values: {
+ checked: function(element, value) {
+ element.checked = !!value;
+ },
+
+ style: function(element, value) {
+ element.style.cssText = value ? value : '';
+ }
+ }
+ };
+
+ Element._attributeTranslations.has = {};
+
+ $w('colSpan rowSpan vAlign dateTime accessKey tabIndex ' +
+ 'encType maxLength readOnly longDesc').each(function(attr) {
+ Element._attributeTranslations.write.names[attr.toLowerCase()] = attr;
+ Element._attributeTranslations.has[attr.toLowerCase()] = attr;
+ });
+
+ (function(v) {
+ Object.extend(v, {
+ href: v._getAttr,
+ src: v._getAttr,
+ type: v._getAttr,
+ action: v._getAttrNode,
+ disabled: v._flag,
+ checked: v._flag,
+ readonly: v._flag,
+ multiple: v._flag,
+ onload: v._getEv,
+ onunload: v._getEv,
+ onclick: v._getEv,
+ ondblclick: v._getEv,
+ onmousedown: v._getEv,
+ onmouseup: v._getEv,
+ onmouseover: v._getEv,
+ onmousemove: v._getEv,
+ onmouseout: v._getEv,
+ onfocus: v._getEv,
+ onblur: v._getEv,
+ onkeypress: v._getEv,
+ onkeydown: v._getEv,
+ onkeyup: v._getEv,
+ onsubmit: v._getEv,
+ onreset: v._getEv,
+ onselect: v._getEv,
+ onchange: v._getEv
+ });
+ })(Element._attributeTranslations.read.values);
+}
+
+else if (Prototype.Browser.Gecko && /rv:1\.8\.0/.test(navigator.userAgent)) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1) ? 0.999999 :
+ (value === '') ? '' : (value < 0.00001) ? 0 : value;
+ return element;
+ };
+}
+
+else if (Prototype.Browser.WebKit) {
+ Element.Methods.setOpacity = function(element, value) {
+ element = $(element);
+ element.style.opacity = (value == 1 || value === '') ? '' :
+ (value < 0.00001) ? 0 : value;
+
+ if (value == 1)
+ if(element.tagName == 'IMG' && element.width) {
+ element.width++; element.width--;
+ } else try {
+ var n = document.createTextNode(' ');
+ element.appendChild(n);
+ element.removeChild(n);
+ } catch (e) { }
+
+ return element;
+ };
+
+ // Safari returns margins on body which is incorrect if the child is absolutely
+ // positioned. For performance reasons, redefine Element#cumulativeOffset for
+ // KHTML/WebKit only.
+ Element.Methods.cumulativeOffset = function(element) {
+ var valueT = 0, valueL = 0;
+ do {
+ valueT += element.offsetTop || 0;
+ valueL += element.offsetLeft || 0;
+ if (element.offsetParent == document.body)
+ if (Element.getStyle(element, 'position') == 'absolute') break;
+
+ element = element.offsetParent;
+ } while (element);
+
+ return Element._returnOffset(valueL, valueT);
+ };
+}
+
+if (Prototype.Browser.IE || Prototype.Browser.Opera) {
+ // IE and Opera are missing .innerHTML support for TABLE-related and SELECT elements
+ Element.Methods.update = function(element, content) {
+ element = $(element);
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) return element.update().insert(content);
+
+ content = Object.toHTML(content);
+ var tagName = element.tagName.toUpperCase();
+
+ if (tagName in Element._insertionTranslations.tags) {
+ $A(element.childNodes).each(function(node) { element.removeChild(node) });
+ Element._getContentFromAnonymousElement(tagName, content.stripScripts())
+ .each(function(node) { element.appendChild(node) });
+ }
+ else element.innerHTML = content.stripScripts();
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ };
+}
+
+if ('outerHTML' in document.createElement('div')) {
+ Element.Methods.replace = function(element, content) {
+ element = $(element);
+
+ if (content && content.toElement) content = content.toElement();
+ if (Object.isElement(content)) {
+ element.parentNode.replaceChild(content, element);
+ return element;
+ }
+
+ content = Object.toHTML(content);
+ var parent = element.parentNode, tagName = parent.tagName.toUpperCase();
+
+ if (Element._insertionTranslations.tags[tagName]) {
+ var nextSibling = element.next();
+ var fragments = Element._getContentFromAnonymousElement(tagName, content.stripScripts());
+ parent.removeChild(element);
+ if (nextSibling)
+ fragments.each(function(node) { parent.insertBefore(node, nextSibling) });
+ else
+ fragments.each(function(node) { parent.appendChild(node) });
+ }
+ else element.outerHTML = content.stripScripts();
+
+ content.evalScripts.bind(content).defer();
+ return element;
+ };
+}
+
+Element._returnOffset = function(l, t) {
+ var result = [l, t];
+ result.left = l;
+ result.top = t;
+ return result;
+};
+
+Element._getContentFromAnonymousElement = function(tagName, html) {
+ var div = new Element('div'), t = Element._insertionTranslations.tags[tagName];
+ if (t) {
+ div.innerHTML = t[0] + html + t[1];
+ t[2].times(function() { div = div.firstChild });
+ } else div.innerHTML = html;
+ return $A(div.childNodes);
+};
+
+Element._insertionTranslations = {
+ before: function(element, node) {
+ element.parentNode.insertBefore(node, element);
+ },
+ top: function(element, node) {
+ element.insertBefore(node, element.firstChild);
+ },
+ bottom: function(element, node) {
+ element.appendChild(node);
+ },
+ after: function(element, node) {
+ element.parentNode.insertBefore(node, element.nextSibling);
+ },
+ tags: {
+ TABLE: ['<table>', '</table>', 1],
+ TBODY: ['<table><tbody>', '</tbody></table>', 2],
+ TR: ['<table><tbody><tr>', '</tr></tbody></table>', 3],
+ TD: ['<table><tbody><tr><td>', '</td></tr></tbody></table>', 4],
+ SELECT: ['<select>', '</select>', 1]
+ }
+};
+
+(function() {
+ Object.extend(this.tags, {
+ THEAD: this.tags.TBODY,
+ TFOOT: this.tags.TBODY,
+ TH: this.tags.TD
+ });
+}).call(Element._insertionTranslations);
+
+Element.Methods.Simulated = {
+ hasAttribute: function(element, attribute) {
+ attribute = Element._attributeTranslations.has[attribute] || attribute;
+ var node = $(element).getAttributeNode(attribute);
+ return node && node.specified;
+ }
+};
+
+Element.Methods.ByTag = { };
+
+Object.extend(Element, Element.Methods);
+
+if (!Prototype.BrowserFeatures.ElementExtensions &&
+ document.createElement('div').__proto__) {
+ window.HTMLElement = { };
+ window.HTMLElement.prototype = document.createElement('div').__proto__;
+ Prototype.BrowserFeatures.ElementExtensions = true;
+}
+
+Element.extend = (function() {
+ if (Prototype.BrowserFeatures.SpecificElementExtensions)
+ return Prototype.K;
+
+ var Methods = { }, ByTag = Element.Methods.ByTag;
+
+ var extend = Object.extend(function(element) {
+ if (!element || element._extendedByPrototype ||
+ element.nodeType != 1 || element == window) return element;
+
+ var methods = Object.clone(Methods),
+ tagName = element.tagName, property, value;
+
+ // extend methods for specific tags
+ if (ByTag[tagName]) Object.extend(methods, ByTag[tagName]);
+
+ for (property in methods) {
+ value = methods[property];
+ if (Object.isFunction(value) && !(property in element))
+ element[property] = value.methodize();
+ }
+
+ element._extendedByPrototype = Prototype.emptyFunction;
+ return element;
+
+ }, {
+ refresh: function() {
+ // extend methods for all tags (Safari doesn't need this)
+ if (!Prototype.BrowserFeatures.ElementExtensions) {
+ Object.extend(Methods, Element.Methods);
+ Object.extend(Methods, Element.Methods.Simulated);
+ }
+ }
+ });
+
+ extend.refresh();
+ return extend;
+})();
+
+Element.hasAttribute = function(element, attribute) {
+ if (element.hasAttribute) return element.hasAttribute(attribute);
+ return Element.Methods.Simulated.hasAttribute(element, attribute);
+};
+
+Element.addMethods = function(methods) {
+ var F = Prototype.BrowserFeatures, T = Element.Methods.ByTag;
+
+ if (!methods) {
+ Object.extend(Form, Form.Methods);
+ Object.extend(Form.Element, Form.Element.Methods);
+ Object.extend(Element.Methods.ByTag, {
+ "FORM": Object.clone(Form.Methods),
+ "INPUT": Object.clone(Form.Element.Methods),
+ "SELECT": Object.clone(Form.Element.Methods),
+ "TEXTAREA": Object.clone(Form.Element.Methods)
+ });
+ }
+
+ if (arguments.length == 2) {
+ var tagName = methods;
+ methods = arguments[1];
+ }
+
+ if (!tagName) Object.extend(Element.Methods, methods || { });
+ else {
+ if (Object.isArray(tagName)) tagName.each(extend);
+ else extend(tagName);
+ }
+
+ function extend(tagName) {
+ tagName = tagName.toUpperCase();
+ if (!Element.Methods.ByTag[tagName])
+ Element.Methods.ByTag[tagName] = { };
+ Object.extend(Element.Methods.ByTag[tagName], methods);
+ }
+
+ function copy(methods, destination, onlyIfAbsent) {
+ onlyIfAbsent = onlyIfAbsent || false;
+ for (var property in methods) {
+ var value = methods[property];
+ if (!Object.isFunction(value)) continue;
+ if (!onlyIfAbsent || !(property in destination))
+ destination[property] = value.methodize();
+ }
+ }
+
+ function findDOMClass(tagName) {
+ var klass;
+ var trans = {
+ "OPTGROUP": "OptGroup", "TEXTAREA": "TextArea", "P": "Paragraph",
+ "FIELDSET": "FieldSet", "UL": "UList", "OL": "OList", "DL": "DList",
+ "DIR": "Directory", "H1": "Heading", "H2": "Heading", "H3": "Heading",
+ "H4": "Heading", "H5": "Heading", "H6": "Heading", "Q": "Quote",
+ "INS": "Mod", "DEL": "Mod", "A": "Anchor", "IMG": "Image", "CAPTION":
+ "TableCaption", "COL": "TableCol", "COLGROUP": "TableCol", "THEAD":
+ "TableSection", "TFOOT": "TableSection", "TBODY": "TableSection", "TR":
+ "TableRow", "TH": "TableCell", "TD": "TableCell", "FRAMESET":
+ "FrameSet", "IFRAME": "IFrame"
+ };
+ if (trans[tagName]) klass = 'HTML' + trans[tagName] + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName + 'Element';
+ if (window[klass]) return window[klass];
+ klass = 'HTML' + tagName.capitalize() + 'Element';
+ if (window[klass]) return window[klass];
+
+ window[klass] = { };
+ window[klass].prototype = document.createElement(tagName).__proto__;
+ return window[klass];
+ }
+
+ if (F.ElementExtensions) {
+ copy(Element.Methods, HTMLElement.prototype);
+ copy(Element.Methods.Simulated, HTMLElement.prototype, true);
+ }
+
+ if (F.SpecificElementExtensions) {
+ for (var tag in Element.Methods.ByTag) {
+ var klass = findDOMClass(tag);
+ if (Object.isUndefined(klass)) continue;
+ copy(T[tag], klass.prototype);
+ }
+ }
+
+ Object.extend(Element, Element.Methods);
+ delete Element.ByTag;
+
+ if (Element.extend.refresh) Element.extend.refresh();
+ Element.cache = { };
+};
+
+document.viewport = {
+ getDimensions: function() {
+ var dimensions = { };
+ var B = Prototype.Browser;
+ $w('width height').each(function(d) {
+ var D = d.capitalize();
+ dimensions[d] = (B.WebKit && !document.evaluate) ? self['inner' + D] :
+ (B.Opera) ? document.body['client' + D] : document.documentElement['client' + D];
+ });
+ return dimensions;
+ },
+
+ getWidth: function() {
+ return this.getDimensions().width;
+ },
+
+ getHeight: function() {
+ return this.getDimensions().height;
+ },
+
+ getScrollOffsets: function() {
+ return Element._returnOffset(
+ window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft,
+ window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop);
+ }
+};
+/* Portions of the Selector class are derived from Jack Slocum’s DomQuery,
+ * part of YUI-Ext version 0.40, distributed under the terms of an MIT-style
+ * license. Please see http://www.yui-ext.com/ for more information. */
+
+var Selector = Class.create({
+ initialize: function(expression) {
+ this.expression = expression.strip();
+ this.compileMatcher();
+ },
+
+ shouldUseXPath: function() {
+ if (!Prototype.BrowserFeatures.XPath) return false;
+
+ var e = this.expression;
+
+ // Safari 3 chokes on :*-of-type and :empty
+ if (Prototype.Browser.WebKit &&
+ (e.include("-of-type") || e.include(":empty")))
+ return false;
+
+ // XPath can't do namespaced attributes, nor can it read
+ // the "checked" property from DOM nodes
+ if ((/(\[[\w-]*?:|:checked)/).test(this.expression))
+ return false;
+
+ return true;
+ },
+
+ compileMatcher: function() {
+ if (this.shouldUseXPath())
+ return this.compileXPathMatcher();
+
+ var e = this.expression, ps = Selector.patterns, h = Selector.handlers,
+ c = Selector.criteria, le, p, m;
+
+ if (Selector._cache[e]) {
+ this.matcher = Selector._cache[e];
+ return;
+ }
+
+ this.matcher = ["this.matcher = function(root) {",
+ "var r = root, h = Selector.handlers, c = false, n;"];
+
+ while (e && le != e && (/\S/).test(e)) {
+ le = e;
+ for (var i in ps) {
+ p = ps[i];
+ if (m = e.match(p)) {
+ this.matcher.push(Object.isFunction(c[i]) ? c[i](m) :
+ new Template(c[i]).evaluate(m));
+ e = e.replace(m[0], '');
+ break;
+ }
+ }
+ }
+
+ this.matcher.push("return h.unique(n);\n}");
+ eval(this.matcher.join('\n'));
+ Selector._cache[this.expression] = this.matcher;
+ },
+
+ compileXPathMatcher: function() {
+ var e = this.expression, ps = Selector.patterns,
+ x = Selector.xpath, le, m;
+
+ if (Selector._cache[e]) {
+ this.xpath = Selector._cache[e]; return;
+ }
+
+ this.matcher = ['.//*'];
+ while (e && le != e && (/\S/).test(e)) {
+ le = e;
+ for (var i in ps) {
+ if (m = e.match(ps[i])) {
+ this.matcher.push(Object.isFunction(x[i]) ? x[i](m) :
+ new Template(x[i]).evaluate(m));
+ e = e.replace(m[0], '');
+ break;
+ }
+ }
+ }
+
+ this.xpath = this.matcher.join('');
+ Selector._cache[this.expression] = this.xpath;
+ },
+
+ findElements: function(root) {
+ root = root || document;
+ if (this.xpath) return document._getElementsByXPath(this.xpath, root);
+ return this.matcher(root);
+ },
+
+ match: function(element) {
+ this.tokens = [];
+
+ var e = this.expression, ps = Selector.patterns, as = Selector.assertions;
+ var le, p, m;
+
+ while (e && le !== e && (/\S/).test(e)) {
+ le = e;
+ for (var i in ps) {
+ p = ps[i];
+ if (m = e.match(p)) {
+ // use the Selector.assertions methods unless the selector
+ // is too complex.
+ if (as[i]) {
+ this.tokens.push([i, Object.clone(m)]);
+ e = e.replace(m[0], '');
+ } else {
+ // reluctantly do a document-wide search
+ // and look for a match in the array
+ return this.findElements(document).include(element);
+ }
+ }
+ }
+ }
+
+ var match = true, name, matches;
+ for (var i = 0, token; token = this.tokens[i]; i++) {
+ name = token[0], matches = token[1];
+ if (!Selector.assertions[name](element, matches)) {
+ match = false; break;
+ }
+ }
+
+ return match;
+ },
+
+ toString: function() {
+ return this.expression;
+ },
+
+ inspect: function() {
+ return "#<Selector:" + this.expression.inspect() + ">";
+ }
+});
+
+Object.extend(Selector, {
+ _cache: { },
+
+ xpath: {
+ descendant: "//*",
+ child: "/*",
+ adjacent: "/following-sibling::*[1]",
+ laterSibling: '/following-sibling::*',
+ tagName: function(m) {
+ if (m[1] == '*') return '';
+ return "[local-name()='" + m[1].toLowerCase() +
+ "' or local-name()='" + m[1].toUpperCase() + "']";
+ },
+ className: "[contains(concat(' ', @class, ' '), ' #{1} ')]",
+ id: "[@id='#{1}']",
+ attrPresence: function(m) {
+ m[1] = m[1].toLowerCase();
+ return new Template("[@#{1}]").evaluate(m);
+ },
+ attr: function(m) {
+ m[1] = m[1].toLowerCase();
+ m[3] = m[5] || m[6];
+ return new Template(Selector.xpath.operators[m[2]]).evaluate(m);
+ },
+ pseudo: function(m) {
+ var h = Selector.xpath.pseudos[m[1]];
+ if (!h) return '';
+ if (Object.isFunction(h)) return h(m);
+ return new Template(Selector.xpath.pseudos[m[1]]).evaluate(m);
+ },
+ operators: {
+ '=': "[@#{1}='#{3}']",
+ '!=': "[@#{1}!='#{3}']",
+ '^=': "[starts-with(@#{1}, '#{3}')]",
+ '$=': "[substring(@#{1}, (string-length(@#{1}) - string-length('#{3}') + 1))='#{3}']",
+ '*=': "[contains(@#{1}, '#{3}')]",
+ '~=': "[contains(concat(' ', @#{1}, ' '), ' #{3} ')]",
+ '|=': "[contains(concat('-', @#{1}, '-'), '-#{3}-')]"
+ },
+ pseudos: {
+ 'first-child': '[not(preceding-sibling::*)]',
+ 'last-child': '[not(following-sibling::*)]',
+ 'only-child': '[not(preceding-sibling::* or following-sibling::*)]',
+ 'empty': "[count(*) = 0 and (count(text()) = 0 or translate(text(), ' \t\r\n', '') = '')]",
+ 'checked': "[@checked]",
+ 'disabled': "[@disabled]",
+ 'enabled': "[not(@disabled)]",
+ 'not': function(m) {
+ var e = m[6], p = Selector.patterns,
+ x = Selector.xpath, le, v;
+
+ var exclusion = [];
+ while (e && le != e && (/\S/).test(e)) {
+ le = e;
+ for (var i in p) {
+ if (m = e.match(p[i])) {
+ v = Object.isFunction(x[i]) ? x[i](m) : new Template(x[i]).evaluate(m);
+ exclusion.push("(" + v.substring(1, v.length - 1) + ")");
+ e = e.replace(m[0], '');
+ break;
+ }
+ }
+ }
+ return "[not(" + exclusion.join(" and ") + ")]";
+ },
+ 'nth-child': function(m) {
+ return Selector.xpath.pseudos.nth("(count(./preceding-sibling::*) + 1) ", m);
+ },
+ 'nth-last-child': function(m) {
+ return Selector.xpath.pseudos.nth("(count(./following-sibling::*) + 1) ", m);
+ },
+ 'nth-of-type': function(m) {
+ return Selector.xpath.pseudos.nth("position() ", m);
+ },
+ 'nth-last-of-type': function(m) {
+ return Selector.xpath.pseudos.nth("(last() + 1 - position()) ", m);
+ },
+ 'first-of-type': function(m) {
+ m[6] = "1"; return Selector.xpath.pseudos['nth-of-type'](m);
+ },
+ 'last-of-type': function(m) {
+ m[6] = "1"; return Selector.xpath.pseudos['nth-last-of-type'](m);
+ },
+ 'only-of-type': function(m) {
+ var p = Selector.xpath.pseudos; return p['first-of-type'](m) + p['last-of-type'](m);
+ },
+ nth: function(fragment, m) {
+ var mm, formula = m[6], predicate;
+ if (formula == 'even') formula = '2n+0';
+ if (formula == 'odd') formula = '2n+1';
+ if (mm = formula.match(/^(\d+)$/)) // digit only
+ return '[' + fragment + "= " + mm[1] + ']';
+ if (mm = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+ if (mm[1] == "-") mm[1] = -1;
+ var a = mm[1] ? Number(mm[1]) : 1;
+ var b = mm[2] ? Number(mm[2]) : 0;
+ predicate = "[((#{fragment} - #{b}) mod #{a} = 0) and " +
+ "((#{fragment} - #{b}) div #{a} >= 0)]";
+ return new Template(predicate).evaluate({
+ fragment: fragment, a: a, b: b });
+ }
+ }
+ }
+ },
+
+ criteria: {
+ tagName: 'n = h.tagName(n, r, "#{1}", c); c = false;',
+ className: 'n = h.className(n, r, "#{1}", c); c = false;',
+ id: 'n = h.id(n, r, "#{1}", c); c = false;',
+ attrPresence: 'n = h.attrPresence(n, r, "#{1}", c); c = false;',
+ attr: function(m) {
+ m[3] = (m[5] || m[6]);
+ return new Template('n = h.attr(n, r, "#{1}", "#{3}", "#{2}", c); c = false;').evaluate(m);
+ },
+ pseudo: function(m) {
+ if (m[6]) m[6] = m[6].replace(/"/g, '\\"');
+ return new Template('n = h.pseudo(n, "#{1}", "#{6}", r, c); c = false;').evaluate(m);
+ },
+ descendant: 'c = "descendant";',
+ child: 'c = "child";',
+ adjacent: 'c = "adjacent";',
+ laterSibling: 'c = "laterSibling";'
+ },
+
+ patterns: {
+ // combinators must be listed first
+ // (and descendant needs to be last combinator)
+ laterSibling: /^\s*~\s*/,
+ child: /^\s*>\s*/,
+ adjacent: /^\s*\+\s*/,
+ descendant: /^\s/,
+
+ // selectors follow
+ tagName: /^\s*(\*|[\w\-]+)(\b|$)?/,
+ id: /^#([\w\-\*]+)(\b|$)/,
+ className: /^\.([\w\-\*]+)(\b|$)/,
+ pseudo:
+/^:((first|last|nth|nth-last|only)(-child|-of-type)|empty|checked|(en|dis)abled|not)(\((.*?)\))?(\b|$|(?=\s|[:+~>]))/,
+ attrPresence: /^\[([\w]+)\]/,
+ attr: /\[((?:[\w-]*:)?[\w-]+)\s*(?:([!^$*~|]?=)\s*((['"])([^\4]*?)\4|([^'"][^\]]*?)))?\]/
+ },
+
+ // for Selector.match and Element#match
+ assertions: {
+ tagName: function(element, matches) {
+ return matches[1].toUpperCase() == element.tagName.toUpperCase();
+ },
+
+ className: function(element, matches) {
+ return Element.hasClassName(element, matches[1]);
+ },
+
+ id: function(element, matches) {
+ return element.id === matches[1];
+ },
+
+ attrPresence: function(element, matches) {
+ return Element.hasAttribute(element, matches[1]);
+ },
+
+ attr: function(element, matches) {
+ var nodeValue = Element.readAttribute(element, matches[1]);
+ return nodeValue && Selector.operators[matches[2]](nodeValue, matches[5] || matches[6]);
+ }
+ },
+
+ handlers: {
+ // UTILITY FUNCTIONS
+ // joins two collections
+ concat: function(a, b) {
+ for (var i = 0, node; node = b[i]; i++)
+ a.push(node);
+ return a;
+ },
+
+ // marks an array of nodes for counting
+ mark: function(nodes) {
+ var _true = Prototype.emptyFunction;
+ for (var i = 0, node; node = nodes[i]; i++)
+ node._countedByPrototype = _true;
+ return nodes;
+ },
+
+ unmark: function(nodes) {
+ for (var i = 0, node; node = nodes[i]; i++)
+ node._countedByPrototype = undefined;
+ return nodes;
+ },
+
+ // mark each child node with its position (for nth calls)
+ // "ofType" flag indicates whether we're indexing for nth-of-type
+ // rather than nth-child
+ index: function(parentNode, reverse, ofType) {
+ parentNode._countedByPrototype = Prototype.emptyFunction;
+ if (reverse) {
+ for (var nodes = parentNode.childNodes, i = nodes.length - 1, j = 1; i >= 0; i--) {
+ var node = nodes[i];
+ if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+ }
+ } else {
+ for (var i = 0, j = 1, nodes = parentNode.childNodes; node = nodes[i]; i++)
+ if (node.nodeType == 1 && (!ofType || node._countedByPrototype)) node.nodeIndex = j++;
+ }
+ },
+
+ // filters out duplicates and extends all nodes
+ unique: function(nodes) {
+ if (nodes.length == 0) return nodes;
+ var results = [], n;
+ for (var i = 0, l = nodes.length; i < l; i++)
+ if (!(n = nodes[i])._countedByPrototype) {
+ n._countedByPrototype = Prototype.emptyFunction;
+ results.push(Element.extend(n));
+ }
+ return Selector.handlers.unmark(results);
+ },
+
+ // COMBINATOR FUNCTIONS
+ descendant: function(nodes) {
+ var h = Selector.handlers;
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ h.concat(results, node.getElementsByTagName('*'));
+ return results;
+ },
+
+ child: function(nodes) {
+ var h = Selector.handlers;
+ for (var i = 0, results = [], node; node = nodes[i]; i++) {
+ for (var j = 0, child; child = node.childNodes[j]; j++)
+ if (child.nodeType == 1 && child.tagName != '!') results.push(child);
+ }
+ return results;
+ },
+
+ adjacent: function(nodes) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++) {
+ var next = this.nextElementSibling(node);
+ if (next) results.push(next);
+ }
+ return results;
+ },
+
+ laterSibling: function(nodes) {
+ var h = Selector.handlers;
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ h.concat(results, Element.nextSiblings(node));
+ return results;
+ },
+
+ nextElementSibling: function(node) {
+ while (node = node.nextSibling)
+ if (node.nodeType == 1) return node;
+ return null;
+ },
+
+ previousElementSibling: function(node) {
+ while (node = node.previousSibling)
+ if (node.nodeType == 1) return node;
+ return null;
+ },
+
+ // TOKEN FUNCTIONS
+ tagName: function(nodes, root, tagName, combinator) {
+ var uTagName = tagName.toUpperCase();
+ var results = [], h = Selector.handlers;
+ if (nodes) {
+ if (combinator) {
+ // fastlane for ordinary descendant combinators
+ if (combinator == "descendant") {
+ for (var i = 0, node; node = nodes[i]; i++)
+ h.concat(results, node.getElementsByTagName(tagName));
+ return results;
+ } else nodes = this[combinator](nodes);
+ if (tagName == "*") return nodes;
+ }
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (node.tagName.toUpperCase() === uTagName) results.push(node);
+ return results;
+ } else return root.getElementsByTagName(tagName);
+ },
+
+ id: function(nodes, root, id, combinator) {
+ var targetNode = $(id), h = Selector.handlers;
+ if (!targetNode) return [];
+ if (!nodes && root == document) return [targetNode];
+ if (nodes) {
+ if (combinator) {
+ if (combinator == 'child') {
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (targetNode.parentNode == node) return [targetNode];
+ } else if (combinator == 'descendant') {
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (Element.descendantOf(targetNode, node)) return [targetNode];
+ } else if (combinator == 'adjacent') {
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (Selector.handlers.previousElementSibling(targetNode) == node)
+ return [targetNode];
+ } else nodes = h[combinator](nodes);
+ }
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (node == targetNode) return [targetNode];
+ return [];
+ }
+ return (targetNode && Element.descendantOf(targetNode, root)) ? [targetNode] : [];
+ },
+
+ className: function(nodes, root, className, combinator) {
+ if (nodes && combinator) nodes = this[combinator](nodes);
+ return Selector.handlers.byClassName(nodes, root, className);
+ },
+
+ byClassName: function(nodes, root, className) {
+ if (!nodes) nodes = Selector.handlers.descendant([root]);
+ var needle = ' ' + className + ' ';
+ for (var i = 0, results = [], node, nodeClassName; node = nodes[i]; i++) {
+ nodeClassName = node.className;
+ if (nodeClassName.length == 0) continue;
+ if (nodeClassName == className || (' ' + nodeClassName + ' ').include(needle))
+ results.push(node);
+ }
+ return results;
+ },
+
+ attrPresence: function(nodes, root, attr, combinator) {
+ if (!nodes) nodes = root.getElementsByTagName("*");
+ if (nodes && combinator) nodes = this[combinator](nodes);
+ var results = [];
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (Element.hasAttribute(node, attr)) results.push(node);
+ return results;
+ },
+
+ attr: function(nodes, root, attr, value, operator, combinator) {
+ if (!nodes) nodes = root.getElementsByTagName("*");
+ if (nodes && combinator) nodes = this[combinator](nodes);
+ var handler = Selector.operators[operator], results = [];
+ for (var i = 0, node; node = nodes[i]; i++) {
+ var nodeValue = Element.readAttribute(node, attr);
+ if (nodeValue === null) continue;
+ if (handler(nodeValue, value)) results.push(node);
+ }
+ return results;
+ },
+
+ pseudo: function(nodes, name, value, root, combinator) {
+ if (nodes && combinator) nodes = this[combinator](nodes);
+ if (!nodes) nodes = root.getElementsByTagName("*");
+ return Selector.pseudos[name](nodes, value, root);
+ }
+ },
+
+ pseudos: {
+ 'first-child': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++) {
+ if (Selector.handlers.previousElementSibling(node)) continue;
+ results.push(node);
+ }
+ return results;
+ },
+ 'last-child': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++) {
+ if (Selector.handlers.nextElementSibling(node)) continue;
+ results.push(node);
+ }
+ return results;
+ },
+ 'only-child': function(nodes, value, root) {
+ var h = Selector.handlers;
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ if (!h.previousElementSibling(node) && !h.nextElementSibling(node))
+ results.push(node);
+ return results;
+ },
+ 'nth-child': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, formula, root);
+ },
+ 'nth-last-child': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, formula, root, true);
+ },
+ 'nth-of-type': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, formula, root, false, true);
+ },
+ 'nth-last-of-type': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, formula, root, true, true);
+ },
+ 'first-of-type': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, "1", root, false, true);
+ },
+ 'last-of-type': function(nodes, formula, root) {
+ return Selector.pseudos.nth(nodes, "1", root, true, true);
+ },
+ 'only-of-type': function(nodes, formula, root) {
+ var p = Selector.pseudos;
+ return p['last-of-type'](p['first-of-type'](nodes, formula, root), formula, root);
+ },
+
+ // handles the an+b logic
+ getIndices: function(a, b, total) {
+ if (a == 0) return b > 0 ? [b] : [];
+ return $R(1, total).inject([], function(memo, i) {
+ if (0 == (i - b) % a && (i - b) / a >= 0) memo.push(i);
+ return memo;
+ });
+ },
+
+ // handles nth(-last)-child, nth(-last)-of-type, and (first|last)-of-type
+ nth: function(nodes, formula, root, reverse, ofType) {
+ if (nodes.length == 0) return [];
+ if (formula == 'even') formula = '2n+0';
+ if (formula == 'odd') formula = '2n+1';
+ var h = Selector.handlers, results = [], indexed = [], m;
+ h.mark(nodes);
+ for (var i = 0, node; node = nodes[i]; i++) {
+ if (!node.parentNode._countedByPrototype) {
+ h.index(node.parentNode, reverse, ofType);
+ indexed.push(node.parentNode);
+ }
+ }
+ if (formula.match(/^\d+$/)) { // just a number
+ formula = Number(formula);
+ for (var i = 0, node; node = nodes[i]; i++)
+ if (node.nodeIndex == formula) results.push(node);
+ } else if (m = formula.match(/^(-?\d*)?n(([+-])(\d+))?/)) { // an+b
+ if (m[1] == "-") m[1] = -1;
+ var a = m[1] ? Number(m[1]) : 1;
+ var b = m[2] ? Number(m[2]) : 0;
+ var indices = Selector.pseudos.getIndices(a, b, nodes.length);
+ for (var i = 0, node, l = indices.length; node = nodes[i]; i++) {
+ for (var j = 0; j < l; j++)
+ if (node.nodeIndex == indices[j]) results.push(node);
+ }
+ }
+ h.unmark(nodes);
+ h.unmark(indexed);
+ return results;
+ },
+
+ 'empty': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++) {
+ // IE treats comments as element nodes
+ if (node.tagName == '!' || (node.firstChild && !node.innerHTML.match(/^\s*$/))) continue;
+ results.push(node);
+ }
+ return results;
+ },
+
+ 'not': function(nodes, selector, root) {
+ var h = Selector.handlers, selectorType, m;
+ var exclusions = new Selector(selector).findElements(root);
+ h.mark(exclusions);
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ if (!node._countedByPrototype) results.push(node);
+ h.unmark(exclusions);
+ return results;
+ },
+
+ 'enabled': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ if (!node.disabled) results.push(node);
+ return results;
+ },
+
+ 'disabled': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ if (node.disabled) results.push(node);
+ return results;
+ },
+
+ 'checked': function(nodes, value, root) {
+ for (var i = 0, results = [], node; node = nodes[i]; i++)
+ if (node.checked) results.push(node);
+ return results;
+ }
+ },
+
+ operators: {
+ '=': function(nv, v) { return nv == v; },
+ '!=': function(nv, v) { return nv != v; },
+ '^=': function(nv, v) { return nv.startsWith(v); },
+ '$=': function(nv, v) { return nv.endsWith(v); },
+ '*=': function(nv, v) { return nv.include(v); },
+ '~=': function(nv, v) { return (' ' + nv + ' ').include(' ' + v + ' '); },
+ '|=': function(nv, v) { return ('-' + nv.toUpperCase() + '-').include('-' + v.toUpperCase() + '-'); }
+ },
+
+ split: function(expression) {
+ var expressions = [];
+ expression.scan(/(([\w#:.~>+()\s-]+|\*|\[.*?\])+)\s*(,|$)/, function(m) {
+ expressions.push(m[1].strip());
+ });
+ return expressions;
+ },
+
+ matchElements: function(elements, expression) {
+ var matches = $$(expression), h = Selector.handlers;
+ h.mark(matches);
+ for (var i = 0, results = [], element; element = elements[i]; i++)
+ if (element._countedByPrototype) results.push(element);
+ h.unmark(matches);
+ return results;
+ },
+
+ findElement: function(elements, expression, index) {
+ if (Object.isNumber(expression)) {
+ index = expression; expression = false;
+ }
+ return Selector.matchElements(elements, expression || '*')[index || 0];
+ },
+
+ findChildElements: function(element, expressions) {
+ expressions = Selector.split(expressions.join(','));
+ var results = [], h = Selector.handlers;
+ for (var i = 0, l = expressions.length, selector; i < l; i++) {
+ selector = new Selector(expressions[i].strip());
+ h.concat(results, selector.findElements(element));
+ }
+ return (l > 1) ? h.unique(results) : results;
+ }
+});
+
+if (Prototype.Browser.IE) {
+ Object.extend(Selector.handlers, {
+ // IE returns comment nodes on getElementsByTagName("*").
+ // Filter them out.
+ concat: function(a, b) {
+ for (var i = 0, node; node = b[i]; i++)
+ if (node.tagName !== "!") a.push(node);
+ return a;
+ },
+
+ // IE improperly serializes _countedByPrototype in (inner|outer)HTML.
+ unmark: function(nodes) {
+ for (var i = 0, node; node = nodes[i]; i++)
+ node.removeAttribute('_countedByPrototype');
+ return nodes;
+ }
+ });
+}
+
+function $$() {
+ return Selector.findChildElements(document, $A(arguments));
+}
+var Form = {
+ reset: function(form) {
+ $(form).reset();
+ return form;
+ },
+
+ serializeElements: function(elements, options) {
+ if (typeof options != 'object') options = { hash: !!options };
+ else if (Object.isUndefined(options.hash)) options.hash = true;
+ var key, value, submitted = false, submit = options.submit;
+
+ var data = elements.inject({ }, function(result, element) {
+ if (!element.disabled && element.name) {
+ key = element.name; value = $(element).getValue();
+ if (value != null && (element.type != 'submit' || (!submitted &&
+ submit !== false && (!submit || key == submit) && (submitted = true)))) {
+ if (key in result) {
+ // a key is already present; construct an array of values
+ if (!Object.isArray(result[key])) result[key] = [result[key]];
+ result[key].push(value);
+ }
+ else result[key] = value;
+ }
+ }
+ return result;
+ });
+
+ return options.hash ? data : Object.toQueryString(data);
+ }
+};
+
+Form.Methods = {
+ serialize: function(form, options) {
+ return Form.serializeElements(Form.getElements(form), options);
+ },
+
+ getElements: function(form) {
+ return $A($(form).getElementsByTagName('*')).inject([],
+ function(elements, child) {
+ if (Form.Element.Serializers[child.tagName.toLowerCase()])
+ elements.push(Element.extend(child));
+ return elements;
+ }
+ );
+ },
+
+ getInputs: function(form, typeName, name) {
+ form = $(form);
+ var inputs = form.getElementsByTagName('input');
+
+ if (!typeName && !name) return $A(inputs).map(Element.extend);
+
+ for (var i = 0, matchingInputs = [], length = inputs.length; i < length; i++) {
+ var input = inputs[i];
+ if ((typeName && input.type != typeName) || (name && input.name != name))
+ continue;
+ matchingInputs.push(Element.extend(input));
+ }
+
+ return matchingInputs;
+ },
+
+ disable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('disable');
+ return form;
+ },
+
+ enable: function(form) {
+ form = $(form);
+ Form.getElements(form).invoke('enable');
+ return form;
+ },
+
+ findFirstElement: function(form) {
+ var elements = $(form).getElements().findAll(function(element) {
+ return 'hidden' != element.type && !element.disabled;
+ });
+ var firstByIndex = elements.findAll(function(element) {
+ return element.hasAttribute('tabIndex') && element.tabIndex >= 0;
+ }).sortBy(function(element) { return element.tabIndex }).first();
+
+ return firstByIndex ? firstByIndex : elements.find(function(element) {
+ return ['input', 'select', 'textarea'].include(element.tagName.toLowerCase());
+ });
+ },
+
+ focusFirstElement: function(form) {
+ form = $(form);
+ form.findFirstElement().activate();
+ return form;
+ },
+
+ request: function(form, options) {
+ form = $(form), options = Object.clone(options || { });
+
+ var params = options.parameters, action = form.readAttribute('action') || '';
+ if (action.blank()) action = window.location.href;
+ options.parameters = form.serialize(true);
+
+ if (params) {
+ if (Object.isString(params)) params = params.toQueryParams();
+ Object.extend(options.parameters, params);
+ }
+
+ if (form.hasAttribute('method') && !options.method)
+ options.method = form.method;
+
+ return new Ajax.Request(action, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element = {
+ focus: function(element) {
+ $(element).focus();
+ return element;
+ },
+
+ select: function(element) {
+ $(element).select();
+ return element;
+ }
+};
+
+Form.Element.Methods = {
+ serialize: function(element) {
+ element = $(element);
+ if (!element.disabled && element.name) {
+ var value = element.getValue();
+ if (value != undefined) {
+ var pair = { };
+ pair[element.name] = value;
+ return Object.toQueryString(pair);
+ }
+ }
+ return '';
+ },
+
+ getValue: function(element) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ return Form.Element.Serializers[method](element);
+ },
+
+ setValue: function(element, value) {
+ element = $(element);
+ var method = element.tagName.toLowerCase();
+ Form.Element.Serializers[method](element, value);
+ return element;
+ },
+
+ clear: function(element) {
+ $(element).value = '';
+ return element;
+ },
+
+ present: function(element) {
+ return $(element).value != '';
+ },
+
+ activate: function(element) {
+ element = $(element);
+ try {
+ element.focus();
+ if (element.select && (element.tagName.toLowerCase() != 'input' ||
+ !['button', 'reset', 'submit'].include(element.type)))
+ element.select();
+ } catch (e) { }
+ return element;
+ },
+
+ disable: function(element) {
+ element = $(element);
+ element.blur();
+ element.disabled = true;
+ return element;
+ },
+
+ enable: function(element) {
+ element = $(element);
+ element.disabled = false;
+ return element;
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+var Field = Form.Element;
+var $F = Form.Element.Methods.getValue;
+
+/*--------------------------------------------------------------------------*/
+
+Form.Element.Serializers = {
+ input: function(element, value) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ return Form.Element.Serializers.inputSelector(element, value);
+ default:
+ return Form.Element.Serializers.textarea(element, value);
+ }
+ },
+
+ inputSelector: function(element, value) {
+ if (Object.isUndefined(value)) return element.checked ? element.value : null;
+ else element.checked = !!value;
+ },
+
+ textarea: function(element, value) {
+ if (Object.isUndefined(value)) return element.value;
+ else element.value = value;
+ },
+
+ select: function(element, index) {
+ if (Object.isUndefined(index))
+ return this[element.type == 'select-one' ?
+ 'selectOne' : 'selectMany'](element);
+ else {
+ var opt, value, single = !Object.isArray(index);
+ for (var i = 0, length = element.length; i < length; i++) {
+ opt = element.options[i];
+ value = this.optionValue(opt);
+ if (single) {
+ if (value == index) {
+ opt.selected = true;
+ return;
+ }
+ }
+ else opt.selected = index.include(value);
+ }
+ }
+ },
+
+ selectOne: function(element) {
+ var index = element.selectedIndex;
+ return index >= 0 ? this.optionValue(element.options[index]) : null;
+ },
+
+ selectMany: function(element) {
+ var values, length = element.length;
+ if (!length) return null;
+
+ for (var i = 0, values = []; i < length; i++) {
+ var opt = element.options[i];
+ if (opt.selected) values.push(this.optionValue(opt));
+ }
+ return values;
+ },
+
+ optionValue: function(opt) {
+ // extend element because hasAttribute may not be native
+ return Element.extend(opt).hasAttribute('value') ? opt.value : opt.text;
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.TimedObserver = Class.create(PeriodicalExecuter, {
+ initialize: function($super, element, frequency, callback) {
+ $super(callback, frequency);
+ this.element = $(element);
+ this.lastValue = this.getValue();
+ },
+
+ execute: function() {
+ var value = this.getValue();
+ if (Object.isString(this.lastValue) && Object.isString(value) ?
+ this.lastValue != value : String(this.lastValue) != String(value)) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ }
+});
+
+Form.Element.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.Observer = Class.create(Abstract.TimedObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+
+/*--------------------------------------------------------------------------*/
+
+Abstract.EventObserver = Class.create({
+ initialize: function(element, callback) {
+ this.element = $(element);
+ this.callback = callback;
+
+ this.lastValue = this.getValue();
+ if (this.element.tagName.toLowerCase() == 'form')
+ this.registerFormCallbacks();
+ else
+ this.registerCallback(this.element);
+ },
+
+ onElementEvent: function() {
+ var value = this.getValue();
+ if (this.lastValue != value) {
+ this.callback(this.element, value);
+ this.lastValue = value;
+ }
+ },
+
+ registerFormCallbacks: function() {
+ Form.getElements(this.element).each(this.registerCallback, this);
+ },
+
+ registerCallback: function(element) {
+ if (element.type) {
+ switch (element.type.toLowerCase()) {
+ case 'checkbox':
+ case 'radio':
+ Event.observe(element, 'click', this.onElementEvent.bind(this));
+ break;
+ default:
+ Event.observe(element, 'change', this.onElementEvent.bind(this));
+ break;
+ }
+ }
+ }
+});
+
+Form.Element.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.Element.getValue(this.element);
+ }
+});
+
+Form.EventObserver = Class.create(Abstract.EventObserver, {
+ getValue: function() {
+ return Form.serialize(this.element);
+ }
+});
+if (!window.Event) var Event = { };
+
+Object.extend(Event, {
+ KEY_BACKSPACE: 8,
+ KEY_TAB: 9,
+ KEY_RETURN: 13,
+ KEY_ESC: 27,
+ KEY_LEFT: 37,
+ KEY_UP: 38,
+ KEY_RIGHT: 39,
+ KEY_DOWN: 40,
+ KEY_DELETE: 46,
+ KEY_HOME: 36,
+ KEY_END: 35,
+ KEY_PAGEUP: 33,
+ KEY_PAGEDOWN: 34,
+ KEY_INSERT: 45,
+
+ cache: { },
+
+ relatedTarget: function(event) {
+ var element;
+ switch(event.type) {
+ case 'mouseover': element = event.fromElement; break;
+ case 'mouseout': element = event.toElement; break;
+ default: return null;
+ }
+ return Element.extend(element);
+ }
+});
+
+Event.Methods = (function() {
+ var isButton;
+
+ if (Prototype.Browser.IE) {
+ var buttonMap = { 0: 1, 1: 4, 2: 2 };
+ isButton = function(event, code) {
+ return event.button == buttonMap[code];
+ };
+
+ } else if (Prototype.Browser.WebKit) {
+ isButton = function(event, code) {
+ switch (code) {
+ case 0: return event.which == 1 && !event.metaKey;
+ case 1: return event.which == 1 && event.metaKey;
+ default: return false;
+ }
+ };
+
+ } else {
+ isButton = function(event, code) {
+ return event.which ? (event.which === code + 1) : (event.button === code);
+ };
+ }
+
+ return {
+ isLeftClick: function(event) { return isButton(event, 0) },
+ isMiddleClick: function(event) { return isButton(event, 1) },
+ isRightClick: function(event) { return isButton(event, 2) },
+
+ element: function(event) {
+ var node = Event.extend(event).target;
+ return Element.extend(node.nodeType == Node.TEXT_NODE ? node.parentNode : node);
+ },
+
+ findElement: function(event, expression) {
+ var element = Event.element(event);
+ if (!expression) return element;
+ var elements = [element].concat(element.ancestors());
+ return Selector.findElement(elements, expression, 0);
+ },
+
+ pointer: function(event) {
+ return {
+ x: event.pageX || (event.clientX +
+ (document.documentElement.scrollLeft || document.body.scrollLeft)),
+ y: event.pageY || (event.clientY +
+ (document.documentElement.scrollTop || document.body.scrollTop))
+ };
+ },
+
+ pointerX: function(event) { return Event.pointer(event).x },
+ pointerY: function(event) { return Event.pointer(event).y },
+
+ stop: function(event) {
+ Event.extend(event);
+ event.preventDefault();
+ event.stopPropagation();
+ event.stopped = true;
+ }
+ };
+})();
+
+Event.extend = (function() {
+ var methods = Object.keys(Event.Methods).inject({ }, function(m, name) {
+ m[name] = Event.Methods[name].methodize();
+ return m;
+ });
+
+ if (Prototype.Browser.IE) {
+ Object.extend(methods, {
+ stopPropagation: function() { this.cancelBubble = true },
+ preventDefault: function() { this.returnValue = false },
+ inspect: function() { return "[object Event]" }
+ });
+
+ return function(event) {
+ if (!event) return false;
+ if (event._extendedByPrototype) return event;
+
+ event._extendedByPrototype = Prototype.emptyFunction;
+ var pointer = Event.pointer(event);
+ Object.extend(event, {
+ target: event.srcElement,
+ relatedTarget: Event.relatedTarget(event),
+ pageX: pointer.x,
+ pageY: pointer.y
+ });
+ return Object.extend(event, methods);
+ };
+
+ } else {
+ Event.prototype = Event.prototype || document.createEvent("HTMLEvents").__proto__;
+ Object.extend(Event.prototype, methods);
+ return Prototype.K;
+ }
+})();
+
+// Richfaces: added
+Event.getDOMEventName = function(eventName) {
+ if (eventName && eventName.include(':')) return "dataavailable";
+ return eventName;
+};
+
+Object.extend(Event, (function() {
+ var cache = Event.cache;
+
+ function getEventID(element) {
+ if (element._prototypeEventID) return element._prototypeEventID[0];
+ arguments.callee.id = arguments.callee.id || 1;
+ return element._prototypeEventID = [++arguments.callee.id];
+ }
+// Richfaces: commented
+/*
+ function getDOMEventName(eventName) {
+ if (eventName && eventName.include(':')) return "dataavailable";
+ return eventName;
+ }
+*/
+ function getCacheForID(id) {
+ return cache[id] = cache[id] || { };
+ }
+
+ function getWrappersForEventName(id, eventName) {
+ var c = getCacheForID(id);
+ return c[eventName] = c[eventName] || [];
+ }
+
+ function createWrapper(element, eventName, handler) {
+ var id = getEventID(element);
+ var c = getWrappersForEventName(id, eventName);
+ if (c.pluck("handler").include(handler)) return false;
+
+ var wrapper = function(event) {
+ if (!Event || !Event.extend ||
+ (event.eventName && event.eventName != eventName))
+ return false;
+
+ Event.extend(event);
+ handler.call(element, event);
+ };
+
+ wrapper.handler = handler;
+ c.push(wrapper);
+ return wrapper;
+ }
+
+ function findWrapper(id, eventName, handler) {
+ var c = getWrappersForEventName(id, eventName);
+ return c.find(function(wrapper) { return wrapper.handler == handler });
+ }
+
+ function destroyWrapper(id, eventName, handler) {
+ var c = getCacheForID(id);
+ if (!c[eventName]) return false;
+ c[eventName] = c[eventName].without(findWrapper(id, eventName, handler));
+ }
+
+// Richfaces: commented
+/*
+ function destroyCache() {
+ for (var id in cache)
+ for (var eventName in cache[id])
+ cache[id][eventName] = null;
+ }
+
+ if (window.attachEvent) {
+ window.attachEvent("onunload", destroyCache);
+ }
+*/
+ return {
+ observe: function(element, eventName, handler) {
+ element = $(element);
+ var name = Event.getDOMEventName(eventName); // Richfaces: Event. added
+
+ var wrapper = createWrapper(element, eventName, handler);
+ if (!wrapper) return element;
+
+ if (element.addEventListener) {
+ element.addEventListener(name, wrapper, false);
+ } else {
+ element.attachEvent("on" + name, wrapper);
+ }
+
+ return element;
+ },
+
+ stopObserving: function(element, eventName, handler) {
+ element = $(element);
+ var id = getEventID(element), name = Event.getDOMEventName(eventName); // Richfaces: Event. added
+
+ if (!handler && eventName) {
+ getWrappersForEventName(id, eventName).each(function(wrapper) {
+ element.stopObserving(eventName, wrapper.handler);
+ });
+ return element;
+
+ } else if (!eventName) {
+ Object.keys(getCacheForID(id)).each(function(eventName) {
+ element.stopObserving(eventName);
+ });
+ return element;
+ }
+
+ var wrapper = findWrapper(id, eventName, handler);
+ if (!wrapper) return element;
+
+ if (element.removeEventListener) {
+ element.removeEventListener(name, wrapper, false);
+ } else {
+ element.detachEvent("on" + name, wrapper);
+ }
+
+ destroyWrapper(id, eventName, handler);
+
+ return element;
+ },
+
+ fire: function(element, eventName, memo) {
+ element = $(element);
+ if (element == document && document.createEvent && !element.dispatchEvent)
+ element = document.documentElement;
+
+ var event;
+ if (document.createEvent) {
+ event = document.createEvent("HTMLEvents");
+ event.initEvent("dataavailable", true, true);
+ } else {
+ event = document.createEventObject();
+ event.eventType = "ondataavailable";
+ }
+
+ event.eventName = eventName;
+ event.memo = memo || { };
+
+ if (document.createEvent) {
+ element.dispatchEvent(event);
+ } else {
+ element.fireEvent(event.eventType, event);
+ }
+
+ return Event.extend(event);
+ }
+ };
+})());
+
+Object.extend(Event, Event.Methods);
+
+Element.addMethods({
+ fire: Event.fire,
+ observe: Event.observe,
+ stopObserving: Event.stopObserving
+});
+
+Object.extend(document, {
+ fire: Element.Methods.fire.methodize(),
+ observe: Element.Methods.observe.methodize(),
+ stopObserving: Element.Methods.stopObserving.methodize(),
+ loaded: false
+});
+
+(function() {
+ /* Support for the DOMContentLoaded event is based on work by Dan Webb,
+ Matthias Miller, Dean Edwards and John Resig. */
+
+ var timer;
+
+ function fireContentLoadedEvent() {
+ if (document.loaded) return;
+ if (timer) window.clearInterval(timer);
+ document.fire("dom:loaded");
+ document.loaded = true;
+ }
+
+ if (document.addEventListener) {
+ if (Prototype.Browser.WebKit) {
+ timer = window.setInterval(function() {
+ if (/loaded|complete/.test(document.readyState))
+ fireContentLoadedEvent();
+ }, 0);
+
+ Event.observe(window, "load", fireContentLoadedEvent);
+
+ } else {
+ document.addEventListener("DOMContentLoaded",
+ fireContentLoadedEvent, false);
+ }
+
+ } else {
+ // added by Pavel Yaschenko // http://jira.jboss.com/jira/browse/RF-3879
+
+ // for 1.6.0.2
+ if (document.loaded) return;
+
+ if (document.readyState != "complete") { // added by Pavel Yaschenko
+ document.write("<script id=__onDOMContentLoaded defer src=//:><\/script>");
+ $("__onDOMContentLoaded").onreadystatechange = function() {
+ if (this.readyState == "complete") {
+ this.onreadystatechange = null;
+ fireContentLoadedEvent();
+ }
+ };
+ } // added by Pavel Yaschenko
+ }
+})();
+/*------------------------------- DEPRECATED -------------------------------*/
+
+Hash.toQueryString = Object.toQueryString;
+
+var Toggle = { display: Element.toggle };
+
+Element.Methods.childOf = Element.Methods.descendantOf;
+
+var Insertion = {
+ Before: function(element, content) {
+ return Element.insert(element, {before:content});
+ },
+
+ Top: function(element, content) {
+ return Element.insert(element, {top:content});
+ },
+
+ Bottom: function(element, content) {
+ return Element.insert(element, {bottom:content});
+ },
+
+ After: function(element, content) {
+ return Element.insert(element, {after:content});
+ }
+};
+
+var $continue = new Error('"throw $continue" is deprecated, use "return" instead');
+
+// This should be moved to script.aculo.us; notice the deprecated methods
+// further below, that map to the newer Element methods.
+var Position = {
+ // set to true if needed, warning: firefox performance problems
+ // NOT neeeded for page scrolling, only if draggable contained in
+ // scrollable elements
+ includeScrollOffsets: false,
+
+ // must be called before calling withinIncludingScrolloffset, every time the
+ // page is scrolled
+ prepare: function() {
+ this.deltaX = window.pageXOffset
+ || document.documentElement.scrollLeft
+ || document.body.scrollLeft
+ || 0;
+ this.deltaY = window.pageYOffset
+ || document.documentElement.scrollTop
+ || document.body.scrollTop
+ || 0;
+ },
+
+ // caches x/y coordinate pair to use with overlap
+ within: function(element, x, y) {
+ if (this.includeScrollOffsets)
+ return this.withinIncludingScrolloffsets(element, x, y);
+ this.xcomp = x;
+ this.ycomp = y;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (y >= this.offset[1] &&
+ y < this.offset[1] + element.offsetHeight &&
+ x >= this.offset[0] &&
+ x < this.offset[0] + element.offsetWidth);
+ },
+
+ withinIncludingScrolloffsets: function(element, x, y) {
+ var offsetcache = Element.cumulativeScrollOffset(element);
+
+ this.xcomp = x + offsetcache[0] - this.deltaX;
+ this.ycomp = y + offsetcache[1] - this.deltaY;
+ this.offset = Element.cumulativeOffset(element);
+
+ return (this.ycomp >= this.offset[1] &&
+ this.ycomp < this.offset[1] + element.offsetHeight &&
+ this.xcomp >= this.offset[0] &&
+ this.xcomp < this.offset[0] + element.offsetWidth);
+ },
+
+ // within must be called directly before
+ overlap: function(mode, element) {
+ if (!mode) return 0;
+ if (mode == 'vertical')
+ return ((this.offset[1] + element.offsetHeight) - this.ycomp) /
+ element.offsetHeight;
+ if (mode == 'horizontal')
+ return ((this.offset[0] + element.offsetWidth) - this.xcomp) /
+ element.offsetWidth;
+ },
+
+ // Deprecation layer -- use newer Element methods now (1.5.2).
+
+ cumulativeOffset: Element.Methods.cumulativeOffset,
+
+ positionedOffset: Element.Methods.positionedOffset,
+
+ absolutize: function(element) {
+ Position.prepare();
+ return Element.absolutize(element);
+ },
+
+ relativize: function(element) {
+ Position.prepare();
+ return Element.relativize(element);
+ },
+
+ realOffset: Element.Methods.cumulativeScrollOffset,
+
+ offsetParent: Element.Methods.getOffsetParent,
+
+ page: Element.Methods.viewportOffset,
+
+ clone: function(source, target, options) {
+ options = options || { };
+ return Element.clonePosition(target, source, options);
+ }
+};
+
+/*--------------------------------------------------------------------------*/
+
+if (!document.getElementsByClassName) document.getElementsByClassName = function(instanceMethods){
+ function iter(name) {
+ return name.blank() ? null : "[contains(concat(' ', @class, ' '), ' " + name + " ')]";
+ }
+
+ instanceMethods.getElementsByClassName = Prototype.BrowserFeatures.XPath ?
+ function(element, className) {
+ className = className.toString().strip();
+ var cond = /\s/.test(className) ? $w(className).map(iter).join('') : iter(className);
+ return cond ? document._getElementsByXPath('.//*' + cond, element) : [];
+ } : function(element, className) {
+ className = className.toString().strip();
+ var elements = [], classNames = (/\s/.test(className) ? $w(className) : null);
+ if (!classNames && !className) return elements;
+
+ var nodes = $(element).getElementsByTagName('*');
+ className = ' ' + className + ' ';
+
+ for (var i = 0, child, cn; child = nodes[i]; i++) {
+ if (child.className && (cn = ' ' + child.className + ' ') && (cn.include(className) ||
+ (classNames && classNames.all(function(name) {
+ return !name.toString().blank() && cn.include(' ' + name + ' ');
+ }))))
+ elements.push(Element.extend(child));
+ }
+ return elements;
+ };
+
+ return function(className, parentElement) {
+ return $(parentElement || document.body).getElementsByClassName(className);
+ };
+}(Element.Methods);
+
+/*--------------------------------------------------------------------------*/
+
+Element.ClassNames = Class.create();
+Element.ClassNames.prototype = {
+ initialize: function(element) {
+ this.element = $(element);
+ },
+
+ _each: function(iterator) {
+ this.element.className.split(/\s+/).select(function(name) {
+ return name.length > 0;
+ })._each(iterator);
+ },
+
+ set: function(className) {
+ this.element.className = className;
+ },
+
+ add: function(classNameToAdd) {
+ if (this.include(classNameToAdd)) return;
+ this.set($A(this).concat(classNameToAdd).join(' '));
+ },
+
+ remove: function(classNameToRemove) {
+ if (!this.include(classNameToRemove)) return;
+ this.set($A(this).without(classNameToRemove).join(' '));
+ },
+
+ toString: function() {
+ return $A(this).join(' ');
+ }
+};
+
+Object.extend(Element.ClassNames.prototype, Enumerable);
+
+/*--------------------------------------------------------------------------*/
+
+Element.addMethods();
\ No newline at end of file
Property changes on: trunk/docs/migrationguide/en/src/main/resources/script/prototype-1.6.0.2.js
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/docs/migrationguide/en/src/main/resources/script/scriptaculous.js
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/script/scriptaculous.js (rev 0)
+++ trunk/docs/migrationguide/en/src/main/resources/script/scriptaculous.js 2008-11-11 20:12:38 UTC (rev 11094)
@@ -0,0 +1,58 @@
+// script.aculo.us scriptaculous.js v1.8.1, Thu Jan 03 22:07:12 -0500 2008
+
+// Copyright (c) 2005-2007 Thomas Fuchs (http://script.aculo.us, http://mir.aculo.us)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+// For details, see the script.aculo.us web site: http://script.aculo.us/
+
+var Scriptaculous = {
+ Version: '1.8.1',
+ require: function(libraryName) {
+ // inserting via DOM fails in Safari 2.0, so brute force approach
+ document.write('<script type="text/javascript" src="'+libraryName+'"><\/script>');
+ },
+ REQUIRED_PROTOTYPE: '1.6.0',
+ load: function() {
+ function convertVersionString(versionString){
+ var r = versionString.split('.');
+ return parseInt(r[0])*100000 + parseInt(r[1])*1000 + parseInt(r[2]);
+ }
+
+ if((typeof Prototype=='undefined') ||
+ (typeof Element == 'undefined') ||
+ (typeof Element.Methods=='undefined') ||
+ (convertVersionString(Prototype.Version) <
+ convertVersionString(Scriptaculous.REQUIRED_PROTOTYPE)))
+ throw("script.aculo.us requires the Prototype JavaScript framework >= " +
+ Scriptaculous.REQUIRED_PROTOTYPE);
+
+ $A(document.getElementsByTagName("script")).findAll( function(s) {
+ return (s.src && s.src.match(/scriptaculous\.js(\?.*)?$/))
+ }).each( function(s) {
+ var path = s.src.replace(/scriptaculous\.js(\?.*)?$/,'');
+ var includes = s.src.match(/\?.*load=([a-z,]*)/);
+ (includes ? includes[1] : 'builder,effects,dragdrop,controls,slider,sound').split(',').each(
+ function(include) { Scriptaculous.require(path+include+'.js') });
+ });
+ }
+}
+
+Scriptaculous.load();
\ No newline at end of file
Property changes on: trunk/docs/migrationguide/en/src/main/resources/script/scriptaculous.js
___________________________________________________________________
Name: svn:executable
+ *
Added: trunk/docs/migrationguide/en/src/main/resources/script/send_mail.php
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/script/send_mail.php (rev 0)
+++ trunk/docs/migrationguide/en/src/main/resources/script/send_mail.php 2008-11-11 20:12:38 UTC (rev 11094)
@@ -0,0 +1,63 @@
+<?php
+//define messages
+$message_error = "Please, enter your message";
+$email_error = "Please, specify your email address";
+$subject_error = "Subject should be maximum 255 chars length";
+$message_not_sent = "Error sending message!";
+$message_success = "Message is sent successfully";
+
+//define pattern
+$email_pat = "/^([A-z0-9|.|-|_]{2,256})(a)(([A-z0-9|.|-]{2,256}).([a-z]{2,4}))*$/";
+$general_pat = "/^(\s)+$/";
+// clean up POST data
+$_POST = array_map('trim', $_POST);
+
+// check if 'subject' field has been filled or not
+if(!$_POST['subject']){
+ $subject="(no subject)";
+}else{
+ $subject = substr($POST['subject'], 0, 255);
+ echo $subject;
+}
+
+// check if 'name' field has been filled or not
+if(!$_POST['name']){
+ $name="(no name)";
+}else{
+ $name = substr($POST['name'], 0, 255);
+}
+
+// check if 'message' field has been filled or not
+if(!$_POST['message'] || preg_match($general_pat, $_POST['message'])){
+ echo $message_error;
+ exit();
+}else{
+ $message = substr($_POST['message'], 0, 3000);
+}
+
+// check if 'email' field has been filled or not
+if(!$_POST['email']){
+ echo $email_error;
+ exit();
+}elseif(!preg_match($email_pat, $_POST['email'])){
+echo $email_error;
+ exit();
+}else{
+ $email = substr($POST['email'], 0, 255);
+}
+
+// get neccessary fields
+$to='smukhina(a)exadel.com';
+
+// define MIME headers
+$headers="MIME-Version 1.0"."\r\n"."Content-Type: text/plain; charset=utf-8"."\r\n"."From: \"".$name."\" "."<".$email.">"."Reply-to: \"".$name."\" "."<".$email.">";
+
+// send email
+if(!@mail($to, $subject, $message, $headers)){
+ echo $message_not_sent;
+ exit();
+}else{
+ echo $message_success;
+ exit();
+}
+?>
\ No newline at end of file
Property changes on: trunk/docs/migrationguide/en/src/main/resources/script/send_mail.php
___________________________________________________________________
Name: svn:executable
+ *
Modified: trunk/docs/migrationguide/en/src/main/resources/script/toggle.js
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/script/toggle.js 2008-11-11 19:51:34 UTC (rev 11093)
+++ trunk/docs/migrationguide/en/src/main/resources/script/toggle.js 2008-11-11 20:12:38 UTC (rev 11094)
@@ -1,5 +1,20 @@
-document.write('<div id="overlay"> </div>');
+// attach handler to window object
+ Event.observe(window,'load',initializeEmailClient,false);
+// initialize email application
+function initializeEmailClient(){
+ Event.observe('feedback-mailform', 'submit', sendEmail);
+}
+
+ // send http request
+function sendEmail(e){
+ var params='subject='+$F('subject')+'&message='+escape($F('message'))+'&name='+$F('name')+'&email='+$F('email');
+ var xmlobj=new Ajax.Updater('feedback-state','script/send_mail.php',{method:'post',parameters: params});
+
+ // prevent form from submitting
+ Event.stop(e);
+}
+
function dbToggle(node, expandText, collapseText) {
var dt = node.parentNode;
if (dt.nodeName.toLowerCase() == 'dt') {
Modified: trunk/docs/migrationguide/en/src/main/resources/xslt/org/jboss/richfaces/xhtml.xsl
===================================================================
--- trunk/docs/migrationguide/en/src/main/resources/xslt/org/jboss/richfaces/xhtml.xsl 2008-11-11 19:51:34 UTC (rev 11093)
+++ trunk/docs/migrationguide/en/src/main/resources/xslt/org/jboss/richfaces/xhtml.xsl 2008-11-11 20:12:38 UTC (rev 11094)
@@ -12,7 +12,142 @@
<xsl:import href="xhtml-common.xsl"/>
<xsl:param name="chunk.fast" select="1"/>
+ <xsl:template name="user.head.content">
+ <xsl:param name="node" select="." />
+ <script type="text/javascript" src="script/prototype-1.6.0.2.js"><xsl:comment>If you see this message, your web browser doesn't support JavaScript or JavaScript is disabled.</xsl:comment></script>
+ <script type="text/javascript" src="script/effects.js"><xsl:comment>If you see this message, your web browser doesn't support JavaScript or JavaScript is disabled.</xsl:comment></script>
+ <script type="text/javascript" src="script/scriptaculous.js"><xsl:comment>If you see this message, your web browser doesn't support JavaScript or JavaScript is disabled.</xsl:comment></script>
+ <script type="text/javascript" src="script/toggle.js"><xsl:comment>If you see this message, your web browser doesn't support JavaScript or JavaScript is disabled.</xsl:comment></script>
+ </xsl:template>
+
+<xsl:template name="header.navigation">
+ <xsl:param name="prev" select="/foo"/>
+ <xsl:param name="next" select="/foo"/>
+ <xsl:param name="nav.context"/>
+ <xsl:variable name="home" select="/*[1]"/>
+ <xsl:variable name="up" select="parent::*"/>
+ <xsl:variable name="row1" select="$navig.showtitles != 0"/>
+ <xsl:variable name="row2" select="count($prev) > 0 or (count($up) > 0 and generate-id($up) != generate-id($home) and $navig.showtitles != 0) or count($next) > 0"/>
+ <xsl:if test="$suppress.navigation = '0' and $suppress.header.navigation = '0'">
+ <xsl:if test="$row1 or $row2">
+ <xsl:if test="$row1">
+ <div id="overlay">
+ <xsl:text> </xsl:text>
+ </div>
+ <!-- FEEDBACK -->
+
+
+
+ <div id="feedback-maincontainer" style="display:none">
+ <div id="feedback-state"><xsl:text> </xsl:text></div>
+ <a href="#" onclick="$('feedback-maincontainer').hide(); return false;">
+ <img src="images/close.png" class="feedback-images" />
+ </a>
+ <form id="feedback-mailform">
+ <div class="feedback-textbox-div">
+ Subject:<input type="text" id="subject" title="Enter the subject of your message" class="feedback-textbox" />
+ </div>
+ <div class="feedback-textbox-div">
+ <span style="vertical-align: top;">Message:</span>
+ <textarea name="message" title="Type here the text of your message" id="message"><xsl:text> </xsl:text></textarea>
+ </div>
+ <div class="feedback-textbox-div">
+ Your name:<input type="text" id="name" title="Enter your name" class="feedback-textbox" />
+ </div>
+ <div class="feedback-textbox-div">
+ Your email:<input type="text" id="email" title="Enter your email address" class="feedback-textbox" />
+ </div>
+ <span class="feedback-button-container">
+ <input type="submit" value="Send Message" class="feedback-formbutton" title="Send Message" />
+ </span>
+ <span class="feedback-button-container">
+ <input type="reset" value="Clear All Fields" class="feedback-formbutton" title="Clear All Fields" />
+ </span>
+ </form>
+</div>
+<div id="feedback-wrapper">
+ <a id="feedback-link" href="#" onclick="$('feedback-maincontainer').appear(); return false;">
+ <img src="images/feedback_logo.png" class="feedback-images" width="136px"/>
+ </a>
+</div>
+
+
+
+
+ <!-- FEEDBACK ENDS -->
+
+ <p xmlns="http://www.w3.org/1999/xhtml">
+ <xsl:attribute name="id">
+ <xsl:text>title</xsl:text>
+ </xsl:attribute>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$siteHref" />
+ </xsl:attribute>
+ <xsl:attribute name="class">
+ <xsl:text>site_href</xsl:text>
+ </xsl:attribute>
+ <strong>
+ <xsl:value-of select="$siteLinkText"/>
+ </strong>
+ </a>
+ <a>
+ <xsl:attribute name="href">
+ <xsl:value-of select="$docHref" />
+ </xsl:attribute>
+ <xsl:attribute name="class">
+ <xsl:text>doc_href</xsl:text>
+ </xsl:attribute>
+ <strong>
+ <xsl:value-of select="$docLinkText"/>
+ </strong>
+ </a>
+ </p>
+ </xsl:if>
+ <xsl:if test="$row2">
+ <ul class="docnav" xmlns="http://www.w3.org/1999/xhtml">
+ <li class="previous">
+ <xsl:if test="count($prev)>0">
+ <a accesskey="p">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$prev"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <strong>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'prev'"/>
+ </xsl:call-template>
+ </strong>
+ </a>
+ </xsl:if>
+ </li>
+ <li class="next">
+ <xsl:if test="count($next)>0">
+ <a accesskey="n">
+ <xsl:attribute name="href">
+ <xsl:call-template name="href.target">
+ <xsl:with-param name="object" select="$next"/>
+ </xsl:call-template>
+ </xsl:attribute>
+ <strong>
+ <xsl:call-template name="navig.content">
+ <xsl:with-param name="direction" select="'next'"/>
+ </xsl:call-template>
+ </strong>
+ </a>
+ </xsl:if>
+ </li>
+ </ul>
+ </xsl:if>
+ </xsl:if>
+ <xsl:if test="$header.rule != 0">
+ <hr/>
+ </xsl:if>
+ </xsl:if>
+</xsl:template>
+
<xsl:template name="chunk">
<xsl:param name="node" select="."/>
17 years, 5 months
JBoss Rich Faces SVN: r11093 - in trunk/sandbox/ui/queue/src/main: java/org/richfaces/component and 1 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2008-11-11 14:51:34 -0500 (Tue, 11 Nov 2008)
New Revision: 11093
Modified:
trunk/sandbox/ui/queue/src/main/config/component/queue.xml
trunk/sandbox/ui/queue/src/main/java/org/richfaces/component/UIQueue.java
trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRegistry.java
Log:
Queue: discovery services & renderer updated
Modified: trunk/sandbox/ui/queue/src/main/config/component/queue.xml
===================================================================
--- trunk/sandbox/ui/queue/src/main/config/component/queue.xml 2008-11-11 19:51:05 UTC (rev 11092)
+++ trunk/sandbox/ui/queue/src/main/config/component/queue.xml 2008-11-11 19:51:34 UTC (rev 11093)
@@ -35,7 +35,7 @@
<property>
<name>name</name>
<classname>java.lang.String</classname>
- <defaultvalue>GLOBAL_QUEUE_NAME</defaultvalue>
+ <defaultvalue>""</defaultvalue>
</property>
<property>
Modified: trunk/sandbox/ui/queue/src/main/java/org/richfaces/component/UIQueue.java
===================================================================
--- trunk/sandbox/ui/queue/src/main/java/org/richfaces/component/UIQueue.java 2008-11-11 19:51:05 UTC (rev 11092)
+++ trunk/sandbox/ui/queue/src/main/java/org/richfaces/component/UIQueue.java 2008-11-11 19:51:34 UTC (rev 11093)
@@ -25,7 +25,6 @@
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UIForm;
-import javax.faces.component.UIViewRoot;
import javax.faces.context.FacesContext;
/**
@@ -48,22 +47,36 @@
return COMPONENT_FAMILY;
}
- @Override
- public void setParent(UIComponent parent) {
- if (parent != null && !(parent instanceof UIViewRoot) && !(parent instanceof UIForm)) {
- throw new IllegalArgumentException("Queue component:" + getClientId(getFacesContext()) +
- " should have UIViewRoot or UIForm as its immediate parent");
+ private UIComponent findParentForm() {
+ UIComponent component = getParent();
+ while (component != null && !(component instanceof UIForm)) {
+ component = component.getParent();
}
- super.setParent(parent);
+ return component;
}
public String getClientName(FacesContext context) {
- UIComponent parent = getParent();
- if (parent instanceof UIForm) {
- return parent.getClientId(context) + NamingContainer.SEPARATOR_CHAR + getName();
+ UIComponent form = findParentForm();
+ String name = getName();
+ String clientName;
+
+ if (form != null) {
+ String formClientId = form.getClientId(context);
+
+ if (name != null && name.length() != 0) {
+ clientName = formClientId + NamingContainer.SEPARATOR_CHAR + name;
+ } else {
+ clientName = formClientId;
+ }
} else {
- return context.getExternalContext().encodeNamespace(getName());
+ if (name == null || name.length() == 0) {
+ name = UIQueue.GLOBAL_QUEUE_NAME;
+ }
+
+ clientName = context.getExternalContext().encodeNamespace(name);
}
+
+ return clientName;
}
}
Modified: trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRegistry.java
===================================================================
--- trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRegistry.java 2008-11-11 19:51:05 UTC (rev 11092)
+++ trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRegistry.java 2008-11-11 19:51:34 UTC (rev 11093)
@@ -51,7 +51,7 @@
if (!registryMap.containsKey(clientName)) {
registryMap.put(clientName, data);
} else {
- throw new IllegalArgumentException("Queue with name '" + clientName + "' has already been registered");
+ context.getExternalContext().log("Queue with name '" + clientName + "' has already been registered");
}
}
17 years, 5 months
JBoss Rich Faces SVN: r11092 - in trunk/framework/impl/src/main: javascript/ajaxjsf and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: nbelaevski
Date: 2008-11-11 14:51:05 -0500 (Tue, 11 Nov 2008)
New Revision: 11092
Modified:
trunk/framework/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java
trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
Log:
Queue: discovery services & renderer updated
Modified: trunk/framework/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java
===================================================================
--- trunk/framework/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java 2008-11-11 19:06:29 UTC (rev 11091)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java 2008-11-11 19:51:05 UTC (rev 11092)
@@ -317,24 +317,29 @@
options.put("status", status);
}
String queue = (String) componentAttributes.get(AJAX_QUEUE_ATTR);
+ String implicitQueue = null;
+
Integer requestDelay = (Integer) componentAttributes
.get(AJAX_DELAY_ATTR);
if (null != requestDelay && requestDelay.intValue() > 0) {
options.put(AJAX_DELAY_ATTR, requestDelay);
-// if (null == queue) {
-// queue = clientId;
-// }
+ if (null == queue) {
+ implicitQueue = clientId;
+ }
}
Boolean ignoreDupResponses = (Boolean) componentAttributes
.get(AJAX_ABORT_ATTR);
if (null != ignoreDupResponses && ignoreDupResponses.booleanValue()) {
options.put(AJAX_ABORT_ATTR, JSReference.TRUE);
-// if (null == queue) {
-// queue = clientId;
-// }
+ if (null == queue) {
+ implicitQueue = clientId;
+ }
}
+
if (null != queue) {
options.put(AJAX_QUEUE_ATTR, queue);
+ } else if (implicitQueue != null) {
+ options.put("implicitEventsQueue", clientId);
}
String namespace = facesContext.getExternalContext().encodeNamespace("");
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-11-11 19:06:29 UTC (rev 11091)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-11-11 19:51:05 UTC (rev 11092)
@@ -792,7 +792,7 @@
A4J.AJAX.Submit = function( containerId, formId, event , options ) {
var query = A4J.AJAX.PrepareQuery(containerId, formId, event, options);
if (query) {
- var queue = A4J.AJAX.EventQueue.getOrCreateQueue(options.eventsQueue, options.requestId, options.namespace, formId);
+ var queue = A4J.AJAX.EventQueue.getOrCreateQueue(options, formId);
if (queue) {
queue.push(query, options);
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-11 19:06:29 UTC (rev 11091)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-11 19:51:05 UTC (rev 11092)
@@ -31,34 +31,51 @@
//TODO A4J.AJAX.EventQueue.getQueue ?
-A4J.AJAX.EventQueue.getOrCreateQueue = function(queueName, requestId, namespace, formId) {
- //uncomment to switch on global queue
- var name = queueName || A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME;
+A4J.AJAX.EventQueue.getOrCreateQueue = function(){
+ var qualifyName = function(name, prefix) {
+ if (prefix) {
+ return prefix + ':' + name;
+ } else {
+ return name;
+ }
+ };
+
+ return function(options, formId) {
+ var queueName = options.eventsQueue;
+ var namespace = options.namespace;
- var queue;
- if (formId) {
- queue = A4J.AJAX._eventQueues[formId + ":" + name];
- }
-
- if (!queue) {
- queue = A4J.AJAX._eventQueues[namespace ? (namespace + ":" + name) : name];
- }
-
- if (!queue) {
- name = queueName || requestId;
- if (namespace) {
- name = namespace + ":" + name;
+ var formQueueName;
+ var viewQueueName;
+ var implicitQueueName;
+
+ if (queueName) {
+ formQueueName = qualifyName(queueName, formId);
+ viewQueueName = qualifyName(queueName, namespace);
+
+ //TODO nick - support settings for default queue scope
+ implicitQueueName = viewQueueName;
+ } else {
+ formQueueName = formId;
+ viewQueueName = qualifyName(A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME, namespace);
+
+ implicitQueueName = options.implicitEventsQueue;
}
- LOG.debug("Creating new transient queue '" + name + "' with default settings");
- queue = new A4J.AJAX.EventQueue(name);
- queue._transient = true;
+ var queue = A4J.AJAX._eventQueues[formQueueName];
+ if (!queue) {
+ queue = A4J.AJAX._eventQueues[viewQueueName];
+ if (!queue && implicitQueueName) {
+ LOG.debug("Creating new transient queue '" + implicitQueueName + "' with default settings");
+ queue = new A4J.AJAX.EventQueue(implicitQueueName);
+ queue._transient = true;
+
+ A4J.AJAX.EventQueue.addQueue(queue);
+ }
+ }
- A4J.AJAX.EventQueue.addQueue(queue);
- }
-
- return queue;
-};
+ return queue;
+ }
+}();
A4J.AJAX.EventQueue.prototype = function() {
@@ -151,12 +168,18 @@
submit: function() {
if (!this.request) {
- var queueData = this.queue.shift();
+ var queueData = this.queue[0];
+
if (queueData) {
- LOG.debug("Queue '" + this.name + "' will submit request NOW");
-
- this.request = queueData.submit();
- this.request.queue = this;
+ if (queueData.delayPassed) {
+ this.queue.shift();
+ LOG.debug("Queue '" + this.name + "' will submit request NOW");
+
+ this.request = queueData.submit();
+ this.request.queue = this;
+ } else {
+ LOG.debug("Delay for request not passed yet, have to wait");
+ }
} else {
LOG.debug("Queue '" + this.name + "' is empty, nothing to submit");
}
@@ -189,6 +212,10 @@
nextQueueData.abortDelay();
}
+ //barrier element could be removed
+ //next element can be ready for submit
+ this.submit();
+
return nextQueueData;
};
@@ -248,10 +275,7 @@
}
} else {
LOG.debug("After request: queue not empty, processing next event in queue '" + this.name + "'");
- var queueData = this.queue[0];
- if (queueData.delayPassed) {
- this.submit();
- }
+ this.submit();
}
}
}
17 years, 5 months
JBoss Rich Faces SVN: r11091 - in trunk/test-applications/seleniumTest/richfaces/src/main: java/org/ajax4jsf/bean/tree/rich and 2 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: dsvyatobatsko
Date: 2008-11-11 14:06:29 -0500 (Tue, 11 Nov 2008)
New Revision: 11091
Added:
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Album.java
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/AudioLibrary.java
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Performer.java
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Song.java
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/swing/
trunk/test-applications/seleniumTest/richfaces/src/main/resources/audio-library.xml
trunk/test-applications/seleniumTest/richfaces/src/main/resources/digester-rules.xml
Modified:
trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/TreeTestBean.java
trunk/test-applications/seleniumTest/richfaces/src/main/webapp/pages/tree/treeTest.xhtml
Log:
tree tests
Modified: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/TreeTestBean.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/TreeTestBean.java 2008-11-11 18:41:36 UTC (rev 11090)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/TreeTestBean.java 2008-11-11 19:06:29 UTC (rev 11091)
@@ -23,16 +23,21 @@
import java.io.IOException;
import java.io.InputStream;
+import java.net.URL;
import java.util.Properties;
import javax.faces.FacesException;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
+import org.ajax4jsf.bean.tree.rich.AudioLibrary;
+import org.apache.commons.digester.Digester;
+import org.apache.commons.digester.xmlrules.DigesterLoader;
import org.richfaces.component.UITree;
import org.richfaces.event.NodeSelectedEvent;
import org.richfaces.model.TreeNode;
import org.richfaces.model.TreeNodeImpl;
+import org.xml.sax.SAXException;
/**
* Copied from demo
@@ -101,6 +106,29 @@
return rootNode;
}
+ private TreeNode<Object> richRootNode = null;
+
+ public TreeNode<Object> getRichTreeNode() {
+ if (null == richRootNode) {
+ URL rulesUrl = TreeBuilder.class.getResource("/digester-rules.xml");
+ Digester digester = DigesterLoader.createDigester(rulesUrl);
+ AudioLibrary library = new AudioLibrary();
+ digester.push(library);
+ try {
+ digester.parse(TreeBuilder.class.getResourceAsStream("/audio-library.xml"));
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (SAXException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ richRootNode = library;
+ }
+
+ return richRootNode;
+ }
+
public String getNodeTitle() {
return nodeTitle;
}
Added: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Album.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Album.java (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Album.java 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,126 @@
+package org.ajax4jsf.bean.tree.rich;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.richfaces.model.TreeNode;
+
+public class Album implements TreeNode<Object> {
+
+ /**
+ * serial version ID
+ */
+ private static final long serialVersionUID = 443084062111349934L;
+
+ private long id;
+ private Map<Object, TreeNode<Object>> songs = new LinkedHashMap<Object, TreeNode<Object>>();
+ private String title;
+ private Integer year;
+ private Performer performer;
+
+ public Album() {
+ setId(System.currentTimeMillis());
+ }
+
+//
+// TreeNode implementation
+//
+
+ public void addChild(Object identifier, TreeNode<Object> child) {
+ songs.put(identifier, child);
+ }
+
+ public TreeNode<Object> getChild(Object id) {
+ return songs.get(id);
+ }
+
+ public Iterator<Entry<Object, TreeNode<Object>>> getChildren() {
+ return songs.entrySet().iterator();
+ }
+
+ public Object getData() {
+ return this;
+ }
+
+ public TreeNode<Object> getParent() {
+ return performer;
+ }
+
+ public boolean isLeaf() {
+ return songs.isEmpty();
+ }
+
+ public void removeChild(Object id) {
+ songs.remove(id);
+ }
+
+ public void setData(Object data) {
+ }
+
+ public void setParent(TreeNode<Object> parent) {
+ performer = (Performer) parent;
+ }
+
+//
+// Album implementation
+//
+
+ /**
+ * Gets value of id field.
+ * @return value of id field
+ */
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * Set a new value for id field.
+ * @param id a new value for id field
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets value of title field.
+ * @return value of title field
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * Set a new value for title field.
+ * @param title a new value for title field
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ /**
+ * Gets value of year field.
+ * @return value of year field
+ */
+ public Integer getYear() {
+ return year;
+ }
+
+ /**
+ * Set a new value for year field.
+ * @param year a new value for year field
+ */
+ public void setYear(Integer year) {
+ this.year = year;
+ }
+
+ public void addSong(Song song) {
+ addChild(song.getId(), song);
+ song.setParent(this);
+ }
+
+ public String getType() {
+ return "album";
+ }
+}
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Album.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Author Id Revision Date
Name: svn:eol-style
+ native
Added: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/AudioLibrary.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/AudioLibrary.java (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/AudioLibrary.java 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,68 @@
+package org.ajax4jsf.bean.tree.rich;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.richfaces.model.TreeNode;
+
+public class AudioLibrary implements TreeNode<Object> {
+
+ /**
+ * serial version ID
+ */
+ private static final long serialVersionUID = -1429183678508376974L;
+
+ private Map<Object, TreeNode<Object>> performers = new LinkedHashMap<Object, TreeNode<Object>>();
+
+//
+// TreeNode implementation
+//
+ public void addChild(Object identifier, TreeNode<Object> child) {
+ performers.put(identifier, child);
+ }
+
+ public TreeNode<Object> getChild(Object id) {
+ return performers.get(id);
+ }
+
+ public Iterator<Entry<Object, TreeNode<Object>>> getChildren() {
+ return performers.entrySet().iterator();
+ }
+
+ public Object getData() {
+ return this;
+ }
+
+ public TreeNode<Object> getParent() {
+ return null;
+ }
+
+ public boolean isLeaf() {
+ return performers.isEmpty();
+ }
+
+ public void removeChild(Object id) {
+ performers.remove(id);
+ }
+
+ public void setData(Object data) {
+ }
+
+ public void setParent(TreeNode<Object> parent) {
+ }
+
+//
+// AudioLibrary implementation
+//
+
+ public void addPerformer(Performer performer) {
+ addChild(performer.getId(), performer);
+ }
+
+ public String getType() {
+ return "library";
+ }
+
+}
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/AudioLibrary.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Author Id Revision Date
Name: svn:eol-style
+ native
Added: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Performer.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Performer.java (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Performer.java 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,124 @@
+package org.ajax4jsf.bean.tree.rich;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map;
+import java.util.Map.Entry;
+
+import org.richfaces.model.TreeNode;
+
+public class Performer implements TreeNode<Object> {
+
+ /**
+ * serial version ID
+ */
+ private static final long serialVersionUID = -4258414186970822017L;
+
+ private long id;
+ private Map<Object, TreeNode<Object>> albums = new LinkedHashMap<Object, TreeNode<Object>>();
+ private String name;
+ private AudioLibrary library;
+
+ public Performer() {
+ setId(System.currentTimeMillis());
+ }
+
+//
+// TreeNode implementation
+//
+ public void addChild(Object identifier, TreeNode<Object> child) {
+ albums.put(identifier, child);
+ }
+
+ public TreeNode<Object> getChild(Object id) {
+ return albums.get(id);
+ }
+
+ public Iterator<Entry<Object, TreeNode<Object>>> getChildren() {
+ return albums.entrySet().iterator();
+ }
+
+ public Object getData() {
+ return this;
+ }
+
+ public TreeNode<Object> getParent() {
+ return library;
+ }
+
+ public boolean isLeaf() {
+ return albums.isEmpty();
+ }
+
+ public void removeChild(Object id) {
+ albums.remove(id);
+ }
+
+ public void setData(Object data) {
+ }
+
+ public void setParent(TreeNode<Object> parent) {
+ library = (AudioLibrary) parent;
+ }
+
+//
+// Band implementation
+//
+
+ /**
+ * Gets value of id field.
+ * @return value of id field
+ */
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * Set a new value for id field.
+ * @param id a new value for id field
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets value of albums field.
+ * @return value of albums field
+ */
+ public Map<Object, TreeNode<Object>> getAlbums() {
+ return albums;
+ }
+
+ /**
+ * Set a new value for albums field.
+ * @param albums a new value for albums field
+ */
+ public void setAlbums(Map<Object, TreeNode<Object>> albums) {
+ this.albums = albums;
+ }
+
+ /**
+ * Gets value of name field.
+ * @return value of name field
+ */
+ public String getName() {
+ return name;
+ }
+
+ /**
+ * Set a new value for name field.
+ * @param name a new value for name field
+ */
+ public void setName(String name) {
+ this.name = name;
+ }
+
+ public void addAlbum(Album album) {
+ addChild(album.getId(), album);
+ album.setParent(this);
+ }
+
+ public String getType() {
+ return "performer";
+ }
+}
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Performer.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Author Id Revision Date
Name: svn:eol-style
+ native
Added: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Song.java
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Song.java (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Song.java 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,102 @@
+package org.ajax4jsf.bean.tree.rich;
+
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.Map.Entry;
+
+import org.richfaces.model.TreeNode;
+
+public class Song implements TreeNode<Object> {
+
+ /**
+ * serial version ID
+ */
+ private static final long serialVersionUID = 3380513023368040508L;
+
+ private long id;
+ private String title;
+ private Album album;
+
+ public Song() {
+ setId(System.currentTimeMillis());
+ }
+
+//
+// TreeNode implementation
+//
+
+ public void addChild(Object identifier, TreeNode<Object> child) {
+ throw new UnsupportedOperationException("Songs do not have children");
+ }
+
+ public TreeNode<Object> getChild(Object id) {
+ throw new UnsupportedOperationException("Songs do not have children");
+ }
+
+ public Iterator<Entry<Object, TreeNode<Object>>> getChildren() {
+ return new LinkedHashMap<Object, TreeNode<Object>>().entrySet().iterator();
+ }
+
+ public Object getData() {
+ return this;
+ }
+
+ public TreeNode<Object> getParent() {
+ return album;
+ }
+
+ public boolean isLeaf() {
+ return true;
+ }
+
+ public void removeChild(Object id) {
+ // TODO Auto-generated method stub
+
+ }
+
+ public void setData(Object data) {
+ }
+
+ public void setParent(TreeNode<Object> parent) {
+ album = (Album) parent;
+ }
+
+//
+// Song implementation
+//
+ /**
+ * Gets value of id field.
+ * @return value of id field
+ */
+ public long getId() {
+ return id;
+ }
+
+ /**
+ * Set a new value for id field.
+ * @param id a new value for id field
+ */
+ public void setId(long id) {
+ this.id = id;
+ }
+
+ /**
+ * Gets value of title field.
+ * @return value of title field
+ */
+ public String getTitle() {
+ return title;
+ }
+
+ /**
+ * Set a new value for title field.
+ * @param title a new value for title field
+ */
+ public void setTitle(String title) {
+ this.title = title;
+ }
+
+ public String getType() {
+ return "song";
+ }
+}
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/java/org/ajax4jsf/bean/tree/rich/Song.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Name: svn:keywords
+ Author Id Revision Date
Name: svn:eol-style
+ native
Added: trunk/test-applications/seleniumTest/richfaces/src/main/resources/audio-library.xml
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/resources/audio-library.xml (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/resources/audio-library.xml 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<audio-library>
+ <performer>
+ <name>Performer</name>
+ <album>
+ <title>Album</title>
+ <year>2008</year>
+ <song>
+ <title>Song1</title>
+ </song>
+ <song>
+ <title>Song2</title>
+ </song>
+ <song>
+ <title>Song3</title>
+ </song>
+ </album>
+ </performer>
+</audio-library>
\ No newline at end of file
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/resources/audio-library.xml
___________________________________________________________________
Name: svn:mime-type
+ text/xml
Name: svn:eol-style
+ native
Added: trunk/test-applications/seleniumTest/richfaces/src/main/resources/digester-rules.xml
===================================================================
--- trunk/test-applications/seleniumTest/richfaces/src/main/resources/digester-rules.xml (rev 0)
+++ trunk/test-applications/seleniumTest/richfaces/src/main/resources/digester-rules.xml 2008-11-11 19:06:29 UTC (rev 11091)
@@ -0,0 +1,53 @@
+<?xml version="1.0"?>
+
+<!--
+ Licensed to the Apache Software Foundation (ASF) under one or more
+ contributor license agreements. See the NOTICE file distributed with
+ this work for additional information regarding copyright ownership.
+ The ASF licenses this file to You under the Apache License, Version 2.0
+ (the "License"); you may not use this file except in compliance with
+ the License. You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+-->
+
+<!DOCTYPE digester-rules
+ PUBLIC "-//Jakarta Apache //DTD digester-rules XML V1.0//EN"
+ "http://jakarta.apache.org/commons/digester/dtds/digester-rules.dtd">
+<digester-rules>
+ <pattern value="audio-library">
+ <pattern value="performer">
+ <object-create-rule classname="org.ajax4jsf.bean.tree.rich.Performer"/>
+ <set-properties-rule/>
+ <set-next-rule methodname="addPerformer"/>
+ <pattern value="name">
+ <call-method-rule methodname="setName" paramcount="0"/>
+ </pattern>
+ <pattern value="album">
+ <object-create-rule classname="org.ajax4jsf.bean.tree.rich.Album"/>
+ <set-properties-rule/>
+ <set-next-rule methodname="addAlbum"/>
+ <pattern value="title">
+ <call-method-rule methodname="setTitle" paramcount="0"/>
+ </pattern>
+ <pattern value="year">
+ <call-method-rule methodname="setYear" paramcount="1" paramtypes="java.lang.Integer"/>
+ </pattern>
+ <pattern value="song">
+ <object-create-rule classname="org.ajax4jsf.bean.tree.rich.Song"/>
+ <set-properties-rule/>
+ <set-next-rule methodname="addSong"/>
+ <pattern value="title">
+ <call-method-rule methodname="setTitle" paramcount="0"/>
+ </pattern>
+ </pattern>
+ </pattern>
+ </pattern>
+ </pattern>
+</digester-rules>
Property changes on: trunk/test-applications/seleniumTest/richfaces/src/main/resources/digester-rules.xml
___________________________________________________________________
Name: svn:mime-type
+ text/xml
Name: svn:eol-style
+ native
Modified: trunk/test-applications/seleniumTest/richfaces/src/main/webapp/pages/tree/treeTest.xhtml
===================================================================
(Binary files differ)
17 years, 5 months