| /******************************************************************************* |
| * 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 org.eclipse.osgi.framework.adaptor.BundleData; |
| import org.eclipse.osgi.framework.internal.core.FrameworkProperties; |
| import org.eclipse.osgi.internal.module.ResolverBundle; |
| import org.eclipse.osgi.service.internal.composite.CompositeModule; |
| import org.eclipse.osgi.service.resolver.BundleDescription; |
| import org.eclipse.osgi.service.resolver.ExportPackageDescription; |
| import org.osgi.framework.*; |
| import org.osgi.framework.launch.Framework; |
| import org.osgi.service.framework.CompositeBundle; |
| import org.osgi.service.framework.SurrogateBundle; |
| |
| public class SurrogateImpl extends CompositeBase implements SurrogateBundle { |
| |
| private final CompositeBundle composite; |
| |
| public SurrogateImpl(BundleData bundledata, org.eclipse.osgi.framework.internal.core.Framework framework) throws BundleException { |
| super(bundledata, framework); |
| this.composite = (CompositeBundle) FrameworkProperties.getProperties().get(PROP_COMPOSITE); |
| } |
| |
| protected Framework findCompanionFramework(org.eclipse.osgi.framework.internal.core.Framework thisFramework, BundleData thisData) { |
| // just get the property which was set when creating the child framework |
| return (Framework) FrameworkProperties.getProperties().get(PROP_PARENTFRAMEWORK); |
| } |
| |
| public BundleContext getCompositeBundleContext() { |
| return composite.getBundleContext(); |
| } |
| |
| protected Bundle getCompanionBundle() { |
| return composite; |
| } |
| |
| protected boolean isSurrogate() { |
| return true; |
| } |
| |
| public boolean giveExports(ExportPackageDescription[] matchingExports) { |
| // only allow the surrogate resolution to occur if we are in the middle of resolving the composite |
| if (resolving.get() == null) |
| return false; |
| if (matchingExports == null) { |
| // set the surrogate to disabled to prevent resolution this go around |
| CompositeHelper.setDisabled(true, getBundleDescription()); |
| return true; |
| } |
| return validExports(matchingExports); |
| } |
| |
| private boolean validExports(ExportPackageDescription[] matchingExports) { |
| // make sure each matching exports matches the export signature of the composite |
| CompositeModule composite = (CompositeModule) getCompanionBundle(); |
| BundleDescription childDesc = composite.getCompositeDescription(); |
| ExportPackageDescription[] childExports = childDesc.getExportPackages(); |
| for (int i = 0; i < matchingExports.length; i++) { |
| for (int j = 0; j < childExports.length; j++) { |
| if (matchingExports[i].getName().equals(childExports[j].getName())) { |
| if (!validateExport(matchingExports[i], childExports[j])) |
| return false; |
| continue; |
| } |
| } |
| } |
| return true; |
| } |
| |
| private boolean validateExport(ExportPackageDescription matchingExport, ExportPackageDescription childExport) { |
| Version matchingVersion = matchingExport.getVersion(); |
| Version childVersion = childExport.getVersion(); |
| if (!childVersion.equals(Version.emptyVersion) && !matchingVersion.equals(childVersion)) |
| return false; |
| if (!ResolverBundle.equivalentMaps(childExport.getAttributes(), matchingExport.getAttributes(), false)) |
| return false; |
| if (!ResolverBundle.equivalentMaps(childExport.getDirectives(), matchingExport.getDirectives(), false)) |
| return false; |
| return true; |
| } |
| |
| protected void startHook() { |
| ((CompositeModule) getCompanionBundle()).started(this); |
| } |
| |
| protected void stopHook() { |
| ((CompositeModule) getCompanionBundle()).stopped(this); |
| } |
| } |