1 package org.kuali.common.util.create.impl; 2 3 import static com.google.common.base.Preconditions.checkNotNull; 4 import static com.google.common.base.Preconditions.checkState; 5 6 import java.util.List; 7 8 import javax.validation.Validator; 9 10 import org.kuali.common.util.bind.api.Binder; 11 import org.kuali.common.util.bind.api.Binding; 12 import org.kuali.common.util.create.CreationProviderResolver; 13 import org.kuali.common.util.create.CreatorFactory; 14 import org.kuali.common.util.create.spi.BootstrapState; 15 import org.kuali.common.util.create.spi.ConfigurationState; 16 import org.kuali.common.util.create.spi.CreationProvider; 17 import org.kuali.common.util.validate.Validation; 18 19 public final class ConfigurationImpl implements KualiCreationConfiguration, ConfigurationState { 20 21 private final Validator validator; 22 private final Binder binder; 23 private final CreationProviderResolver providerResolver; 24 25 @Override 26 public CreatorFactory buildCreatorFactory() { 27 List<CreationProvider<?>> providers = providerResolver.getCreationProviders(); 28 checkState(providers.size() > 0, "No providers were found"); 29 CreationProvider<?> provider = providers.get(0); 30 return provider.buildCreatorFactory(this); 31 } 32 33 @Override 34 public Validator getValidator() { 35 return validator; 36 } 37 38 @Override 39 public Binder getBinderService() { 40 return binder; 41 } 42 43 private ConfigurationImpl(Builder builder) { 44 this.validator = builder.validator; 45 this.binder = builder.binder; 46 this.providerResolver = builder.providerResolver; 47 } 48 49 public static ConfigurationImpl create(BootstrapState state) { 50 return builder(state).build(); 51 } 52 53 public static Builder builder(BootstrapState state) { 54 return new Builder(state); 55 } 56 57 public static class Builder implements org.apache.commons.lang3.builder.Builder<ConfigurationImpl> { 58 59 private final CreationProviderResolver providerResolver; 60 private Validator validator = Validation.getDefaultValidator(); 61 private Binder binder = Binding.getDefaultBinderService(); 62 63 public Builder(BootstrapState state) { 64 if (state.getCreationProviderResolver().isPresent()) { 65 this.providerResolver = state.getCreationProviderResolver().get(); 66 } else { 67 this.providerResolver = state.getDefaultCreationProviderResolver(); 68 } 69 } 70 71 public Builder validator(Validator validator) { 72 this.validator = validator; 73 return this; 74 } 75 76 public Builder binder(Binder binder) { 77 this.binder = binder; 78 return this; 79 } 80 81 @Override 82 public ConfigurationImpl build() { 83 ConfigurationImpl instance = new ConfigurationImpl(this); 84 validate(instance); 85 return instance; 86 } 87 88 private static void validate(ConfigurationImpl instance) { 89 checkNotNull(instance.validator, "'validator' cannot be null"); 90 checkNotNull(instance.binder, "'binder' cannot be null"); 91 } 92 93 public Validator getValidator() { 94 return validator; 95 } 96 97 public void setValidator(Validator validator) { 98 this.validator = validator; 99 } 100 101 public Binder getBinder() { 102 return binder; 103 } 104 105 public void setBinder(Binder binder) { 106 this.binder = binder; 107 } 108 109 public CreationProviderResolver getProviderResolver() { 110 return providerResolver; 111 } 112 } 113 114 public Binder getBinder() { 115 return binder; 116 } 117 118 public CreationProviderResolver getProviderResolver() { 119 return providerResolver; 120 } 121 122 }