// Path: reference/src/main/java/me/doubledutch/stroom/client/StreamConnection.java
// public interface StreamConnection{
// 	public final static int LINEAR=0;
// 	public final static int SYNC=1;
// 	public final static int FLUSH=2;
// 	public final static int NONE=3;
// 
// 	public List<String> get(long index,long endIndex) throws IOException;
// 	public String get(long index) throws IOException;
// 	public String getLast() throws IOException;
// 	public long getCount() throws IOException;
// 	
// 	public long append(JSONObject data) throws IOException,JSONException;
// 	public long append(String data) throws IOException,JSONException;
// 	public List<Long> append(List<String> data) throws IOException,JSONException;
// 	
// 	public long append(JSONObject data,int hint) throws IOException,JSONException;
// 	public long append(String data,int hint) throws IOException,JSONException;
// 	public List<Long> append(List<String> data,int hint) throws IOException,JSONException;
// 
// 	public void truncate(long index) throws IOException;
// }


import org.apache.log4j.Logger;
import me.doubledutch.stroom.streams.*;
import me.doubledutch.stroom.perf.*;
import me.doubledutch.stroom.*;
import me.doubledutch.stroom.client.StreamConnection;
import java.util.*;
import org.json.*;
import java.net.*;
import javax.script.*;

	public String getAggregate() throws Exception{
		if(type==JAVASCRIPT){
			metric.startTimer("javascript.serialize");
			jsEngine.eval("var result=null");
			jsEngine.eval("if(aggregate!=null)result=JSON.stringify(aggregate);");
			// Object obj=jsEngine.eval("result");
			Object obj=jsEngine.get("result");
			metric.stopTimer("javascript.serialize");
			if(obj!=null){
				aggregate=(String)obj;
			}
		}
		return aggregate;
	}

	private void loadState() throws Exception{
		JSONObject obj=new JSONObject(getStream("state").getLast());
		index=obj.getLong("i");
		outputIndex=obj.getLong("o");
		aggregate=getStream("output").get(outputIndex);
		if(type==JAVASCRIPT){
			jsEngine.eval("var aggregate="+aggregate+";");
		}
	}

	private void saveState() throws Exception{
		JSONObject obj=new JSONObject();
		obj.put("i",index);
		obj.put("o",outputIndex);
// Path: reference/src/main/java/me/doubledutch/stroom/client/StreamConnection.java
// public interface StreamConnection{
// 	public final static int LINEAR=0;
// 	public final static int SYNC=1;
// 	public final static int FLUSH=2;
// 	public final static int NONE=3;
// 
// 	public List<String> get(long index,long endIndex) throws IOException;
// 	public String get(long index) throws IOException;
// 	public String getLast() throws IOException;
// 	public long getCount() throws IOException;
// 	
// 	public long append(JSONObject data) throws IOException,JSONException;
// 	public long append(String data) throws IOException,JSONException;
// 	public List<Long> append(List<String> data) throws IOException,JSONException;
// 	
// 	public long append(JSONObject data,int hint) throws IOException,JSONException;
// 	public long append(String data,int hint) throws IOException,JSONException;
// 	public List<Long> append(List<String> data,int hint) throws IOException,JSONException;
// 
// 	public void truncate(long index) throws IOException;
// }


// Path: reference/src/main/java/me/doubledutch/stroom/aggregates/AggregateService.java
import org.apache.log4j.Logger;
import me.doubledutch.stroom.streams.*;
import me.doubledutch.stroom.perf.*;
import me.doubledutch.stroom.*;
import me.doubledutch.stroom.client.StreamConnection;
import java.util.*;
import org.json.*;
import java.net.*;
import javax.script.*;


	public String getAggregate() throws Exception{
		if(type==JAVASCRIPT){
			metric.startTimer("javascript.serialize");
			jsEngine.eval("var result=null");
			jsEngine.eval("if(aggregate!=null)result=JSON.stringify(aggregate);");
			// Object obj=jsEngine.eval("result");
			Object obj=jsEngine.get("result");
			metric.stopTimer("javascript.serialize");
			if(obj!=null){
				aggregate=(String)obj;
			}
		}
		return aggregate;
	}

	private void loadState() throws Exception{
		JSONObject obj=new JSONObject(getStream("state").getLast());
		index=obj.getLong("i");
		outputIndex=obj.getLong("o");
		aggregate=getStream("output").get(outputIndex);
		if(type==JAVASCRIPT){
			jsEngine.eval("var aggregate="+aggregate+";");
		}
	}

	private void saveState() throws Exception{
		JSONObject obj=new JSONObject();
		obj.put("i",index);
		obj.put("o",outputIndex);
		getStream("state").append(obj,StreamConnection.FLUSH);