blob: 781074fef3b1ccc0b0c2afc320c68ba3ff79160f [file] [log] [blame]
/****************************************************************************
* Copyright (c) 2009 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.internal.examples.datashare.app;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.ecf.core.ContainerConnectException;
import org.eclipse.ecf.core.IContainer;
import org.eclipse.ecf.core.IContainerFactory;
import org.eclipse.ecf.core.IContainerManager;
import org.eclipse.ecf.core.identity.IDFactory;
import org.eclipse.ecf.core.util.ECFException;
import org.eclipse.ecf.datashare.IChannel;
import org.eclipse.ecf.datashare.IChannelContainerAdapter;
import org.eclipse.ecf.datashare.IChannelListener;
import org.eclipse.equinox.app.IApplication;
import org.eclipse.equinox.app.IApplicationContext;
import org.osgi.framework.BundleContext;
import org.osgi.util.tracker.ServiceTracker;
public abstract class AbstractDatashareApplication implements IApplication {
protected BundleContext bundleContext;
protected ServiceTracker containerManagerTracker;
private final Object appLock = new Object();
private boolean done = false;
protected IContainer container;
// The following must be set in processArgs
protected String containerType;
protected String containerId;
protected String targetId;
// Datashare adapter
protected IChannelContainerAdapter datashareAdapter;
// Test channel
protected IChannel testChannel;
protected abstract IChannelListener createChannelListener();
protected abstract void processArgs(String[] args);
protected abstract String usageApplicationId();
protected abstract String usageParameters();
public Object start(IApplicationContext context) throws Exception {
Object startupResult = startup(context);
if (!startupResult.equals(IApplication.EXIT_OK))
return startupResult;
return run();
}
protected void createChannel() throws ECFException {
// Get datashare adapter from new container
datashareAdapter = (IChannelContainerAdapter) container
.getAdapter(IChannelContainerAdapter.class);
// Create channel listener for channel to be created
IChannelListener channelListener = createChannelListener();
// Create a channel with given channel listener
testChannel = datashareAdapter.createChannel(IDFactory.getDefault()
.createStringID(Activator.class.getName()), channelListener,
null);
}
protected void createContainer() throws ECFException {
// get container factory and create container
IContainerFactory containerFactory = getContainerManager()
.getContainerFactory();
// If the containerId is null, the id is *not* passed to the container
// factory
// If it is non-null (i.e. the server), then it's passed to the factory
container = (containerId == null) ? containerFactory
.createContainer(containerType) : containerFactory
.createContainer(containerType, new Object[] { containerId });
}
protected void connectContainer() throws ContainerConnectException {
// then if targetId is non-null (client), connect to target Id
if (targetId != null)
container.connect(IDFactory.getDefault().createID(
container.getConnectNamespace(), targetId), null);
}
protected Object startup(IApplicationContext context) throws Exception {
// Get BundleContext
bundleContext = Activator.getContext();
// Process Arguments
final String[] args = mungeArguments((String[]) context.getArguments()
.get("application.args")); //$NON-NLS-1$
processArgs(args);
createContainer();
createChannel();
connectContainer();
return IApplication.EXIT_OK;
}
private String[] mungeArguments(String originalArgs[]) {
if (originalArgs == null)
return new String[0];
final List l = new ArrayList();
for (int i = 0; i < originalArgs.length; i++)
if (!originalArgs[i].equals("-pdelaunch")) //$NON-NLS-1$
l.add(originalArgs[i]);
return (String[]) l.toArray(new String[] {});
}
protected void usage() {
System.out.println("Usage: eclipse.exe -application "
+ usageApplicationId() + " " + usageParameters());
}
protected void waitForDone() {
// then just wait here
synchronized (appLock) {
while (!done) {
try {
appLock.wait();
} catch (InterruptedException e) {
// do nothing
}
}
}
}
public void stop() {
shutdown();
}
protected void shutdown() {
if (datashareAdapter != null) {
datashareAdapter.removeChannel(testChannel.getID());
testChannel = null;
datashareAdapter = null;
}
if (container != null) {
container.dispose();
getContainerManager().removeAllContainers();
container = null;
}
if (containerManagerTracker != null) {
containerManagerTracker.close();
containerManagerTracker = null;
}
synchronized (appLock) {
done = true;
appLock.notifyAll();
}
bundleContext = null;
}
protected Object run() {
waitForDone();
return IApplication.EXIT_OK;
}
protected IContainerManager getContainerManager() {
if (containerManagerTracker == null) {
containerManagerTracker = new ServiceTracker(bundleContext,
IContainerManager.class.getName(), null);
containerManagerTracker.open();
}
return (IContainerManager) containerManagerTracker.getService();
}
}