[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[news.eclipse.technology.ecomm] Re: My interpretation of your abstract model

Hi John,

Thanks very much for your analysis. I think this is a very lucid description of the general model that I've been using, with only some very minor differences/additions from what you describe. It also points to some very important issues/questions that we can/will address in ecomm/ecf...with your help.

Comments, thoughts interspersed below

John F. Patterson wrote:
Scott:

<stuff deleted>
>

Broad comments:*

To some degree the abstract model that I originally outlined derives from consideration of telephony-like concerns. The choice of terms (conferences) reflects that. To some degree your approach seems to be more driven from computer science approaches. The emphasis on shared objects and state sharing reflects that. I do not mention this because I prefer either approach. Both approaches provide insights; they are simply different disciplines or cultures within which people have been trying to solve these problems. A big part of the challenge in a proposal like yours is to draw insights from all perspectives and fuse them into a single approach.

I agree totally. My own background includes a heavy dose of telephony as well, but I have brought very much a data communications emphasis to this work. Just a quick comment...I take the perspective that 'object state' and 'state synchronization' can encapsulate a wide variety of applications...both those where 'state updates' happen constantly and immediately (e.g. streaming audio, video, etc) and where state information is more abstract (e.g. objects that define a 'model' that is being constructed or manipulated by the user). Of course the requirements for protocol performance, bandwidth, and reliability differ radically, but such a perspective does allow for multiple kinds of state synchronization.



*My interpretation of your approach:

*At its most basic, you seem to be talking in terms of three base interfaces. Let me refer to these as a SharedObjectSpaceFactory, a SharedObjectSpace, and a SharedObject.

_SharedObjectSpaceFactory_

This is an object that is used to create SharedObjectSpaces. It is implementation neutral and can create SharedObjectSpaces that support alternate implementations using different protocols. It is a singleton. Alternate factories for implementing specific SharedObjectSpaces are plugged into (or registered against) the SharedObjectSpaceFactory. When a request to create a SharedObjectSpace of a particular type is requested, the appropriate factory is found and asked to create the SharedObjectSpace that is then returned from the SharedObjectFactory.

Yes, exactly. This factory pattern does provide a central api for constructing instances of SharedObjectSpaces, while allowing for easy extensibility. In my previous work, I've made the SharedObjectSpaceFactory an Eclipse extension point, so that other plugins can register themselves as the alternate factories for creating new types of SharedObjectSpaces (e.g. a voice conference, access to a xmpp/jabber server, interaction with a legacy and/or proprietary system, etc). This allows application creators to use a common api (a SharedObjectSpace interface, with alternate implementation), and the ability to modify/add to the types of spaces available within Eclipse.


This is pretty much all the factory does. It
supports registration of implementation-specific factories and creation requests. In addition, it should support queries regarding the available types and the instantiated SharedObjectSpaces.

Yes, exactly.


_SharedObjectSpace_

The SharedObjectSpace is a container for SharedObjects. Clients connect to the SharedObjectSpace to gain access to the SharedObjects. They disconnect from the SharedObjectSpace when access is no longer needed. Connecting to the SharedObjectSpace is the primary authenticated operation. Further operations on the space and the objects it contains will refer back to the authenticated persona provided upon connection. While other operations may require permission, authentication will not occur again. Connection to the SharedObjectSpace does not in and of itself convey any information to others about the presence of the authenticated persona.

Yes, this is correct. Associated with every local instance of a SharedObjectSpace (session, container, etc) is an identity instance that can be used to authenticate for access to this distributed set of SharedObjectSpaces. This identity instance provides a unique handle for each participant within all the participating processes, and can be used for authentication. Note that different types of SharedObjectSpaces require different types of identity, which provide different types of authentication. For example, some SharedObjectSpaces may require a correct username/password for access (e.g. xmpp, lots of others), others may require a valid digital certificate, others may require a liberty-alliance service provider authentication token, others may require an ldap lookup, others may be completely open, etc).


This allows different types of sospaces to use/provide completely different types of authentication, as per their specific security requirements.


A SharedObjectSpace supports the abilities to attach SharedObjects to and detach SharedObjects from the space. To convey presence, a client attaches a presence object to the space. From the SharedObjectSpace one can obtain a list of the currently attached SharedObjects.

Yes. I've used the term 'add' and 'remove' (because of the container metaphor) rather than 'attach' and 'detach', but the concepts are the same.



One of the important operations on the SharedObjectSpace is the registration of subscriptions for information about SharedObjects. I assume these subscriptions can indicate both the properties (including type) of a SharedObject that make its events interesting and the types of events that are worth reporting. I assume that the SharedObjectSpace generates the actual notifications.

Yes.

The "publication" of the event
occurs when the object is attached, deltached, updated, or manipulated (e.g. send operation). (While subscription for creation cannot be registered against the object itself, other subscriptions can be registered on the individual objects. I'm still not sure what your position on this is, but here I've chosen to assume that only the SharedObjectSpace actually receives subscriptions and provides notifications.)

Yes. In addition to notification about sharedobject 'arrivals' and 'departures' there is also notification available for other SharedObjectSpace instances 'arrival' and 'departure'. This is group membership information...the space itself is responsible for keeping track of what the current group membership is (often referred to as the 'view'), providing notifications to sharedobjects about changes, and engaging in some membership protocol to keep the membership information in synch (to an app-specified level of accuracy).


_
SharedObject_

There are many different types of SharedObjects each of which supports a different interface for interacting among the clients that are attached to the SharedObjectSpace and subscribed for the interactions. The SharedObjects enforce permissions so that one client may expose a SharedObject, such as presence, and be assured that other clients are not manipulating that object. The details of the interface for SharedObjects will depend on the type, but they will have properties against which subscriptions may be formed. They will also have modifiable state that can generate events to which clients subscribe. Many will also support a send event that supports messaging among the subscribed clients without implying any state change.

Yes. As you say, the notion of a SharedObject allows arbitrary types to be created/added/removed from a given container. SharedObject can be (asynchronously) notified about membership changes, arrival/departure of other sharedobjects...can have arbitrary state, can use the sharedobjectcontainer to send messages to other sharedobjects, etc.




*Mapping this approach onto online awareness and conferences*

_Online awareness_

To support online awareness let's assume that there is a type of SharedObjectSpace against which clients will register their online presence. Let's call this specialization a PresenceCommunity. To obtain online presence information, I connect to the PresenceCommunity and submit my subscription for the objects I am interested in. In this case, I am asking for events related to PresenceObjects with the names enumerated in my buddy list.

Yes, in fact my early implementation of the XMPPSharedObjectSpace does exactly this...in this instance, the PresenceCommunity is a jabber-provided community...i.e. in the jabber user-namespace.



Upon joining the PresenceCommunity, I also attach a specialized SharedObject called a PresenceObject. Before disconnecting from the space, I detach this object. If I want to reflect my online status, I change one of the modifiable properties of this PresenceObject. Others learn of my presence when the PresenceObject first attaches, changes, or detaches, provided they have registered for these events against my presence. The PresenceObject enforces permissions such that only I may change my PresenceObject. Others have a read-only version of the presence.

Yes, this is one way to implement the notion of user presence.


This formulation brings to mind two questions:

1) How do we support global presence? I think people do want this and as I have indicated elsewhere fracturing presence into separate communities raises issues about how many communities I must be in, how I know where other people's communities are, etc.

I suppose it depends primarily on having a single service for handling presence notifications for a global namespace. That is, if the various IM vendors were to all agree on a single user namespace, and provide a common authentication protocol for access to user presence info for that global namespace, then it would be very easy to have a SharedObjectSpace that 'talked' that authentication protocol, and 'understood' notifications from the service about users and their presence.


The client-side implementation pales in comparison to the standardization required to create such a service, however...with interoperable server protocols for communication about user registrations, keeping user information, etc., etc.

2) Doesn't the PresenceObject need to be more specialized than this implies? First, it is critical that no one be able to spoof my presence, which means that the key attribute must be managed by the system and not simply by the client. I suppose one might argue that every SharedObject might have an attacher field filled in with the authenticated name of the person who attaches the object. This might do it and not require specialization. But what about this? Most SharedObjects must survive beyond the presence of the attaching user, while the presence object must not. If I disconnect from the SharedObjectSpace without detaching my PresenceObject, then all clients must somehow learn that my PresenceObject is stale. This implies that the PresenceObject is specialized to the extent that its existence is somehow tied to the disconnection operation.

Yes...it's existence (for *remote participants*) must be dependent upon the disconnect operation...but remember that there can be a distinction between a 'primary copy' and a 'remote replica' of your PresenceObject. Remote replicas of your PresenceObject(say), can be designed to respond to disconnect operations (or group membership changes in general) by destroying themselves...while your local (primary copy) of the PresenceObject *never* goes away (from your point of view). That is, your local copy can always be present, but remote copies (of your presence on other peoples machines) can 'disappear' when you disconnect from the network...thus having exactly the user effect we expect of presence...that your PresenceObject on your machine never disappears (even when you disconnect), but your existence, state info, etc disappears on my machine when you disconnect...and I see your state change to 'not connected'.


Consider further that I might want to enforce reciprocity of presence and ensure that no client may lurk by refusing to attach the PresenceObject. For these reasons, I tend to think of the PresenceObject as tied to the connect and disconnect operations and created and destroyed on behalf of the client rather than managed by the client.

Yes, it is necessary that the connect and disconnect operations be accessible to certain 'special' SharedObjects. But this is just access to a certain functionality provided by the container, and accessible via the SharedObjectContext reference provided to the SharedObject upon addition/removal from the container.


_
Conferences_

To support conferences, let's assume that there is a type of SharedObjectSpace called a Conference. I create the Conference, add my PresenceObject, and somehow make others aware of the Conference. Then, they attach to the Conference and add their PresenceObjects. To actually interact with each other, we attach a specialized SharedObject, such as a Chat object. We use the send method of the Chat object to transmit messages among the participants. In general, we subscribe to learn about all the SharedObjects attached to the space, including the PresenceObjects. Later, we decide that we would like a voice channel, so one of us attaches an AudioChannelObject, then we continue to interact using this new object.

Yes, exactly.


This formulation raises these questions:

1) How do we do invites? Somehow we need a way to call someone into a Conference that they are not currently in. We could create a Community through which invitations will occur, but this brings us back to the whole issue of multiple communities. Now, I have to listen on all the communities that might contain someone who wants to call me. This does not seem tenable. Instead, it seems necessary to provide a global service for relaying invitations.

I think of this as an instance of the more general 'service lookup' problem. That is, how are people/systems made aware of arbitrary 'services'. The one that's worked the best, I think, is to ride on existing services to communicate the availability of a new service, identified via an URI. At least the URI is now understood by browsers, email clients, IM clients, etc.


I know this isn't a complete answer to your question, but in my previous work I chose to not deal with the general problem of service lookup, with the hope that agreement on basic web service protocols (like WSDL and UDDI) could help deal with this problem more generally...and with the ability to create containers that are accessed via URIs, so that invitations could be communicated among participants with already established services.

2) How do we negotiate streaming channels? It is an annoying fact of life that communication resources require negotiation before they can be effectively used. There are issues of codecs, preferred channels, and quality of service parameters. I am uncertain how such negotiations proceed in this formulation.

One solution is that the SharedObjectContainer (sorry about slipping the container word back in in place of 'space'...I just think 'space' is too abstract), can have an explicit 'join' and 'leave' operation. Of course, various types of SharedObjectContainers can implement these operations in completely idiosyncratic ways...i.e. undergo a complicated negotiation as part of join, etc...based upon the capabilities of the underlying transport being used. Same principal as the 'Socket'...with SSLSocket, JXTASocket, regular Sockets, etc. Each implementation of the 'connect' operation is different. The idea I'm suggesting is just to use the same idea at a higher level of abstraction as well (at the SharedObjectContainer level).



3) More than the Online awareness example, Conferences bring forward concerns about ensuring against lurking. Won't we want to tie PresenceObjects to the connect and disconnect operations?

Yes, certainly...as per the discussion of group membership notifications described above.


John thanks very much for these ideas and questions. I'm beginning to feel convergence on a common set of ideas: Containers/Spaces, SharedObjects, use of factories for providing a common api for the creation of an unknown/extensible set of types, etc.

I hope you don't mind if we use your idea of identifying the core interface as 'SharedObject' and combine that with container to have another core type of 'SharedObjectContainer' (along with SharedObjectContainerFactory). It seems to me that SharedObject is nicely descriptive, clear, not overly used, and not too long.

I will make sure that we hook up at CSCW...and we can talk about these ideas and more.

Scott