/**************************************************************************** * Copyright (c) 2004 Composent, 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: * Composent, Inc. - initial API and implementation *****************************************************************************/ package org.eclipse.ecf.provider.datashare; import java.lang.reflect.Constructor; import java.util.*; import org.eclipse.ecf.core.IContainer; import org.eclipse.ecf.core.IContainerManager; import org.eclipse.ecf.core.identity.*; import org.eclipse.ecf.core.sharedobject.*; import org.eclipse.ecf.core.sharedobject.events.ISharedObjectActivatedEvent; import org.eclipse.ecf.core.sharedobject.events.ISharedObjectDeactivatedEvent; import org.eclipse.ecf.core.util.*; import org.eclipse.ecf.datashare.*; import org.eclipse.ecf.datashare.events.*; import org.eclipse.ecf.internal.provider.datashare.Activator; public class SharedObjectDatashareContainerAdapter extends BaseSharedObject implements IChannelContainerAdapter { protected static final int DEFAULT_TRANSACTION_WAIT = 30000; protected List channelContainerListeners = Collections.synchronizedList(new ArrayList()); protected void initialize() throws SharedObjectInitException { super.initialize(); addEventProcessor(new IEventProcessor() { public boolean processEvent(Event event) { if (event instanceof ISharedObjectActivatedEvent) { final ISharedObjectActivatedEvent soae = (ISharedObjectActivatedEvent) event; if (!soae.getActivatedID().equals(getID())) fireChannelContainerListeners(new IChannelContainerChannelActivatedEvent() { public ID getChannelID() { return soae.getActivatedID(); } public ID getChannelContainerID() { return soae.getLocalContainerID(); } public String toString() { StringBuffer buf = new StringBuffer("ChannelActivatedEvent["); //$NON-NLS-1$ buf.append("channelid=").append(soae.getActivatedID()).append(";"); //$NON-NLS-1$ //$NON-NLS-2$ buf.append("containerid=").append(soae.getLocalContainerID()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ return buf.toString(); } }); } else if (event instanceof ISharedObjectDeactivatedEvent) { final ISharedObjectDeactivatedEvent sode = (ISharedObjectDeactivatedEvent) event; if (!sode.getDeactivatedID().equals(getID())) fireChannelContainerListeners(new IChannelContainerChannelDeactivatedEvent() { public ID getChannelID() { return sode.getDeactivatedID(); } public ID getChannelContainerID() { return sode.getLocalContainerID(); } public String toString() { StringBuffer buf = new StringBuffer("ChannelDeactivatedEvent["); //$NON-NLS-1$ buf.append("channelid=").append(sode.getDeactivatedID()).append(";"); //$NON-NLS-1$ //$NON-NLS-2$ buf.append("containerid=").append(sode.getLocalContainerID()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$ return buf.toString(); } }); } return false; } }); } protected void fireChannelContainerListeners(IChannelContainerEvent event) { synchronized (channelContainerListeners) { for (Iterator i = channelContainerListeners.iterator(); i.hasNext();) { IChannelContainerListener l = (IChannelContainerListener) i.next(); if (l != null) l.handleChannelContainerEvent(event); } } } /* * (non-Javadoc) * * @see org.eclipse.ecf.datashare.IChannelContainerAdapter#createChannel(org.eclipse.ecf.datashare.IChannelConfig) */ public IChannel createChannel(final ID newID, final IChannelListener listener, final Map properties) throws ECFException { return createChannel(new IChannelConfig() { public IChannelListener getListener() { return listener; } public ID getID() { return newID; } public Object getAdapter(Class adapter) { return null; } public Map getProperties() { return properties; } }); } /** * @param channelConfig * @return SharedObjectDescription a non-<code>null</code> instance. * @throws ECFException not thrown by this implementation. */ protected SharedObjectDescription createChannelSharedObjectDescription(final IChannelConfig channelConfig) throws ECFException { return new SharedObjectDescription(BaseChannel.class, channelConfig.getID(), channelConfig.getProperties()); } protected ISharedObjectTransactionConfig createChannelSharedObjectTransactionConfig() { return null; } protected ISharedObject createSharedObject(SharedObjectTypeDescription typeDescription, ISharedObjectTransactionConfig transactionConfig, IChannelListener listener) throws SharedObjectCreateException { try { Class clazz = Class.forName(typeDescription.getClassName()); Constructor cons = clazz.getDeclaredConstructor(new Class[] {ISharedObjectTransactionConfig.class, IChannelListener.class}); return (ISharedObject) cons.newInstance(new Object[] {transactionConfig, listener}); } catch (Exception e) { throw new SharedObjectCreateException("Cannot create shared object of class=" + typeDescription.getClassName(), e); //$NON-NLS-1$ } } public IChannel createChannel(IChannelConfig newChannelConfig) throws ECFException { SharedObjectDescription sodesc = createChannelSharedObjectDescription(newChannelConfig); SharedObjectTypeDescription sotypedesc = sodesc.getTypeDescription(); IChannelListener listener = newChannelConfig.getListener(); ISharedObjectTransactionConfig transactionConfig = createChannelSharedObjectTransactionConfig(); ISharedObject so = null; if (sotypedesc.getName() != null) { so = SharedObjectFactory.getDefault().createSharedObject(sotypedesc, new Object[] {transactionConfig, listener}); } else { so = createSharedObject(sotypedesc, transactionConfig, listener); } IChannel channel = (IChannel) so.getAdapter(IChannel.class); if (channel == null) throw new SharedObjectCreateException("channel must not be null"); //$NON-NLS-1$ ID newID = sodesc.getID(); if (newID == null) newID = IDFactory.getDefault().createGUID(); // Now add channel to container...this will block getContext().getSharedObjectManager().addSharedObject(newID, so, sodesc.getProperties()); return channel; } /* * (non-Javadoc) * * @see org.eclipse.ecf.datashare.IChannelContainerAdapter#getChannel(org.eclipse.ecf.core.identity.ID) */ public IChannel getChannel(ID channelID) { if (channelID == null || channelID.equals(getID())) return null; return (IChannel) getContext().getSharedObjectManager().getSharedObject(channelID); } /* * (non-Javadoc) * * @see org.eclipse.ecf.datashare.IChannelContainerAdapter#removeChannel(org.eclipse.ecf.core.identity.ID) */ public boolean removeChannel(ID channelID) { if (channelID == null || channelID.equals(getID())) return false; ISharedObject o = getContext().getSharedObjectManager().removeSharedObject(channelID); if (o != null && o instanceof IChannel) { ((IChannel) o).dispose(); return true; } return false; } /* * (non-Javadoc) * * @see org.eclipse.ecf.datashare.IChannelContainerAdapter#getChannelNamespace() */ public Namespace getChannelNamespace() { return IDFactory.getDefault().getNamespaceByName(StringID.class.getName()); } public void addListener(IChannelContainerListener listener) { channelContainerListeners.add(listener); } public void removeListener(IChannelContainerListener listener) { channelContainerListeners.add(listener); } /* (non-Javadoc) * @see org.eclipse.ecf.core.sharedobject.BaseSharedObject#getAdapter(java.lang.Class) */ public Object getAdapter(Class adapter) { if (adapter != null && adapter.isAssignableFrom(IContainer.class)) { IContainerManager containerManager = Activator.getDefault().getContainerManager(); return containerManager.getContainer(getContext().getLocalContainerID()); } return super.getAdapter(adapter); } }