/** * Copyright (c) 2006 Ecliptical Software Inc. and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Ecliptical Software Inc. - initial API and implementation */ package org.eclipse.ecf.pubsub.model.impl; import java.io.IOException; import java.util.Collection; import java.util.HashSet; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IConfigurationElement; import org.eclipse.core.runtime.IExtensionRegistry; import org.eclipse.core.runtime.Platform; import org.eclipse.ecf.core.identity.ID; import org.eclipse.ecf.core.sharedobject.ISharedObjectConfig; import org.eclipse.ecf.core.sharedobject.ISharedObjectContext; import org.eclipse.ecf.core.sharedobject.SharedObjectInitException; import org.eclipse.ecf.example.pubsub.SerializationUtil; import org.eclipse.ecf.pubsub.ISubscribedService; import org.eclipse.ecf.pubsub.ISubscriber; import org.eclipse.ecf.pubsub.impl.SubscribeMessage; import org.eclipse.ecf.pubsub.impl.UnsubscribeMessage; import org.eclipse.ecf.pubsub.model.IModelUpdater; import org.eclipse.ecf.pubsub.model.IReplicaModel; public class RemoteAgent extends AgentBase implements IReplicaModel, ISubscribedService { private Collection subscribers; private final Object subscriptionMutex = new Object(); public void unsubscribe(ID requestorID) { synchronized (subscriptionMutex) { if (subscribers == null) return; subscribers.remove(requestorID); if (subscribers.isEmpty()) { ISharedObjectContext ctx = config.getContext(); try { ctx.sendMessage(config.getHomeContainerID(), new UnsubscribeMessage()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } ctx.getSharedObjectManager().removeSharedObject(config.getSharedObjectID()); } } } public void init(ISharedObjectConfig config) throws SharedObjectInitException { super.init(config); subscribers = new HashSet(); ID requestorID = (ID) config.getProperties().get(REQUESTOR_ID); if (requestorID != null) subscribers.add(requestorID); } protected void initializeData(Object data) throws SharedObjectInitException { try { this.data = SerializationUtil.deserialize((byte[]) data); } catch (IOException e) { throw new SharedObjectInitException(e); } catch (ClassNotFoundException e) { throw new SharedObjectInitException(e); } } protected void initializeUpdater() throws SharedObjectInitException { IExtensionRegistry registry = Platform.getExtensionRegistry(); if (registry == null) throw new SharedObjectInitException("No Platform Extension Registry."); IConfigurationElement[] elements = registry.getConfigurationElementsFor("org.eclipse.ecf.example.pubsub.modelUpdater"); for (int i = 0; i < elements.length; ++i) { if (updaterID.equals(elements[i].getAttribute("id"))) { try { updater = (IModelUpdater) elements[i].createExecutableExtension("class"); } catch (CoreException e) { throw new SharedObjectInitException(e); } catch (ClassCastException e) { throw new SharedObjectInitException(e); } break; } } if (updater == null) throw new SharedObjectInitException("Could not find specified Model Updater."); } protected void activated() { ID requestorID = (ID) config.getProperties().get(REQUESTOR_ID); if (requestorID != null) { Object svc = config.getContext().getSharedObjectManager().getSharedObject(requestorID); if (svc instanceof ISubscriber) ((ISubscriber) svc).subscribed(this); } } protected void disconnected() { config.getContext().getSharedObjectManager().removeSharedObject(config.getSharedObjectID()); } protected void disconnected(ID containerID) { if (containerID.equals(config.getHomeContainerID())) disconnected(); } protected void received(ID containerID, Object data) { if (!(data instanceof byte[])) return; if (data instanceof SubscribeMessage) { SubscribeMessage msg = (SubscribeMessage) data; synchronized (subscriptionMutex) { subscribers.add(msg.getRequestorID()); } return; } try { updater.update(this.data, SerializationUtil.deserialize((byte[]) data)); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }