| /******************************************************************************* |
| * Copyright (c) 2008, 2010 VMware Inc. |
| * 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: |
| * VMware Inc. - initial contribution |
| *******************************************************************************/ |
| |
| package org.eclipse.virgo.kernel.userregionfactory; |
| |
| import java.util.ArrayList; |
| import java.util.Dictionary; |
| import java.util.HashSet; |
| import java.util.Hashtable; |
| import java.util.List; |
| import java.util.Set; |
| |
| import org.eclipse.virgo.nano.serviceability.Assert; |
| import org.eclipse.virgo.medic.eventlog.EventLogger; |
| import org.eclipse.virgo.util.osgi.manifest.BundleManifest; |
| import org.eclipse.virgo.util.osgi.manifest.BundleManifestFactory; |
| import org.eclipse.virgo.util.osgi.manifest.DynamicImportPackage; |
| import org.eclipse.virgo.util.osgi.manifest.DynamicallyImportedPackage; |
| import org.osgi.framework.Bundle; |
| import org.osgi.framework.BundleContext; |
| import org.osgi.framework.ServiceReference; |
| import org.osgi.service.packageadmin.ExportedPackage; |
| import org.osgi.service.packageadmin.PackageAdmin; |
| |
| /** |
| * {@link PackageImportWildcardExpander} expands the wildcards in a string containing the body of an import package |
| * header. |
| * <p /> |
| * |
| * <strong>Concurrent Semantics</strong><br /> |
| * |
| * Thread safe. |
| * |
| */ |
| @SuppressWarnings("deprecation") |
| final class PackageImportWildcardExpander { |
| |
| private static final String wildcard = "*"; |
| |
| static String expandPackageImportsWildcards(String userRegionImportsProperty, BundleContext systemBundleContext, EventLogger eventLogger) { |
| String[] exportedPackageNames = getExportedPackageNames(systemBundleContext); |
| |
| return expandWildcards(userRegionImportsProperty, exportedPackageNames, eventLogger); |
| } |
| |
| private static String[] getExportedPackageNames(BundleContext bundleContext) { |
| Set<String> exportedPackageNames = new HashSet<String>(); |
| for (ExportedPackage exportedPackage : getExportedPackages(bundleContext)) { |
| exportedPackageNames.add(exportedPackage.getName()); |
| } |
| return exportedPackageNames.toArray(new String[exportedPackageNames.size()]); |
| } |
| |
| private static ExportedPackage[] getExportedPackages(BundleContext bundleContext) { |
| ServiceReference<PackageAdmin> paServiceReference = bundleContext.getServiceReference(PackageAdmin.class); |
| PackageAdmin pa = bundleContext.getService(paServiceReference); |
| |
| ExportedPackage[] exportedPackages = pa.getExportedPackages((Bundle) null); |
| Assert.notNull(exportedPackages, "Expected at least one exported package"); |
| |
| bundleContext.ungetService(paServiceReference); |
| |
| return exportedPackages; |
| } |
| |
| private static String expandWildcards(String userRegionImportsProperty, String[] exportedPackageNamess, EventLogger eventLogger) { |
| DynamicImportPackage dynamicImportPackage = representImportsAsDynamicImports(userRegionImportsProperty, eventLogger); |
| return expandWildcards(dynamicImportPackage, exportedPackageNamess, eventLogger); |
| } |
| |
| private static DynamicImportPackage representImportsAsDynamicImports(String userRegionImportsProperty, EventLogger eventLogger) { |
| Dictionary<String, String> headers = new Hashtable<String, String>(); |
| headers.put("DynamicImport-Package", userRegionImportsProperty); |
| |
| BundleManifest manifest = BundleManifestFactory.createBundleManifest(headers, new UserRegionFactoryParserLogger(eventLogger)); |
| return manifest.getDynamicImportPackage(); |
| } |
| |
| private static String expandWildcards(DynamicImportPackage dynamicImportPackage, String[] exportedPackageNames, EventLogger eventLogger) { |
| StringBuffer expandedPackages = new StringBuffer(); |
| boolean first = true; |
| List<DynamicallyImportedPackage> dynamicallyImportedPackages = dynamicImportPackage.getDynamicallyImportedPackages(); |
| for (DynamicallyImportedPackage dynamicallyImportedPackage : dynamicallyImportedPackages) { |
| String possiblyWildcardedPackageName = dynamicallyImportedPackage.getPackageName(); |
| if (possiblyWildcardedPackageName.endsWith(wildcard)) { |
| List<String> expansions = expandWildcard(possiblyWildcardedPackageName, exportedPackageNames, eventLogger); |
| for (String expansion : expansions) { |
| dynamicallyImportedPackage.setPackageName(expansion); |
| if (first) { |
| first = false; |
| } else { |
| expandedPackages.append(","); |
| } |
| expandedPackages.append(dynamicallyImportedPackage.toParseString()); |
| } |
| } else { |
| if (first) { |
| first = false; |
| } else { |
| expandedPackages.append(","); |
| } |
| expandedPackages.append(dynamicallyImportedPackage.toParseString()); |
| } |
| |
| } |
| return expandedPackages.toString(); |
| } |
| |
| private static List<String> expandWildcard(String wildcardedPackageName, String[] exportedPackageNames, EventLogger eventLogger) { |
| List<String> expansions = new ArrayList<String>(); |
| |
| String prefix = wildcardedPackageName.substring(0, wildcardedPackageName.length() - 1); |
| for (String exportedPackage : exportedPackageNames) { |
| if (exportedPackage.startsWith(prefix)) { |
| expansions.add(exportedPackage); |
| } |
| } |
| if (expansions.isEmpty()) { |
| eventLogger.log(UserRegionFactoryLogEvents.REGION_IMPORT_NO_MATCH, wildcardedPackageName); |
| } |
| return expansions; |
| } |
| |
| } |