JBoss Rich Faces SVN: r11200 - trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/html.
by richfaces-svn-commits@lists.jboss.org
Author: pgolawski
Date: 2008-11-18 03:48:26 -0500 (Tue, 18 Nov 2008)
New Revision: 11200
Modified:
trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/html/RichTableMenuRenderer.java
Log:
show only rendered columns in context menu
Modified: trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/html/RichTableMenuRenderer.java
===================================================================
--- trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/html/RichTableMenuRenderer.java 2008-11-18 08:47:38 UTC (rev 11199)
+++ trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/html/RichTableMenuRenderer.java 2008-11-18 08:48:26 UTC (rev 11200)
@@ -234,7 +234,7 @@
boolean isGroupingColumn = column.getId().equalsIgnoreCase(
table.getGroupByColumnId());
if ((Boolean) column.getAttributes().get("sortable")) {
- if (sortFunction != null) {
+ if (groupFunction != null) {
if (prepareFunction != null) {
actionScriptBuilder.append(prepareFunction.toScript())
.append("; ");
@@ -282,7 +282,7 @@
*/
protected void buildMenuItem(UIComponent parent, UIColumn col)
throws IOException {
- if (col instanceof UIColumn) {
+ if (((Boolean)col.getAttributes().get("rendered")) && (col instanceof UIColumn)) {
UIColumn dataColumn = (UIColumn) col;
UIMenuItem menuItem = (UIMenuItem) context.getApplication()
.createComponent(UIMenuItem.COMPONENT_TYPE);
17 years, 5 months
JBoss Rich Faces SVN: r11199 - trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit.
by richfaces-svn-commits@lists.jboss.org
Author: pgolawski
Date: 2008-11-18 03:47:38 -0500 (Tue, 18 Nov 2008)
New Revision: 11199
Modified:
trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/AbstractExtendedTableRenderer.java
Log:
sort and group changed
Modified: trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/AbstractExtendedTableRenderer.java
===================================================================
--- trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/AbstractExtendedTableRenderer.java 2008-11-18 08:43:48 UTC (rev 11198)
+++ trunk/ui/extendedDataTable/src/main/java/org/richfaces/renderkit/AbstractExtendedTableRenderer.java 2008-11-18 08:47:38 UTC (rev 11199)
@@ -29,12 +29,10 @@
import java.util.List;
import java.util.Map;
import java.util.Set;
-import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.faces.component.UIComponent;
-import javax.faces.component.UIForm;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
@@ -95,6 +93,8 @@
private final static String CHANGE_COL_VISIBILITY = "change_col_v";
private static final String SORT_FUNCTION = "sortFunction";
+
+ private static final String GROUP_FUNCTION = "groupFunction";
private static final String SHOW_MENU_FUNCTION = "showMenuFunction";
@@ -843,6 +843,8 @@
context, table));
scriptOptions.addOption(SORT_FUNCTION, getSortFunctionDef(context,
table));
+ scriptOptions.addOption(GROUP_FUNCTION, getGroupFunctionDef(context,
+ table));
scriptOptions.addOption(SHOW_MENU_FUNCTION, getShowMenuFunction(
context, table));
/* Not needed if we do not save open/close state */
@@ -869,6 +871,7 @@
JSFunctionDefinition definition = new JSFunctionDefinition();
definition.addParameter("event");
definition.addParameter("columnId");
+ definition.addParameter("ascending");
String id = table.getClientId(context);
Map<String, Object> eventOptions = AjaxRendererUtils.buildEventOptions(
context, table);
@@ -876,10 +879,10 @@
Map<String, Object> parameters = (Map<String, Object>) eventOptions
.get("parameters");
parameters.put(id, SORT_FILTER_PARAMETER);
- if (asc != null) {
- parameters.put(SORT_DIR_PARAMETER, asc ? SORT_DIR_PARAMETER_ASC
- : SORT_DIR_PARAMETER_DESC);
- }
+// if (asc != null) {
+// parameters.put(SORT_DIR_PARAMETER, asc ? SORT_DIR_PARAMETER_ASC
+// : SORT_DIR_PARAMETER_DESC);
+// }
// parameters.put(SORT_FILTER_PARAMETER, column.getClientId(context));
JSFunctionDefinition onAjaxCompleteFunction = getOnAjaxCompleteFunction(
context, table);
@@ -891,12 +894,17 @@
ScriptUtils.toScript(eventOptions)).addToBody(";\n");
definition.addToBody("options.parameters['" + SORT_FILTER_PARAMETER
+ "'] = columnId;\n");
+ definition.addToBody("" +
+ "if (ascending != null){"+
+ " options.parameters['" + SORT_DIR_PARAMETER + "'] = (ascending ? '"+SORT_DIR_PARAMETER_ASC+"':'"+SORT_DIR_PARAMETER_DESC+"');"+
+ "}"
+ );
JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(table,
context);
ajaxFunction.addParameter(new JSReference("options"));
definition.addToBody(ajaxFunction.toScript()).addToBody(";\n");
return definition;
- }// getSortFunction
+ }// getSortFunctionDef
protected JSFunction getSortFunction(FacesContext context, UIDataTable table) {
String id = table.getClientId(context);
@@ -918,8 +926,60 @@
context);
ajaxFunction.addParameter(requestOpts);
return ajaxFunction;
- }// getSortFunction
+ }// getSortFunction
+ protected JSFunction getGroupFunction(FacesContext context,
+ UIDataTable table) {
+ String id = table.getClientId(context);
+ Map<String, Object> requestOpts = AjaxRendererUtils.buildEventOptions(
+ context, table);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> parameters = (Map<String, Object>) requestOpts
+ .get("parameters");
+ parameters.put(id, GROUP_FILTER_PARAMETER);
+ parameters.put(GROUP_FILTER_PARAMETER, "{columnId}");
+ JSFunctionDefinition onAjaxCompleteFunction = getOnAjaxCompleteFunction(
+ context, table);
+ if (onAjaxCompleteFunction != null) {
+ requestOpts.put(AjaxRendererUtils.ONCOMPLETE_ATTR_NAME,
+ onAjaxCompleteFunction);
+ }
+ JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(table,
+ context);
+ ajaxFunction.addParameter(requestOpts);
+ return ajaxFunction;
+ }// getGroupFunction
+
+ protected JSFunctionDefinition getGroupFunctionDef(FacesContext context,
+ UIDataTable table) {
+ JSFunctionDefinition definition = new JSFunctionDefinition();
+ definition.addParameter("event");
+ definition.addParameter("columnId");
+ String id = table.getClientId(context);
+ Map<String, Object> eventOptions = AjaxRendererUtils.buildEventOptions(
+ context, table);
+ @SuppressWarnings("unchecked")
+ Map<String, Object> parameters = (Map<String, Object>) eventOptions
+ .get("parameters");
+ parameters.put(id, GROUP_FILTER_PARAMETER);
+
+ JSFunctionDefinition onAjaxCompleteFunction = getOnAjaxCompleteFunction(
+ context, table);
+ if (onAjaxCompleteFunction != null) {
+ eventOptions.put(AjaxRendererUtils.ONCOMPLETE_ATTR_NAME,
+ onAjaxCompleteFunction);
+ }
+ definition.addToBody("var options = ").addToBody(
+ ScriptUtils.toScript(eventOptions)).addToBody(";\n");
+ definition.addToBody("options.parameters['" + GROUP_FILTER_PARAMETER
+ + "'] = columnId;\n");
+ JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(table,
+ context);
+ ajaxFunction.addParameter(new JSReference("options"));
+ definition.addToBody(ajaxFunction.toScript()).addToBody(";\n");
+ return definition;
+ }// getGroupFunctionDef
+
protected JSFunctionDefinition getOnGroupToggleFunctionDef(
FacesContext context, UIDataTable table) {
JSFunctionDefinition definition = new JSFunctionDefinition();
@@ -940,30 +1000,8 @@
ajaxFunction.addParameter(new JSReference("options"));
definition.addToBody(ajaxFunction.toScript()).addToBody(";\n");
return definition;
- }// getSortFunction
+ }// getOnGroupToggleFunctionDef
- protected JSFunction getGroupFunction(FacesContext context,
- UIDataTable table) {
- String id = table.getClientId(context);
- Map<String, Object> requestOpts = AjaxRendererUtils.buildEventOptions(
- context, table);
- @SuppressWarnings("unchecked")
- Map<String, Object> parameters = (Map<String, Object>) requestOpts
- .get("parameters");
- parameters.put(id, GROUP_FILTER_PARAMETER);
- parameters.put(GROUP_FILTER_PARAMETER, "{columnId}");
- JSFunctionDefinition onAjaxCompleteFunction = getOnAjaxCompleteFunction(
- context, table);
- if (onAjaxCompleteFunction != null) {
- requestOpts.put(AjaxRendererUtils.ONCOMPLETE_ATTR_NAME,
- onAjaxCompleteFunction);
- }
- JSFunction ajaxFunction = AjaxRendererUtils.buildAjaxFunction(table,
- context);
- ajaxFunction.addParameter(requestOpts);
- return ajaxFunction;
- }// getSortFunction
-
protected JSFunctionDefinition getOnResizeFunctionDef(FacesContext context,
UIDataTable table) {
JSFunctionDefinition definition = new JSFunctionDefinition();
@@ -1286,6 +1324,7 @@
} catch (NumberFormatException _) {
}
}// if
+ context.renderResponse();
}
}
17 years, 5 months
JBoss Rich Faces SVN: r11198 - trunk/ui/extendedDataTable/src/main/java/org/richfaces/component.
by richfaces-svn-commits@lists.jboss.org
Author: pgolawski
Date: 2008-11-18 03:43:48 -0500 (Tue, 18 Nov 2008)
New Revision: 11198
Modified:
trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/UIExtendedDataTable.java
Log:
changed phase for execute sorting and filtering events
Modified: trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/UIExtendedDataTable.java
===================================================================
--- trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2008-11-18 08:42:20 UTC (rev 11197)
+++ trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/UIExtendedDataTable.java 2008-11-18 08:43:48 UTC (rev 11198)
@@ -92,13 +92,13 @@
new AjaxEvent(this).queue();
event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else if (event instanceof ColumnResizeEvent) {
- event.setPhaseId(PhaseId.RENDER_RESPONSE);
+ event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
} else if (event instanceof ExtTableSortEvent) {
new AjaxEvent(this).queue();
- event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+ event.setPhaseId(PhaseId.INVOKE_APPLICATION);
} else if (event instanceof ExtTableFilterEvent) {
new AjaxEvent(this).queue();
- event.setPhaseId(PhaseId.APPLY_REQUEST_VALUES);
+ event.setPhaseId(PhaseId.INVOKE_APPLICATION);
}
}
super.queueEvent(event);
17 years, 5 months
JBoss Rich Faces SVN: r11197 - trunk/ui/extendedDataTable/src/main/java/org/richfaces/component.
by richfaces-svn-commits@lists.jboss.org
Author: pgolawski
Date: 2008-11-18 03:42:20 -0500 (Tue, 18 Nov 2008)
New Revision: 11197
Modified:
trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/ExtendedDataTableState.java
Log:
column visibility state changes + toggleGroup method bugfix
Modified: trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/ExtendedDataTableState.java
===================================================================
--- trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/ExtendedDataTableState.java 2008-11-18 08:35:29 UTC (rev 11196)
+++ trunk/ui/extendedDataTable/src/main/java/org/richfaces/component/ExtendedDataTableState.java 2008-11-18 08:42:20 UTC (rev 11197)
@@ -7,17 +7,13 @@
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
-import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
-import java.util.Set;
import javax.el.ValueExpression;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
import org.richfaces.json.JSONArray;
import org.richfaces.json.JSONCollection;
import org.richfaces.json.JSONException;
@@ -34,8 +30,6 @@
public class ExtendedDataTableState implements Serializable {
private static final long serialVersionUID = -3103664821855261335L;
-
- private static final Log log = LogFactory.getLog(ExtendedDataTableState.class);
public static final String TABLE_STATE_ATTR_NAME = "tableState";
@@ -65,16 +59,13 @@
try {
stateMap = new JSONMap(value);
} catch (JSONException e) {
- log.error("Could not initialize table state");
- if(log.isDebugEnabled()) {
- log.debug(e);
- }
+ e.printStackTrace();
}
}
//initialize columns order part
columnsOrder = ColumnsOrder.getColumnsOrder(extendedDataTable, (stateMap == null ? null : (JSONCollection)stateMap.get("columnsOrder")));
//initialize columns visibility part
- columnsVisibility = ColumnsVisibility.getColumnsVisibility(extendedDataTable, (stateMap == null ? null : (JSONCollection)stateMap.get("columnsVisibility")));
+ columnsVisibility = ColumnsVisibility.getColumnsVisibility(extendedDataTable, (stateMap == null ? null : (JSONMap)stateMap.get("columnsVisibility")));
//initialize columns size part
columnsSizeState = ColumnsSizeState.getColumnsSize(extendedDataTable, (stateMap == null ? null : (JSONMap)stateMap.get("columnsSizeState")));
//initialize column grouping part
@@ -106,10 +97,7 @@
result.put("columnsSizeState", columnsSizeState.toJSON());
result.put("columnGroupingState", columnGroupingState.toJSON());
} catch (JSONException e) {
- log.error("Could not convert to JSON");
- if(log.isDebugEnabled()) {
- log.debug(e);
- }
+ e.printStackTrace();
}
return result;
}
@@ -231,8 +219,6 @@
class ColumnsSizeState implements Serializable{
private static final long serialVersionUID = 8724163192351491340L;
-
- private static final Log log = LogFactory.getLog(ExtendedDataTableState.class);
private static final String DEFAULT_WIDTH = "100";
@@ -298,12 +284,7 @@
}
value = new JSONMap(writer.endObject().toString());
} catch (JSONException e) {
- if(log.isWarnEnabled()) {
- log.warn("Default column size state not created");
- }
- if(log.isDebugEnabled()) {
- log.debug(e);
- }
+ e.printStackTrace();
}
}
@@ -493,8 +474,11 @@
private static final long serialVersionUID = -3923409650272094713L;
//private static final String SEP = ";";
+
+ private static final String TRUE = "1";
+ private static final String FALSE = "0";
- private JSONArray value;
+ private JSONMap value;
private ColumnsVisibility() {
super();
@@ -502,29 +486,23 @@
static ColumnsVisibility getColumnsVisibility(UIExtendedDataTable extendedDataTable, String val) throws JSONException{
ColumnsVisibility columnsVisibility = new ColumnsVisibility();
- columnsVisibility.init(extendedDataTable, new JSONCollection(val));
+ columnsVisibility.init(extendedDataTable, new JSONMap(val));
return columnsVisibility;
}
- static ColumnsVisibility getColumnsVisibility(UIExtendedDataTable extendedDataTable, JSONCollection collection){
+ static ColumnsVisibility getColumnsVisibility(UIExtendedDataTable extendedDataTable, JSONMap map){
ColumnsVisibility columnsVisibility = new ColumnsVisibility();
- columnsVisibility.init(extendedDataTable, collection);
+ columnsVisibility.init(extendedDataTable, map);
return columnsVisibility;
}
/**
* Converts its state from String representation or create default state if it is not set.
*/
- private void init(UIExtendedDataTable extendedDataTable, JSONCollection collection){
+ private void init(UIExtendedDataTable extendedDataTable, JSONMap map){
value = null;
- if ((collection != null) && (collection.size()>0)){
- //try to restore state from string
- value = new JSONArray(collection);
-// try {
-// value = new JSONArray(val);
-// } catch (JSONException e) {
-// e.printStackTrace();
-// }
+ if ((map != null) && (map.size()>0)){
+ value = map;
}
if (value == null){
@@ -554,7 +532,7 @@
* Get state in JSON format.
* @return JSON object contains state
*/
- public JSONArray toJSON(){
+ public JSONMap toJSON(){
return value;
}
@@ -562,31 +540,19 @@
* Create default column visibility based on component children.
*/
private void createDefaultColumnsVisibility(UIExtendedDataTable extendedDataTable){
- value = new JSONArray();
- for (Iterator<UIColumn> iter = extendedDataTable.getChildColumns(); iter.hasNext();) {
- UIColumn col = iter.next();
- value.put(col.getId());
+ try {
+ JSONWriter writer = new JSONStringer().object();
+ for (Iterator<UIColumn> iter = extendedDataTable.getChildColumns(); iter.hasNext();) {
+ UIColumn col = iter.next();
+ writer.key(col.getId()).value(TRUE);
+ }
+ value = new JSONMap(writer.endObject().toString());
+ } catch (JSONException e) {
+ e.printStackTrace();
}
}//createDefaultColumnsVisibility
/**
- * Get column position.
- * @param columnId column id to be found
- * @return column position or -1 if not found
- */
- private int getColumnPosition(String columnId){
- if (value == null)
- return -1;
- for (int i=0;i<value.length(); i++){
- Object val = value.opt(i);
- if (columnId.equals(val)){
- return i;
- }
- }
- return -1;
- }//getColumnIndex
-
- /**
* Get column visibility.
* @param columnId column id to be found
* @return true if column is visible, otherwise false
@@ -594,7 +560,7 @@
boolean isVisible(String columnId){
if (value == null)
return true;
- return (value.opt(getColumnPosition(columnId)) != null);
+ return TRUE.equals(value.get(columnId));
}//isVisible
/**
@@ -607,36 +573,23 @@
return;
UIColumn column = null;
//find column by id
-// for (Iterator<UIColumn> iter = extendedDataTable.getChildColumns(); iter.hasNext();) {
-// UIColumn col = iter.next();
-// if (col.getId().equalsIgnoreCase(columnId)){
-// if (col instanceof UIColumn){
-// column = (UIColumn) col;
-// }
-// break;
-// }//if
-// }//for
-// if (column == null)
-// return;
+ for (Iterator<UIColumn> iter = extendedDataTable.getChildColumns(); iter.hasNext();) {
+ UIColumn col = iter.next();
+ if (col.getId().equalsIgnoreCase(columnId)){
+ if (col instanceof UIColumn){
+ column = (UIColumn) col;
+ }
+ break;
+ }//if
+ }//for
+ if (column == null)
+ return;
boolean visible = column.isVisible();
//toggle visibility
visible = !visible;
//set visibility flag for column
column.setVisible(visible);
- Set<String> visibleIds = new HashSet<String>(value.length());
- for (int i=0;i<value.length(); i++){
- visibleIds.add(value.optString(i));
- }
- if (visible){
- //add id to set
- visibleIds.add(columnId);
- }
- else{
- //remove id from list
- visibleIds.remove(columnId);
- }
- //convert from set to JSON
- value = new JSONArray(visibleIds);
+ value.put(columnId, (visible ? TRUE : FALSE));
}//changeVisibility
}//ColumnsVisibility
17 years, 5 months
JBoss Rich Faces SVN: r11196 - trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable.
by richfaces-svn-commits@lists.jboss.org
Author: pgolawski
Date: 2008-11-18 03:35:29 -0500 (Tue, 18 Nov 2008)
New Revision: 11196
Modified:
trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTable.js
trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTableHeader.js
Log:
sort and group changed
added sortBy and groupBy API functions
Modified: trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTable.js
===================================================================
--- trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTable.js 2008-11-18 00:56:26 UTC (rev 11195)
+++ trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTable.js 2008-11-18 08:35:29 UTC (rev 11196)
@@ -12,6 +12,14 @@
this.options = options;
this.selectionManager = new ExtendedDataTable.SelectionManager(options, this);
+ if (this.options.sortFunction) {
+ this.sortFct = this.options.sortFunction;
+ }
+
+ if (this.options.groupFunction) {
+ this.groupFct = this.options.groupFunction;
+ }
+
this.onGroupToggleFct = this.options.onGroupToggleFunction;
if (this.options.onColumnResize != null){
this.onColumnResize = this.options.onColumnResize;
@@ -146,8 +154,40 @@
*/
//this.table.setStyle({visibility:''});
this.splashScreen.className = 'extdt-ss-hdn';
- },
+ },
+ sortBy: function(columnId, ascending, event){
+ if (this.sortFct){
+ this.preSendAjaxRequest();
+ if (!columnId){
+ columnId = "";
+ }
+ else{
+ //prepend table id if necessary
+ if (columnId.indexOf(":") == -1){
+ columnId = this.id + ":" + columnId;
+ }
+ }
+ this.sortFct(event, columnId, ascending);
+ }
+ },
+
+ groupBy: function(columnId, event){
+ if (this.groupFct){
+ this.preSendAjaxRequest();
+ if (!columnId){
+ columnId = "";
+ }
+ else{
+ //prepend table id if necessary
+ if (columnId.indexOf(":") == -1){
+ columnId = this.id + ":" + columnId;
+ }
+ }
+ this.groupFct(event, columnId);
+ }
+ },
+
OnWindowResize: function(event) {
if (this.table) {
this.calculateWidthsFromRatios();
Modified: trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTableHeader.js
===================================================================
--- trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTableHeader.js 2008-11-18 00:56:26 UTC (rev 11195)
+++ trunk/ui/extendedDataTable/src/main/javascript/ClientUI/controls/datatable/ExtendedDataTableHeader.js 2008-11-18 08:35:29 UTC (rev 11196)
@@ -16,8 +16,7 @@
this.eventHeaderCellMouseOver = this.OnHeaderCellMouseOver.bindAsEventListener(this);
this.eventHeaderCellMouseOut = this.OnHeaderCellMouseOut.bindAsEventListener(this);
- if (this.extDt.options.sortFunction) {
- this.sortFct = this.extDt.options.sortFunction;
+ if (this.extDt.sortFct) {
this.eventHeaderCellClicked = this.OnHeaderCellMouseClicked.bindAsEventListener(this);
}
@@ -48,8 +47,7 @@
var columnId = (el) ? el.id : null;
if (columnId && (columnId != "")){
- this.extDt.showSplashScreen();
- this.sortFct(event, columnId);
+ this.extDt.sortBy(columnId, null, event);
}
Event.stop(event);
},
17 years, 5 months
JBoss Rich Faces SVN: r11195 - in branches/jsf2.0/framework/jsf-test/src: main/java/org/richfaces/test/staging and 2 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: alexsmirnov
Date: 2008-11-17 19:56:26 -0500 (Mon, 17 Nov 2008)
New Revision: 11195
Added:
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/EventInvoker.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/HttpMethod.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationErrorEvent.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationEvent.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationListener.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/PageContextExtension.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerLogger.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingConnection.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServer.java
Removed:
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/HttpMethod.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerLogger.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
Modified:
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/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/main/java/org/richfaces/test/staging/AbstractServerResource.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/FilterContainer.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/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/StaggingJspApplicationContext.java
branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspFactory.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/UrlServerResource.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/staging/ServletTest.java
branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/UrlResourceLoadingTest.java
Log:
Improve test framework features.
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/AbstractFacesTest.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -27,6 +27,8 @@
import org.richfaces.test.staging.FilterContainer;
import org.richfaces.test.staging.RequestChain;
import org.richfaces.test.staging.ServletContainer;
+import org.richfaces.test.staging.StagingConnection;
+import org.richfaces.test.staging.StagingServer;
/**
* @author asmirnov
Deleted: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/EventInvoker.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -1,10 +0,0 @@
-/**
- *
- */
-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
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/HttpMethod.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/HttpMethod.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/HttpMethod.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -1,33 +0,0 @@
-/**
- *
- */
-package org.richfaces.test;
-
-/**
- * @author asmirnov
- *
- */
-public enum HttpMethod {
-
- GET("GET"),
- POST("POST"),
- HEAD("HEAD"),
- PUT("PUT"),
- OPTIONS("OPTIONS"),
- TRACE("TRACE"),
- DELETE("DELETE");
-
- /**
- * @param name
- */
- private HttpMethod(String name) {
- this.name = name;
- }
-
- private String name;
-
- @Override
- public String toString() {
- return name;
- }
-}
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-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebClient.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -3,6 +3,8 @@
*/
package org.richfaces.test;
+import org.richfaces.test.staging.StagingServer;
+
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
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-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebConnection.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -8,7 +8,9 @@
import javax.servlet.ServletException;
import org.apache.commons.httpclient.NameValuePair;
-import org.richfaces.test.staging.StagingHttpRequest;
+import org.richfaces.test.staging.HttpMethod;
+import org.richfaces.test.staging.StagingConnection;
+import org.richfaces.test.staging.StagingServer;
import com.gargoylesoftware.htmlunit.FormEncodingType;
import com.gargoylesoftware.htmlunit.WebConnection;
@@ -32,14 +34,13 @@
connection.addRequestParameter(param.getName(), param.getValue());
}
HttpMethod httpMethod = HttpMethod.valueOf(settings.getHttpMethod().toString());
- connection.setMethod(httpMethod);
- StagingHttpRequest request = connection.getRequest();
- request.setCharacterEncoding(settings.getCharset());
+ connection.setRequestMethod(httpMethod);
+ connection.setRequestCharacterEncoding(settings.getCharset());
String body = settings.getRequestBody();
String contentType = settings.getEncodingType().getName();
- request.setRequestBody(body);
- request.setContentType(contentType);
- request.addHeaders(settings.getAdditionalHeaders());
+ connection.setRequestBody(body);
+ connection.setRequestContentType(contentType);
+ connection.addRequestHeaders(settings.getAdditionalHeaders());
if(null != body && FormEncodingType.URL_ENCODED.getName().equals(contentType)){
connection.parseFormParameters(body);
}
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-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/LocalWebResponse.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -14,6 +14,7 @@
import java.util.Map.Entry;
import org.apache.commons.httpclient.NameValuePair;
+import org.richfaces.test.staging.StagingConnection;
import com.gargoylesoftware.htmlunit.WebRequestSettings;
import com.gargoylesoftware.htmlunit.WebResponse;
@@ -78,7 +79,7 @@
public List<NameValuePair> getResponseHeaders() {
ArrayList<NameValuePair> headers = new ArrayList<NameValuePair>(10);
- for (Entry<String, String[]> entry : serverConnection.getResponse().getHeaders().entrySet()) {
+ for (Entry<String, String[]> entry : serverConnection.getResponseHeaders().entrySet()) {
for (String value : entry.getValue()) {
headers.add(new NameValuePair(entry.getKey(),value));
}
Deleted: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerLogger.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerLogger.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerLogger.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -1,41 +0,0 @@
-/**
- *
- */
-package org.richfaces.test;
-
-import java.util.logging.Logger;
-
-/**
- * @author asmirnov
- *
- */
-public enum ServerLogger {
-
- RESOURCE("resource"),
- CONNECTION("connection"),
- SERVER("server");
-
- private static final String PREFIX="org.richfaces.test.";
-
- private static final String LOGGING_BUNDLE="org.richfaces.test.LogMessages";
- private final String name;
-
- /**
- * @param name
- */
- private ServerLogger(String name) {
- this.name = PREFIX+name;
- }
-
- /**
- * @return the name
- */
- public String getName() {
- return name;
- }
-
- public Logger getLogger(){
- return Logger.getLogger(name, LOGGING_BUNDLE);
- }
-
-}
Deleted: 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/StagingConnection.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingConnection.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -1,477 +0,0 @@
-/**
- *
- */
-package org.richfaces.test;
-
-import java.io.IOException;
-import java.io.InvalidClassException;
-import java.io.UnsupportedEncodingException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLDecoder;
-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 java.util.logging.Logger;
-
-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 static final Logger log = ServerLogger.SERVER.getLogger();
-
- 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);
- setQueryString(url.getQuery());
- if (null != getQueryString()) {
- parseFormParameters(queryString);
- }
-
- }
-
- public void parseFormParameters(String queryString) {
- String[] queryParams = queryString.split("&");
- for (int i = 0; i < queryParams.length; i++) {
- try {
- String par = queryParams[i];
- int eqIndex = par.indexOf('=');
- if (eqIndex >= 0) {
- // TODO - decode url-decoded values.
- String name = URLDecoder.decode(par.substring(0, eqIndex),
- request.getCharacterEncoding());
- String value = URLDecoder.decode(
- par.substring(eqIndex + 1), request
- .getCharacterEncoding());
- addRequestParameter(name, value);
- } else {
- addRequestParameter(URLDecoder.decode(par, request
- .getCharacterEncoding()), null);
- }
- } catch (UnsupportedEncodingException e) {
- throw new TestException(e);
- }
- }
- }
-
- /**
- * @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() {
- log.fine("start " + getMethod() + " request processing for file "
- + url.getFile());
- log.fine("request parameters: " + requestParameters);
- 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();
- }
-
- /**
- * @param queryString
- * the queryString to set
- */
- public void setQueryString(String queryString) {
- this.queryString = queryString;
- }
-
- /**
- * @return the queryString
- */
- public String getQueryString() {
- return queryString;
- }
-
-}
Deleted: 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/StagingServer.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/StagingServer.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -1,348 +0,0 @@
-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 javax.servlet.jsp.JspFactory;
-
-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.ServletContainer;
-import org.richfaces.test.staging.StaggingJspFactory;
-import org.richfaces.test.staging.StagingHttpSession;
-import org.richfaces.test.staging.StagingServletContext;
-import org.richfaces.test.staging.StaticServlet;
-import org.richfaces.test.staging.UrlServerResource;
-
-
-/**
- * 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 addResource(String path, URL resource){
- serverRoot.addResource(new ServerResourcePath(path), new UrlServerResource(resource));
- }
-
- public void addWebListener(EventListener listener) {
- contextListeners.add(listener);
- }
-
- public HttpSession getSession(){
- return getSession(true);
- }
-
- public synchronized 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 Jsp factory
- JspFactory.setDefaultFactory(new StaggingJspFactory());
- // 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();
- session = null;
- }
- // 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();
- // Create Jsp factory
- JspFactory.setDefaultFactory(null);
-
- }
-
- 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);
- }
- });
- }
-}
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/AbstractServerResource.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/AbstractServerResource.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/AbstractServerResource.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -8,8 +8,12 @@
import java.util.Set;
import java.util.logging.Logger;
-import org.richfaces.test.ServerLogger;
+/**
+ * Base abstract class for an all file references in the 'virtual' staging server directory.
+ * @author asmirnov
+ *
+ */
public abstract class AbstractServerResource implements ServerResource {
private static final Logger log = ServerLogger.RESOURCE.getLogger();
@@ -17,6 +21,10 @@
public AbstractServerResource() {
}
+ /** This implementation creates stream from the resource URL. I also tries to disable
+ * url connection cache, to prevent jar file locking in the windows environment.
+ * @see org.richfaces.test.staging.ServerResource#getAsStream()
+ */
public InputStream getAsStream() throws IOException {
URL url = getURL();
if (url != null) {
@@ -32,22 +40,34 @@
}
}
+ /**
+ * File-like resources do not allows resources additions.
+ * @throws UnsupportedOperationException
+ * @see org.richfaces.test.staging.ServerResource#addResource(org.richfaces.test.staging.ServerResourcePath, 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 points to the resource itself, returns this instance.
if(path.isFile()){
return this;
}
return null;
}
+ /** File-like resources does not contain any other, so this method always returns null.
+ * @see org.richfaces.test.staging.ServerResource#getPaths()
+ */
public Set<String> getPaths() {
- return Collections.emptySet();
+ return null;//Collections.emptySet();
}
}
\ No newline at end of file
Modified: 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/ClasspathServerResource.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ClasspathServerResource.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -3,29 +3,28 @@
*/
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;
-
/**
+ * This class represents file from classpath in the virtual web application
+ * content.
+ *
* @author asmirnov
- *
+ *
*/
public class ClasspathServerResource extends AbstractServerResource {
-
+
+ /**
+ *
+ */
private final String classpath;
-
+
+ private volatile URL url = null;
+
private static final Logger log = ServerLogger.RESOURCE.getLogger();
-
/**
* @param name
@@ -35,16 +34,29 @@
this.classpath = classpath;
}
- /* (non-Javadoc)
+ /*
+ * (non-Javadoc)
+ *
* @see org.richfaces.test.staging.ServerResource#getURL()
*/
public URL getURL() {
- ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
- if(null == classLoader){
- classLoader = this.getClass().getClassLoader();
+ if (url == null) {
+ // JDK-5 singleton-like synchronization.
+ // @see http://jeremymanson.blogspot.com/2008/05/double-checked-locking.html
+ synchronized (this) {
+ if(log.isLoggable(Level.FINEST)){
+ log.finest("get classpath resource from "+this.classpath);
+ }
+ ClassLoader classLoader = Thread.currentThread()
+ .getContextClassLoader();
+ if (null == classLoader) {
+ classLoader = this.getClass().getClassLoader();
+ }
+ url = classLoader.getResource(classpath);
+ }
}
- return classLoader.getResource(classpath);
+
+ return url;
}
-
}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/EventInvoker.java (from rev 11158, 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/staging/EventInvoker.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/EventInvoker.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,10 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.util.EventListener;
+
+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/staging/EventInvoker.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/FilterContainer.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -5,6 +5,7 @@
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
+import java.util.logging.Logger;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
@@ -14,40 +15,94 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+
+/**
+ * Holds a filter instance and reference to the next executable server object (
+ * filter or servlet ) in the chain.
+ *
+ * @author asmirnov
+ *
+ */
public class FilterContainer implements RequestChain {
+ private static final Logger log = ServerLogger.SERVER.getLogger();
+
+ /**
+ * Servlet filter instance.
+ */
private final Filter filter;
+ /**
+ * Next object in the chain.
+ */
private final RequestChain next;
+ /**
+ * Filter name.
+ */
private String name = "Default";
+ /**
+ * Filter initialization parameters.
+ */
private final Map<String, String> initParameters;
+ /**
+ * Initialization flag to avoid double calls.
+ */
private boolean initialized = false;
/**
* @param filter
+ * instance of the web application filter.
* @param next
+ * next executable object in the filter chain.
+ * @throws NullPointerException if any of parameter is null.
*/
public FilterContainer(Filter filter, RequestChain next) {
+ if(null == filter || null == next){
+ throw new NullPointerException();
+ }
this.filter = filter;
this.next = next;
this.initParameters = new HashMap<String, String>();
}
+ /**
+ * @return filter name.
+ */
public String getName() {
return name;
}
+ /**
+ * @param name
+ * new filter name.
+ */
public void setName(String name) {
+ if (initialized) {
+ throw new IllegalStateException(
+ "Filter have already been initialized, name can't be changed");
+ }
this.name = 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 {
+ if (!initialized) {
+ throw new IllegalStateException(
+ "Filter "+getName()+" have not been initialized, could'n execute request");
+ }
+ log.finest("Request '"+request+"' executes by the '"+getName()+"' filter");
FilterChain chain = new FilterChain() {
-
+ // Execute next object in the chain.
public void doFilter(ServletRequest request,
ServletResponse response) throws IOException,
ServletException {
@@ -60,14 +115,41 @@
}
+ /**
+ * Append filter initialization parameter. Name and value are same as
+ * defined in the web.xml
+ *
+ * <code>
+ * <init-param>
+ * <param-name>foo</param-name>
+ * <param-value>bar</param-value>
+ * </init-param>
+ * </code>
+ *
+ * @param name
+ * name of the parameter
+ * @param value
+ * its value
+ */
public void addInitParameter(String name, String value) {
+ if (initialized) {
+ throw new IllegalStateException(
+ "Filter have already been initialized, init parameters can't be changed");
+ }
initParameters.put(name, value);
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#isApplicable(java.lang.String)
+ */
public boolean isApplicable(String path) {
+ // Delegate to the next object. Filter has a same mapping as target servlet.
return next.isApplicable(path);
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#destroy()
+ */
public void destroy() {
if (initialized) {
next.destroy();
@@ -76,7 +158,10 @@
}
}
- public void init(final StagingServletContext context)
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#init(org.richfaces.test.staging.StagingServletContext)
+ */
+ public void init(final ServletContext context)
throws ServletException {
if (!initialized) {
filter.init(new FilterConfig() {
@@ -104,11 +189,19 @@
}
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#getPathInfo(java.lang.String)
+ */
public String getPathInfo(String path) {
+ // Delegate to the next object. Filter has a same mapping as target servlet.
return next.getPathInfo(path);
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#getServletPath(java.lang.String)
+ */
public String getServletPath(String path) {
+ // Delegate to the next object. Filter has a same mapping as target servlet.
return next.getServletPath(path);
}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/HttpMethod.java (from rev 11158, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/HttpMethod.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/HttpMethod.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/HttpMethod.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,33 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+/**
+ * @author asmirnov
+ *
+ */
+public enum HttpMethod {
+
+ GET("GET"),
+ POST("POST"),
+ HEAD("HEAD"),
+ PUT("PUT"),
+ OPTIONS("OPTIONS"),
+ TRACE("TRACE"),
+ DELETE("DELETE");
+
+ /**
+ * @param name
+ */
+ private HttpMethod(String name) {
+ this.name = name;
+ }
+
+ private String name;
+
+ @Override
+ public String toString() {
+ return name;
+ }
+}
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationErrorEvent.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationErrorEvent.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationErrorEvent.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,36 @@
+package org.richfaces.test.staging;
+
+import java.lang.reflect.Method;
+import java.util.EventObject;
+
+public class InvocationErrorEvent extends EventObject {
+ private Object target;
+ private Method method;
+ private Object[] args;
+ private Throwable e;
+
+ public InvocationErrorEvent(Object target, Method method, Object[] args,
+ Throwable e) {
+ super(target);
+ this.target = target;
+ this.method = method;
+ this.args = args;
+ this.e = e;
+ }
+
+ public Object getTarget() {
+ return target;
+ }
+
+ public Method getMethod() {
+ return method;
+ }
+
+ public Object[] getArgs() {
+ return args;
+ }
+
+ public Throwable getE() {
+ return e;
+ }
+}
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationErrorEvent.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationEvent.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationEvent.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationEvent.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,36 @@
+package org.richfaces.test.staging;
+
+import java.lang.reflect.Method;
+import java.util.EventObject;
+
+public class InvocationEvent extends EventObject {
+ private Object target;
+ private Method method;
+ private Object[] args;
+ private Object result;
+
+ public InvocationEvent(Object target, Method method, Object[] args,
+ Object result) {
+ super(target);
+ this.target = target;
+ this.method = method;
+ this.args = args;
+ this.result = result;
+ }
+
+ public Object getTarget() {
+ return target;
+ }
+
+ public Method getMethod() {
+ return method;
+ }
+
+ public Object[] getArgs() {
+ return args;
+ }
+
+ public Object getResult() {
+ return result;
+ }
+}
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationEvent.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationListener.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationListener.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationListener.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,32 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.util.EventListener;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+
+/**
+ * Listener interface to inspect all calls to {@link HttpServletRequest} , {@link HttpServletResponse}, {@link HttpSession} and {@link ServletContext} objects.
+ * @author asmirnov
+ *
+ */
+public interface InvocationListener extends EventListener{
+
+ /**
+ * This metod called after successful invocation on the target object.
+ * @param invocationEvent
+ */
+ public void afterInvoke(InvocationEvent invocationEvent);
+
+ /**
+ * This method called after any {@link Throwable} thrown during method invocation.
+ * @param invocationErrorEvent
+ */
+ public void processException(InvocationErrorEvent invocationErrorEvent);
+
+}
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/InvocationListener.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Added: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/PageContextExtension.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/PageContextExtension.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/PageContextExtension.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,201 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.util.Enumeration;
+
+import javax.el.ELContext;
+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 javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import javax.servlet.jsp.JspWriter;
+import javax.servlet.jsp.PageContext;
+import javax.servlet.jsp.el.ExpressionEvaluator;
+import javax.servlet.jsp.el.VariableResolver;
+
+final class PageContextExtension extends PageContext {
+ private ServletResponse response;
+ private Servlet servlet;
+ private ServletRequest request;
+ private boolean needsSession;
+ private int bufferSize;
+ private boolean autoFlush;
+
+
+ @Override
+ public void forward(String relativeUrlPath)
+ throws ServletException, IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Exception getException() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object getPage() {
+ return servlet;
+ }
+
+ @Override
+ public ServletRequest getRequest() {
+ return request;
+ }
+
+ @Override
+ public ServletResponse getResponse() {
+ return response;
+ }
+
+ @Override
+ public ServletConfig getServletConfig() {
+ return servlet.getServletConfig();
+ }
+
+ @Override
+ public ServletContext getServletContext() {
+ return servlet.getServletConfig().getServletContext();
+ }
+
+ @Override
+ public HttpSession getSession() {
+ HttpServletRequest httpRequest = (HttpServletRequest) request;
+ return httpRequest.getSession(needsSession);
+ }
+
+ @Override
+ public void handlePageException(Exception e)
+ throws ServletException, IOException {
+ throw new ServletException(e);
+
+ }
+
+ @Override
+ public void handlePageException(Throwable t)
+ throws ServletException, IOException {
+ throw new ServletException(t);
+
+ }
+
+ @Override
+ public void include(String relativeUrlPath)
+ throws ServletException, IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void include(String relativeUrlPath, boolean flush)
+ throws ServletException, IOException {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void initialize(Servlet servlet, ServletRequest request,
+ ServletResponse response, String errorPageURL,
+ boolean needsSession, int bufferSize, boolean autoFlush)
+ throws IOException, IllegalStateException,
+ IllegalArgumentException {
+ this.response = response;
+ this.servlet = servlet;
+ this.request = request;
+ this.needsSession = needsSession;
+ this.bufferSize = bufferSize;
+ this.autoFlush = autoFlush;
+ }
+
+ @Override
+ public void release() {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public Object findAttribute(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object getAttribute(String name) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Object getAttribute(String name, int scope) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public Enumeration<String> getAttributeNamesInScope(int scope) {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public int getAttributesScope(String name) {
+ // TODO Auto-generated method stub
+ return 0;
+ }
+
+ @Override
+ public ELContext getELContext() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public ExpressionEvaluator getExpressionEvaluator() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public JspWriter getOut() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public VariableResolver getVariableResolver() {
+ // TODO Auto-generated method stub
+ return null;
+ }
+
+ @Override
+ public void removeAttribute(String name) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void removeAttribute(String name, int scope) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setAttribute(String name, Object value) {
+ // TODO Auto-generated method stub
+
+ }
+
+ @Override
+ public void setAttribute(String name, Object value, int scope) {
+ // TODO Auto-generated method stub
+
+ }
+}
\ No newline at end of file
Property changes on: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/PageContextExtension.java
___________________________________________________________________
Name: svn:mime-type
+ text/plain
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/RequestChain.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -2,23 +2,60 @@
import java.io.IOException;
+import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
+/**
+ * Implementations of the this interface represent any executable request object ( filter or servlet ) in the virtual server.
+ * Filter implementation also hold a reference to the next server object in the chain.
+ * @author asmirnov
+ *
+ */
public interface RequestChain {
+ /**
+ * Is this object applicable to process given path ?
+ * @param path request path relative to web application context.
+ * @return true if this object was configured to process given path.
+ */
public abstract boolean isApplicable(String path);
+ /**
+ * Execute request with current object. Filter objects also delegate doFilter calls to the next object in the chain.
+ * @param request
+ * @param response
+ * @throws ServletException
+ * @throws IOException
+ */
public abstract void execute(ServletRequest request,
ServletResponse response) throws ServletException, IOException;
+ /**
+ * Destroy containing web server objects.
+ */
public abstract void destroy();
- public abstract void init(StagingServletContext context) throws ServletException;
+ /**
+ * Init containing objects ( filters or servlet ).
+ * @param servletContext
+ * @throws ServletException
+ */
+ public abstract void init(ServletContext servletContext) throws ServletException;
+ /**
+ * Calculate path info for a request path.
+ * @param path request path relative to the web application context.
+ * @return part of the path after servlet path or null for a suffix-based mapping.
+ */
public abstract String getPathInfo(String path);
+ /**
+ * Calculate servlet path for a given request.
+ * @param path request path relative to the web application context.
+ * @return prefix part from servlet mapping or {@code path} for a suffix-based mapping.
+ */
public abstract String getServletPath(String path);
}
\ No newline at end of file
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerLogger.java (from rev 11158, branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/ServerLogger.java)
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerLogger.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerLogger.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,41 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.util.logging.Logger;
+
+/**
+ * @author asmirnov
+ *
+ */
+public enum ServerLogger {
+
+ RESOURCE("resource"),
+ CONNECTION("connection"),
+ SERVER("server");
+
+ private static final String PREFIX="org.richfaces.test.";
+
+ private static final String LOGGING_BUNDLE="org.richfaces.test.LogMessages";
+ private final String name;
+
+ /**
+ * @param name
+ */
+ private ServerLogger(String name) {
+ this.name = PREFIX+name;
+ }
+
+ /**
+ * @return the name
+ */
+ public String getName() {
+ return name;
+ }
+
+ public Logger getLogger(){
+ return Logger.getLogger(name, LOGGING_BUNDLE);
+ }
+
+}
Modified: 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/ServerResourcesDirectory.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServerResourcesDirectory.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -11,6 +11,7 @@
import java.util.Set;
/**
+ * Directory-like resource for a virtual web application content.
* @author asmirnov
*
*/
@@ -18,6 +19,9 @@
+ /**
+ * Directory content.
+ */
private final Map<String,ServerResource> children = new HashMap<String,ServerResource>();
/* (non-Javadoc)
@@ -28,8 +32,10 @@
if(null == path || path.isFile()){
throw new IllegalArgumentException();
} else if(path.getNextPath().isFile()) {
+ // This is a last part in the path - append resource to the directory content.
children.put(path.getNextElementName(), resource);
} else {
+ // Create a next directory entry.
ServerResource nextDirectory = children.get(path.getNextElementName());
if(null == nextDirectory){
nextDirectory = new ServerResourcesDirectory();
@@ -48,10 +54,12 @@
}
ServerResource resource = null; //children.get(path.getName());
if(path.isFile()){
+ // Path points to the resource itself.
resource=this;
} else {
resource = children.get(path.getNextElementName());
if(!path.getNextPath().isFile() && null!=resource){
+ // Get next resource in the tree, if exists.
resource = resource.getResource(path.getNextPath());
}
}
Modified: 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/ServletContainer.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/ServletContainer.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -17,9 +17,9 @@
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
-import org.richfaces.test.ServerLogger;
/**
+ * This class represens Servlet in the web application.
* @author asmirnov
*
*/
@@ -40,10 +40,14 @@
private boolean initialized = false;
/**
- * @param mapping
- * @param servlet
+ * @param mapping Servlet mapping pattern, as defined in the <servlet-mapping> element.
+ * @param servlet servlet instance. Can't be null.
+ * @throws NullPointerException if servlet parameter is null.
*/
public ServletContainer(String mapping, Servlet servlet) {
+ if(null == servlet){
+ throw new NullPointerException();
+ }
if (null == mapping) {
this.prefixMapped = true;
this.mapping = "";
@@ -60,12 +64,31 @@
this.initParameters = new HashMap<String, String>();
}
+ /**
+ * Append filter initialization parameter. Name and value are same as
+ * defined in the web.xml
+ *
+ * <code>
+ * <init-param>
+ * <param-name>foo</param-name>
+ * <param-value>bar</param-value>
+ * </init-param>
+ * </code>
+ *
+ * @param name
+ * @param value
+ * @throws IllegalStateException if servlet was already initialized.
+ */
public void addInitParameter(String name, String value) {
+ if (initialized) {
+ throw new IllegalStateException(
+ "Servlet have already been initialized, init parameters can't be changed");
+ }
initParameters.put(name, value);
}
/**
- * @return the name
+ * @return the name of servlet
*/
public String getName() {
return name;
@@ -74,8 +97,13 @@
/**
* @param name
* the name to set
+ * @throws IllegalStateException if servlet was already initialized.
*/
public void setName(String name) {
+ if (initialized) {
+ throw new IllegalStateException(
+ "Servlet have already been initialized, name can't be changed");
+ }
this.name = name;
}
@@ -95,6 +123,9 @@
}
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#getServletPath(java.lang.String)
+ */
public String getServletPath(String path) {
if (!isApplicable(path)) {
return null;
@@ -106,6 +137,9 @@
}
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#getPathInfo(java.lang.String)
+ */
public String getPathInfo(String path) {
if (!isApplicable(path)) {
return null;
@@ -118,9 +152,13 @@
}
- public void init(final StagingServletContext context)
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#init(org.richfaces.test.staging.StagingServletContext)
+ */
+ public void init(final ServletContext context)
throws ServletException {
if (!initialized) {
+ log.finest("Initialize servlet "+getName());
servlet.init(new ServletConfig() {
public String getInitParameter(String name) {
@@ -154,10 +192,18 @@
*/
public void execute(ServletRequest request, ServletResponse response)
throws ServletException, IOException {
+ if (!initialized) {
+ throw new IllegalStateException(
+ "Servlet "+getName()+" have not been initialized, could'n execute request");
+ }
+ log.finest("Request '"+request+"' executes by the '"+getName()+"' servlet");
this.servlet.service(request, response);
}
+ /* (non-Javadoc)
+ * @see org.richfaces.test.staging.RequestChain#destroy()
+ */
public void destroy() {
if (initialized) {
this.servlet.destroy();
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspApplicationContext.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspApplicationContext.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspApplicationContext.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -6,6 +6,7 @@
import javax.el.ELContextListener;
import javax.el.ELResolver;
import javax.el.ExpressionFactory;
+import javax.servlet.ServletContext;
import javax.servlet.jsp.JspApplicationContext;
import com.sun.el.ExpressionFactoryImpl;
@@ -17,8 +18,11 @@
public class StaggingJspApplicationContext implements JspApplicationContext {
private final ExpressionFactory expressionFactory ;
+ private final ServletContext servletContext;
- public StaggingJspApplicationContext() {
+
+ public StaggingJspApplicationContext(ServletContext servletContext) {
+ this.servletContext = servletContext;
expressionFactory = ExpressionFactory.newInstance();
}
@@ -26,7 +30,6 @@
* @see javax.servlet.jsp.JspApplicationContext#addELContextListener(javax.el.ELContextListener)
*/
public void addELContextListener(ELContextListener listener) {
- // TODO Auto-generated method stub
}
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspFactory.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspFactory.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StaggingJspFactory.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -3,6 +3,8 @@
*/
package org.richfaces.test.staging;
+import java.io.IOException;
+
import javax.servlet.Servlet;
import javax.servlet.ServletContext;
import javax.servlet.ServletRequest;
@@ -13,27 +15,31 @@
import javax.servlet.jsp.PageContext;
/**
+ * Stagging implementation of the {@link JspFactory} to simulate JSP processing in the stagging server.
+ * TODO - implement JSP functionality.
* @author asmirnov
- *
+ *
*/
public class StaggingJspFactory extends JspFactory {
-
- private static final JspEngineInfo engineInfo = new JspEngineInfo(){
-
+ private static final JspEngineInfo engineInfo = new JspEngineInfo() {
+
@Override
public String getSpecificationVersion() {
return "2.1";
}
-
+
};
- private final JspApplicationContext context;
+ private final JspApplicationContext context;
- public StaggingJspFactory() {
- this.context = new StaggingJspApplicationContext();
+ public StaggingJspFactory(ServletContext servletContext) {
+ this.context = new StaggingJspApplicationContext(servletContext);
}
- /* (non-Javadoc)
+
+ /*
+ * (non-Javadoc)
+ *
* @see javax.servlet.jsp.JspFactory#getEngineInfo()
*/
@Override
@@ -42,31 +48,47 @@
return engineInfo;
}
- /* (non-Javadoc)
- * @see javax.servlet.jsp.JspFactory#getJspApplicationContext(javax.servlet.ServletContext)
+ /*
+ * (non-Javadoc)
+ *
+ * @seejavax.servlet.jsp.JspFactory#getJspApplicationContext(javax.servlet.
+ * ServletContext)
*/
@Override
public JspApplicationContext getJspApplicationContext(ServletContext context) {
return this.context;
}
- /* (non-Javadoc)
- * @see javax.servlet.jsp.JspFactory#getPageContext(javax.servlet.Servlet, javax.servlet.ServletRequest, javax.servlet.ServletResponse, java.lang.String, boolean, int, boolean)
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.jsp.JspFactory#getPageContext(javax.servlet.Servlet,
+ * javax.servlet.ServletRequest, javax.servlet.ServletResponse,
+ * java.lang.String, boolean, int, boolean)
*/
@Override
- public PageContext getPageContext(Servlet servlet, ServletRequest request,
- ServletResponse response, String errorPageURL,
- boolean needsSession, int buffer, boolean autoflush) {
- // TODO Auto-generated method stub
- return null;
+ public PageContext getPageContext(final Servlet servlet, final ServletRequest request,
+ final ServletResponse response, String errorPageURL,
+ final boolean needsSession, int buffer, boolean autoflush) {
+ PageContextExtension pageContextExtension = new PageContextExtension();
+ try {
+ pageContextExtension.initialize(servlet, request, response, errorPageURL, needsSession, buffer, autoflush);
+ } catch (IOException e) {
+ throw new IllegalStateException(e);
+ }
+ return pageContextExtension;
}
- /* (non-Javadoc)
- * @see javax.servlet.jsp.JspFactory#releasePageContext(javax.servlet.jsp.PageContext)
+ /*
+ * (non-Javadoc)
+ *
+ * @see
+ * javax.servlet.jsp.JspFactory#releasePageContext(javax.servlet.jsp.PageContext
+ * )
*/
@Override
public void releasePageContext(PageContext pc) {
- // TODO Auto-generated method stub
+ pc.release();
}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingConnection.java (from rev 11158, 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/staging/StagingConnection.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingConnection.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,521 @@
+/**
+ *
+ */
+package org.richfaces.test.staging;
+
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Proxy;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLDecoder;
+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 java.util.logging.Logger;
+
+import javax.servlet.RequestDispatcher;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.Cookie;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+
+import org.richfaces.test.TestException;
+
+/**
+ * This class represent single connection to the server.
+ *
+ * @author asmirnov
+ *
+ */
+public class StagingConnection {
+
+ private static final Logger log = ServerLogger.SERVER.getLogger();
+
+ private final StagingServer server;
+
+ final URL url;
+
+ private ConnectionRequest request;
+
+ private 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;
+
+ private HttpServletRequest requestProxy;
+
+ private HttpServletResponse responseProxy;
+
+ 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);
+ setQueryString(url.getQuery());
+ if (null != getQueryString()) {
+ parseFormParameters(queryString);
+ }
+
+ // Create proxy objects.
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if(null == loader){
+ loader = this.getClass().getClassLoader();
+ }
+ requestProxy = (HttpServletRequest) Proxy.newProxyInstance(loader, new Class[]{HttpServletRequest.class}, server.getInvocationHandler(request));
+ responseProxy = (HttpServletResponse) Proxy.newProxyInstance(loader, new Class[]{HttpServletResponse.class}, server.getInvocationHandler(response));
+ }
+
+ public void parseFormParameters(String queryString) {
+ String[] queryParams = queryString.split("&");
+ for (int i = 0; i < queryParams.length; i++) {
+ try {
+ String par = queryParams[i];
+ int eqIndex = par.indexOf('=');
+ if (eqIndex >= 0) {
+ // decode url-decoded values.
+ String name = URLDecoder.decode(par.substring(0, eqIndex),
+ request.getCharacterEncoding());
+ String value = URLDecoder.decode(
+ par.substring(eqIndex + 1), request
+ .getCharacterEncoding());
+ addRequestParameter(name, value);
+ } else {
+ addRequestParameter(URLDecoder.decode(par, request
+ .getCharacterEncoding()), null);
+ }
+ } catch (UnsupportedEncodingException e) {
+ throw new TestException(e);
+ }
+ }
+ }
+
+ /**
+ * @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");
+ }
+ }
+
+ private void checkNotStarted() {
+ if (isStarted()) {
+ throw new IllegalStateException("request was started, no parameters changes allowed");
+ }
+ }
+
+ 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() {
+ log.fine("start " + getMethod() + " request processing for file "
+ + url.getFile());
+ log.fine("request parameters: " + requestParameters);
+ server.requestStarted(request);
+ started = true;
+ }
+
+ /**
+ * @return the method
+ */
+ public HttpMethod getMethod() {
+ return method;
+ }
+
+ /**
+ * @param method
+ * the method to set
+ */
+ public void setRequestMethod(HttpMethod method) {
+ checkNotStarted();
+ this.method = method;
+ }
+
+ /**
+ * @return the url
+ */
+ public URL getUrl() {
+ return url;
+ }
+
+ public void addRequestParameter(String name, String value) {
+ checkNotStarted();
+ 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);
+ }
+
+ /**
+ * @return
+ */
+ 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) {
+ throw new TestException(e);
+ }
+ } 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 HttpServletRequest getRequest() {
+ return requestProxy;
+ }
+
+ /**
+ * @return the response
+ */
+ public HttpServletResponse getResponse() {
+ return responseProxy;
+ }
+
+ 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();
+ }
+
+ /**
+ * @param queryString
+ * the queryString to set
+ */
+ public void setQueryString(String queryString) {
+ checkNotStarted();
+ this.queryString = queryString;
+ }
+
+ /**
+ * @return the queryString
+ */
+ public String getQueryString() {
+ return queryString;
+ }
+
+ /**
+ * @return
+ */
+ public Map<String, String[]> getResponseHeaders() {
+ checkStarted();
+ return response.getHeaders();
+ }
+
+ public void setRequestCharacterEncoding(String charset) throws UnsupportedEncodingException {
+ checkNotStarted();
+ request.setCharacterEncoding(charset);
+ }
+
+ public void setRequestBody(String body) {
+ checkNotStarted();
+ request.setRequestBody(body);
+ }
+
+ public void setRequestContentType(String contentType) {
+ checkNotStarted();
+ request.setContentType(contentType);
+
+ }
+
+ public void addRequestHeaders(Map<String, String> headers) {
+ request.addHeaders(headers);
+ }
+
+}
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpRequest.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -8,6 +8,7 @@
import java.io.IOException;
import java.io.StringReader;
import java.io.UnsupportedEncodingException;
+import java.nio.charset.Charset;
import java.security.Principal;
import java.text.DateFormat;
import java.text.ParseException;
@@ -26,13 +27,12 @@
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
-import org.richfaces.test.ServerLogger;
/**
* @author asmirnov
*
*/
-public abstract class StagingHttpRequest implements HttpServletRequest {
+abstract class StagingHttpRequest implements HttpServletRequest {
private static final Logger log = ServerLogger.CONNECTION.getLogger();
@@ -57,7 +57,7 @@
/**
* @return the requestBody
*/
- public String getRequestBody() {
+ String getRequestBody() {
return requestBody;
}
@@ -65,7 +65,7 @@
* @param requestBody
* the requestBody to set
*/
- public void setRequestBody(String requestBody) {
+ void setRequestBody(String requestBody) {
this.requestBody = requestBody;
}
@@ -157,11 +157,11 @@
return -1;
}
- public void addHeader(String name, String value) {
+ void addHeader(String name, String value) {
headers.put(name, value);
}
- public void addHeaders(Map<String, String> headers) {
+ void addHeaders(Map<String, String> headers) {
this.headers.putAll(headers);
}
@@ -541,6 +541,9 @@
*/
public void setCharacterEncoding(String env)
throws UnsupportedEncodingException {
+ if (!Charset.isSupported(env)) {
+ throw new UnsupportedEncodingException("Unknown charset "+env);
+ }
this.characterEncoding = env;
}
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpResponse.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -22,13 +22,12 @@
import org.apache.commons.httpclient.HttpStatus;
import org.junit.internal.matchers.SubstringMatcher;
-import org.richfaces.test.ServerLogger;
/**
* @author asmirnov
*
*/
-public abstract class StagingHttpResponse implements HttpServletResponse {
+abstract class StagingHttpResponse implements HttpServletResponse {
private static final Logger log = ServerLogger.CONNECTION.getLogger();
@@ -63,7 +62,7 @@
/**
* @return the headers
*/
- public Map<String, String[]> getHeaders() {
+ Map<String, String[]> getHeaders() {
return headers;
}
@@ -445,21 +444,21 @@
/**
* @return the status
*/
- public int getStatus() {
+ int getStatus() {
return status;
}
/**
* @return the redirectLocation
*/
- public String getRedirectLocation() {
+ String getRedirectLocation() {
return redirectLocation;
}
/**
* @return the errorMessage
*/
- public String getErrorMessage() {
+ String getErrorMessage() {
return errorMessage;
}
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingHttpSession.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -21,7 +21,7 @@
* @author asmirnov
*
*/
-public abstract class StagingHttpSession implements HttpSession {
+abstract class StagingHttpSession implements HttpSession {
private static final int DEFAULT_INACTIVE_TIME = 30;
@@ -43,7 +43,7 @@
/**
*
*/
- public void destroy() {
+ void destroy() {
// Destroy all session attributes.
unboundAttributes();
}
Copied: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServer.java (from rev 11159, 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/StagingServer.java (rev 0)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServer.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -0,0 +1,558 @@
+package org.richfaces.test.staging;
+
+import java.io.File;
+import java.io.IOException;
+import java.lang.reflect.InvocationHandler;
+import java.lang.reflect.Method;
+import java.lang.reflect.Proxy;
+import java.net.MalformedURLException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.Enumeration;
+import java.util.EventListener;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import javax.servlet.Filter;
+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 javax.servlet.jsp.JspFactory;
+
+import org.richfaces.test.TestException;
+
+/**
+ * This class implements limited Http servlet container 2.5 functionality. It
+ * supports only calls only, java code configuration, just one web application
+ * etc...
+ *
+ */
+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 final Map<String, String> mimeTypes = new HashMap<String, String>();
+
+
+ private InvocationListener invocationListener;
+
+
+ private StagingServletContext context;
+
+ private ServletContext contextProxy;
+
+
+ private ServerHttpSession session;
+
+ private HttpSession sessionProxy;
+
+
+ private class LocalContext extends StagingServletContext {
+
+ /*
+ * (non-Javadoc)
+ *
+ * @see javax.servlet.ServletContext#getMimeType(java.lang.String)
+ */
+ public String getMimeType(String file) {
+ int indexOfDot = file.lastIndexOf('.');
+ // get extension.
+ if (indexOfDot >= 0) {
+ file = file.substring(indexOfDot);
+ }
+ return mimeTypes.get(file);
+ }
+
+ @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 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);
+ }
+ });
+ }
+ }
+
+ /**
+ *
+ */
+ @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);
+ }
+ }
+ }
+
+ /**
+ * Append executable server object ( {@link Filter} or {@link Servlet}
+ * container.
+ *
+ * @param servlet
+ */
+ public void addServlet(RequestChain servlet) {
+ servlets.add(servlet);
+ }
+
+ /**
+ * Add servlet to the server.
+ *
+ * @param mapping
+ * servlet mapping
+ * @param servlet
+ * {@link Servlet} instance.
+ */
+ public void addServlet(String mapping, Servlet servlet) {
+ servlets.add(new ServletContainer(mapping, servlet));
+ }
+
+ /**
+ * Get appropriate object ( Filter or Servlet ) for a given path.
+ *
+ * @param path
+ * request path relative to web application context.
+ * @return
+ */
+ 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);
+ }
+
+ void addMimeType(String extension, String mimeType) {
+ mimeTypes.put(extension, mimeType);
+ }
+
+ public void addResource(String path, String resource) {
+ ServerResourcePath resourcePath = new ServerResourcePath(path);
+ serverRoot.addResource(resourcePath, new ClasspathServerResource(
+ resource));
+ }
+
+ public void addResource(String path, URL resource) {
+ serverRoot.addResource(new ServerResourcePath(path),
+ new UrlServerResource(resource));
+ }
+
+ public void addResourcesFromDirectory(String path, URL resource) {
+ ServerResourcePath resourcePath = new ServerResourcePath(path);
+ ServerResource baseDirectory = serverRoot.getResource(resourcePath);
+ if (null == baseDirectory) {
+ baseDirectory = new ServerResourcesDirectory();
+ serverRoot.addResource(resourcePath, baseDirectory);
+ }
+ String protocol = resource.getProtocol();
+ if ("jar".equals(protocol)) {
+ addResourcesFromJar(resource, baseDirectory);
+ } else if ("file".equals(protocol)) {
+ addResourcesFromFile(resource, baseDirectory);
+ } else {
+ throw new TestException("Unsupported protocol " + protocol);
+ }
+ }
+
+ protected void addResourcesFromFile(URL resource,
+ ServerResource baseDirectory) {
+ File file = new File(resource.getPath());
+ if (!file.isDirectory()) {
+ file = file.getParentFile();
+ }
+ try {
+ addFiles(baseDirectory, file);
+ } catch (MalformedURLException e) {
+ throw new TestException(e);
+ }
+ }
+
+ protected void addResourcesFromJar(URL resource,
+ ServerResource baseDirectory) {
+ try {
+ String jarPath = resource.getPath();
+ String entry = jarPath.substring(jarPath.indexOf('!') + 2);
+ jarPath = jarPath.substring(0, jarPath.indexOf('!'));
+ File file = new File(new URI(jarPath));
+ ZipFile zip = new ZipFile(file);
+ Enumeration<? extends ZipEntry> entries = zip.entries();
+ entry = entry.substring(0, entry.lastIndexOf('/') + 1);
+ while (entries.hasMoreElements()) {
+ ZipEntry zzz = (ZipEntry) entries.nextElement();
+ if (zzz.getName().startsWith(entry) && !zzz.isDirectory()) {
+ String relativePath = zzz.getName().substring(
+ entry.length());
+ URL relativeResource = new URL(resource, relativePath);
+ baseDirectory.addResource(new ServerResourcePath("/"
+ + relativePath), new UrlServerResource(
+ relativeResource));
+ }
+ }
+
+ } catch (IOException e) {
+ throw new TestException(e);
+ } catch (URISyntaxException e) {
+ throw new TestException(e);
+ }
+ }
+
+ /**
+ * @param baseDirectory
+ * @param file
+ * @throws MalformedURLException
+ */
+ protected void addFiles(ServerResource baseDirectory, File file)
+ throws MalformedURLException {
+ File[] files = file.listFiles();
+ for (File subfile : files) {
+ ServerResourcePath serverResourcePath = new ServerResourcePath("/"
+ + subfile.getName());
+ if (subfile.isDirectory()) {
+ ServerResourcesDirectory subDir = new ServerResourcesDirectory();
+ baseDirectory.addResource(serverResourcePath, subDir);
+ addFiles(subDir, subfile);
+ } else {
+ UrlServerResource resource = new UrlServerResource(subfile
+ .toURL());
+ baseDirectory.addResource(serverResourcePath, resource);
+
+ }
+ }
+ }
+
+ public void addWebListener(EventListener listener) {
+ contextListeners.add(listener);
+ }
+
+ /**
+ * @return the invocationListener
+ */
+ public InvocationListener getInvocationListener() {
+ return invocationListener;
+ }
+
+ /**
+ * @param invocationListener the invocationListener to set
+ */
+ public void setInvocationListener(InvocationListener invocationListener) {
+ this.invocationListener = invocationListener;
+ }
+
+ /**
+ * @return the invocationHandler
+ */
+ public InvocationHandler getInvocationHandler(final Object target) {
+ return new InvocationHandler() {
+
+ public Object invoke(Object proxy, Method method, Object[] args)
+ throws Throwable {
+ InvocationListener listener = getInvocationListener();
+ try {
+ Object result = method.invoke(target, args);
+ if(null != listener){
+ listener.afterInvoke(new InvocationEvent(target,method,args,result));
+ }
+ return result;
+ } catch (Throwable e) {
+ if(null != listener){
+ listener.processException(new InvocationErrorEvent(target,method,args,e));
+ }
+ throw e;
+ }
+ }
+
+ };
+
+ }
+
+ public HttpSession getSession() {
+ return getSession(true);
+ }
+
+ public synchronized HttpSession getSession(boolean create) {
+ if (null == this.session && create) {
+ this.session = new ServerHttpSession();
+ // Create proxy objects.
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if(null == loader){
+ loader = this.getClass().getClassLoader();
+ }
+ this.sessionProxy = (HttpSession) Proxy.newProxyInstance(loader, new Class[]{HttpSession.class}, getInvocationHandler(session));
+ // 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 sessionProxy;
+ }
+
+ public void init() {
+ // Create context.
+ this.context = new LocalContext();
+ // Create Jsp factory
+ JspFactory.setDefaultFactory(new StaggingJspFactory(this.context));
+ // Create init parameters
+ context.addInitParameters(initParameters);
+ // Inform listeners
+ // Create proxy objects.
+ ClassLoader loader = Thread.currentThread().getContextClassLoader();
+ if(null == loader){
+ loader = this.getClass().getClassLoader();
+ }
+ this.contextProxy = (ServletContext) Proxy.newProxyInstance(loader, new Class[]{ServletContext.class}, getInvocationHandler(context));
+ 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();
+ session = null;
+ }
+ // 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();
+ // Create Jsp factory
+ JspFactory.setDefaultFactory(null);
+
+ }
+
+ public StagingConnection getConnection(URL url) {
+ return new StagingConnection(this, url);
+ }
+
+ public ServletContext getContext() {
+ return contextProxy;
+ }
+
+ 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);
+ }
+ });
+ }
+}
Modified: 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 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/StagingServletContext.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -24,13 +24,12 @@
import javax.servlet.ServletContextAttributeListener;
import javax.servlet.ServletException;
-import org.richfaces.test.ServerLogger;
/**
* @author asmirnov
*
*/
-public abstract class StagingServletContext implements ServletContext {
+abstract class StagingServletContext implements ServletContext {
private static final Logger log = ServerLogger.SERVER.getLogger();
@@ -38,7 +37,7 @@
private static final String APPLICATION_NAME = "stub";
private final Map<String, Object> attributes = new ConcurrentHashMap<String, Object>();
- private Map<String,String> initParameters = new HashMap<String, String>();
+ private final Map<String,String> initParameters = new HashMap<String, String>();
/* (non-Javadoc)
* @see javax.servlet.ServletContext#getAttribute(java.lang.String)
@@ -106,14 +105,6 @@
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()
Modified: branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/UrlServerResource.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/UrlServerResource.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/main/java/org/richfaces/test/staging/UrlServerResource.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -6,18 +6,24 @@
import java.net.URL;
import java.util.logging.Logger;
-import org.richfaces.test.ServerLogger;
/**
+ * This class represent file-like virtual web application object, loaded from the any URL.
* @author asmirnov
*
*/
public class UrlServerResource extends AbstractServerResource {
+ /**
+ * Resource target URL
+ */
private final URL resource;
static final Logger log = ServerLogger.RESOURCE.getLogger();
+ /**
+ * @param resource url to the resource content.
+ */
public UrlServerResource(URL resource) {
this.resource = resource;
}
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-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/FacesServerTest.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -63,7 +63,7 @@
/**
* Test method for
- * {@link org.richfaces.test.StagingServer#getConnection(java.net.URL)}.
+ * {@link org.richfaces.test.staging.StagingServer#getConnection(java.net.URL)}.
*
* @throws Exception
*/
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/ServletTest.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -83,6 +83,11 @@
// TODO Auto-generated method stub
}
+
+ public String getMimeType(String file) {
+ // TODO Auto-generated method stub
+ return null;
+ }
};
servlet.init(context);
Modified: branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/UrlResourceLoadingTest.java
===================================================================
--- branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/UrlResourceLoadingTest.java 2008-11-17 18:04:31 UTC (rev 11194)
+++ branches/jsf2.0/framework/jsf-test/src/test/java/org/richfaces/test/staging/UrlResourceLoadingTest.java 2008-11-18 00:56:26 UTC (rev 11195)
@@ -15,62 +15,41 @@
public class UrlResourceLoadingTest {
@Test
- public void testGetURL() throws Exception {
+ public void testAddFromJar() throws Exception {
URL resource = this.getClass().getClassLoader().getResource("java/util/Set.class");
assertNotNull(resource);
- System.out.println(resource.toExternalForm());
- System.out.println(resource.getProtocol());
- String path = resource.getPath();
- System.out.println(path);
- String entry = path.substring(path.indexOf('!')+2);
- path = path.substring(0,path.indexOf('!'));
- System.out.println(path+" entry: "+entry);
- File file = new File(new URI(path));
- ZipFile zip = new ZipFile(file);
- ZipEntry zipEntry = zip.getEntry(entry);
- assertNotNull(zipEntry);
- Enumeration<? extends ZipEntry> entries = zip.entries();
- entry = entry.substring(0, entry.lastIndexOf('/')+1);
- while (entries.hasMoreElements()) {
- ZipEntry zzz = (ZipEntry) entries.nextElement();
- if(zzz.getName().startsWith(entry) && !zzz.isDirectory()){
- String relativePath = zzz.getName().substring(entry.length());
- System.out.println(" entry: "+relativePath);
- URL relativeResource = new URL(resource,relativePath);
- System.out.println(relativeResource.toExternalForm());
-
- }
- }
- resource = this.getClass().getClassLoader().getResource("org/richfaces/test/HelloBean.class");
- assertNotNull(resource);
- System.out.println(resource.toExternalForm());
- System.out.println(resource.getProtocol());
- System.out.println(resource.getPath());
- System.out.println(resource.toExternalForm());
- file = new File(resource.getPath());
- if(!file.isDirectory()){
- file = file.getParentFile();
- }
- listFiles("/",file);
- resource = this.getClass().getClassLoader().getResource("org/richfaces/test/");
- assertNotNull(resource);
- System.out.println(resource.toExternalForm());
+ StagingServer server = new StagingServer();
+ ServerResourcesDirectory baseDir = new ServerResourcesDirectory();
+ server.addResourcesFromJar(resource, baseDir);
+ assertNotNull(baseDir.getResource(new ServerResourcePath("/Map.class")));
+ assertNotNull(baseDir.getResource(new ServerResourcePath("/concurrent/atomic/AtomicBoolean.class")));
}
- private void listFiles(String path,File file) {
- File[] files = file.listFiles();
- for (File subfile : files) {
- if(subfile.isDirectory()){
- listFiles(path+subfile.getName()+"/",subfile);
- } else {
- System.out.println(path+subfile.getName());
-
- }
- }
+ @Test
+ public void testAddFromFile() throws Exception {
+ URL resource = this.getClass().getClassLoader().getResource("org/richfaces/test/resource.txt");
+ assertNotNull(resource);
+ StagingServer server = new StagingServer();
+ ServerResourcesDirectory baseDir = new ServerResourcesDirectory();
+ server.addResourcesFromFile(resource, baseDir);
+ assertNotNull(baseDir.getResource(new ServerResourcePath("/logging.properties")));
+ assertNotNull(baseDir.getResource(new ServerResourcePath("/WEB-INF/faces-config.xml")));
}
+
@Test
- public void testGetDirectory() {
+ public void testGetDirectory() throws Exception {
+ URL resource = this.getClass().getClassLoader().getResource("java/util/Set.class");
+ assertNotNull(resource);
+ StagingServer server = new StagingServer();
+ server.addResourcesFromDirectory("/WEB-INF/classes/java/util", resource);
+ try {
+ server.init();
+ assertNotNull(server.getContext().getResource("/WEB-INF/classes/java/util/Map.class"));
+ } finally {
+ server.destroy();
+ }
+
}
}
17 years, 5 months
JBoss Rich Faces SVN: r11194 - in trunk/sandbox/ui/editor/src/test/java/org/richfaces: seamparser and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: dmorozov
Date: 2008-11-17 13:04:31 -0500 (Mon, 17 Nov 2008)
New Revision: 11194
Added:
trunk/sandbox/ui/editor/src/test/java/org/richfaces/seamparser/
trunk/sandbox/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java
Log:
initial commit, test for the html seam text converter
Added: trunk/sandbox/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java
===================================================================
--- trunk/sandbox/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java (rev 0)
+++ trunk/sandbox/ui/editor/src/test/java/org/richfaces/seamparser/HtmlSeamParserTest.java 2008-11-17 18:04:31 UTC (rev 11194)
@@ -0,0 +1,146 @@
+/**
+ * License Agreement.
+ *
+ * Rich Faces - Natural Ajax for Java Server Faces (JSF)
+ *
+ * Copyright (C) 2007 Exadel, Inc.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License version 2.1 as published by the Free Software Foundation.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+package org.richfaces.seamparser;
+
+import java.io.StringReader;
+
+import junit.framework.TestCase;
+
+import org.jboss.seam.text.SeamTextLexer;
+import org.jboss.seam.text.SeamTextParser;
+import org.richfaces.HtmlSeamTextLexer;
+import org.richfaces.HtmlSeamTextParser;
+
+/**
+ * HtmlSeamParser Junit Test
+ * @author Denis Morozov
+ *
+ */
+public class HtmlSeamParserTest extends TestCase {
+
+
+ private final static String SEAM_TEXT_EXPRESSION_1 = "It's easy to make *emphasis*, |monospace|, "
+ + "~deleted text~, super^scripts^ or_underlines_.";
+
+ private final static String SEAM_TEXT_EXPRESSION_2 = "+This is a big heading\n"
+ + "You /must/ have some text following a heading!\n\n"
+ + "++This is a smaller heading\n"
+ + "This is the first paragraph. We can split it across multiple"
+ + "lines, but we must end it with a blank line.\n\n"
+ + "This is the second paragraph.";
+
+ private final static String SEAM_TEXT_EXPRESSION_3 = "An ordered list:\n\n"
+ + "#first item\n" + "#second item\n"
+ + "#and even the /third/ item\n\n" + "An unordered list:\n\n"
+ + "=an item\n" + "=another item";
+
+ private final static String SEAM_TEXT_EXPRESSION_4 = "The other guy said: "+ "\"Nyeah nyeah-nee\"";
+
+ private final static String SEAM_TEXT_EXPRESSION_5 = "You can write down equations like 2\\*3\\=6 and HTML tagslike \\<body\\> using the escape character: \\\\.";
+
+ private final static String SEAM_TEXT_EXPRESSION_6 = "My code doesn't work:"
+ + "`for (int i=0; i<100; i--)\n"
+ + "{\n"
+ + "doSomething(); doSomething();\n"
+ + "doSomething() " +
+ "}`" + " Any ideas?";
+
+ private final static String SEAM_TEXT_EXPRESSION_7 = "+test value<h1>test1<h2>test2</h2>test4</h1>\ntest";
+
+ private final static String SEAM_TEXT_EXPRESSION_8 = "+test value<div>test5</div><h1>test1<div>test2</div>test4</h1>\ntest";
+
+ private final static String SEAM_TEXT_EXPRESSION_9 = "[test link=>http://test.com]";
+
+ private final static String SEAM_TEXT_EXPRESSION_10 = "This is a |<tag attribute=\"value\"/>| example.";
+
+ private final static String SEAM_TEXT_EXPRESSION_11 = "= <div></div> <h1> test value </h1>";
+
+
+
+ public HtmlSeamParserTest(String name) {
+ super(name);
+ }
+ public void testSeamTextConverting1() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_1);
+ }
+
+ public void testSeamTextConverting2() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_2);
+ }
+
+ public void testSeamTextConverting3() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_3);
+ }
+
+ public void testSeamTextConverting4() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_4);
+ }
+
+ public void testSeamTextConverting5() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_5);
+ }
+
+ public void testSeamTextConverting6() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_6);
+ }
+
+ public void testSeamTextConverting7() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_7);
+ }
+
+ public void testSeamTextConverting8() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_8);
+ }
+
+ public void testSeamTextConverting9() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_9);
+ }
+
+ public void testSeamTextConverting10() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_10);
+ }
+
+ public void testSeamTextConverting11() throws Exception {
+ assertSeamConverting(SEAM_TEXT_EXPRESSION_11);
+ }
+
+
+
+
+ /**
+ * Method to assert converting from Seam Text to html and back
+ * @param seamTextExpression
+ * @throws Exception
+ */
+ private void assertSeamConverting(String seamTextExpression)
+ throws Exception {
+
+ SeamTextParser seamParser = new SeamTextParser(new SeamTextLexer(new StringReader(seamTextExpression)));
+ seamParser.startRule();
+ String html = seamParser.toString();
+
+ HtmlSeamTextParser htmlParser = new HtmlSeamTextParser(new HtmlSeamTextLexer(new StringReader(html)));
+ htmlParser.startRule();
+ String seamtext = htmlParser.toString();
+
+ assertEquals(seamTextExpression,seamtext.trim());
+ }
+}
17 years, 5 months
JBoss Rich Faces SVN: r11193 - trunk/sandbox/ui/editor/src/main/antlr.
by richfaces-svn-commits@lists.jboss.org
Author: abelevich
Date: 2008-11-17 13:03:17 -0500 (Mon, 17 Nov 2008)
New Revision: 11193
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-17 16:15:17 UTC (rev 11192)
+++ trunk/sandbox/ui/editor/src/main/antlr/html-seamtext.g 2008-11-17 18:03:17 UTC (rev 11193)
@@ -210,7 +210,6 @@
if (!containText) {
result.append("\n").append("<span></span>");
- isHeaderProcessed = true;
}
return result.toString();
}
@@ -226,7 +225,7 @@
token = LT(i);
if (token.getType() == ALPHANUMERICWORD) {
if(!(isParagraph(token) || isHeader(token) || isList(token))) {
- return "\n\n";
+ return BLANK_LINE;
}
break ;
}
@@ -243,8 +242,7 @@
token = LT(i);
if (token.getType() == ALPHANUMERICWORD) {
if(!(isParagraph(token) || isHeader(token))) {
- System.out.println(token);
- return "\n\n";
+ return BLANK_LINE;
}
break;
@@ -309,13 +307,16 @@
if(!isSeamTextElement(name)) {
return true;
}
-
+
+ if(isHeader(name) && !htmlElementStack.isEmpty()) {
+ return true;
+ }
+
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")) {
+ if(isHeader(token) || isListItem(token)) {
return true;
- }
+ }
}
}
@@ -420,28 +421,26 @@
text: ((seamCharacters|plain|html|htmlSpecialChars) (NEWLINE
{
- Token token = LT(2);
-// newlines++;
- if(!isParagraph(token)) {
- if(isHeaderProcessed) {
+ Token token = LT(2);
+ if(!isParagraph(token) && isHeaderProcessed) {
isHeaderProcessed = false;
- }
- }
+ }
}
)*)+
;
-plain: (word|punctuation|space:SPACE {append(space.getText());})
+plain: (word|punctuation|space:SPACE {
+ append(space.getText());}
+ )
- {
-
- Token token = LT(2);
- if (isList(token)) {
-// append(BLANK_LINE);
- }
- }
+ {
+ Token token = LT(2);
+ if(!isParagraph(token) && isHeaderProcessed) {
+ isHeaderProcessed = false;
+ }
+ }
;
word: an:ALPHANUMERICWORD { append( an.getText() ); } | uc:UNICODEWORD { append( uc.getText() ); }
@@ -493,10 +492,11 @@
space: s:SPACE {
if(!htmlElementStack.isEmpty()) {
- Token token = htmlElementStack.peek();
- if(!isSeamTextElement(token)) {
- append(s.getText());
- }
+ Token token = htmlElementStack.pop();
+ if(isPlainHMTLRequired(token, htmlElementStack)) {
+ append(s.getText());
+ }
+ htmlElementStack.push(token);
}
}
;
@@ -526,7 +526,7 @@
{
Token token = htmlElementStack.peek();
if(isLink(token)) {
- String message = "unexpected token";
+ String message = "Unexpected token " + "<" + token.getText() + ">";
throw new SemanticException(message);
}
}
@@ -570,9 +570,10 @@
append(BLANK_LINE);
} else if (isListItem(name)) {
append(createSeamTextList(name, htmlElementStack));
- }else if (isHeader(name)) {
- append(createSeamTextHeader(name));
- }else if(isParagraph(name)) {
+ } else if (isHeader(name)) {
+ append(createSeamTextHeader(name));
+
+ }else if(isParagraph(name) && !isHeaderProcessed) {
if(!isHeaderProcessed) {
append(BLANK_LINE);
}
@@ -589,7 +590,13 @@
} else {
if(valueCollector != null) {
- append(valueCollector.toString().trim());
+ Token prevToken = htmlElementStack.peek();
+ if(isListItem(prevToken) && valueCollector.toString().trim().length() == 0) {
+ append(" ");
+ } else {
+ append(valueCollector.toString().trim());
+ }
+
valueCollector = null;
}
append("<");
@@ -634,7 +641,10 @@
closeTagWithBody:
LT SLASH name:ALPHANUMERICWORD GT
{
- htmlElementStack.pop();
+ Token token = htmlElementStack.pop();
+ if(!token.getText().equals(name.getText())) {
+ throw new RecognitionException("Can not convert to the Seam Text: </" +token.getText() + ">" + " expected");
+ }
String value = "";
if(valueCollector != null) {
value = valueCollector.toString();
@@ -648,23 +658,22 @@
append(value);
if(isHeaderProcessed) {
isHeaderProcessed = false;
- } else {
- append(checkParagraphMarkup());
- }
+ }
+ append(checkParagraphMarkup());
+
- } else {
- append(value.trim());
- }
+ } else {
+ append(value.trim());
+ }
- if(isList(name)) {
- append(checkListMarkup());
- } else if(isListItem(name)) {
- append(checkListItemMarkup());
- } else if(isHeader(name)) {
-// append("\n");
- append(checkHeaderMarkup());
- isHeaderProcessed = true;
- }
+ if(isList(name)) {
+ append(checkListMarkup());
+ } else if(isListItem(name)) {
+ append(checkListItemMarkup());
+ } else if(isHeader(name)) {
+ append(checkHeaderMarkup());
+ isHeaderProcessed = true;
+ }
} else if(isSimpleSeamTextElement(name)) {
append(value.trim());
@@ -695,11 +704,12 @@
attribute: att:ALPHANUMERICWORD (space)* EQ (space)*
DOUBLEQUOTE
{
- Token token = htmlElementStack.peek();
+ Token token = htmlElementStack.pop();
sanitizer.validateHtmlAttribute(token, att);
- boolean isSeamTextProcessed = isSeamTextElement(token);
+// boolean isSeamTextProcessed = isSeamTextElement(token);
+ boolean isPlainHMTLRequired = isPlainHMTLRequired(token, htmlElementStack);
- if (!isSeamTextProcessed) {
+ if (isPlainHMTLRequired) {
append(att.getText());
append("=\"");
}
@@ -710,7 +720,7 @@
String attValue = endCapture();
sanitizer.validateHtmlAttributeValue(token, att, attValue);
- if (!isSeamTextProcessed) {
+ if (isPlainHMTLRequired) {
append(attValue);
} else if(isLink(token) && "href".equals(att.getText())) {
@@ -719,9 +729,10 @@
}
DOUBLEQUOTE {
- if(!isSeamTextProcessed) {
+ if(isPlainHMTLRequired) {
append("\"");
}
+ htmlElementStack.push(token);
}
;
exception
17 years, 5 months
JBoss Rich Faces SVN: r11192 - in trunk/sandbox: samples/queue-sample/src/main/webapp/pages and 7 other directories.
by richfaces-svn-commits@lists.jboss.org
Author: dmorozov
Date: 2008-11-17 11:15:17 -0500 (Mon, 17 Nov 2008)
New Revision: 11192
Added:
trunk/sandbox/samples/queue-sample/src/main/webapp/pages/events.xhtml
Modified:
trunk/sandbox/samples/queue-sample/src/main/java/org/richfaces/Bean.java
trunk/sandbox/samples/queue-sample/src/main/webapp/templates/navigation.xhtml
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/QueueRenderer.java
trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/scripts/QueueScriptResourceRenderer.java
trunk/sandbox/ui/queue/src/test/java/org/richfaces/AbstractQueueComponentTest.java
trunk/sandbox/ui/queue/src/test/java/org/richfaces/ScriptTest.java
trunk/sandbox/ui/queue/src/test/resources/org/richfaces/simulation.js
Log:
https://jira.jboss.org/jira/browse/RF-4899
Modified: trunk/sandbox/samples/queue-sample/src/main/java/org/richfaces/Bean.java
===================================================================
--- trunk/sandbox/samples/queue-sample/src/main/java/org/richfaces/Bean.java 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/samples/queue-sample/src/main/java/org/richfaces/Bean.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -23,17 +23,12 @@
import java.util.Map;
-import javax.faces.component.UIComponent;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.event.ActionEvent;
import org.ajax4jsf.event.AjaxEvent;
import org.ajax4jsf.event.AjaxListener;
-import org.ajax4jsf.javascript.JSFunction;
-import org.ajax4jsf.javascript.JSReference;
-import org.ajax4jsf.javascript.ScriptString;
-import org.ajax4jsf.taglib.html.jsp.AjaxFunction;
/**
* @author $Autor$
Added: trunk/sandbox/samples/queue-sample/src/main/webapp/pages/events.xhtml
===================================================================
--- trunk/sandbox/samples/queue-sample/src/main/webapp/pages/events.xhtml (rev 0)
+++ trunk/sandbox/samples/queue-sample/src/main/webapp/pages/events.xhtml 2008-11-17 16:15:17 UTC (rev 11192)
@@ -0,0 +1,34 @@
+<html
+ xmlns:h="http://java.sun.com/jsf/html"
+ xmlns:f="http://java.sun.com/jsf/core"
+ xmlns:ui="http://java.sun.com/jsf/facelets"
+ xmlns:a4j="http://richfaces.org/a4j"
+ xmlns:q="http://labs.jboss.com/jbossrichfaces/ui/ui/queue">
+ <head>
+ <title>Events check page</title>
+ </head>
+ <body>
+ <f:view>
+ <ui:include src="/templates/navigation.xhtml" />
+
+ <a4j:status startText="...running..." startStyle="color: green" />
+
+ <q:queue name="queue" oncomplete="alert('queue - oncomplete')" onbeforedomupdate="alert('queue - onbeforedomupdate')" />
+
+ <h:form>
+ <h:panelGrid columns="1">
+ Components in queue
+ <a4j:commandLink value="No component handlers" eventsQueue="queue"/>
+ <a4j:commandLink value="Oncomplete component client handler" eventsQueue="queue" onbeforedomupdate="request.options.oncomplete = function(){alert('component - oncomplete')}" />
+ <a4j:commandLink value="Both component handlers" eventsQueue="queue" oncomplete="alert('component - oncomplete')" onbeforedomupdate="alert('component - onbeforedomupdate')" />
+ </h:panelGrid>
+ <h:panelGrid columns="1">
+ Components without queue
+ <a4j:commandLink value="No component handlers" />
+ <a4j:commandLink value="Oncomplete component client handler" onbeforedomupdate="request.options.oncomplete = function(){alert('component - oncomplete')}" />
+ <a4j:commandLink value="Both component handlers" oncomplete="alert('component - oncomplete')" onbeforedomupdate="alert('component - onbeforedomupdate')" />
+ </h:panelGrid>
+ </h:form>
+ </f:view>
+ </body>
+</html>
Modified: trunk/sandbox/samples/queue-sample/src/main/webapp/templates/navigation.xhtml
===================================================================
--- trunk/sandbox/samples/queue-sample/src/main/webapp/templates/navigation.xhtml 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/samples/queue-sample/src/main/webapp/templates/navigation.xhtml 2008-11-17 16:15:17 UTC (rev 11192)
@@ -13,6 +13,8 @@
<h:outputLink value="view-queue.jsf">View global queue</h:outputLink>
<h:outputText value=" " />
<h:outputLink value="sized-queue.jsf">Size exceed behaviors</h:outputLink>
+ <h:outputText value=" " />
+ <h:outputLink value="events.jsf">Events handling</h:outputLink>
<br />
</ui:composition>
Modified: trunk/sandbox/ui/queue/src/main/config/component/queue.xml
===================================================================
--- trunk/sandbox/ui/queue/src/main/config/component/queue.xml 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/main/config/component/queue.xml 2008-11-17 16:15:17 UTC (rev 11192)
@@ -54,6 +54,10 @@
<name>timeout</name>
<classname>java.lang.Integer</classname>
</property>
+ <property>
+ <name>disabled</name>
+ <classname>boolean</classname>
+ </property>
<property>
<name>onsubmit</name>
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-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/main/java/org/richfaces/component/UIQueue.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -42,6 +42,18 @@
public abstract String getName();
public abstract void setName(String name);
+ public abstract String getOnsubmit();
+ public abstract void setOnsubmit(String onsubmit);
+
+ public abstract String getOncomplete();
+ public abstract void setOncomplete(String oncomplete);
+
+ public abstract String getOnbeforedomupdate();
+ public abstract void setOnbeforedomupdate(String Onbeforedomupdate);
+
+ public abstract boolean isDisabled();
+ public abstract void setDisabled(boolean disabled);
+
@Override
public String getFamily() {
return COMPONENT_FAMILY;
Modified: trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRenderer.java
===================================================================
--- trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRenderer.java 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/QueueRenderer.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -29,6 +29,7 @@
import org.ajax4jsf.javascript.AjaxScript;
import org.ajax4jsf.javascript.JSFunctionDefinition;
+import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.HeaderResourcesRendererBase;
import org.ajax4jsf.resource.InternetResource;
import org.richfaces.component.UIQueue;
@@ -40,6 +41,12 @@
*/
public class QueueRenderer extends HeaderResourcesRendererBase {
+ private static final String QUEUE_ONSUBMIT_ATTRIBUTE = "queueonsubmit";
+
+ private static final String QUEUE_ONBEFOREDOMUPDATE_ATTRIBUTE = "queueonbeforedomupdate";
+
+ private static final String QUEUE_ONCOMPLETE_ATTRIBUTE = "queueoncomplete";
+
private static final String[] QUEUE_ATTRIBUTES = new String[] {
"enabled",
"size",
@@ -59,12 +66,6 @@
"limitToList"
};
- private static final String[] REQUEST_FUNCTION_ATTRIBUTES = new String[] {
- "onsubmit",
- "oncomplete",
- "onbeforedomupdate",
- };
-
private volatile InternetResource[] scripts;
@Override
@@ -130,14 +131,24 @@
}
}
- for (String attributeName : REQUEST_FUNCTION_ATTRIBUTES) {
- Object value = attributes.get(attributeName);
- if (isNotEmpty(value)) {
- //TODO nick - apply proper functions signature
- data.addRequestAttribute(attributeName, new JSFunctionDefinition("event").addToBody(value));
- }
+ String oncomplete = queue.getOncomplete();
+ if (oncomplete != null) {
+ data.addRequestAttribute(QUEUE_ONCOMPLETE_ATTRIBUTE, AjaxRendererUtils.buildAjaxOncomplete(oncomplete));
}
+
+ String onBeforeDomUpdate = queue.getOnbeforedomupdate();
+ if (onBeforeDomUpdate != null) {
+ data.addRequestAttribute(QUEUE_ONBEFOREDOMUPDATE_ATTRIBUTE, AjaxRendererUtils.buildAjaxOnBeforeDomUpdate(onBeforeDomUpdate));
+ }
+ String onsubmit = queue.getOnsubmit();
+ if (onsubmit != null) {
+ JSFunctionDefinition onsubmitFunction = new JSFunctionDefinition();
+ onsubmitFunction.addToBody(onsubmit);
+
+ data.addRequestAttribute(QUEUE_ONSUBMIT_ATTRIBUTE, onsubmitFunction);
+ }
+
return data;
}
@@ -153,8 +164,9 @@
super.encodeEnd(context, component);
UIQueue queue = (UIQueue) component;
-
- QueueRegistry.registerQueue(context, queue.getClientName(context),
- createRendererData(context, queue));
+ if (!queue.isDisabled()) {
+ QueueRegistry.registerQueue(context, queue.getClientName(context),
+ createRendererData(context, queue));
+ }
}
}
Modified: trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/scripts/QueueScriptResourceRenderer.java
===================================================================
--- trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/scripts/QueueScriptResourceRenderer.java 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/main/java/org/richfaces/renderkit/html/scripts/QueueScriptResourceRenderer.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -27,6 +27,7 @@
import java.util.Map;
import java.util.Map.Entry;
+import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
@@ -35,6 +36,7 @@
import org.ajax4jsf.renderkit.RendererUtils.HTML;
import org.ajax4jsf.resource.BaseResourceRenderer;
import org.ajax4jsf.resource.InternetResource;
+import org.richfaces.component.UIQueue;
import org.richfaces.renderkit.html.QueueRegistry;
import org.richfaces.renderkit.html.QueueRendererData;
@@ -44,22 +46,66 @@
*/
public class QueueScriptResourceRenderer extends BaseResourceRenderer {
+ private void encodeQueue(ResponseWriter writer, String queueName, QueueRendererData queueData)
+ throws IOException {
+
+ Map<String, Object> queueAttributes = null;
+ Map<String, Object> requestAttributes = null;
+
+ if (queueData != null) {
+ queueAttributes = queueData.getQueueAttributes();
+ requestAttributes = queueData.getRequestAttributes();
+ }
+
+ writer.writeText("A4J.AJAX.EventQueue.addQueue(", null);
+ writer.writeText(
+ new JSObject("A4J.AJAX.EventQueue",
+ queueName,
+ queueAttributes,
+ requestAttributes
+ ).toScript(), null);
+ writer.writeText(");", null);
+ }
+
+ @Override
+ protected void customEncode(InternetResource resource,
+ FacesContext context, Object data) throws IOException {
+ super.customEncode(resource, context, data);
+
+ ResponseWriter writer = context.getResponseWriter();
+
+ Map<String, QueueRendererData> queues = QueueRegistry.getRegisteredQueues(context);
+
+ ExternalContext externalContext = context.getExternalContext();
+ if (Boolean.valueOf(externalContext.getInitParameter("org.richfaces.queue.global.enabled"))) {
+ String encodedGlobalQueueName = externalContext.encodeNamespace(UIQueue.GLOBAL_QUEUE_NAME);
+
+ if (queues == null || !queues.containsKey(encodedGlobalQueueName)) {
+ encodeQueue(writer, encodedGlobalQueueName, null);
+ }
+ }
+
+ if (queues != null && !queues.isEmpty()) {
+ for (Entry<String, QueueRendererData> entry : queues.entrySet()) {
+ encodeQueue(writer, entry.getKey(), entry.getValue());
+ }
+ }
+ }
+
protected void doEncode(InternetResource resource, FacesContext context,
Object data, Map<String, Object> attributes) throws IOException {
AjaxContext ajaxContext = AjaxContext.getCurrentInstance(context);
+ //TODO nick - what if ajax request?
if (!ajaxContext.isAjaxRequest(context)) {
- Map<String, Object> requestMap = context.getExternalContext().getRequestMap();
+ ExternalContext externalContext = context.getExternalContext();
+ Map<String, Object> requestMap = externalContext.getRequestMap();
String resourceKey = resource.getKey();
if (requestMap.get(resourceKey) == null) {
requestMap.put(resourceKey, Boolean.TRUE);
- Map<String, QueueRendererData> queues = QueueRegistry.getRegisteredQueues(context);
-
- if (queues != null && !queues.isEmpty()) {
- super.encode(resource, context, queues, attributes);
- }
+ super.encode(resource, context, data, attributes);
}
}
}
@@ -79,32 +125,10 @@
}
@Override
- public void encodeEnd(InternetResource resource,
- FacesContext context, Object data) throws IOException {
-
- ResponseWriter writer = context.getResponseWriter();
- Map<String, QueueRendererData> queues = (Map<String, QueueRendererData>) data;
-
- for (Entry<String, QueueRendererData> entry : queues.entrySet()) {
- String queueName = entry.getKey();
- QueueRendererData rendererData = entry.getValue();
-
- writer.writeText("A4J.AJAX.EventQueue.addQueue(", null);
- writer.writeText(
- new JSObject("A4J.AJAX.EventQueue",
- queueName,
- rendererData.getQueueAttributes(),
- rendererData.getRequestAttributes()
- ).toScript(), null);
- writer.writeText(");", null);
- }
-
- super.encodeEnd(resource, context, data);
- }
-
- @Override
protected String[][] getCommonAttrs() {
- return new String[][]{{HTML.TYPE_ATTR, getContentType()}};
+ return new String[][] {
+ {HTML.TYPE_ATTR, getContentType()},
+ };
}
@Override
Modified: trunk/sandbox/ui/queue/src/test/java/org/richfaces/AbstractQueueComponentTest.java
===================================================================
--- trunk/sandbox/ui/queue/src/test/java/org/richfaces/AbstractQueueComponentTest.java 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/test/java/org/richfaces/AbstractQueueComponentTest.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -25,6 +25,7 @@
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
+import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -42,6 +43,7 @@
import org.ajax4jsf.component.html.HtmlLoadScript;
import org.ajax4jsf.javascript.JSFunction;
import org.ajax4jsf.javascript.JSReference;
+import org.ajax4jsf.javascript.ScriptUtils;
import org.ajax4jsf.renderkit.AjaxRendererUtils;
import org.ajax4jsf.renderkit.UserResourceRenderer2;
import org.ajax4jsf.renderkit.RendererUtils.HTML;
@@ -57,6 +59,7 @@
import com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine;
import com.sun.facelets.Facelet;
import com.sun.facelets.FaceletFactory;
+import com.sun.facelets.compiler.Compiler;
import com.sun.facelets.compiler.SAXCompiler;
import com.sun.facelets.impl.DefaultFaceletFactory;
import com.sun.facelets.impl.ResourceResolver;
@@ -65,10 +68,12 @@
* @author Nick Belaevski
* @since 3.3.0
*/
-public abstract class AbstractQueueComponentTest extends AbstractAjax4JsfTestCase implements ResourceResolver {
+public abstract class AbstractQueueComponentTest extends AbstractAjax4JsfTestCase {
private static final String COMPONENT_TYPE = AjaxSubmitFunctionComponent.class.getName();
+ private static final String AJAX_SUBMIT = "ajaxSubmit";
+
public final static class AjaxSubmitFunctionComponent extends UIComponentBase {
@Override
@@ -95,14 +100,15 @@
options.put("data", new JSReference("data"));
options.put("requestTime", new JSReference("parameters.requestTime || 1000"));
options.put("timeout", new JSReference("parameters.timeout"));
- options.put("eventsQueue", new JSReference("parameters.eventsQueue || 'testQueue'"));
+ options.put("eventsQueue", new JSReference("parameters.eventsQueue"));
+ options.put("implicitEventsQueue", new JSReference("parameters.implicitEventsQueue"));
ajaxFunction.addParameter(options);
ResponseWriter responseWriter = facesContext.getResponseWriter();
responseWriter.startElement(HTML.SCRIPT_ELEM, component);
responseWriter.writeAttribute(HTML.TYPE_ATTR, "text/javascript", null);
- responseWriter.writeText("var ajaxSubmit = function(data, parameters) {" + ajaxFunction.toScript() + "};", null);
+ responseWriter.writeText("var " + AJAX_SUBMIT + " = function(data, parameters) {" + ajaxFunction.toScript() + "};", null);
responseWriter.endElement(HTML.SCRIPT_ELEM);
}
@@ -126,10 +132,6 @@
super(name);
}
- public URL resolveUrl(String path) {
- return Thread.currentThread().getContextClassLoader().getResource("org/richfaces" + path);
- }
-
@Override
public void setUp() throws Exception {
super.setUp();
@@ -190,10 +192,54 @@
}
}
+ protected static final class ParametersBuilder {
+ private Map<String, Object> parameters;
+
+ private ParametersBuilder() {
+ this.parameters = new HashMap<String, Object>();
+ }
+
+ private ParametersBuilder(Map<String, Object> parameters) {
+ this.parameters = new HashMap<String, Object>(parameters);
+ }
+
+ private ParametersBuilder put(String key, Object value) {
+ this.parameters.put(key, value);
+ return this;
+ }
+
+ private String getParamatersString() {
+ return ScriptUtils.toScript(parameters);
+ }
+
+ public ParametersBuilder requestDelay(double value) {
+ return new ParametersBuilder(this.parameters).put("requestDelay", value);
+ }
+ public ParametersBuilder requestId(Object id) {
+ return new ParametersBuilder(this.parameters).put("requestId", id);
+ }
+ public ParametersBuilder requestTime(double value) {
+ return new ParametersBuilder(this.parameters).put("requestTime", value);
+ }
+ public ParametersBuilder timeout(double value) {
+ return new ParametersBuilder(this.parameters).put("timeout", value);
+ }
+ public ParametersBuilder eventsQueue(String name) {
+ return new ParametersBuilder(this.parameters).put("eventsQueue", name);
+ }
+ public ParametersBuilder implicitEventsQueue(String name) {
+ return new ParametersBuilder(this.parameters).put("implicitEventsQueue", name);
+ }
+ }
+
+ protected ParametersBuilder createAjaxParameters() {
+ return new ParametersBuilder();
+ }
+
protected static final class TestsResult {
private List<RequestData> dataList = new ArrayList<RequestData>();
- private Number currentTime;
+ private double currentTime;
public void addData(RequestData data) {
this.dataList.add(data);
@@ -203,11 +249,11 @@
return dataList;
}
- public void setCurrentTime(Number number) {
+ public void setCurrentTime(double number) {
this.currentTime = number;
}
- public Number getCurrentTime() {
+ public double getCurrentTime() {
return currentTime;
}
@@ -231,13 +277,13 @@
protected static final class RequestData {
private boolean timedOut;
- private Number startTime;
+ private double startTime;
- private Number endTime;
+ private double endTime;
private String data;
- public RequestData(String data, Number startTime, Number endTime,
+ public RequestData(String data, double startTime, double endTime,
boolean timedOut) {
super();
this.data = data;
@@ -250,11 +296,11 @@
return timedOut;
}
- public Number getStartTime() {
+ public double getStartTime() {
return startTime;
}
- public Number getEndTime() {
+ public double getEndTime() {
return endTime;
}
@@ -276,10 +322,9 @@
builder.append("endTime: ");
builder.append(endTime);
- builder.append(", ");
if (isTimedOut()) {
- builder.append("timeout: ");
+ builder.append(", timeout: ");
builder.append(true);
}
@@ -287,17 +332,46 @@
}
};
+ protected void assertRequestData(RequestData requestData, String data,
+ double startTime, double endTime, boolean timedOut) {
+
+ assertEquals("Data check failed for " + requestData, data, requestData.getData());
+ assertEquals("Start time check failed for " + requestData, startTime, requestData.getStartTime());
+ assertEquals("End time check failed for " + requestData, endTime, requestData.getEndTime());
+ assertEquals("Timeout check failed for " + requestData, timedOut, requestData.isTimedOut());
+
+ }
+
protected void ajax(String data, String parameters) {
scriptCommands.add(new AjaxCommand(data, parameters));
}
+ protected void ajax(String data, ParametersBuilder builder) {
+ scriptCommands.add(new AjaxCommand(data, builder.getParamatersString()));
+ }
+
protected void delay(int delayValue) {
scriptCommands.add(new DelayCommand(delayValue));
}
+ protected String getRootContextPath() {
+ return this.getClass().getPackage().getName().replace('.', '/');
+ }
+
+ protected ResourceResolver createResourceResolver() {
+ return new ResourceResolver() {
+
+ public URL resolveUrl(String path) {
+ return Thread.currentThread().getContextClassLoader().getResource(getRootContextPath() + path);
+ }
+
+ };
+ }
+
+ private static final Compiler compiler = new SAXCompiler();
+
protected void buildView(String viewId) throws IOException {
- com.sun.facelets.compiler.Compiler c = new SAXCompiler();
- FaceletFactory factory = new DefaultFaceletFactory(c, this);
+ FaceletFactory factory = new DefaultFaceletFactory(compiler, createResourceResolver());
FaceletFactory.setInstance(factory);
FaceletFactory f = FaceletFactory.getInstance();
@@ -310,7 +384,9 @@
@Override
protected HtmlPage renderView() throws Exception {
- StringBuilder builder = new StringBuilder("<script type='text/javascript'>do { with (simulationContext) {");
+ StringBuilder builder = new StringBuilder("<script type='text/javascript'>" +
+ "window.simulationContext = new SimulationContext(" + AJAX_SUBMIT + ");" +
+ "do { with (simulationContext) {");
for (ScriptCommand command : scriptCommands) {
command.append(builder);
}
@@ -336,8 +412,8 @@
NativeObject object = (NativeObject) array.get(i, array);
String data = (String) object.get("data", object);
- Number startTime = (Number) object.get("startTime", object);
- Number endTime = (Number) object.get("endTime", object);
+ Double startTime = (Double) object.get("startTime", object);
+ Double endTime = (Double) object.get("endTime", object);
Object timedOut = object.get("timedOut", object);
boolean timedOutBoolean = timedOut instanceof Boolean && (Boolean) timedOut;
@@ -346,7 +422,7 @@
}
scriptResult = page.executeJavaScript("Timer.currentTime");
- result.setCurrentTime((Number) scriptResult.getJavaScriptResult());
+ result.setCurrentTime((Double) scriptResult.getJavaScriptResult());
return result;
}
Modified: trunk/sandbox/ui/queue/src/test/java/org/richfaces/ScriptTest.java
===================================================================
--- trunk/sandbox/ui/queue/src/test/java/org/richfaces/ScriptTest.java 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/test/java/org/richfaces/ScriptTest.java 2008-11-17 16:15:17 UTC (rev 11192)
@@ -22,6 +22,8 @@
package org.richfaces;
+import java.util.List;
+
import com.gargoylesoftware.htmlunit.html.HtmlPage;
/**
@@ -30,17 +32,60 @@
*/
public class ScriptTest extends AbstractQueueComponentTest {
+ private static final String QUEUE_NAME = "testQueue";
+
public ScriptTest(String name) {
super(name);
}
- public void testScript() throws Exception {
+ @Override
+ public void setUp() throws Exception {
+ super.setUp();
+
buildView("/script.xhtml");
+ }
+
+ @Override
+ public void tearDown() throws Exception {
+ super.tearDown();
+ }
+
+ public void testSimpleAjax() throws Exception {
+ delay(50);
+ ajax("a", createAjaxParameters().requestTime(100));
+ ajax("b", createAjaxParameters().requestTime(150));
+ TestsResult result = getTestsResult(renderView());
+ List<RequestData> dataList = result.getDataList();
+ assertEquals(2, dataList.size());
+ assertRequestData(dataList.get(0), "a", 50, 150, false);
+ assertRequestData(dataList.get(1), "b", 50, 200, false);
+
+ assertEquals(200d, result.getCurrentTime());
+ }
+
+ public void testSimpleQueuedAjax() throws Exception {
+ delay(50);
+ ParametersBuilder queueParameters = createAjaxParameters().requestTime(500).eventsQueue(QUEUE_NAME);
+ ajax("a", queueParameters.requestId(0));
+ delay(200);
+ ajax("b", queueParameters.requestId(1));
+
+ TestsResult result = getTestsResult(renderView());
+ List<RequestData> dataList = result.getDataList();
+ assertEquals(2, dataList.size());
+ assertRequestData(dataList.get(0), "a", 50, 550, false);
+ assertRequestData(dataList.get(1), "b", 550, 1050, false);
+
+ assertEquals(1050d, result.getCurrentTime());
+ }
+
+ public void testScript() throws Exception {
delay(500);
- ajax("a", "{requestDelay: 1000, requestId: '12', requestTime: 1500}");
+ ajax("a", "{requestDelay: 100, requestId: '12', requestTime: 100, eventsQueue: 'q'}");
delay(4100);
- ajax("b", "{requestDelay: 4100, requestId: '12', requestTime: 101, timeout: 10}");
+ ajax("b", "{requestDelay: 4400, requestId: '12', requestTime: 101, timeout: 10, eventsQueue: 'q'}");
+ ajax("c", "{requestDelay: 0, requestId: '123', requestTime: 1, timeout: 10, eventsQueue: 'q'}");
HtmlPage page = this.renderView();
@@ -48,4 +93,27 @@
System.out.println(getTestsResult(page));
}
+
+ public void testImplicitQueue() throws Exception {
+ ParametersBuilder parameters = createAjaxParameters().
+ requestDelay(100).
+ implicitEventsQueue("myqueue").
+ requestTime(10);
+
+ ajax("a", parameters);
+ delay(10);
+ ajax("b", parameters);
+ delay(10);
+ ajax("c", parameters.requestDelay(50));
+
+ TestsResult result = getTestsResult(this.renderView());
+ List<RequestData> dataList = result.getDataList();
+ assertEquals(1, dataList.size());
+
+ RequestData requestData = dataList.get(0);
+ assertRequestData(requestData, "c", 70, 80, false);
+
+ assertEquals(80d, result.getCurrentTime());
+
+ }
}
Modified: trunk/sandbox/ui/queue/src/test/resources/org/richfaces/simulation.js
===================================================================
--- trunk/sandbox/ui/queue/src/test/resources/org/richfaces/simulation.js 2008-11-17 16:13:42 UTC (rev 11191)
+++ trunk/sandbox/ui/queue/src/test/resources/org/richfaces/simulation.js 2008-11-17 16:15:17 UTC (rev 11192)
@@ -65,26 +65,28 @@
Timer.removeEventFromTimer(timerId);
}
-window.simulationContext = {
+var SimulationContext = function(submitFunction) {
+ this.results = new Array();
+ this.time = 0;
- results: new Array(),
-
- delay: 0,
-
- wait: function(delay) {
- this.delay += delay;
- },
-
- ajax: function() {
- var args = arguments;
- ajaxSubmit(args[0], args[1]);
-
- Timer.addEventToTimer(function() {
- ajaxSubmit(args[0], args[1]);
- }, this.delay);
- }
- };
+ this.submitFunction = submitFunction;
+};
+SimulationContext.prototype.wait = function(delay) {
+ this.time += delay;
+};
+
+SimulationContext.prototype.ajax = function() {
+ var args = arguments;
+ var _this = this;
+
+ Timer.addEventToTimer(function() {
+ _this.submitFunction(args[0], args[1]);
+ }, this.time);
+};
+
+window.simulationContext = undefined;
+
A4J.AJAX.SubmitQuery = function(query, options) {
var request = {};
17 years, 5 months
JBoss Rich Faces SVN: r11191 - in trunk/framework/impl/src/main: javascript/ajaxjsf and 1 other directory.
by richfaces-svn-commits@lists.jboss.org
Author: dmorozov
Date: 2008-11-17 11:13:42 -0500 (Mon, 17 Nov 2008)
New Revision: 11191
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:
https://jira.jboss.org/jira/browse/RF-4899
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-17 13:37:32 UTC (rev 11190)
+++ trunk/framework/impl/src/main/java/org/ajax4jsf/renderkit/AjaxRendererUtils.java 2008-11-17 16:13:42 UTC (rev 11191)
@@ -297,18 +297,12 @@
}
String oncomplete = getAjaxOncomplete(uiComponent);
if (null != oncomplete) {
- JSFunctionDefinition function = new JSFunctionDefinition("request", "event", "data");
- function.addToBody(oncomplete);
-
- options.put(ONCOMPLETE_ATTR_NAME, function);
+ options.put(ONCOMPLETE_ATTR_NAME, buildAjaxOncomplete(oncomplete));
}
String beforeupdate = getAjaxOnBeforeDomUpdate(uiComponent);
if (null != beforeupdate) {
- JSFunctionDefinition function = new JSFunctionDefinition("request", "event", "data");
- function.addToBody(beforeupdate);
-
- options.put(ONBEFOREDOMUPDATE_ATTR_NAME, function);
+ options.put(ONBEFOREDOMUPDATE_ATTR_NAME, buildAjaxOnBeforeDomUpdate(beforeupdate));
}
@@ -572,6 +566,20 @@
return statusId;
}
+ public static JSFunctionDefinition buildAjaxOncomplete(String body) {
+ JSFunctionDefinition function = new JSFunctionDefinition("request", "event", "data");
+ function.addToBody(body);
+
+ return function;
+ }
+
+ public static JSFunctionDefinition buildAjaxOnBeforeDomUpdate(String body) {
+ JSFunctionDefinition function = new JSFunctionDefinition("request", "event", "data");
+ function.addToBody(body);
+
+ return function;
+ }
+
/**
* Get function name for call on completed ajax request.
*
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-11-17 13:37:32 UTC (rev 11190)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/JSFAJAX.js 2008-11-17 16:13:42 UTC (rev 11191)
@@ -865,9 +865,19 @@
if(req.getParserStatus() == Sarissa.PARSED_OK){
// perform beforeupdate if exists
- if(options.onbeforedomupdate){
- LOG.debug( "Call request onbeforedomupdate function before replacing elemements" );
- options.onbeforedomupdate(req, req.domEvt, req.getJSON('_ajax:data'));
+ if(options.onbeforedomupdate || options.queueonbeforedomupdate){
+ var event = req.domEvt;
+ var data = req.getJSON('_ajax:data');
+
+ LOG.debug( "Call local onbeforedomupdate function before replacing elemements" );
+
+ if (options.onbeforedomupdate) {
+ options.onbeforedomupdate(req, event, data);
+ }
+
+ if (options.queueonbeforedomupdate) {
+ options.queueonbeforedomupdate(req, event, data);
+ }
}
var idsFromResponse = req.getResponseHeader("Ajax-Update-Ids");
@@ -1071,24 +1081,42 @@
window.setTimeout(function(){
var event = request.domEvt;
var data = request.getJSON('_ajax:data');
- try {
+
+ try {
+ var target = null;
+ if (event) {
+ target = event.target ? event.target : event.srcElement;
+ }
+
var newscript = Sarissa.getText(oncomp,true);
var oncomplete = new Function("request","event","data",newscript);
- var target = null;
- if (event) {
- target = event.target ? event.target : event.srcElement;
- };
oncomplete.call(target,request,event,data);
- } catch(e){
- LOG.error('Error evaluate oncomplete function '+e.Message);
- }
-// mark status object ( if any ) for complete request ;
+
+ if (options.queueoncomplete) {
+ options.queueoncomplete.call(target, request, event, data);
+ }
+
+ } catch (e) {
+ LOG.error('Error evaluate oncomplete function '+e.Message);
+ }
+
+ // mark status object ( if any ) for complete request ;
A4J.AJAX.status(request.containerId,options.status,false);},
0);
- } else if(options.oncomplete){
- LOG.debug( "Call component oncomplete function after processing updates" );
+ } else if (options.oncomplete || options.queueoncomplete){
+ LOG.debug( "Call local oncomplete function after processing updates" );
window.setTimeout(function(){
- options.oncomplete(request,request.domEvt,request.getJSON('_ajax:data'));
+ var event = request.domEvt;
+ var data = request.getJSON('_ajax:data');
+
+ if (options.oncomplete) {
+ options.oncomplete(request, event, data);
+ }
+
+ if (options.queueoncomplete) {
+ options.queueoncomplete(request, event, data);
+ }
+
// mark status object ( if any ) for complete request ;
A4J.AJAX.status(request.containerId,options.status,false);},
0);
@@ -1098,7 +1126,7 @@
A4J.AJAX.status(request.containerId,options.status,false);
}
- if (request.queue) {
+ if (request.shouldNotifyQueue && request.queue) {
request.queue.pop();
}
};
Modified: trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js
===================================================================
--- trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-17 13:37:32 UTC (rev 11190)
+++ trunk/framework/impl/src/main/javascript/ajaxjsf/queue.js 2008-11-17 16:13:42 UTC (rev 11191)
@@ -166,7 +166,7 @@
}
if (this.pipeline.isFull()) {
- var behavior = data.queue.getSizeExceededBehavior();
+ var behavior = data.getSizeExceededBehavior();
if (behavior == DROP_NEW ||
(behavior == DROP_NEXT && !this.pipeline.hasNextItem())) {
@@ -202,8 +202,6 @@
this.gate = new Gate();
this.pipeline = new Pipeline(this.queueOptions.size, this.gate);
this.gate.pipeline = this.pipeline;
-
- this.queue = new Array();
};
A4J.AJAX.EventQueue.DEFAULT_QUEUE_NAME = "org.richfaces.queue.global";
@@ -246,7 +244,6 @@
formQueueName = qualifyName(queueName, formId);
viewQueueName = qualifyName(queueName, namespace);
- //TODO nick - support settings for default queue scope
implicitQueueName = viewQueueName;
} else {
formQueueName = formId;
@@ -383,20 +380,21 @@
};
extend(EventQueueData.prototype, {
- submitWithCallback: function() {
+ submitWithoutCallback: function() {
this.query.appendParameter("AJAX:EVENTS_COUNT", this.eventsCount);
-
var request = A4J.AJAX.SubmitQuery(this.query, this.options)
request.queue = this.queue;
+
+ return request;
+ },
+
+ submitWithCallback: function() {
+ var request = this.submitWithoutCallback();
+ request.shouldNotifyQueue = true;
return request;
},
- submitWithoutCallback: function() {
- this.query.appendParameter("AJAX:EVENTS_COUNT", this.eventsCount);
- return A4J.AJAX.SubmitQuery(this.query, this.options)
- },
-
getRequestId: function() {
return this.options.requestId;
},
@@ -405,8 +403,20 @@
return this.options.requestDelay;
},
+ getSizeExceededBehavior: function() {
+ return this.queue.getSizeExceededBehavior();
+ },
+
setEventsCounter: function(count) {
this.eventsCount = count;
+ },
+
+ setRequest: function() {
+ //TODO nick
+ },
+
+ shouldSubmitWithoutCallback: function() {
+ //TODO nick
}
});
17 years, 5 months