Java tutorial
/* * 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); } } }