/*
* Copyright (C) 2010 Stanford University
*
* 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 edu.stanford.junction.props2;
import org.json.JSONObject;
import org.json.JSONException;
import java.util.*;
import java.net.*;
import edu.stanford.junction.addon.JSONObjWrapper;
import edu.stanford.junction.api.activity.JunctionExtra;
import edu.stanford.junction.api.messaging.MessageHeader;
import edu.stanford.junction.JunctionException;
import edu.stanford.junction.JunctionMaker;
import edu.stanford.junction.Junction;
import edu.stanford.junction.SwitchboardConfig;
import edu.stanford.junction.api.activity.JunctionActor;
import edu.stanford.junction.api.activity.JunctionExtra;
public class PropDaemon extends Prop{
static class AnyState implements IPropState{
private String state;
public AnyState(String state){
this.state = state;
}
public IPropState applyOperation(JSONObject operation){ return this; }
public JSONObject toJSON(){
try{
if(this.state == null){
return new JSONObject("null");
}
else {
return new JSONObject(this.state);
}
}
catch(JSONException e){
e.printStackTrace(System.err);
return null;
}
}
public IPropState copy(){ return new AnyState(this.state); }
public String toString(){ return state; }
}
public PropDaemon(String propName, IPropState state, long seqNum){
super(propName, state, seqNum);
}
public PropDaemon(String propName){
this(propName, new AnyState(null), 0);
}
@Override
protected IPropState reifyState(JSONObject obj){
return new AnyState(obj.toString());
}
@Override
public IProp newFresh(){
return new PropDaemon(this.propName);
}
/**
* Ignore state operations.
*/
@Override
protected void handleReceivedOp(JSONObject opMsg){
logInfo("Ignoring operation.");
}
protected long syncInterval = 10000;
private long lastSyncTime = 0;
/**
* Slightly modify the behaviour of handleHello so that we
* don't request sync on every hello message we receive.
*
*/
@Override
protected void handleHello(JSONObject msg){
if(!isSelfMsg(msg)){
long t = (new Date()).getTime();
long elapsedSinceLastSync = t - lastSyncTime;
long seqNum = msg.optLong("localSeqNum");
logInfo("Peer HELLO @ seqNum: " + seqNum);
if(seqNum > this.sequenceNum && (elapsedSinceLastSync > syncInterval)) {
enterSYNCMode();
lastSyncTime = t;
}
}
else{
logInfo("Self HELLO");
}
}
@Override
protected long helloInterval(){
return 5000;
}
@Override
protected long syncRequestInterval(){
return 10000;
}
/**
* Conveniance runner for PropDaemon
* Expects two arguments: junction-url propName
*/
public static void main(String[] args){
if(args.length != 2){
System.out.println("Usage: PROGRAM junction-url propName");
System.exit(0);
}
final String urlStr = args[0];
final String propName = args[1];
JunctionActor actor = new JunctionActor("prop-daemon") {
public void onActivityJoin() {
System.out.println("Joined activity!");
}
public void onActivityCreate(){
System.out.println("Created activity!");
}
public void onMessageReceived(MessageHeader header, JSONObject msg){
System.out.println("Got message!");
}
public List<JunctionExtra> getInitialExtras(){
ArrayList<JunctionExtra> l = new ArrayList<JunctionExtra>();
l.add(new PropDaemon(propName));
return l;
}
};
try{
URI uri = new URI(urlStr);
SwitchboardConfig sb = JunctionMaker.getDefaultSwitchboardConfig(uri);
JunctionMaker jxMaker = JunctionMaker.getInstance(sb);
Junction jx = jxMaker.newJunction(uri, actor);
}
catch(URISyntaxException e){
System.err.println("Failed to parse url!");
e.printStackTrace(System.err);
}
catch(JunctionException e){
System.err.println("Failed to connect to junction activity!");
e.printStackTrace(System.err);
}
catch(Exception e){
System.err.println("Failed to connect to junction activity!");
e.printStackTrace(System.err);
}
}
}