1 package org.kuali.common.util.create.impl; 2 3 import static com.google.common.base.Preconditions.checkNotNull; 4 5 import java.util.List; 6 import java.util.Set; 7 8 import javax.validation.ConstraintViolation; 9 import javax.validation.Validator; 10 11 import org.kuali.common.util.bind.api.Binder; 12 import org.kuali.common.util.build.InstanceBuilder; 13 import org.kuali.common.util.create.Creator; 14 import org.kuali.common.util.validate.Validation; 15 16 public class DefaultCreator implements Creator { 17 18 private final Validator validator; 19 private final Binder binder; 20 21 @Override 22 public <T> T create(InstanceBuilder<T> builder) { 23 List<String> errors = binder.bind(builder); 24 check(errors); 25 T instance = builder.getInstance(); 26 Set<ConstraintViolation<T>> violations = validator.validate(instance); 27 Validation.check(violations); 28 return instance; 29 } 30 31 private static void check(List<String> errors) { 32 if (errors.isEmpty()) { 33 return; 34 } 35 StringBuilder sb = new StringBuilder(); 36 sb.append("Binding failed:\n\n"); 37 for (int i = 0; i < errors.size(); i++) { 38 if (i != 0) { 39 sb.append("\n"); 40 } 41 sb.append(errors.get(i)); 42 } 43 sb.append("\n"); 44 throw new IllegalArgumentException(sb.toString()); 45 } 46 47 private DefaultCreator(Builder builder) { 48 this.validator = builder.validator; 49 this.binder = builder.binder; 50 } 51 52 public static DefaultCreator create(Validator validator, Binder binder) { 53 return builder().validator(validator).binder(binder).build(); 54 } 55 56 public static Builder builder() { 57 return new Builder(); 58 } 59 60 public static class Builder { 61 62 private Validator validator; 63 private Binder binder; 64 65 public Builder validator(Validator validator) { 66 this.validator = validator; 67 return this; 68 } 69 70 public Builder binder(Binder binder) { 71 this.binder = binder; 72 return this; 73 } 74 75 public DefaultCreator build() { 76 DefaultCreator instance = new DefaultCreator(this); 77 validate(instance); 78 return instance; 79 } 80 81 private static void validate(DefaultCreator instance) { 82 checkNotNull(instance.validator, "'validator' cannot be null"); 83 checkNotNull(instance.binder, "'binder' cannot be null"); 84 } 85 } 86 87 }