/* *************************************************************************************** * Copyright (C) 2006 EsperTech, Inc. All rights reserved. * * http://www.espertech.com/esper * * http://www.espertech.com * * ---------------------------------------------------------------------------------- * * The software in this package is published under the terms of the GPL license * * a copy of which has been included with this distribution in the license.txt file. * *************************************************************************************** */ package com.espertech.esper.view.window; import com.espertech.esper.client.EventBean; import com.espertech.esper.collection.ViewUpdatedCollection; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; /** * For use with length and time window views that must provide random access into data window contents * provided for the "previous" expression if used. */ public class IStreamRandomAccess implements RandomAccessByIndex, ViewUpdatedCollection { private final ArrayList<EventBean> arrayList; private final RandomAccessByIndexObserver updateObserver; /** * Ctor. * * @param updateObserver is invoked when updates are received */ public IStreamRandomAccess(RandomAccessByIndexObserver updateObserver) { this.updateObserver = updateObserver; this.arrayList = new ArrayList<EventBean>(); } public void update(EventBean[] newData, EventBean[] oldData) { if (updateObserver != null) { updateObserver.updated(this); } if (newData != null) { for (int i = 0; i < newData.length; i++) { arrayList.add(0, newData[i]); } } if (oldData != null) { for (int i = 0; i < oldData.length; i++) { arrayList.remove(arrayList.size() - 1); } } } /** * Remove event. * * @param oldData event to remove */ public void remove(EventBean oldData) { if (updateObserver != null) { updateObserver.updated(this); } arrayList.remove(arrayList.size() - 1); } /** * Apply event * * @param newData to apply */ public void update(EventBean newData) { if (updateObserver != null) { updateObserver.updated(this); } arrayList.add(0, newData); } public EventBean getNewData(int index) { // New events are added to the start of the list if (index < arrayList.size()) { return arrayList.get(index); } return null; } public EventBean getOldData(int index) { return null; } public void destroy() { // No action required } /** * Returns true for empty. * * @return indicator */ public boolean isEmpty() { return arrayList.isEmpty(); } public EventBean getNewDataTail(int index) { // New events are added to the start of the list if (index < arrayList.size() && index >= 0) { return arrayList.get(arrayList.size() - index - 1); } return null; } public Iterator<EventBean> getWindowIterator() { return arrayList.iterator(); } public Collection<EventBean> getWindowCollectionReadOnly() { return arrayList; } public int getWindowCount() { return arrayList.size(); } public int getNumEventsInsertBuf() { return getWindowCount(); } }