Skip to content

Commit 11ee7ff

Browse files
committed
[#1861] feat(validation): add new methods insert, remove, hasError
1 parent 7f9c8d8 commit 11ee7ff

File tree

2 files changed

+218
-5
lines changed

2 files changed

+218
-5
lines changed

framework/src/play/data/validation/Validation.java

Lines changed: 64 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,12 @@
66
import java.util.Collections;
77
import java.util.Date;
88
import java.util.HashMap;
9+
import java.util.Iterator;
910
import java.util.LinkedHashMap;
1011
import java.util.List;
1112
import java.util.Map;
1213
import java.util.regex.Pattern;
14+
1315
import net.sf.oval.configuration.annotation.AbstractAnnotationCheck;
1416
import play.Play;
1517
import play.classloading.enhancers.LocalvariablesNamesEnhancer.LocalVariablesNamesTracer;
@@ -70,10 +72,59 @@ public Map<String, List<Error>> errorsMap() {
7072
* @param variables Message variables
7173
*/
7274
public static void addError(String field, String message, String... variables) {
73-
if (error(field) == null || !error(field).message.equals(message)) {
74-
Validation.current().errors.add(new Error(field, message, variables));
75+
insertError(Validation.current().errors.size(), field, message, variables);
76+
}
77+
78+
/**
79+
* Insert an error at the specified position in this list.
80+
* @param index index at which the specified element is to be inserted
81+
* @param field Field name
82+
* @param message Message key
83+
* @param variables Message variables
84+
*/
85+
public static void insertError(int index, String field, String message, String... variables) {
86+
Error error = error(field);
87+
if (error == null || !error.message.equals(message)) {
88+
Validation.current().errors.add(index, new Error(field, message, variables));
7589
}
7690
}
91+
92+
/**
93+
* Remove all errors on a field with the given message
94+
* @param field Field name
95+
* @param message Message key
96+
*/
97+
public static void removeErrors(String field, String message) {
98+
Validation validation = current.get();
99+
if (validation != null) {
100+
Iterator<Error> it = validation.errors.iterator();
101+
while (it.hasNext()) {
102+
Error error = it.next();
103+
if (error.key != null && error.key.equals(field) && error.message.equals(message)) {
104+
it.remove();
105+
}
106+
}
107+
}
108+
}
109+
110+
/**
111+
* Remove all errors on a field
112+
* @param field Field name
113+
*/
114+
public static void removeErrors(String field) {
115+
Validation validation = current.get();
116+
if (validation != null) {
117+
Iterator<Error> it = validation.errors.iterator();
118+
while (it.hasNext()) {
119+
Error error = it.next();
120+
if (error.key != null && error.key.equals(field)) {
121+
it.remove();
122+
}
123+
}
124+
}
125+
}
126+
127+
77128

78129
/**
79130
* @return True if the current request has errors
@@ -83,6 +134,14 @@ public static boolean hasErrors() {
83134
return validation != null && validation.errors.size() > 0;
84135
}
85136

137+
/**
138+
* @param field The field name
139+
* @return true if field has some errors
140+
*/
141+
public static boolean hasErrors(String field){
142+
return error(field) != null;
143+
}
144+
86145
/**
87146
* @param field The field name
88147
* @return First error related to this field
@@ -135,7 +194,9 @@ public static boolean hasError(String field) {
135194

136195
public static void clear() {
137196
current.get().errors.clear();
138-
ValidationPlugin.keys.get().clear();
197+
if(ValidationPlugin.keys.get() != null){
198+
ValidationPlugin.keys.get().clear();
199+
}
139200
}
140201

141202
// ~~~~ Integration helper

framework/test-src/play/data/validation/ValidationTest.java

Lines changed: 154 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
package play.data.validation;
22

33
import org.junit.Test;
4-
import play.i18n.MessagesBuilder;
54

5+
import play.i18n.MessagesBuilder;
66
import static org.fest.assertions.Assertions.assertThat;
7+
import static org.junit.Assert.assertEquals;
78

89
public class ValidationTest {
910

1011
@Test
1112
public void verifyError() {
12-
1313
new MessagesBuilder().build();
1414

1515
Validation.current.set(new Validation());
@@ -33,5 +33,157 @@ public void verifyError() {
3333
assertThat(Validation.errors(field)).containsOnly(Validation.error(field));
3434

3535
}
36+
37+
@Test
38+
public void addErrorTest(){
39+
new MessagesBuilder().build();
40+
41+
Validation.current.set(new Validation());
42+
43+
final String field = "f1";
44+
final String field2 = "f1.element";
45+
46+
final String errorMsg = "My errorMessage";
47+
48+
Validation.addError(field, errorMsg);
49+
Validation.addError(field, errorMsg);
50+
51+
Validation.addError(field2, errorMsg);
52+
53+
assertThat( Validation.error(field).message).isEqualTo(errorMsg);
54+
55+
// Test avoid insert duplicate message key
56+
assertEquals(2, Validation.errors().size());
57+
58+
assertEquals(1, Validation.errors(field).size());
59+
assertEquals(1, Validation.errors(field2).size());
60+
61+
Validation.clear();
62+
63+
// Test clear empty the lsit
64+
assertEquals(0, Validation.errors().size());
65+
assertEquals(0, Validation.errors(field).size());
66+
assertEquals(0, Validation.errors(field2).size());
67+
68+
final String errorMsgWithParam = "My errorMessage: %2$s";
69+
70+
Validation.addError(field, errorMsgWithParam, "param1");
71+
Validation.addError(field, errorMsgWithParam,"param2");
72+
73+
assertThat( Validation.error(field).message).isEqualTo(errorMsgWithParam);
74+
75+
// Test avoid insert duplicate message key
76+
assertEquals(1, Validation.errors().size());
77+
78+
assertEquals(1, Validation.errors(field).size());
79+
80+
assertEquals("My errorMessage: param1", Validation.error(field).message());
81+
}
82+
83+
@Test
84+
public void removeErrorTest(){
85+
new MessagesBuilder().build();
86+
87+
Validation.current.set(new Validation());
88+
89+
final String field = "f1";
90+
final String field2 = "f1.element";
91+
92+
final String errorMsg = "My errorMessage";
93+
final String errorMsg2 = "My errorMessage2";
94+
Validation.addError(field, errorMsg);
95+
Validation.addError(field, errorMsg2);
96+
97+
Validation.addError(field2, errorMsg);
98+
Validation.addError(field2, errorMsg2);
99+
100+
// Check the first error
101+
assertThat( Validation.error(field).message).isEqualTo(errorMsg);
102+
assertEquals(4, Validation.current().errors.size());
103+
104+
// Remove Errors on field2
105+
Validation.removeErrors(field2);
106+
107+
assertEquals(2, Validation.errors().size());
108+
assertEquals(2, Validation.errors(field).size());
109+
assertEquals(0, Validation.errors(field2).size());
110+
111+
// Restore error on field2
112+
Validation.addError(field2, errorMsg);
113+
Validation.addError(field2, errorMsg2);
114+
115+
assertEquals(4, Validation.current().errors.size());
116+
117+
// Remove Errors on field
118+
Validation.removeErrors(field);
119+
120+
assertEquals(2, Validation.errors().size());
121+
assertEquals(0, Validation.errors(field).size());
122+
assertEquals(2, Validation.errors(field2).size());
123+
}
124+
125+
@Test
126+
public void removeErrorMessageTest(){
127+
new MessagesBuilder().build();
128+
129+
Validation.current.set(new Validation());
130+
131+
final String field = "f1";
132+
final String field2 = "f1.element";
133+
134+
final String errorMsg = "My errorMessage";
135+
final String errorMsg2 = "My errorMessage2";
136+
Validation.addError(field, errorMsg);
137+
Validation.addError(field, errorMsg2);
138+
139+
Validation.addError(field2, errorMsg);
140+
Validation.addError(field2, errorMsg2);
141+
142+
// Check the first error
143+
assertThat( Validation.error(field).message).isEqualTo(errorMsg);
144+
assertEquals(4, Validation.current().errors.size());
145+
146+
// Remove Errors on field2
147+
Validation.removeErrors(field2, errorMsg);
148+
149+
assertEquals(3, Validation.errors().size());
150+
assertEquals(2, Validation.errors(field).size());
151+
assertEquals(1, Validation.errors(field2).size());
152+
153+
assertThat( Validation.error(field2).message).isEqualTo(errorMsg2);
154+
155+
// Restore error on field2
156+
Validation.addError(field2, errorMsg);
157+
Validation.addError(field2, errorMsg2);
158+
159+
assertEquals(4, Validation.current().errors.size());
160+
161+
// Remove Errors on field
162+
Validation.removeErrors(field, errorMsg);
163+
164+
assertEquals(3, Validation.errors().size());
165+
assertEquals(1, Validation.errors(field).size());
166+
assertEquals(2, Validation.errors(field2).size());
167+
168+
assertThat( Validation.error(field).message).isEqualTo(errorMsg2);
169+
}
170+
171+
@Test
172+
public void insertErrorTest(){
173+
new MessagesBuilder().build();
174+
175+
Validation.current.set(new Validation());
36176

177+
final String field = "f1";
178+
179+
final String errorMsg = "My errorMessage";
180+
final String errorMsg2 = "My errorMessage2";
181+
Validation.addError(field, errorMsg);
182+
Validation.insertError(0, field, errorMsg2);
183+
184+
185+
// Check the first error
186+
assertThat( Validation.error(field).message).isEqualTo(errorMsg2);
187+
assertEquals(2, Validation.current().errors.size());
188+
}
37189
}

0 commit comments

Comments
 (0)