View Javadoc
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  }