blob: d6413f43d3c9cbe76b5d510e0ccf7f21e9396b8b [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2008, 2009 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.osgi.internal.composite;
import java.io.IOException;
import java.io.InputStream;
import org.eclipse.osgi.framework.adaptor.BundleData;
import org.eclipse.osgi.framework.adaptor.ClassLoaderDelegate;
import org.eclipse.osgi.framework.internal.core.BundleHost;
import org.eclipse.osgi.internal.module.CompositeResolveHelper;
import org.eclipse.osgi.service.internal.composite.CompositeModule;
import org.eclipse.osgi.service.resolver.BundleDescription;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.launch.Framework;
/**
* This is a base class for both composite and surrogate bundles.
*/
public abstract class CompositeBase extends BundleHost implements CompositeResolveHelper, CompositeModule {
protected static String PROP_COMPOSITE = "org.eclipse.equinox.Composite"; //$NON-NLS-1$
protected static String PROP_PARENTFRAMEWORK = "org.eclipse.equinox.parentFramework"; //$NON-NLS-1$
protected final Framework companionFramework;
protected final ThreadLocal resolving = new ThreadLocal();
public CompositeBase(BundleData bundledata, org.eclipse.osgi.framework.internal.core.Framework framework) throws BundleException {
super(bundledata, framework);
this.companionFramework = findCompanionFramework(framework, bundledata);
}
/*
* Finds the companion framework for the composite/surrogate.
* For surrogate bundles this is the parent framework.
* For composite bundles this is the child framework.
*/
protected abstract Framework findCompanionFramework(org.eclipse.osgi.framework.internal.core.Framework thisFramework, BundleData thisData) throws BundleException;
/*
* Gets the companion bundle for the composite/surrogate.
* For surrogate bundles this is the composite bundle.
* For composite bundles this is the surrogate bundle.
*/
abstract protected Bundle getCompanionBundle();
protected boolean isSurrogate() {
return false;
}
public BundleDescription getCompositeDescription() {
return getBundleDescription();
}
public ClassLoaderDelegate getDelegate() {
return getBundleLoader();
}
public void refreshContent() {
resolving.set(Boolean.TRUE);
try {
framework.getPackageAdmin().refreshPackages(new Bundle[] {this}, true);
} finally {
resolving.set(null);
}
}
public boolean resolveContent() {
resolving.set(Boolean.TRUE);
try {
return framework.getPackageAdmin().resolveBundles(new Bundle[] {this});
} finally {
resolving.set(null);
}
}
public void started(CompositeModule surrogate) {
// nothing
}
public void stopped(CompositeModule surrogate) {
// nothing
}
public void updateContent(InputStream content) throws BundleException {
super.update(content);
}
public void update() throws BundleException {
throw new BundleException("Cannot update composite bundles", BundleException.INVALID_OPERATION); //$NON-NLS-1$
}
public void update(InputStream in) throws BundleException {
try {
in.close();
} catch (IOException e) {
// ignore
}
throw new BundleException("Cannot update composite bundles", BundleException.INVALID_OPERATION); //$NON-NLS-1$
}
}