/** * Copyright (C) 2012 - present by OpenGamma Inc. and the OpenGamma group of companies * * Please see distribution for license. */ package com.opengamma.master; import static com.google.common.collect.Lists.newArrayList; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.HashSet; import java.util.List; import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import org.threeten.bp.Instant; import com.opengamma.id.UniqueId; import com.opengamma.id.UniqueIdentifiable; /** * Utilities for managing masters. * <p> * This is a thread-safe static utility class. */ public class MasterUtils { public static <D extends AbstractDocument> List<D> adjustVersionInstants(Instant now, Instant from, Instant to, List<D> documents) { for (D document : documents) { Instant fromInstant = document.getVersionFromInstant(); if (fromInstant == null) { document.setVersionFromInstant(from); } } List<D> copy = newArrayList(documents); Collections.sort(copy, new Comparator<D>() { @Override public int compare(D a, D b) { Instant fromA = a.getVersionFromInstant(); Instant fromB = b.getVersionFromInstant(); return fromA.compareTo(fromB); } }); final Instant latestDocumentVersionTo = copy.get(copy.size() - 1).getVersionToInstant(); D prevDocument = null; for (D document : copy) { document.setVersionToInstant(latestDocumentVersionTo == null ? to : latestDocumentVersionTo); if (prevDocument != null) { prevDocument.setVersionToInstant(document.getVersionFromInstant()); } prevDocument = document; document.setCorrectionFromInstant(now); document.setCorrectionToInstant(null); } return copy; } public static <D extends AbstractDocument> boolean checkUniqueVersionsFrom(List<D> documents) { Set<Instant> instants = new HashSet<Instant>(); for (D document : documents) { instants.add(document.getVersionFromInstant()); } return instants.size() == documents.size(); } public static <D extends AbstractDocument> boolean checkVersionInstantsWithinRange(Instant missing, Instant from, Instant to, List<D> documents, boolean equalFrom) { if (!documents.isEmpty()) { SortedSet<Instant> instants = new TreeSet<Instant>(); for (D document : documents) { Instant fromInstant = document.getVersionFromInstant(); if (fromInstant == null) { instants.add(missing); } else { instants.add(document.getVersionFromInstant()); } } Instant minFromVersion = instants.first(); Instant maxFromVersion = instants.last(); return ((equalFrom && minFromVersion.equals(from)) || (!equalFrom && !minFromVersion.isBefore(from))) && (to == null || !maxFromVersion.isAfter(to)); } else { return true; } } public static <D extends UniqueIdentifiable> List<UniqueId> mapToUniqueIDs(List<D> documents) { List<UniqueId> result = new ArrayList<UniqueId>(); for (D doc : documents) { result.add(doc.getUniqueId()); } return result; } }