package com.thinkbiganalytics.feedmgr.sla;
/*-
* #%L
* thinkbig-feed-manager-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.collect.Lists;
import com.thinkbiganalytics.metadata.rest.model.sla.Obligation;
import com.thinkbiganalytics.metadata.rest.model.sla.ObligationGroup;
import com.thinkbiganalytics.metadata.rest.model.sla.ServiceLevelAgreement;
import com.thinkbiganalytics.metadata.rest.model.sla.ServiceLevelAgreementCheck;
import com.thinkbiganalytics.metadata.sla.api.Metric;
import com.thinkbiganalytics.metadata.sla.api.ServiceLevelAgreementActionConfiguration;
import com.thinkbiganalytics.policy.PolicyPropertyTypes;
import com.thinkbiganalytics.policy.PolicyTransformException;
import com.thinkbiganalytics.policy.rest.model.FieldRuleProperty;
import com.thinkbiganalytics.rest.model.LabelValue;
import com.thinkbiganalytics.support.FeedNameUtil;
import org.apache.commons.lang3.StringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* Transforms SLA UI objects (to / from the Rest/Model)
*/
public class ServiceLevelAgreementMetricTransformerHelper {
public ServiceLevelAgreementMetricTransformerHelper() {
}
/**
* gets all SystemCategory.SystemFeedName values
*/
public List<String> getCategoryFeedNames(ServiceLevelAgreementGroup serviceLevelAgreement) {
List<String> names = new ArrayList<>();
if (serviceLevelAgreement != null) {
List<FieldRuleProperty>
properties =
ServiceLevelAgreementMetricTransformer.instance().findPropertiesForRulesetMatchingRenderTypes(serviceLevelAgreement.getRules(),
new String[]{PolicyPropertyTypes.PROPERTY_TYPE.currentFeed.name(),
PolicyPropertyTypes.PROPERTY_TYPE.feedChips.name(),
PolicyPropertyTypes.PROPERTY_TYPE.feedSelect.name()});
if (properties != null && !properties.isEmpty()) {
//get the Value or List of values.
for (FieldRuleProperty property : properties) {
String value = property.getValue();
if (StringUtils.isNotBlank(value)) {
names.add(value);
} else if (property.getValues() != null && !property.getValues().isEmpty()) {
names.addAll(property.getValues().stream().map(LabelValue::getValue).collect(Collectors.toList()));
}
}
}
}
return names;
}
public void applyFeedNameToCurrentFeedProperties(ServiceLevelAgreementGroup serviceLevelAgreement, String categoryAndFeedName) {
if (serviceLevelAgreement != null) {
List<FieldRuleProperty>
properties = getPropertiesMatchingFeedType(serviceLevelAgreement);
applyFeedNameToCurrentFeedProperties(properties, categoryAndFeedName);
}
}
private void applyFeedNameToCurrentFeedProperties(List<FieldRuleProperty>
properties, String categoryAndFeedName) {
if (!properties.isEmpty()) {
for (FieldRuleProperty property : properties) {
if (StringUtils.isBlank(property.getValue())) {
property.setValue(categoryAndFeedName);
}
}
}
}
private List<FieldRuleProperty> getPropertiesMatchingFeedType(ServiceLevelAgreementGroup serviceLevelAgreement) {
List<FieldRuleProperty>
properties = new ArrayList<>();
if (serviceLevelAgreement != null) {
List<FieldRuleProperty>
currentFeedProperties =
ServiceLevelAgreementMetricTransformer.instance().findPropertiesForRulesetMatchingRenderType(serviceLevelAgreement.getRules(), PolicyPropertyTypes.PROPERTY_TYPE.currentFeed.name());
if (currentFeedProperties != null && !currentFeedProperties.isEmpty()) {
properties.addAll(currentFeedProperties);
}
List<FieldRuleProperty>
defaultValueProperties = ServiceLevelAgreementMetricTransformer.instance().findPropertiesForRulesMatchingDefaultValue(serviceLevelAgreement.getRules(),
PolicyPropertyTypes.CURRENT_FEED_VALUE);
if (defaultValueProperties != null && !defaultValueProperties.isEmpty()) {
properties.addAll(defaultValueProperties);
}
}
return properties;
}
public void applyFeedNameToCurrentFeedProperties(ServiceLevelAgreementGroup serviceLevelAgreement, String category, String feed) {
if (serviceLevelAgreement != null) {
List<FieldRuleProperty>
properties = getPropertiesMatchingFeedType(serviceLevelAgreement);
applyFeedNameToCurrentFeedProperties(properties, FeedNameUtil.fullName(category, feed));
}
}
public ServiceLevelAgreement getServiceLevelAgreement(ServiceLevelAgreementGroup serviceLevelAgreement) {
ServiceLevelAgreement transformedSla = new ServiceLevelAgreement();
transformedSla.setId(serviceLevelAgreement.getId());
transformedSla.setName(serviceLevelAgreement.getName());
transformedSla.setDescription(serviceLevelAgreement.getDescription());
for (ServiceLevelAgreementRule rule : serviceLevelAgreement.getRules()) {
try {
ObligationGroup group = new ObligationGroup();
Metric policy = ServiceLevelAgreementMetricTransformer.instance().fromUiModel(rule);
Obligation obligation = new Obligation(policy.getDescription());
obligation.setMetrics(Lists.newArrayList(policy));
group.addObligation(obligation);
group.setCondition(rule.getCondition().name());
transformedSla.addGroup(group);
} catch (PolicyTransformException e) {
throw new RuntimeException(e);
}
}
return transformedSla;
}
public List<ServiceLevelAgreementActionConfiguration> getActionConfigurations(ServiceLevelAgreementGroup serviceLevelAgreement) {
List<ServiceLevelAgreementActionConfiguration> actionConfigurations = new ArrayList<>();
if (serviceLevelAgreement.getActionConfigurations() != null) {
for (ServiceLevelAgreementActionUiConfigurationItem agreementActionUiConfigurationItem : serviceLevelAgreement.getActionConfigurations()) {
try {
ServiceLevelAgreementActionConfiguration actionConfiguration = ServiceLevelAgreementActionConfigTransformer.instance().fromUiModel(agreementActionUiConfigurationItem);
actionConfigurations.add(actionConfiguration);
} catch (PolicyTransformException e) {
throw new RuntimeException(e);
}
}
}
return actionConfigurations;
}
/**
* Transform the Rest Model back to the form model
*/
public ServiceLevelAgreementGroup toServiceLevelAgreementGroup(ServiceLevelAgreement sla) {
ServiceLevelAgreementGroup slaGroup = new ServiceLevelAgreementGroup();
slaGroup.setId(sla.getId());
slaGroup.setName(sla.getName());
slaGroup.setDescription(sla.getDescription());
slaGroup.setActionErrors(sla.getSlaCheckErrors());
slaGroup.setRuleErrors(sla.getObligationErrors());
for (ObligationGroup group : sla.getGroups()) {
List<Obligation> obligations = group.getObligations();
for (Obligation obligation : obligations) {
List<Metric> metrics = obligation.getMetrics();
for (Metric metric : metrics) {
ServiceLevelAgreementRule rule = ServiceLevelAgreementMetricTransformer.instance().toUIModel(metric);
slaGroup.addServiceLevelAgreementRule(rule);
}
}
}
//transform the Actions if they exist.
if (sla.getSlaChecks() != null) {
List<ServiceLevelAgreementActionUiConfigurationItem> agreementActionUiConfigurationItems = new ArrayList<>();
for (ServiceLevelAgreementCheck check : sla.getSlaChecks()) {
for (ServiceLevelAgreementActionConfiguration actionConfig : check.getActionConfigurations()) {
if (actionConfig != null) {
ServiceLevelAgreementActionUiConfigurationItem uiModel = ServiceLevelAgreementActionConfigTransformer.instance().toUIModel(actionConfig);
agreementActionUiConfigurationItems.add(uiModel);
}
}
}
slaGroup.setActionConfigurations(agreementActionUiConfigurationItems);
}
slaGroup.setCanEdit(sla.isCanEdit());
return slaGroup;
}
}