blob: 2a6ff4ba926d3127e5b5d73c5c3873c6d17a49ba [file] [log] [blame]
/*******************************************************************************
* 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;
}
}