blob: 24f7dfaa6efdc0e49ab07a1a3da83f5362daf3cd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.karaf.shell.packages;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import org.apache.felix.gogo.commands.Argument;
import org.apache.felix.gogo.commands.Option;
import org.apache.felix.gogo.commands.Command;
import org.osgi.framework.Bundle;
import org.osgi.framework.Constants;
import org.osgi.service.packageadmin.ExportedPackage;
import org.osgi.service.packageadmin.PackageAdmin;
@Command(scope = "packages", name = "exports", description = "Displays exported packages.")
public class ExportsCommand extends PackageCommandSupport {
@Option(name = "-i", aliases = {"--imports"}, description = "List bundles importing the specified packages")
boolean imports;
@Option(name = "-s", description = "Shows the symbolic name", required = false, multiValued = false)
boolean showSymbolic;
@Option(name = "-d", aliases = {"--details"}, description = "List bundles in a master detail table")
boolean details;
@Argument(index = 0, name = "ids", description = "The IDs of bundles to check", required = false, multiValued = true)
List<Long> ids;
protected void doExecute(PackageAdmin admin) throws Exception {
String format = "";
int index = 1;
List<String> headers = new ArrayList<String>();
headers.add("ID");
format += "%" + (index++) + "$6s";
if (showSymbolic) {
headers.add("Symbolic name");
format += " %" + (index++) + "$-40s ";
}
headers.add("Packages");
format += " %" + (index++) + "$-40s";
if (imports) {
headers.add("Imported by");
format += " %" + (index++) + "$-40s";
}
format += "\n";
System.out.format(format, headers.toArray());
if (ids != null && !ids.isEmpty()) {
for (long id : ids) {
Bundle bundle = getBundleContext().getBundle(id);
if (bundle != null) {
printExports(System.out, format, bundle, admin.getExportedPackages(bundle));
} else {
System.err.println("Bundle ID " + id + " is invalid.");
}
}
} else {
for (Bundle bundle : getBundleContext().getBundles()) {
printExports(System.out, format, bundle, admin.getExportedPackages((Bundle) bundle));
}
}
}
protected void printExports(PrintStream out, String format, Bundle target, ExportedPackage[] exports) {
List<String> columns = new ArrayList<String>();
if ((exports != null) && (exports.length > 0)) {
for (int i = 0; i < exports.length; i++) {
columns = new ArrayList<String>();
Bundle bundle = exports[i].getExportingBundle();
columns.add(String.valueOf(bundle.getBundleId()));
if (showSymbolic) {
columns.add(bundle.getSymbolicName());
}
//Do not repeat ID, Symbolic names etc when bundle exports more that one package
if (i > 0) {
int size = columns.size();
if (details) {
columns = new ArrayList<String>();
fillDetailRecord(columns, size);
}
}
columns.add(exports[i].toString());
if (imports) {
Bundle[] bs = exports[i].getImportingBundles();
if (bs != null && bs.length > 0) {
for (int j = 0; j < bs.length; j++) {
columns.add(getBundleName(bs[j]));
out.format(format, columns.toArray());
//Do not repeat ID, Symbolic names etc when package is imported by more than one bundles
if (details) {
int size = columns.size();
columns = new ArrayList<String>();
fillDetailRecord(columns, size - 1);
} else {
columns.remove(columns.size() - 1);
}
}
} else {
columns.add("");
out.format(format, columns.toArray());
}
} else {
out.format(format, columns.toArray());
}
}
} else {
columns.add(String.valueOf(target.getBundleId()));
if (showSymbolic) {
columns.add(target.getSymbolicName());
}
columns.add("No active exported packages.");
if (imports) {
columns.add("");
}
out.format(format, columns.toArray());
}
}
public static String getBundleName(Bundle bundle) {
if (bundle != null) {
String name = (String) bundle.getHeaders().get(Constants.BUNDLE_NAME);
return (name == null)
? "Bundle " + Long.toString(bundle.getBundleId())
: name + " (" + Long.toString(bundle.getBundleId()) + ")";
}
return "[STALE BUNDLE]";
}
/**
* Method that creates an empty list of string that serves as detail record.
* @param colums
* @param size
*/
public void fillDetailRecord(List<String> colums, int size) {
for (int i = 0; i < size; i++) {
colums.add("");
}
}
}