package com.sequenceiq.cloudbreak.facade;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import javax.inject.Inject;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.core.convert.ConversionService;
import org.springframework.core.convert.TypeDescriptor;
import org.springframework.stereotype.Service;
import com.sequenceiq.cloudbreak.api.model.CloudbreakFlexUsageJson;
import com.sequenceiq.cloudbreak.api.model.CloudbreakUsageJson;
import com.sequenceiq.cloudbreak.domain.CbUsageFilterParameters;
import com.sequenceiq.cloudbreak.domain.CloudbreakUsage;
import com.sequenceiq.cloudbreak.service.usages.CloudbreakUsagesRetrievalService;
@Service
@Transactional
public class DefaultCloudbreakUsagesFacade implements CloudbreakUsagesFacade {
@Inject
private CloudbreakUsagesRetrievalService cloudbreakUsagesService;
@Inject
@Qualifier("conversionService")
private ConversionService conversionService;
@Override
public List<CloudbreakUsageJson> getUsagesFor(CbUsageFilterParameters params) {
List<CloudbreakUsage> usages = cloudbreakUsagesService.findUsagesFor(params);
return (List<CloudbreakUsageJson>) conversionService
.convert(usages, TypeDescriptor.forObject(usages), TypeDescriptor.collection(List.class,
TypeDescriptor.valueOf(CloudbreakUsageJson.class)));
}
@Override
public List<CloudbreakFlexUsageJson> getFlexUsagesFor(CbUsageFilterParameters params) {
List<CloudbreakUsage> usages = cloudbreakUsagesService.findUsagesFor(params);
Map<Long, CloudbreakFlexUsageJson> flexUsageJsonsByStackId = new HashMap<>();
for (CloudbreakUsage usage : usages) {
Long stackId = usage.getStackId();
if (!flexUsageJsonsByStackId.containsKey(stackId)) {
CloudbreakFlexUsageJson flexUsageJson = conversionService.convert(usage, CloudbreakFlexUsageJson.class);
flexUsageJsonsByStackId.put(stackId, flexUsageJson);
} else {
CloudbreakFlexUsageJson flexUsageJson = flexUsageJsonsByStackId.get(stackId);
Integer actPeak = usage.getPeak() != null ? usage.getPeak() : 0;
Integer peak = flexUsageJson.getPeak() != null ? flexUsageJson.getPeak() : 0;
int newPeak = peak + actPeak;
int instanceNum = flexUsageJson.getInstanceNum() + usage.getInstanceNum();
flexUsageJson.setPeak(newPeak);
flexUsageJson.setInstanceNum(instanceNum);
}
}
return flexUsageJsonsByStackId.values().stream().collect(Collectors.toList());
}
}