Skip to content

Commit

Permalink
Updated to allow case-insensitive searches
Browse files Browse the repository at this point in the history
  • Loading branch information
colezlaw committed Feb 7, 2012
1 parent bcc614e commit 74f1db7
Show file tree
Hide file tree
Showing 8 changed files with 78 additions and 34 deletions.
2 changes: 2 additions & 0 deletions src/main/java/us/cltnc/validators/constraints/OneOf.java
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,6 @@
}

String[] value() default {};

boolean caseSensitive() default true;
}
5 changes: 4 additions & 1 deletion src/main/java/us/cltnc/validators/constraints/USState.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,8 @@
public @interface USState {
public enum MatchType {
SHORT,
LONG
LONG,
ANY
}

public enum MatchDomain {
Expand All @@ -41,6 +42,8 @@ public enum MatchDomain {
Class<?>[] groups() default {};

Class<? extends Payload>[] payload() default {};

boolean caseSensitive() default true;

@Target({ METHOD, FIELD, ANNOTATION_TYPE, CONSTRUCTOR, PARAMETER })
@Retention(RUNTIME)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,29 @@
package us.cltnc.validators.constraints.impl;

import java.text.Collator;
import java.util.Arrays;
import java.util.TreeSet;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

import us.cltnc.validators.constraints.OneOf;

public class OneOfValidator implements ConstraintValidator<OneOf, String> {
private String[] value;
TreeSet<String> value;

public void initialize(OneOf constraintAnnotation) {
this.value = constraintAnnotation.value();
public void initialize(OneOf annotation) {
if (! annotation.caseSensitive()) {
Collator c = Collator.getInstance();
c.setStrength(Collator.PRIMARY);
this.value = new TreeSet<String>(c);
} else {
this.value = new TreeSet<String>();
}
this.value.addAll(Arrays.asList(annotation.value()));
}

public boolean isValid(String value, ConstraintValidatorContext context) {
return Arrays.asList(this.value).contains(value);
return value == null || this.value.contains(value);
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package us.cltnc.validators.constraints.impl;

import java.text.Collator;
import java.util.Arrays;
import java.util.TreeSet;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
Expand All @@ -10,6 +12,8 @@
import us.cltnc.validators.constraints.USState.MatchType;

public class USStateValidator implements ConstraintValidator<USState, String> {
private TreeSet<String> states;

private static final String[] US_SHORT = new String[] {
"AL","AK","AZ","AR","CA",
"CO","CT","DE","FL","GA",
Expand Down Expand Up @@ -57,38 +61,38 @@ public class USStateValidator implements ConstraintValidator<USState, String> {
"Armed Forces Americas","Armed Forces Africa","Armed Forces Canada","Armed Forces Europe",
"Armed Forces Middle East","Armed Forces Pacific"
};

private MatchType type;
private MatchDomain domain;


public void initialize(USState annotation) {
this.type = annotation.type();
this.domain = annotation.domain();
if (!annotation.caseSensitive()) {
System.out.println("Doing a case-insensitve match");
Collator c = Collator.getInstance();
c.setStrength(Collator.PRIMARY);
states = new TreeSet<String>(c);
} else {
states = new TreeSet<String>();
}

if ((MatchType.ANY == annotation.type()) || MatchType.SHORT == annotation.type()) {
states.addAll(Arrays.asList(US_SHORT));
if ((MatchDomain.US_DC == annotation.domain()) || (MatchDomain.US_DC_TERRITORIES == annotation.domain()))
states.addAll(Arrays.asList(DC_SHORT));
if (MatchDomain.US_DC_TERRITORIES == annotation.domain())
states.addAll(Arrays.asList(INTL_SHORT));
}
if ((MatchType.ANY == annotation.type()) || MatchType.LONG == annotation.type()) {
states.addAll(Arrays.asList(US_LONG));
if ((MatchDomain.US_DC == annotation.domain()) || (MatchDomain.US_DC_TERRITORIES == annotation.domain()))
states.addAll(Arrays.asList(DC_LONG));
if (MatchDomain.US_DC_TERRITORIES == annotation.domain())
states.addAll(Arrays.asList(INTL_LONG));
}
}

public boolean isValid(String value, ConstraintValidatorContext context) {
// I WANTED to do this as an extension of the OneOf validator, but that
// wouldn't allow me to do a composition with a list that we can't know
// beforehand. I otherwise would have had to make separate validators
// for each
boolean retval = false;

if (MatchType.SHORT == type) {
if (Arrays.asList(US_SHORT).contains(value))
retval = true;
if ((MatchDomain.US_DC == domain) && (Arrays.asList(DC_SHORT).contains(value)))
retval = true;
else if ((MatchDomain.US_DC_TERRITORIES == domain) && (Arrays.asList(INTL_SHORT).contains(value)))
retval = true;
} else {
if (Arrays.asList(US_LONG).contains(value))
retval = true;
if ((MatchDomain.US_DC == domain) && (Arrays.asList(DC_LONG).contains(value)))
retval = true;
else if ((MatchDomain.US_DC_TERRITORIES == domain) && (Arrays.asList(INTL_LONG).contains(value)))
retval = true;
}

return retval;
return this.states.contains(value);
}
}
10 changes: 9 additions & 1 deletion src/test/java/us/cltnc/validators/tests/OneOfTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public void testNullShortName() {
dp.setLongName("Pitcher");
Set<ConstraintViolation<DiamondPosition>> violations =
validator.validate(dp);
assertEquals(2, violations.size());
assertEquals(1, violations.size());
}

@Test
Expand All @@ -58,4 +58,12 @@ public void testValid() {
validator.validate(dp);
assertEquals(0, violations.size());
}

@Test
public void testCaseInsensitive() {
DiamondPosition dp = new DiamondPosition("1b", "fIrSt BaSe");
Set<ConstraintViolation<DiamondPosition>> violations =
validator.validate(dp);
assertEquals(0, violations.size());
}
}
11 changes: 10 additions & 1 deletion src/test/java/us/cltnc/validators/tests/USStateTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ public void testValid() {
ad.setState2("DC");
ad.setState3("AE");
ad.setState4("North Carolina");
ad.setState5("NC");
Set<ConstraintViolation<Address>> violations = validator
.validate(ad);
assertEquals(0, violations.size());
Expand All @@ -41,8 +42,16 @@ public void testInvalidShort() {
ad.setState2("DC");
ad.setState3("AE");
ad.setState4("North Carolina");
ad.setState5("nOrTh CaRoLiNa");
Set<ConstraintViolation<Address>> violations = validator
.validate(ad);
assertEquals(1, violations.size());
assertEquals(1, violations.size());

ad.setState5("nc");
violations = validator
.validate(ad);
assertEquals(1, violations.size());
}


}
7 changes: 7 additions & 0 deletions src/test/java/us/cltnc/validators/tests/beans/Address.java
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,10 @@ public class Address {
@USState(type=MatchType.LONG)
private String state4;

@NotNull
@USState(type=MatchType.ANY, caseSensitive=false)
private String state5;

public Address() {}

public void setState1(String state1) { this.state1 = state1; }
Expand All @@ -36,4 +40,7 @@ public Address() {}

public void setState4(String state4) { this.state4 = state4; }
public String getState4() { return state4; }

public void setState5(String state5) { this.state5 = state5; }
public String getState5() { return state5; }
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,13 @@
*/
public class DiamondPosition {
@NotNull
@OneOf({"P","C","1B","2B","3B","SS","LF","CF","RF"})
@OneOf(value={"P","C","1B","2B","3B","SS","LF","CF","RF"}, caseSensitive=false)
private String shortName;

@NotNull
@OneOf({"Pitcher","Catcher","First Base","Second Base","Third Base","Shortstop","Left Field","Center Field","Right Field"})
@OneOf(value={
"Pitcher","Catcher","First Base","Second Base","Third Base","Shortstop","Left Field","Center Field","Right Field"},
caseSensitive=false)
private String longName;

public DiamondPosition() {}
Expand Down

0 comments on commit 74f1db7

Please sign in to comment.