edu.stanford.junction.Junction.java Source code

Java tutorial

Introduction

Here is the source code for edu.stanford.junction.Junction.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;

import java.net.URI;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;

import org.json.JSONObject;

import edu.stanford.junction.api.activity.ActivityScript;
import edu.stanford.junction.api.activity.JunctionActor;
import edu.stanford.junction.api.activity.JunctionExtra;
import edu.stanford.junction.api.messaging.MessageHeader;
import edu.stanford.junction.provider.ExtrasDirector;

/**
 * This class is the glue between an application developer's actor
 * and the service provider's junction implementation.
 */
public abstract class Junction {
    protected JunctionActor mOwner;
    public static String NS_JX = "jx";

    /**
     * Required constructors
     */
    public Junction() {
    }

    /** 
     * Activity Description
     */

    public abstract ActivityScript getActivityScript();

    public abstract URI getAcceptedInvitation();

    //public String getActivityID();
    public abstract String getSessionID();

    // TODO: doesn't make sense for other switchboard implementations.
    // return Maker object instead?
    @Deprecated
    public abstract String getSwitchboard();
    //public String[] getRoles();

    /**
     * Activity Lifecycle
     */
    // TODO: move to constructor?
    protected void setActor(JunctionActor actor) {
        mOwner = actor;
        mOwner.setJunction(this);

        List<JunctionExtra> extras = actor.getInitialExtras();
        if (extras != null) {
            for (int i = 0; i < extras.size(); i++) {
                registerExtra(extras.get(i));
            }
        }
    }

    //public abstract void start();
    public abstract void disconnect();
    // public abstract void onStart(); // or register handler?

    /** 
     * Actor Management
     */

    //public abstract void registerActor(JunctionActor actor);
    //public List<String> getActorsForRole(String role);
    // getActorsForHuman(String id); // some way of getting actor(s) associated with a person
    //public void onActorJoin(JunctionActor actor); // or do we want registerActorJoinHandler()
    public JunctionActor getActor() {
        return mOwner;
    }

    /**
     * Actor Invitation
     */
    public abstract URI getBaseInvitationURI();

    public final URI getInvitationURI() {
        return getInvitationURI(null);
    }

    public URI getInvitationURI(String role) {
        URI uri = getBaseInvitationURI();

        Map<String, String> params = new HashMap<String, String>();
        if (role != null) {
            params.put("role", role);
        }
        mExtrasDirector.updateInvitationParameters(params);

        StringBuffer queryBuf = new StringBuffer("?");
        Set<String> keys = params.keySet();
        for (String key : keys) {
            try {
                queryBuf.append(
                        URLEncoder.encode(key, "UTF-8") + "=" + URLEncoder.encode(params.get(key), "UTF-8") + "&");
            } catch (Exception e) {
            }
        }
        String queryStr = queryBuf.substring(0, queryBuf.length() - 1);

        try {
            uri = new URI(uri.toString() + queryStr);
        } catch (Exception e) {
            e.printStackTrace();
        }

        return uri;
    }

    // there will also be device-specific methods, EG QR codes / contact list on Android

    /**
     * Messaging
     */

    // send

    public abstract void doSendMessageToRole(String role, JSONObject message);

    public final void sendMessageToRole(String role, JSONObject message) {
        if (mExtrasDirector.beforeSendMessageToRole(role, message)) {
            doSendMessageToRole(role, message);
        }
    }

    public abstract void doSendMessageToActor(String actorID, JSONObject message);

    public final void sendMessageToActor(String actorID, JSONObject message) {
        if (mExtrasDirector.beforeSendMessageToActor(actorID, message)) {
            doSendMessageToActor(actorID, message);
        }
    }

    public abstract void doSendMessageToSession(JSONObject message);

    public final void sendMessageToSession(JSONObject message) {
        if (mExtrasDirector.beforeSendMessageToSession(message)) {
            doSendMessageToSession(message);
        }
    }

    // receive
    public void triggerMessageReceived(MessageHeader header, JSONObject message) {
        if (mExtrasDirector.beforeOnMessageReceived(header, message)) {
            getActor().onMessageReceived(header, message);
            mExtrasDirector.afterOnMessageReceived(header, message);
        }
    }

    public void triggerActorJoin(boolean isCreator) {
        // Create
        if (isCreator) {
            if (!mExtrasDirector.beforeActivityCreate()) {
                disconnect();
                return;
            }
            getActor().onActivityCreate();
            mExtrasDirector.afterActivityCreate();
        }

        // Join
        if (!mExtrasDirector.beforeActivityJoin()) {
            disconnect();
            return;
        }
        getActor().onActivityJoin();
        mExtrasDirector.afterActivityJoin();
    }

    private ExtrasDirector mExtrasDirector = new ExtrasDirector();

    final public void registerExtra(JunctionExtra extra) {
        extra.setActor(getActor());
        mExtrasDirector.registerExtra(extra);
    }

    public static URI getWebInvitation(String webUrl, URI inviteUri) {
        // TODO: Improve me; look for query parameters etc.
        return URI.create(webUrl + "?jxuri=" + URLEncoder.encode(inviteUri.toString()));
    }
}