/* * Copyright (C) 2007 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package net.redgeek.android.eventrend.primitives; import java.util.ArrayList; import java.util.Iterator; import java.util.SortedMap; import java.util.TreeMap; public class CategoryDatapointCache { private long mCatId; private boolean mValid; private TreeMap<Long, Datapoint> mCache; private long mStart; private long mEnd; private int mHistory; public CategoryDatapointCache(long catId, int history) { mCatId = catId; mValid = false; mCache = new TreeMap<Long, Datapoint>(); resetRangeMarkers(); mHistory = history; } public void clear() { mCache.clear(); resetRangeMarkers(); } public boolean isValid() { return mValid; } public long getCategoryId() { return mCatId; } public long getStart() { return mStart; } public void updateStart(long start) { if (start < mStart) mStart = start; } public long getEnd() { return mEnd; } public void updateEnd(long end) { if (end > mEnd) mEnd = end; } public void setHistory(int history) { mHistory = history; } public int getHistory() { return mHistory; } public Datapoint addDatapoint(Datapoint d) { if (d.mMillis < mStart) mStart = d.mMillis; if (d.mMillis > mEnd) mEnd = d.mMillis; mValid = true; return mCache.put(d.mMillis, d); } public Datapoint updateDatapoint(Datapoint d) { if (mCache.get(d.mMillis) == null) return null; return mCache.put(d.mMillis, d); } public ArrayList<Datapoint> getDataInRange(long msStart, long msEnd) { ArrayList<Datapoint> range = new ArrayList<Datapoint>(); SortedMap<Long, Datapoint> map; if (msStart > msEnd) return range; try { map = mCache.subMap(Long.valueOf(msStart), Long.valueOf(msEnd + 1)); } catch (NullPointerException e) { return range; } Iterator<Datapoint> iterator = map.values().iterator(); while (iterator.hasNext()) { Datapoint d = iterator.next(); if (d != null) range.add(d); } return range; } public ArrayList<Datapoint> getDataBefore(int number, long ms) { ArrayList<Datapoint> pre = new ArrayList<Datapoint>(); SortedMap<Long, Datapoint> range; SortedMap<Long, Datapoint> reverse; try { range = mCache.headMap(Long.valueOf(ms)); } catch (NullPointerException e) { return pre; } catch (IllegalArgumentException e) { return pre; } reverse = new TreeMap<Long, Datapoint>(java.util.Collections.reverseOrder()); reverse.putAll(range); Iterator<Datapoint> iterator = reverse.values().iterator(); for (int i = 0; i < number && iterator.hasNext();) { Datapoint d = iterator.next(); if (d != null) { i++; pre.add(0, d); } } return pre; } public ArrayList<Datapoint> getDataAfter(int number, long ms) { ArrayList<Datapoint> post = new ArrayList<Datapoint>(); SortedMap<Long, Datapoint> range; try { range = mCache.tailMap(Long.valueOf(ms) + 1); } catch (NullPointerException e) { return post; } catch (IllegalArgumentException e) { return post; } Iterator<Datapoint> iterator = range.values().iterator(); for (int i = 0; i < number && iterator.hasNext();) { Datapoint d = iterator.next(); if (d != null) { i++; post.add(d); } } return post; } public ArrayList<Datapoint> getLast(int number) { ArrayList<Datapoint> last = new ArrayList<Datapoint>(); SortedMap<Long, Datapoint> reverse = new TreeMap<Long, Datapoint>( java.util.Collections.reverseOrder()); reverse.putAll(mCache); Iterator<Datapoint> iterator = reverse.values().iterator(); for (int i = 0; i < number && iterator.hasNext();) { Datapoint d = iterator.next(); if (d != null) { i++; last.add(0, d); } } return last; } private void resetRangeMarkers() { mValid = false; mStart = Long.MAX_VALUE; mEnd = Long.MIN_VALUE; } }