edu.stanford.junction.props2.PropDaemon.java Source code

Java tutorial

Introduction

Here is the source code for edu.stanford.junction.props2.PropDaemon.java

Source

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

}