package org.jolokia.history;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import java.util.LinkedList;
import java.io.Serializable;
/*
* Copyright 2009-2013 Roland Huss
*
* 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.
*/
/**
* Single entry in the call history of this agent. Used by {@link HistoryStore} for internally
* remembering ancient values. Each HistoryEntry represent a list of values which in the stored
* is keyed with the attribute/operation which was called. It has a maximum number of values
* which are stored and truncates the oldest one if more values are added.
*
* @author roland
* @since Jun 12, 2009
*/
class HistoryEntry implements Serializable {
private static final long serialVersionUID = 42L;
@SuppressWarnings("PMD.LooseCoupling")
private LinkedList<ValueEntry> values;
private HistoryLimit limit;
/**
* Constructor
*
* @param pLimit how many values to keep and/or how long
*/
HistoryEntry(HistoryLimit pLimit) {
limit = pLimit;
values = new LinkedList<ValueEntry>();
}
/**
* Get an JSON array with values (along with their timestamps)
*
* @return array of values
*/
public JSONArray jsonifyValues() {
JSONArray jValues = new JSONArray();
for (ValueEntry vEntry : values) {
JSONObject o = new JSONObject();
o.put("value",vEntry.getValue());
o.put("timestamp",vEntry.getTimestamp());
jValues.add(o);
}
return jValues;
}
/**
* Set the limit (maximum number, maximum duration) for entries and truncate if necessary
*
* @param pLimit new limit to apply
*/
public void setLimit(HistoryLimit pLimit) {
limit = pLimit;
trim();
}
/**
* Set the maximum entries for a history entry
*
* @param pMaxEntries maximum number of values to keep
*/
public void setMaxEntries(int pMaxEntries) {
setLimit(new HistoryLimit(pMaxEntries,limit.getMaxDuration()));
}
/**
* Add a new value with the given times stamp to the values list
*
* @param pObject object to add
* @param pTime timestamp in milliseconds
*/
public void add(Object pObject, long pTime) {
values.addFirst(new ValueEntry(pObject,pTime));
trim();
}
// Truncate list so that no more than max entries are stored in the list
private void trim() {
// Trim
while (values.size() > limit.getMaxEntries()) {
values.removeLast();
}
// Trim according to duration
if (limit.getMaxDuration() > 0 && !values.isEmpty()) {
long duration = limit.getMaxDuration();
long start = values.getFirst().getTimestamp();
while (start - values.getLast().getTimestamp() > duration) {
values.removeLast();
}
}
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder();
sb.append("HistoryEntry");
sb.append("{values=").append(values);
sb.append(", limit=").append(limit);
sb.append('}');
return sb.toString();
}
}