/** * */ package iamrescue.belief.provenance; import iamrescue.agent.ISimulationTimer; import java.util.ArrayList; import java.util.Collections; import java.util.Iterator; import java.util.List; import org.apache.log4j.Logger; /** * @author Sebastian * */ public class FastProvenanceInformation implements IProvenanceInformation { private static final Logger LOGGER = Logger .getLogger(FastProvenanceInformation.class); private static List<ProvenanceLogEntry> EMPTY_LIST = new ArrayList<ProvenanceLogEntry>(); private ProvenanceLogEntry previous = null; private ProvenanceLogEntry latest = null; private ProvenanceLogEntry latestDefined = null; private List<ProvenanceLogEntry> infoList = new ArrayList<ProvenanceLogEntry>( 2); private boolean listValid = false; /** * */ public FastProvenanceInformation() { } public void addEntry(ProvenanceLogEntry entry) { if (latest == null) { latest = entry; updateLatestDefined(); return; } int compared = ProvenanceLogEntry.TIME_ORIGIN_COMPARATOR.compare(entry, latest); if (compared > 0) { // This becomes latest previous = latest; latest = entry; updateLatestDefined(); listValid = false; } else if (compared < 0) { if (previous == null) { previous = entry; updateLatestDefined(); } else { int comparedPrevious = ProvenanceLogEntry.TIME_ORIGIN_COMPARATOR .compare(entry, previous); if (comparedPrevious > 0) { previous = entry; updateLatestDefined(); listValid = false; } } } } private void updateLatestDefined() { if (latest != null && latest.getProperty().isDefined()) { latestDefined = latest; } else if (previous != null && previous.getProperty().isDefined()) { latestDefined = previous; } } public ProvenanceLogEntry getLatest() { return latest; } public Iterator<ProvenanceLogEntry> getAllLatestFirst() { if (!listValid) { listValid = true; if (latest == null) { return EMPTY_LIST.iterator(); } else if (previous == null) { return Collections.singletonList(latest).iterator(); } else { if (infoList.size() == 0) { infoList.add(latest); infoList.add(previous); } else { infoList.set(0, latest); infoList.set(1, previous); } return infoList.iterator(); } } return infoList.iterator(); } @Override public ProvenanceLogEntry getLastDefined() { return latestDefined; } }