diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.app/src/org/eclipse/equinox/internal/app/SingletonContainer.java')
-rwxr-xr-x | bundles/org.eclipse.equinox.app/src/org/eclipse/equinox/internal/app/SingletonContainer.java | 68 |
1 files changed, 68 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.app/src/org/eclipse/equinox/internal/app/SingletonContainer.java b/bundles/org.eclipse.equinox.app/src/org/eclipse/equinox/internal/app/SingletonContainer.java new file mode 100755 index 000000000..8b61feee9 --- /dev/null +++ b/bundles/org.eclipse.equinox.app/src/org/eclipse/equinox/internal/app/SingletonContainer.java @@ -0,0 +1,68 @@ +/******************************************************************************* + * Copyright (c) 2005, 2006 IBM Corporation 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: + * IBM Corporation - initial API and implementation + *******************************************************************************/ +package org.eclipse.equinox.internal.app; + +import org.eclipse.equinox.app.*; + +public class SingletonContainer implements IContainer { + private EclipseAppHandle singletonHandle; + private String type; + private IContainer singletonContainer; + private ContainerManager containerManager; + + public SingletonContainer(IContainer singletonContainer, String type, ContainerManager containerManager) { + this.singletonContainer = singletonContainer; + this.type = type; + this.containerManager = containerManager; + } + + public synchronized IApplication launch(IAppContext context) throws Exception { + // attempt to lock this application type; an exception will be thrown if the type cannot be locked + lock((EclipseAppHandle) context); + return singletonContainer.launch(context); + } + + public boolean isSingletonContainer() { + return true; + } + + synchronized boolean isLocked() { + return singletonHandle != null; + } + + synchronized void lock(EclipseAppHandle appHandle) { + if (singletonHandle != null) + throw new IllegalStateException("Only one application of type \"" + type + "\" is allowed to run at a time"); + singletonHandle = appHandle; + refreshAppDescriptors(); + } + + synchronized void unlock() { + singletonHandle = null; + refreshAppDescriptors(); + } + + private void refreshAppDescriptors() { + EclipseAppDescriptor[] singletonApps = containerManager.getAppDescriptorsByType(type); + for (int i = 0; i < singletonApps.length; i++) { + singletonApps[i].setSingletonMgr(this); + singletonApps[i].refreshProperties(); + } + } + + public void shutdown() { + singletonContainer.shutdown(); + } + + IContainer getContainer() { + return singletonContainer; + } +} |