package com.thinkbiganalytics.policy;
/*-
* #%L
* thinkbig-field-policy-core
* %%
* Copyright (C) 2017 ThinkBig Analytics
* %%
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
* #L%
*/
import com.thinkbiganalytics.policy.standardization.StandardizationPolicy;
import com.thinkbiganalytics.policy.validation.ValidationPolicy;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Vector;
/**
* Build domain level {@link StandardizationPolicy} and {@link ValidationPolicy} objects for a given field.
*/
public class FieldPolicyBuilder {
public static final FieldPolicy SKIP_VALIDATION = FieldPolicyBuilder.newBuilder().skipSchemaValidation().build();
private FieldPolicy policy = new FieldPolicy();
private List<BaseFieldPolicy> fieldPolicies = new Vector<>();
private boolean profile;
private boolean isPartitionColumn;
private FieldPolicyBuilder() {
super();
}
public static FieldPolicyBuilder newBuilder() {
return new FieldPolicyBuilder();
}
public FieldPolicyBuilder addPolicies(List<BaseFieldPolicy> policies) {
fieldPolicies.addAll(policies);
return this;
}
public FieldPolicyBuilder tableName(String tableName) {
policy.setTable(tableName);
return this;
}
public FieldPolicyBuilder fieldName(String fieldName) {
policy.setField(fieldName);
return this;
}
public FieldPolicyBuilder disallowNullOrEmpty() {
policy.setNullable(false);
return this;
}
public FieldPolicyBuilder feedFieldName(String feedFieldName) {
this.policy.setFeedField(feedFieldName);
return this;
}
public FieldPolicyBuilder skipSchemaValidation() {
policy.setSkipSchemaValidation(true);
return this;
}
public FieldPolicyBuilder enableDiscoverTypes() {
policy.setTypeDiscovery(true);
return this;
}
public FieldPolicyBuilder setPartitionColumn(boolean isPartitionColumn) {
this.isPartitionColumn = isPartitionColumn;
return this;
}
public FieldPolicy build() {
FieldPolicy newPolicy = this.policy;
if (StringUtils.isEmpty(newPolicy.getFeedField())) {
newPolicy.setFeedField(policy.getFeedField());
}
List<ValidationPolicy> validationPolicies = new ArrayList<>();
List<StandardizationPolicy> standardizationPolicies = new ArrayList<>();
for(BaseFieldPolicy policy : fieldPolicies){
if(policy instanceof ValidationPolicy) {
validationPolicies.add((ValidationPolicy)policy);
}
if(policy instanceof StandardizationPolicy) {
standardizationPolicies.add((StandardizationPolicy)policy);
}
}
newPolicy.setAllPolicies(fieldPolicies);
newPolicy.setValidators(validationPolicies);
newPolicy.setStandardizationPolicies(standardizationPolicies);
newPolicy.setProfile(profile);
newPolicy.setPartitionColumn(isPartitionColumn);
return newPolicy;
}
public FieldPolicyBuilder setProfile(boolean profile) {
this.profile = profile;
return this;
}
}