package com.tibco.as.spacebar.ui.editor.action;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.core.runtime.IStatus;
import org.eclipse.core.runtime.Status;
import org.eclipse.core.runtime.jobs.Job;
import com.tibco.as.spacebar.ui.SpaceBarPlugin;
import com.tibco.as.space.ASException;
import com.tibco.as.space.Tuple;
public class TupleSizeJob extends Job {
private List<Tuple> tuples;
private int index = 0;
private long totalSize = 0;
private Collection<ITupleSizeListener> listeners = new ArrayList<ITupleSizeListener>();
public TupleSizeJob(List<Tuple> tuples) {
super("Tuple size");
setUser(true);
setSystem(false);
this.tuples = tuples;
}
@Override
protected IStatus run(IProgressMonitor monitor) {
for (Tuple tuple : tuples) {
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
try {
byte[] serialize = tuple.serialize();
index++;
totalSize += serialize.length;
if (index % 1000 == 0) {
for (ITupleSizeListener listener : listeners) {
listener.tupleSize(getSize());
}
}
} catch (ASException e) {
return SpaceBarPlugin.createStatus(e,
"Could not compute tuple size");
}
}
for (ITupleSizeListener listener : listeners) {
listener.tupleSize(getSize());
}
for (ITupleSizeListener listener : listeners) {
listener.done();
}
if (monitor.isCanceled()) {
return Status.CANCEL_STATUS;
}
return Status.OK_STATUS;
}
private Long getSize() {
if (index == 0) {
return null;
}
return totalSize / index;
}
public void addListener(ITupleSizeListener listener) {
listeners.add(listener);
}
}