package com.sequenceiq.cloudbreak.cloud.template.init; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashMap; import java.util.LinkedList; import java.util.List; import java.util.Map; import javax.annotation.PostConstruct; import javax.inject.Inject; import org.springframework.stereotype.Component; import com.sequenceiq.cloudbreak.cloud.model.Platform; import com.sequenceiq.cloudbreak.cloud.template.ComputeResourceBuilder; import com.sequenceiq.cloudbreak.cloud.template.GroupResourceBuilder; import com.sequenceiq.cloudbreak.cloud.template.NetworkResourceBuilder; import com.sequenceiq.cloudbreak.cloud.template.OrderedBuilder; @Component public class ResourceBuilders { @Inject private List<NetworkResourceBuilder> network; @Inject private List<ComputeResourceBuilder> compute; @Inject private List<GroupResourceBuilder> group; private Map<Platform, List<NetworkResourceBuilder>> networkChain = new HashMap<>(); private Map<Platform, List<GroupResourceBuilder>> groupChain = new HashMap<>(); private Map<Platform, List<ComputeResourceBuilder>> computeChain = new HashMap<>(); @PostConstruct public void init() { BuilderComparator comparator = new BuilderComparator(); initNetwork(comparator); initGroup(comparator); initCompute(comparator); } public List<NetworkResourceBuilder> network(Platform platform) { return new ArrayList<>(networkChain.get(platform)); } public List<ComputeResourceBuilder> compute(Platform platform) { return new ArrayList<>(computeChain.get(platform)); } public List<GroupResourceBuilder> group(Platform platform) { return new ArrayList<>(groupChain.get(platform)); } private void initNetwork(BuilderComparator comparator) { for (NetworkResourceBuilder builder : network) { List<NetworkResourceBuilder> chain = this.networkChain.get(builder.platform()); if (chain == null) { chain = new LinkedList<>(); this.networkChain.put(builder.platform(), chain); } chain.add(builder); Collections.sort(chain, comparator); } } private void initCompute(BuilderComparator comparator) { for (ComputeResourceBuilder builder : compute) { List<ComputeResourceBuilder> chain = this.computeChain.get(builder.platform()); if (chain == null) { chain = new LinkedList<>(); this.computeChain.put(builder.platform(), chain); } chain.add(builder); Collections.sort(chain, comparator); } } private void initGroup(BuilderComparator comparator) { for (GroupResourceBuilder builder : group) { List<GroupResourceBuilder> chain = this.groupChain.get(builder.platform()); if (chain == null) { chain = new LinkedList<>(); this.groupChain.put(builder.platform(), chain); } chain.add(builder); Collections.sort(chain, comparator); } } private class BuilderComparator implements Comparator<OrderedBuilder> { @Override public int compare(OrderedBuilder o1, OrderedBuilder o2) { return Integer.compare(o1.order(), o2.order()); } } }