package com.thinkbiganalytics.policy;
/*-
* #%L
* thinkbig-field-policy-controller
* %%
* 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.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
import com.thinkbiganalytics.app.ServicesApplicationStartup;
import com.thinkbiganalytics.app.ServicesApplicationStartupListener;
import com.thinkbiganalytics.policy.rest.model.BaseUiPolicyRule;
import com.thinkbiganalytics.policy.rest.model.FieldStandardizationRule;
import com.thinkbiganalytics.policy.rest.model.FieldValidationRule;
import org.joda.time.DateTime;
import org.springframework.stereotype.Service;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.inject.Inject;
/**
* Hold a cache of the Standardization and Validation rules
* This cache is built on startup on the application via a startup listener
* {@link ServicesApplicationStartup}
*/
@Service
public class FieldPolicyCache {
private static LoadingCache<FieldPolicyType, List<? extends BaseUiPolicyRule>> cache;
@Inject
ServicesApplicationStartup startup;
public FieldPolicyCache() {
cache = CacheBuilder.newBuilder().recordStats().build(new CacheLoader<FieldPolicyType, List<? extends BaseUiPolicyRule>>() {
@Override
public List<? extends BaseUiPolicyRule> load(FieldPolicyType key) throws Exception {
return availablePolicies(key);
}
});
}
public static List<FieldStandardizationRule> getStandardizationPolicies() {
return (List<FieldStandardizationRule>) cache.getUnchecked(FieldPolicyType.STANDARDIZATION);
}
public static List<FieldValidationRule> getValidationPolicies() {
return (List<FieldValidationRule>) cache.getUnchecked(FieldPolicyType.VALIDATION);
}
private List<? extends BaseUiPolicyRule> availablePolicies(FieldPolicyType key) {
if (FieldPolicyType.STANDARDIZATION.equals(key)) {
return AvailablePolicies.discoverStandardizationRules();
} else if (FieldPolicyType.VALIDATION.equals(key)) {
return AvailablePolicies.discoverValidationRules();
} else {
return null;
}
}
@PostConstruct
private void init() {
startup.subscribe(new ValidationStartupListener());
startup.subscribe(new StandardizationStartupListener());
}
enum FieldPolicyType {
STANDARDIZATION, VALIDATION;
}
public class ValidationStartupListener implements ServicesApplicationStartupListener {
@Override
public void onStartup(DateTime startTime) {
getValidationPolicies();
}
}
public class StandardizationStartupListener implements ServicesApplicationStartupListener {
@Override
public void onStartup(DateTime startTime) {
getStandardizationPolicies();
}
}
}