Author: lindner
Date: Tue Jan 11 07:31:23 2011
New Revision: 1057507

URL: http://svn.apache.org/viewvc?rev=1057507&view=rev
Log:
SHINDIG-1479 | Patch from Andy Smith | Several bugs in common container test 
page

Added:
    
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/inline.js
Modified:
    
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/feature.xml

Modified: 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/feature.xml
URL: 
http://svn.apache.org/viewvc/shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/feature.xml?rev=1057507&r1=1057506&r2=1057507&view=diff
==============================================================================
--- 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/feature.xml
 (original)
+++ 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/feature.xml
 Tue Jan 11 07:31:23 2011
@@ -27,6 +27,7 @@ specific language governing permissions 
   <container>
     <script src="OpenAjax-mashup.js"/>
     <script src="iframe.js"/>
+    <script src="inline.js"/> 
     <script src="crypto.js"/>
   </container>
 </feature>

Added: 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/inline.js
URL: 
http://svn.apache.org/viewvc/shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/inline.js?rev=1057507&view=auto
==============================================================================
--- 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/inline.js
 (added)
+++ 
shindig/trunk/extras/src/main/javascript/features-extras/org.openajax.hub-2.0.5/inline.js
 Tue Jan 11 07:31:23 2011
@@ -0,0 +1,549 @@
+/*
+
+        Copyright 2006-2009 OpenAjax Alliance
+
+        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.
+*/
+
+/**
+ * Create a new Inline Container.
+ * @constructor
+ * @extends OpenAjax.hub.Container
+ *
+ * InlineContainer implements the Container interface to provide a container
+ * that places components within the same browser frame as the main mashup
+ * application. As such, this container does not isolate client components into
+ * secure sandboxes.
+ * 
+ * @param {OpenAjax.hub.ManagedHub} hub
+ *    Managed Hub instance to which this Container belongs
+ * @param {String} clientID
+ *    A string ID that identifies a particular client of a Managed Hub. Unique
+ *    within the context of the ManagedHub.
+ * @param {Object} params  
+ *    Parameters used to instantiate the InlineContainer.
+ *    Once the constructor is called, the params object belongs exclusively to
+ *    the InlineContainer. The caller MUST not modify it.
+ *    The following are the pre-defined properties on params:
+ * @param {Function} params.Container.onSecurityAlert
+ *    Called when an attempted security breach is thwarted.  Function is 
defined
+ *    as follows:  function(container, securityAlert)
+ * @param {Function} [params.Container.onConnect]
+ *    Called when the client connects to the Managed Hub.  Function is defined
+ *    as follows:  function(container)
+ * @param {Function} [params.Container.onDisconnect]
+ *    Called when the client disconnects from the Managed Hub.  Function is
+ *    defined as follows:  function(container)
+ * @param {Object} [params.Container.scope]
+ *    Whenever one of the Container's callback functions is called, references
+ *    to "this" in the callback will refer to the scope object. If no scope is
+ *    provided, default is window.
+ * @param {Function} [params.Container.log]
+ *    Optional logger function. Would be used to log to console.log or
+ *    equivalent. 
+ *
+ * @throws {OpenAjax.hub.Error.BadParameters}   if required params are not
+ *    present or null
+ * @throws {OpenAjax.hub.Error.Duplicate}   if a Container with this clientID
+ *    already exists in the given Managed Hub
+ * @throws {OpenAjax.hub.Error.Disconnected}   if ManagedHub is not connected
+ */
+OpenAjax.hub.InlineContainer = function( hub, clientID, params )
+{
+    if ( ! hub || ! clientID || ! params ||
+            ! params.Container || ! params.Container.onSecurityAlert ) {
+        throw new Error(OpenAjax.hub.Error.BadParameters);
+    }
+    
+    var cbScope = params.Container.scope || window;
+    var connected = false;
+    var subs = [];
+    var subIndex = 0;
+    var client = null;
+    
+    if ( params.Container.log ) {
+        var log = function( msg ) {
+            try {
+                params.Container.log.call( cbScope, "InlineContainer::" + 
clientID + ": " + msg );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+            }
+        };
+    } else {
+        log = function() {};
+    }
+    
+    this._init = function() {
+        hub.addContainer( this );
+    };
+
+  /*** OpenAjax.hub.Container interface implementation ***/
+    
+    this.getHub = function() {
+       return hub;
+    };
+    
+    this.sendToClient = function( topic, data, subscriptionID ) {
+        if ( connected ) {
+            var sub = subs[ subscriptionID ];
+            try {
+                sub.cb.call( sub.sc, topic, data, sub.d );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+                client._log( "caught error from onData callback to 
HubClient.subscribe(): " + e.message );
+            }
+        }
+    };
+    
+    this.remove = function() {
+        if ( connected ) {
+            finishDisconnect();
+        }
+    };
+    
+    this.isConnected = function() {
+        return connected;
+    };
+    
+    this.getClientID = function() {
+        return clientID;
+    };
+    
+    this.getPartnerOrigin = function() {
+        if ( connected ) {
+            return window.location.protocol + "//" + window.location.hostname;
+        }
+        return null;
+    };
+    
+    this.getParameters = function() {
+        return params;
+    };
+    
+  /*** OpenAjax.hub.HubClient interface implementation ***/
+    
+    this.connect = function( hubClient, onComplete, scope ) {
+        if ( connected ) {
+            throw new Error( OpenAjax.hub.Error.Duplicate );
+        }
+        
+        connected = true;
+        client = hubClient;
+        
+        if ( params.Container.onConnect ) {
+            try {
+                params.Container.onConnect.call( cbScope, this );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+                log( "caught error from onConnect callback to constructor: " + 
e.message );
+            }
+        }
+        
+        invokeOnComplete( onComplete, scope, hubClient, true );
+    };
+    
+    this.disconnect = function( hubClient, onComplete, scope ) {
+        if ( ! connected ) {
+            throw new Error( OpenAjax.hub.Error.Disconnected );
+        }
+        
+        finishDisconnect();
+    
+        if ( params.Container.onDisconnect ) {
+            try {
+                params.Container.onDisconnect.call( cbScope, this );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+                log( "caught error from onDisconnect callback to constructor: 
" + e.message );
+            }
+        }
+        
+        invokeOnComplete( onComplete, scope, hubClient, true );
+    };
+    
+  /*** OpenAjax.hub.Hub interface implementation ***/
+    
+    this.subscribe = function( topic, onData, scope, onComplete, 
subscriberData ) {
+        assertConn();
+        assertSubTopic( topic );
+        if ( ! onData ) {
+            throw new Error( OpenAjax.hub.Error.BadParameters );
+        }
+        
+        var subID = "" + subIndex++;
+        var success = false;
+        var msg = null;
+        try {
+            var handle = hub.subscribeForClient( this, topic, subID );
+            success = true;
+        } catch( e ) {
+            // failure
+            subID = null;
+            msg = e.message;
+        }
+        
+        scope = scope || window;
+        if ( success ) {
+            subs[ subID ] = { h: handle, cb: onData, sc: scope, d: 
subscriberData };
+        }
+        
+        invokeOnComplete( onComplete, scope, subID, success, msg );
+        return subID;
+    };
+    
+    this.publish = function( topic, data ) {
+        assertConn();
+        assertPubTopic( topic );
+        hub.publishForClient( this, topic, data );
+    };
+    
+    this.unsubscribe = function( subscriptionID, onComplete, scope ) {
+        assertConn();
+        if ( typeof subscriptionID === "undefined" || subscriptionID === null 
) {
+            throw new Error( OpenAjax.hub.Error.BadParameters );
+        }
+        var sub = subs[ subscriptionID ];
+        if ( ! sub ) { 
+            throw new Error( OpenAjax.hub.Error.NoSubscription );
+        }    
+        hub.unsubscribeForClient( this, sub.h );
+        delete subs[ subscriptionID ];
+        
+        invokeOnComplete( onComplete, scope, subscriptionID, true );
+    };
+    
+    this.getSubscriberData = function( subID ) {
+        assertConn();
+        return getSubscription( subID ).d;
+    };
+    
+    this.getSubscriberScope = function( subID ) {
+        assertConn();
+        return getSubscription( subID ).sc;
+    };
+    
+  /*** PRIVATE FUNCTIONS ***/
+    
+    function invokeOnComplete( func, scope, item, success, errorCode ) {
+        if ( func ) { // onComplete is optional
+            try {
+                scope = scope || window;
+                func.call( scope, item, success, errorCode );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+                // invokeOnComplete is only called for client interfaces (Hub 
and HubClient)
+                client._log( "caught error from onComplete callback: " + 
e.message );
+            }
+        }
+    }
+    
+    function finishDisconnect() {
+        for ( var subID in subs ) {
+            hub.unsubscribeForClient( this, subs[subID].h );
+        }
+        subs = [];
+        subIndex = 0;
+        connected = false;
+    }
+    
+    function assertConn() {
+        if ( ! connected ) {
+            throw new Error( OpenAjax.hub.Error.Disconnected );
+        }
+    }
+    
+    function assertPubTopic( topic ) {
+        if ((topic == null) || (topic === "") || (topic.indexOf("*") != -1) ||
+            (topic.indexOf("..") != -1) ||  (topic.charAt(0) == ".") ||
+            (topic.charAt(topic.length-1) == "."))
+        {
+            throw new Error(OpenAjax.hub.Error.BadParameters);
+        }
+    }
+    
+    function assertSubTopic( topic ) {
+        if ( ! topic ) {
+            throw new Error(OpenAjax.hub.Error.BadParameters);
+        }
+        var path = topic.split(".");
+        var len = path.length;
+        for (var i = 0; i < len; i++) {
+            var p = path[i];
+            if ((p === "") ||
+               ((p.indexOf("*") != -1) && (p != "*") && (p != "**"))) {
+                throw new Error(OpenAjax.hub.Error.BadParameters);
+            }
+            if ((p == "**") && (i < len - 1)) {
+                throw new Error(OpenAjax.hub.Error.BadParameters);
+            }
+        }
+    }
+    
+    function getSubscription( subID ) {
+        var sub = subs[ subID ];
+        if ( sub ) {
+            return sub;
+        }
+        throw new Error( OpenAjax.hub.Error.NoSubscription );
+    }
+    
+    
+    this._init();
+};
+
+////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * Create a new InlineHubClient.
+ * @constructor
+ * @extends OpenAjax.hub.HubClient
+ * 
+ * @param {Object} params 
+ *    Parameters used to instantiate the HubClient.
+ *    Once the constructor is called, the params object belongs to the
+ *    HubClient. The caller MUST not modify it.
+ *    The following are the pre-defined properties on params:
+ * @param {Function} params.HubClient.onSecurityAlert
+ *     Called when an attempted security breach is thwarted
+ * @param {Object} [params.HubClient.scope]
+ *     Whenever one of the HubClient's callback functions is called,
+ *     references to "this" in the callback will refer to the scope object.
+ *     If not provided, the default is window.
+ * @param {Function} [params.HubClient.log]
+ *     Optional logger function. Would be used to log to console.log or
+ *     equivalent. 
+ * @param {OpenAjax.hub.InlineContainer} params.InlineHubClient.container
+ *     Specifies the InlineContainer to which this HubClient will connect
+ *  
+ * @throws {OpenAjax.hub.Error.BadParameters} if any of the required
+ *     parameters are missing
+ */
+OpenAjax.hub.InlineHubClient = function( params )
+{
+    if ( ! params || ! params.HubClient || ! params.HubClient.onSecurityAlert 
||
+            ! params.InlineHubClient || ! params.InlineHubClient.container ) {
+        throw new Error(OpenAjax.hub.Error.BadParameters);
+    }
+    
+    var container = params.InlineHubClient.container;
+    var scope = params.HubClient.scope || window;
+    
+    if ( params.HubClient.log ) {
+        var log = function( msg ) {
+            try {
+                params.HubClient.log.call( scope, "InlineHubClient::" + 
container.getClientID() + ": " + msg );
+            } catch( e ) {
+                OpenAjax.hub._debugger();
+            }
+        };
+    } else {
+        log = function() {};
+    }
+    this._log = log;
+
+  /*** OpenAjax.hub.HubClient interface implementation ***/
+    
+    /**
+     * Requests a connection to the ManagedHub, via the InlineContainer
+     * associated with this InlineHubClient.
+     * 
+     * If the Container accepts the connection request, this HubClient's 
+     * state is set to CONNECTED and the HubClient invokes the 
+     * onComplete callback function.
+     * 
+     * If the Container refuses the connection request, the HubClient
+     * invokes the onComplete callback function with an error code. 
+     * The error code might, for example, indicate that the Container 
+     * is being destroyed.
+     * 
+     * If the HubClient is already connected, calling connect will cause
+     * the HubClient to immediately invoke the onComplete callback with
+     * the error code OpenAjax.hub.Error.Duplicate.
+     * 
+     * @param {Function} [onComplete]
+     *     Callback function to call when this operation completes.
+     * @param {Object} [scope]  
+     *     When the onComplete function is invoked, the JavaScript "this"
+     *     keyword refers to this scope object.
+     *     If no scope is provided, default is window.
+     *    
+     * In this implementation of InlineHubClient, this function operates 
+     * SYNCHRONOUSLY, so the onComplete callback function is invoked before 
+     * this connect function returns. Developers are cautioned that in  
+     * IframeHubClient implementations, this is not the case.
+     * 
+     * A client application may call InlineHubClient.disconnect and then call
+     * InlineHubClient.connect to reconnect to the Managed Hub.
+     */
+    this.connect = function( onComplete, scope ) {
+        container.connect( this, onComplete, scope );
+    };
+    
+    /**
+     * Disconnect from the ManagedHub
+     * 
+     * Disconnect immediately:
+     * 
+     * 1. Sets the HubClient's state to DISCONNECTED.
+     * 2. Causes the HubClient to send a Disconnect request to the 
+     *                 associated Container. 
+     * 3. Ensures that the client application will receive no more
+     *                 onData or onComplete callbacks associated with this 
+     *                 connection, except for the disconnect function's own
+     *                 onComplete callback.
+     * 4. Automatically destroys all of the HubClient's subscriptions.
+     *         
+     * @param {Function} [onComplete]
+     *     Callback function to call when this operation completes.
+     * @param {Object} [scope]  
+     *     When the onComplete function is invoked, the JavaScript "this"
+     *     keyword refers to the scope object.
+     *     If no scope is provided, default is window.
+     *    
+     * In this implementation of InlineHubClient, the disconnect function 
operates 
+     * SYNCHRONOUSLY, so the onComplete callback function is invoked before 
+     * this function returns. Developers are cautioned that in IframeHubClient 
+     * implementations, this is not the case.   
+     * 
+     * A client application is allowed to call HubClient.disconnect and 
+     * then call HubClient.connect in order to reconnect.
+     */
+    this.disconnect = function( onComplete, scope ) {
+        container.disconnect( this, onComplete, scope );
+    };
+    
+    this.getPartnerOrigin = function() {
+        return container.getPartnerOrigin();
+    };
+    
+    this.getClientID = function() {
+        return container.getClientID();
+    };
+    
+  /*** OpenAjax.hub.Hub interface implementation ***/
+    
+    /**
+     * Subscribe to a topic.
+     *
+     * @param {String} topic
+     *     A valid topic string. MAY include wildcards.
+     * @param {Function} onData   
+     *     Callback function that is invoked whenever an event is 
+     *     published on the topic
+     * @param {Object} [scope]
+     *     When onData callback or onComplete callback is invoked,
+     *     the JavaScript "this" keyword refers to this scope object.
+     *     If no scope is provided, default is window.
+     * @param {Function} [onComplete]
+     *     Invoked to tell the client application whether the 
+     *     subscribe operation succeeded or failed. 
+     * @param {*} [subscriberData]
+     *     Client application provides this data, which is handed
+     *     back to the client application in the subscriberData
+     *     parameter of the onData and onComplete callback functions.
+     * 
+     * @returns subscriptionID
+     *     Identifier representing the subscription. This identifier is an 
+     *     arbitrary ID string that is unique within this Hub instance
+     * @type {String}
+     * 
+     * @throws {OpenAjax.hub.Error.Disconnected} if this Hub instance is not 
in CONNECTED state
+     * @throws {OpenAjax.hub.Error.BadParameters} if the topic is invalid 
(e.g. contains an empty token)
+     *
+     * In this implementation of InlineHubClient, the subscribe function 
operates 
+     * Thus, onComplete is invoked before this function returns. Developers 
are 
+     * cautioned that in most implementations of HubClient, onComplete is 
invoked 
+     * after this function returns.
+     * 
+     * If unsubscribe is called before subscribe completes, the subscription 
is 
+     * immediately terminated, and onComplete is never invoked.
+     */
+    this.subscribe = function( topic, onData, scope, onComplete, 
subscriberData ) {
+        return container.subscribe( topic, onData, scope, onComplete, 
subscriberData );
+    };
+    
+    /**
+     * Publish an event on 'topic' with the given data.
+     *
+     * @param {String} topic
+     *     A valid topic string. MUST NOT include wildcards.
+     * @param {*} data
+     *     Valid publishable data. To be portable across different
+     *     Container implementations, this value SHOULD be serializable
+     *     as JSON.
+     *     
+     * @throws {OpenAjax.hub.Error.Disconnected} if this Hub instance 
+     *     is not in CONNECTED state
+     * 
+     * In this implementation, publish operates SYNCHRONOUSLY. 
+     * Data will be delivered to subscribers after this function returns.
+     * In most implementations, publish operates synchronously, 
+     * delivering its data to the clients before this function returns.
+     */
+    this.publish = function( topic, data ) {
+        container.publish( topic, data );
+    };
+    
+    /**
+     * Unsubscribe from a subscription
+     *
+     * @param {String} subscriptionID
+     *     A subscriptionID returned by InlineHubClient.prototype.subscribe()
+     * @param {Function} [onComplete]
+     *     Callback function invoked when unsubscribe completes
+     * @param {Object} [scope]
+     *     When onComplete callback function is invoked, the JavaScript "this"
+     *     keyword refers to this scope object.
+     *     
+     * @throws {OpenAjax.hub.Error.NoSubscription} if no such subscription is 
found
+     * 
+     * To facilitate cleanup, it is possible to call unsubscribe even 
+     * when the HubClient is in a DISCONNECTED state.
+     * 
+     * In this implementation of HubClient, this function operates 
SYNCHRONOUSLY. 
+     * Thus, onComplete is invoked before this function returns. Developers 
are 
+     * cautioned that in most implementations of HubClient, onComplete is 
invoked 
+     * after this function returns.
+     */
+    this.unsubscribe = function( subscriptionID, onComplete, scope ) {
+        container.unsubscribe( subscriptionID, onComplete, scope );
+    };
+    
+    this.isConnected = function() {
+        return container.isConnected();
+    };
+    
+    this.getScope = function() {
+        return scope;
+    };
+    
+    this.getSubscriberData = function( subID ) {
+        return container.getSubscriberData( subID );
+    };
+    
+    this.getSubscriberScope = function( subID ) {
+        return container.getSubscriberScope( subID );
+    };
+    
+    /**
+     * Returns the params object associated with this Hub instance.
+     * Allows mix-in code to access parameters passed into constructor that 
created
+     * this Hub instance.
+     *
+     * @returns params  the params object associated with this Hub instance
+     * @type {Object}
+     */
+    this.getParameters = function() {
+        return params;
+    };
+};
\ No newline at end of file


Reply via email to