Author: nbelaevski
Date: 2010-05-09 16:09:42 -0400 (Sun, 09 May 2010)
New Revision: 16940
Added:
root/ui/trunk/components/core/src/test/java/org/richfaces/component/RepeatTest.java
root/ui/trunk/components/core/src/test/resources/org/richfaces/component/
root/ui/trunk/components/core/src/test/resources/org/richfaces/component/RepeatTest.xhtml
Removed:
root/ui/trunk/components/core/src/test-old/java/org/ajax4jsf/component/RepeatTestCase.java
Modified:
root/framework/trunk/impl/src/main/java/org/richfaces/component/SequenceIterationStatus.java
root/framework/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java
root/framework/trunk/impl/src/main/java/org/richfaces/component/UISequence.java
root/framework/trunk/impl/src/test/java/org/richfaces/component/MockDataAdaptor.java
root/framework/trunk/impl/src/test/java/org/richfaces/component/SequenceIterationStatusTest.java
Log:
https://jira.jboss.org/jira/browse/RF-8474
UIDataAdaptor refactoring & bug fixes
Modified:
root/framework/trunk/impl/src/main/java/org/richfaces/component/SequenceIterationStatus.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/richfaces/component/SequenceIterationStatus.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/framework/trunk/impl/src/main/java/org/richfaces/component/SequenceIterationStatus.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -50,17 +50,17 @@
private boolean even;
public SequenceIterationStatus(Integer begin, Integer end, int index, Integer
rowCount) {
- this.begin = begin;
- this.end = end;
- this.index = index;
- this.rowCount = rowCount;
-
int iBegin = (begin != null ? begin.intValue() : 0);
int iRowCountEnd = (rowCount != null ? rowCount.intValue() - 1 :
Integer.MAX_VALUE);
- int iEnd = (end != null ? end.intValue() : Integer.MAX_VALUE);
+ int iEnd = (end != null ? end.intValue() : iRowCountEnd);
int iLastIdx = Math.min(iEnd, iRowCountEnd);
+ this.begin = begin;
+ this.end = iEnd;
+ this.index = index;
+ this.rowCount = rowCount;
+
this.first = (index == iBegin);
this.last = (index >= iLastIdx);
Modified:
root/framework/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/framework/trunk/impl/src/main/java/org/richfaces/component/UIDataAdaptor.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -1465,7 +1465,14 @@
*/
// TODO review!
protected String extractKeySegment(FacesContext context, String substring) {
- return null;
+ char separatorChar = UINamingContainer.getSeparatorChar(context);
+ int separatorIndex = substring.indexOf(separatorChar);
+
+ if (separatorIndex < 0) {
+ return substring;
+ } else {
+ return substring.substring(0, separatorIndex);
+ }
}
/**
Modified: root/framework/trunk/impl/src/main/java/org/richfaces/component/UISequence.java
===================================================================
---
root/framework/trunk/impl/src/main/java/org/richfaces/component/UISequence.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/framework/trunk/impl/src/main/java/org/richfaces/component/UISequence.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -28,7 +28,6 @@
import java.util.Map;
import javax.el.ValueExpression;
-import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.el.ValueBinding;
@@ -94,6 +93,7 @@
return model;
}
+ @SuppressWarnings("unchecked")
@Override
protected ExtendedDataModel<?> createExtendedDataModel() {
ExtendedDataModel<?> model = null;
@@ -111,18 +111,6 @@
}
@Override
- protected String extractKeySegment(FacesContext context, String clientIdSubstring) {
- char separatorChar = UINamingContainer.getSeparatorChar(context);
- int separatorIndex = clientIdSubstring.indexOf(separatorChar);
-
- if (separatorIndex < 0) {
- return clientIdSubstring;
- } else {
- return clientIdSubstring.substring(0, separatorIndex);
- }
- }
-
- @Override
protected DataComponentState createComponentState() {
SequenceState state = new SequenceState();
Modified:
root/framework/trunk/impl/src/test/java/org/richfaces/component/MockDataAdaptor.java
===================================================================
---
root/framework/trunk/impl/src/test/java/org/richfaces/component/MockDataAdaptor.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/framework/trunk/impl/src/test/java/org/richfaces/component/MockDataAdaptor.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -21,7 +21,6 @@
*/
package org.richfaces.component;
-import javax.faces.component.UINamingContainer;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
@@ -64,14 +63,4 @@
return facesContext.getApplication().createConverter(Integer.class);
}
- @Override
- protected String extractKeySegment(FacesContext context, String substring) {
- char separatorChar = UINamingContainer.getSeparatorChar(context);
- int separatorIdx = substring.indexOf(separatorChar);
- if (separatorIdx >= 0) {
- return substring.substring(0, separatorIdx);
- } else {
- return substring;
- }
- }
}
Modified:
root/framework/trunk/impl/src/test/java/org/richfaces/component/SequenceIterationStatusTest.java
===================================================================
---
root/framework/trunk/impl/src/test/java/org/richfaces/component/SequenceIterationStatusTest.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/framework/trunk/impl/src/test/java/org/richfaces/component/SequenceIterationStatusTest.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -23,6 +23,7 @@
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import org.junit.Test;
@@ -35,6 +36,21 @@
public class SequenceIterationStatusTest {
@Test
+ public void testBeginEnd() throws Exception {
+ SequenceIterationStatus s1 = new SequenceIterationStatus(5, 10, 5, 100);
+ assertEquals(Integer.valueOf(5), s1.getBegin());
+ assertEquals(Integer.valueOf(10), s1.getEnd());
+
+ SequenceIterationStatus s2 = new SequenceIterationStatus(null, null, 5, 100);
+ assertNull(s2.getBegin());
+ assertEquals(Integer.valueOf(99), s2.getEnd());
+
+ SequenceIterationStatus s3 = new SequenceIterationStatus(null, null, 5, null);
+ assertNull(s3.getBegin());
+ assertEquals(Integer.valueOf(Integer.MAX_VALUE), s3.getEnd());
+ }
+
+ @Test
public void testFirst() throws Exception {
SequenceIterationStatus s1 = new SequenceIterationStatus(0, 10, 0, 100);
assertTrue(s1.isFirst());
Added:
root/ui/trunk/components/core/src/test/java/org/richfaces/component/RepeatTest.java
===================================================================
--- root/ui/trunk/components/core/src/test/java/org/richfaces/component/RepeatTest.java
(rev 0)
+++
root/ui/trunk/components/core/src/test/java/org/richfaces/component/RepeatTest.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -0,0 +1,206 @@
+/*
+ * JBoss, Home of Professional Open Source
+ * Copyright 2010, Red Hat, Inc. and individual contributors
+ * by the @authors tag. See the copyright.txt in the distribution for a
+ * full listing of individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software 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 software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.richfaces.component;
+
+import static org.junit.Assert.assertEquals;
+
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.UUID;
+
+import org.jboss.test.faces.htmlunit.HtmlUnitEnvironment;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+
+import com.gargoylesoftware.htmlunit.html.HtmlElement;
+import com.gargoylesoftware.htmlunit.html.HtmlPage;
+
+/**
+ * @author Nick Belaevski
+ *
+ */
+public class RepeatTest {
+
+ private static final int TEST_DATA_SIZE = 40;
+
+ public static class TestBean {
+
+ private List<String> data = new ArrayList<String>();
+
+ private int first;
+
+ private int rows;
+
+ private int switchedFirst;
+
+ private int switchedRows;
+
+ public List<String> getData() {
+ return data;
+ }
+
+ public void setFirst(int first) {
+ this.first = first;
+ }
+
+ public int getFirst() {
+ return first;
+ }
+
+ public void setRows(int rows) {
+ this.rows = rows;
+ }
+
+ public int getRows() {
+ return rows;
+ }
+
+ public int getSwitchedFirst() {
+ return switchedFirst;
+ }
+
+ public void setSwitchedFirst(int switchedFirst) {
+ this.switchedFirst = switchedFirst;
+ }
+
+ public int getSwitchedRows() {
+ return switchedRows;
+ }
+
+ public void setSwitchedRows(int switchedRows) {
+ this.switchedRows = switchedRows;
+ }
+
+ public void switchFirstAndRows() {
+ first = switchedFirst;
+ rows = switchedRows;
+ }
+
+ }
+
+ private TestBean testBean;
+
+ private HtmlUnitEnvironment environment;
+
+ private void setupTestBean() {
+ testBean = new TestBean();
+
+ for (int i = 0; i < TEST_DATA_SIZE; i++) {
+ testBean.getData().add(UUID.randomUUID().toString());
+ }
+ }
+
+ @Before
+ public void setUp() throws Exception {
+ setupTestBean();
+
+ environment = new HtmlUnitEnvironment();
+
+ environment.withResource("/WEB-INF/classes/faces-config.xml",
+
getClass().getResource("/org/richfaces/component/RepeatTest.faces-config.xml"));
+
+ environment.withResource("/test.xhtml",
+
getClass().getResource("/org/richfaces/component/RepeatTest.xhtml"));
+
+ environment.start();
+
+ environment.getServer().getSession(true).setAttribute("testBean",
testBean);
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ testBean = null;
+
+ environment.release();
+ environment = null;
+ }
+
+ private List<HtmlElement> getRepeatContent(HtmlPage page) {
+ List<?> xPathResult =
page.getByXPath("//div[@id='repeatWrapper']/*");
+ List<HtmlElement> result = new ArrayList<HtmlElement>();
+
+ for (Object xPathResultObject : xPathResult) {
+ result.add(HtmlElement.class.cast(xPathResultObject));
+ }
+
+ return result;
+ }
+
+ private void checkRendering(HtmlPage page, int first, int rows) {
+ List<HtmlElement> content = getRepeatContent(page);
+ List<String> testData = testBean.getData();
+ assertEquals(rows, content.size());
+ for (int i = 0; i < rows; i++) {
+ HtmlElement element = content.get(i);
+
+ int key = i + first;
+ assertEquals(MessageFormat.format("form:repeat:{0}:child", key),
element.getId());
+ assertEquals(testData.get(key),
+ element.<HtmlElement>getFirstByXPath("*[contains(@id,
':item')]").getTextContent().trim());
+
+ String iterationStatusString = MessageFormat.format("begin: {0}, end:
{1}, index: {2}, rowCount: {3}",
+ first, first + rows - 1, key, testData.size());
+
+ assertEquals(iterationStatusString,
+ element.<HtmlElement>getFirstByXPath("*[contains(@id,
':iterationStatus')]").getTextContent().trim());
+ }
+ }
+
+ @Test
+ public void testRendering() throws Exception {
+ HtmlPage page = environment.getPage("/test.jsf");
+ checkRendering(page, 0, TEST_DATA_SIZE);
+ }
+
+ @Test
+ public void testFirst() throws Exception {
+ testBean.setFirst(5);
+ HtmlPage page = environment.getPage("/test.jsf");
+ checkRendering(page, 5, TEST_DATA_SIZE - 5);
+ }
+
+ @Test
+ public void testRows() throws Exception {
+ testBean.setRows(6);
+ HtmlPage page = environment.getPage("/test.jsf");
+ checkRendering(page, 0, 6);
+ }
+
+ @Test
+ public void testSwitchFirstAndRows() throws Exception {
+ testBean.setFirst(0);
+ testBean.setRows(10);
+
+ testBean.setSwitchedFirst(15);
+ testBean.setSwitchedRows(7);
+
+ HtmlPage page = environment.getPage("/test.jsf");
+ checkRendering(page, 0, 10);
+
+ page = (HtmlPage)
page.getElementById("form:switchFirstAndRowsLink").click();
+
+ assertEquals(15, testBean.getFirst());
+ assertEquals(7, testBean.getRows());
+ }
+}
Added:
root/ui/trunk/components/core/src/test/resources/org/richfaces/component/RepeatTest.xhtml
===================================================================
---
root/ui/trunk/components/core/src/test/resources/org/richfaces/component/RepeatTest.xhtml
(rev 0)
+++
root/ui/trunk/components/core/src/test/resources/org/richfaces/component/RepeatTest.xhtml 2010-05-09
20:09:42 UTC (rev 16940)
@@ -0,0 +1,24 @@
+<ui:composition
xmlns="http://www.w3.org/1999/xhtml"
+
xmlns:ui="http://java.sun.com/jsf/facelets"
+
xmlns:h="http://java.sun.com/jsf/html"
+
xmlns:f="http://java.sun.com/jsf/core"
+
xmlns:a4j="http://richfaces.org/a4j">
+
+ <h:form id="form">
+ <div id="repeatWrapper">
+ <a4j:repeat iterationStatusVar="iterationStatus"
value="#{testBean.data}" id="repeat"
first="#{testBean.first}" rows="#{testBean.rows}"
var="item">
+ <h:panelGroup layout="block" id="child">
+ <h:panelGroup id="item">
+ #{item}
+ </h:panelGroup>
+ <h:panelGroup id="iterationStatus">
+ begin: #{iterationStatus.begin}, end: #{iterationStatus.end}, index:
#{iterationStatus.index}, rowCount: #{iterationStatus.rowCount}
+ </h:panelGroup>
+ </h:panelGroup>
+ </a4j:repeat>
+ </div>
+
+ <h:commandButton id="switchFirstAndRowsLink" value="Switch first and
rows" action="#{testBean.switchFirstAndRows}" />
+ </h:form>
+</ui:composition>
+
Deleted:
root/ui/trunk/components/core/src/test-old/java/org/ajax4jsf/component/RepeatTestCase.java
===================================================================
---
root/ui/trunk/components/core/src/test-old/java/org/ajax4jsf/component/RepeatTestCase.java 2010-05-09
17:44:22 UTC (rev 16939)
+++
root/ui/trunk/components/core/src/test-old/java/org/ajax4jsf/component/RepeatTestCase.java 2010-05-09
20:09:42 UTC (rev 16940)
@@ -1,258 +0,0 @@
-/**
- * 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.ajax4jsf.component;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.Map;
-
-import javax.faces.component.UIColumn;
-import javax.faces.component.UIComponent;
-import javax.faces.component.UIInput;
-import javax.faces.context.FacesContext;
-
-import org.ajax4jsf.renderkit.html.RepeatRenderer;
-import org.ajax4jsf.tests.AbstractAjax4JsfTestCase;
-import org.ajax4jsf.tests.MockDataModel;
-import org.ajax4jsf.tests.MockUIInputRenderer;
-
-/**
- * @author shura
- *
- */
-public class RepeatTestCase extends AbstractAjax4JsfTestCase {
- private UIInput child;
- private UIInput childChild;
- private UIInput childChildFacet;
- private int childChildFacetInvoked;
- private int childChildInvoked;
- private int childInvoked;
- private UIRepeat enclosedRepeater;
- private UIInput facetChild;
- private int facetInvoked;
- private UIRepeat repeater;
-
- /**
- * @param name
- */
- public RepeatTestCase(String name) {
- super(name);
- }
-
- /*
- * (non-Javadoc)
- * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#setUp()
- */
- public void setUp() throws Exception {
- super.setUp();
-
- // Create mock DataAdaptor and childs.
- repeater = new UIRepeat();
- child = new UIInput() {
- public void processDecodes(FacesContext context) {
- childInvoked++;
- super.processDecodes(context);
- }
- };
- childInvoked = 0;
- child.setId("child");
- repeater.getChildren().add(child);
- facetChild = new UIInput() {
- public void processDecodes(FacesContext context) {
- facetInvoked++;
- super.processDecodes(context);
- }
- };
- facetInvoked = 0;
- facetChild.setId("facetChild");
- repeater.getFacets().put("facet", facetChild);
- childChild = new UIInput() {
- public void processDecodes(FacesContext context) {
- childChildInvoked++;
- super.processDecodes(context);
- }
- };;
- childChildInvoked = 0;
- childChild.setId("childChild");
- child.getChildren().add(childChild);
- childChildFacet = new UIInput() {
- public void processDecodes(FacesContext context) {
- childChildFacetInvoked++;
- super.processDecodes(context);
- }
- };;
- childChildFacetInvoked = 0;
- childChildFacet.setId("childChildFacet");
- childChild.getFacets().put("facet", childChildFacet);
- enclosedRepeater = new UIRepeat();
- renderKit.addRenderer(child.getFamily(), child.getRendererType(), new
MockUIInputRenderer() {
- public void decode(FacesContext context, UIComponent component) {
- super.decode(context, component);
-
- UIInput input = (UIInput) component;
- String submittedValie = enclosedRepeater.getRowKey() + ":" +
repeater.getRowKey();
-
- input.setSubmittedValue(submittedValie);
- System.out.println("decode component " +
component.getClientId(facesContext) + " with value "
- + submittedValie);
- }
- });
- renderKit.addRenderer(repeater.getFamily(), repeater.getRendererType(), new
RepeatRenderer());
- }
-
- /*
- * (non-Javadoc)
- * @see org.ajax4jsf.tests.AbstractAjax4JsfTestCase#tearDown()
- */
- public void tearDown() throws Exception {
- super.tearDown();
- repeater = null;
- child = null;
- childChild = null;
- childChildFacet = null;
- facetChild = null;
- enclosedRepeater = null;
- }
-
- private void createDataTree() {
- enclosedRepeater.setId("data");
- repeater.setId("adaptor");
- repeater.setVar("row");
-
- ArrayList value = new ArrayList(2);
-
- value.add("first");
- value.add("second");
- enclosedRepeater.setValue(value);
- enclosedRepeater.setVar("var");
-
- UIColumn column = new UIColumn();
-
- enclosedRepeater.getChildren().add(column);
- column.getChildren().add(repeater);
- facesContext.getViewRoot().getChildren().add(enclosedRepeater);
- }
-
- private void printChildMap(Map childrenState) {
- System.out.println("{");
-
- for (Iterator iter = childrenState.keySet().iterator(); iter.hasNext(); ) {
- Object key = iter.next();
-
- System.out.println(" " + key + " : " +
childrenState.get(key));
- }
-
- System.out.println("}");
- }
-
- /**
- * Test method for {@link
javax.faces.component.UIData#processDecodes(javax.faces.context.FacesContext)}.
- */
- public void testProcessDecodesFacesContext() {
- createDataTree();
- repeater.setValue(new MockDataModel());
-
-// enclosedRepeater.setValue(new MockDataModel());
- enclosedRepeater.processDecodes(facesContext);
- enclosedRepeater.setRowIndex(1);
- repeater.setRowIndex(1);
- System.out.println("Saved child state for external repeater ");
- printChildMap(enclosedRepeater.getChildState(facesContext));
- System.out.println("Saved child state");
- printChildMap(repeater.getChildState(facesContext));
- assertEquals("1:1", child.getSubmittedValue());
- }
-
- /**
- * Test method for {@link
javax.faces.component.UIData#processUpdates(javax.faces.context.FacesContext)}.
- */
- public void testProcessUpdatesFacesContext() {
- createDataTree();
- repeater.setValue(new MockDataModel());
-
-// enclosedRepeater.setValue(new MockDataModel());
- enclosedRepeater.processDecodes(facesContext);
- enclosedRepeater.processValidators(facesContext);
- enclosedRepeater.processUpdates(facesContext);
- enclosedRepeater.setRowIndex(1);
- repeater.setRowIndex(1);
- assertEquals("1:1", child.getValue());
- enclosedRepeater.setRowIndex(0);
- repeater.setRowIndex(2);
- assertEquals("0:2", child.getValue());
- }
-
- /**
- * Test method for {@link
javax.faces.component.UIData#processUpdates(javax.faces.context.FacesContext)}.
- */
- public void testProcessValidatorsFacesContext() {
- createDataTree();
- repeater.setValue(new MockDataModel());
-
-// enclosedRepeater.setValue(new MockDataModel());
- enclosedRepeater.processDecodes(facesContext);
- enclosedRepeater.processValidators(facesContext);
- enclosedRepeater.setRowIndex(1);
- repeater.setRowIndex(1);
- assertEquals("1:1", child.getLocalValue());
- enclosedRepeater.setRowIndex(0);
- repeater.setRowIndex(2);
- assertEquals("0:2", child.getLocalValue());
- }
-
- public void testSetRowIndex() throws Exception {
- createDataTree();
- repeater.setValue(new MockDataModel());
- enclosedRepeater.setRowIndex(1);
- repeater.setRowIndex(1);
- child.setValue("1:1");
- repeater.setRowIndex(-1);
- enclosedRepeater.setRowIndex(-1);
-
- // -----------------------------
- enclosedRepeater.setRowIndex(0);
- repeater.setRowIndex(2);
- child.setValue("0:2");
-
- // -----------------------------
- repeater.setRowIndex(-1);
- enclosedRepeater.setRowIndex(-1);
- System.out.println("Saved child state for external repeater ");
- printChildMap(enclosedRepeater.getChildState(facesContext));
- System.out.println("Saved child state");
- printChildMap(repeater.getChildState(facesContext));
-
- // -----------------------------
- enclosedRepeater.setRowIndex(1);
- repeater.setRowIndex(1);
- assertEquals("1:1", child.getValue());
- repeater.setRowIndex(-1);
- enclosedRepeater.setRowIndex(-1);
-
- // -----------------------------
- enclosedRepeater.setRowIndex(0);
- repeater.setRowIndex(2);
- assertEquals("0:2", child.getValue());
- }
-}