org.beepcore.beep.core.ProfileRegistry.java Source code

Java tutorial

Introduction

Here is the source code for org.beepcore.beep.core.ProfileRegistry.java

Source

/*
 * ProfileRegistry.java  $Revision: 1.15 $ $Date: 2006/02/25 17:48:36 $
 *
 * Copyright (c) 2001 Invisible Worlds, Inc.  All rights reserved.
 * Copyright (c) 2001,2002,2004 Huston Franklin.  All rights reserved.
 *
 * The contents of this file are subject to the Blocks Public License (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.beepcore.org/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 */
package org.beepcore.beep.core;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import java.util.Collection;
import java.util.Enumeration;
import java.util.Hashtable;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Set;

import org.beepcore.beep.util.StringUtil;

/**
 * Maintains a set of associations between URIs and
 * <code>StartChannelListener</code>s. This set is used to generate
 * the <code>greeting</code> and to demux <code>start</code> requests.
 *
 * @author Eric Dixon
 * @author Huston Franklin
 * @author Jay Kint
 * @author Scott Pead
 * @version $Revision: 1.15 $, $Date: 2006/02/25 17:48:36 $
 */
public class ProfileRegistry implements Cloneable {

    // Instance Data
    private Log log = LogFactory.getLog(this.getClass());

    private class InternalProfile {
        StartChannelListener listener;
        SessionTuningProperties tuning;
    }

    private Hashtable profileListeners;
    String localize;

    // Constructors

    /**
     * Constructor ProfileRegistry
     *
     *
     */
    public ProfileRegistry() {
        this.localize = Constants.LOCALIZE_DEFAULT;
        this.profileListeners = new Hashtable();
    }

    private ProfileRegistry(String localize, Hashtable profiles) {
        this.localize = localize;
        this.profileListeners = profiles;
    }

    public Object clone() {
        return new ProfileRegistry(this.localize, (Hashtable) this.profileListeners.clone());
    }

    /**
     * Returns the currently registered profile URIs.
     */
    public Enumeration getProfiles() {
        return profileListeners.keys();
    }

    /**
     * Returns the <code>StartChannelListener</code> for the specified URI.
     *
     *
     * @param uri
     *
     */
    public StartChannelListener getStartChannelListener(SessionTuningProperties tuning, String uri) {

        InternalProfile profile = (InternalProfile) profileListeners.get(uri);

        if (profile == null) {
            return null;
        }

        // if there are no qualifications, then just return the listener
        if (profile.tuning == null || profile.tuning.isEmpty()) {
            return ((InternalProfile) profileListeners.get(uri)).listener;
        }

        // so the profile requires something, but if the session doesn't
        // have anything, then return null
        if (tuning == null) {
            log.debug("Session does not have any tuning properties");
            return null;
        }

        // if the profile requires any of the standard properties, then
        // make sure they are set on the session before returning the listener
        int i = 0;

        for (i = 0; i < SessionTuningProperties.STANDARD_PROPERTIES.length; i++) {
            if ((profile.tuning.getProperty(SessionTuningProperties.STANDARD_PROPERTIES[i]) != null)
                    && (tuning.getProperty(SessionTuningProperties.STANDARD_PROPERTIES[i]) == null)) {
                if (log.isDebugEnabled()) {
                    log.debug("Session does not have tuning property "
                            + SessionTuningProperties.STANDARD_PROPERTIES[i]);
                }
                return null;
            }
        }

        // all the ones the profile requested must be there so we return the
        // listener
        return ((InternalProfile) profileListeners.get(uri)).listener;
    }

    /**
     * Add the <code>StartChannelListener</code> for the specified URI.
     *
     *
     * @param profile
     * @param listener
     *
     * @return the previously registered <code>StartChannelListener</code>
     *
     */
    public synchronized StartChannelListener addStartChannelListener(String profile, StartChannelListener listener,
            SessionTuningProperties tuning) {

        // Replace semantics - change this if we want to prevent clobbering.
        StartChannelListener temp = null;

        if (profileListeners.get(profile) != null) {
            temp = ((InternalProfile) profileListeners.get(profile)).listener;
        }

        InternalProfile tempProfile = new InternalProfile();

        tempProfile.listener = listener;

        tempProfile.tuning = tuning;

        profileListeners.put(profile, tempProfile);

        return temp;
    }

    /**
     * Remove the <code>StartChannelListener</code> for the specified uri.
     *
     *
     * @param profile
     *
     * @return <code>StartChannelListener</code> registered for the specified
     *         uri.
     *
     */
    public synchronized StartChannelListener removeStartChannelListener(String profile) {
        InternalProfile temp = (InternalProfile) profileListeners.remove(profile);

        return temp.listener;
    }

    /**
     * Set values for the BEEP greeting localize attribute.
     *
     *
     * @param localize
     *
     */
    public void setLocalization(String localize) {
        this.localize = localize;
    }

    /**
     * Returns the value for the BEEP greeting localize attribute.
     *
     *
     */
    public String getLocalization() {
        return this.localize;
    }

    public Collection getAdvertisedProfiles(Session session) {
        LinkedList advertise = new LinkedList();

        SessionTuningProperties sessionTuning = session.getTuningProperties();

        Set profiles = profileListeners.keySet();

        for (Iterator p = profileListeners.keySet().iterator(); p.hasNext();) {
            String profileUri = (String) p.next();
            InternalProfile profile = (InternalProfile) profileListeners.get(profileUri);
            boolean callAdvertise = false;

            // check the standard tuning settings first
            for (int i = 0; i < SessionTuningProperties.STANDARD_PROPERTIES.length; i++) {

                if ((profile.tuning != null) && (sessionTuning != null)
                        && (profile.tuning.getProperty(SessionTuningProperties.STANDARD_PROPERTIES[i]) != null)
                        && (sessionTuning.getProperty(SessionTuningProperties.STANDARD_PROPERTIES[i]) != null)) {
                    callAdvertise = true;
                }
            }

            try {
                if ((profile.tuning == null) || (callAdvertise && profile.listener.advertiseProfile(session))) {
                    advertise.add(profileUri);
                }
            } catch (BEEPException e) {
                continue;
            }
        }

        return advertise;
    }
}