use of aQute.lib.collections.MultiMap in project bnd by bndtools.
the class bnd method doPrint.
private void doPrint(Jar jar, int options, printOptions po) throws ZipException, IOException, Exception {
if ((options & VERIFY) != 0) {
Verifier verifier = new Verifier(jar);
verifier.setPedantic(isPedantic());
verifier.verify();
getInfo(verifier);
}
if ((options & MANIFEST) != 0) {
Manifest manifest = jar.getManifest();
if (manifest == null)
warning("JAR has no manifest %s", jar);
else {
err.println("[MANIFEST " + jar.getName() + "]");
printManifest(manifest);
}
out.println();
}
if ((options & IMPEXP) != 0) {
out.println("[IMPEXP]");
Manifest m = jar.getManifest();
Domain domain = Domain.domain(m);
if (m != null) {
Parameters imports = domain.getImportPackage();
Parameters exports = domain.getExportPackage();
for (String p : exports.keySet()) {
if (imports.containsKey(p)) {
Attrs attrs = imports.get(p);
if (attrs.containsKey(VERSION_ATTRIBUTE)) {
exports.get(p).put("imported-as", attrs.get(VERSION_ATTRIBUTE));
}
}
}
print(Constants.IMPORT_PACKAGE, new TreeMap<String, Attrs>(imports));
print(Constants.EXPORT_PACKAGE, new TreeMap<String, Attrs>(exports));
} else
warning("File has no manifest");
}
if ((options & CAPABILITIES) != 0) {
out.println("[CAPABILITIES]");
Manifest m = jar.getManifest();
Domain domain = Domain.domain(m);
if (m != null) {
Parameters provide = domain.getProvideCapability();
Parameters require = domain.getRequireCapability();
print(Constants.PROVIDE_CAPABILITY, new TreeMap<String, Attrs>(provide));
print(Constants.REQUIRE_CAPABILITY, new TreeMap<String, Attrs>(require));
} else
warning("File has no manifest");
}
if ((options & (USES | USEDBY | API)) != 0) {
out.println();
try (Analyzer analyzer = new Analyzer()) {
analyzer.setPedantic(isPedantic());
analyzer.setJar(jar);
Manifest m = jar.getManifest();
if (m != null) {
String s = m.getMainAttributes().getValue(Constants.EXPORT_PACKAGE);
if (s != null)
analyzer.setExportPackage(s);
}
analyzer.analyze();
boolean java = po.java();
Packages exports = analyzer.getExports();
if ((options & API) != 0) {
Map<PackageRef, List<PackageRef>> apiUses = analyzer.cleanupUses(analyzer.getAPIUses(), !po.java());
if (!po.xport()) {
if (exports.isEmpty())
warning("Not filtering on exported only since exports are empty");
else
apiUses.keySet().retainAll(analyzer.getExports().keySet());
}
out.println("[API USES]");
printMultiMap(apiUses);
Set<PackageRef> privates = analyzer.getPrivates();
for (PackageRef export : exports.keySet()) {
Map<Def, List<TypeRef>> xRef = analyzer.getXRef(export, privates, Modifier.PROTECTED + Modifier.PUBLIC);
if (!xRef.isEmpty()) {
out.println();
out.printf("%s refers to private Packages (not good)\n\n", export);
for (Entry<Def, List<TypeRef>> e : xRef.entrySet()) {
TreeSet<PackageRef> refs = new TreeSet<Descriptors.PackageRef>();
for (TypeRef ref : e.getValue()) refs.add(ref.getPackageRef());
refs.retainAll(privates);
//
out.printf(//
"%60s %-40s %s\n", //
e.getKey().getOwnerType().getFQN(), e.getKey().getName(), refs);
}
out.println();
}
}
out.println();
}
Map<PackageRef, List<PackageRef>> uses = analyzer.cleanupUses(analyzer.getUses(), !po.java());
if ((options & USES) != 0) {
out.println("[USES]");
printMultiMap(uses);
out.println();
}
if ((options & USEDBY) != 0) {
out.println("[USEDBY]");
MultiMap<PackageRef, PackageRef> usedBy = new MultiMap<Descriptors.PackageRef, Descriptors.PackageRef>(uses).transpose();
printMultiMap(usedBy);
}
}
}
if ((options & COMPONENT) != 0) {
printComponents(out, jar);
}
if ((options & METATYPE) != 0) {
printMetatype(out, jar);
}
if ((options & LIST) != 0) {
out.println("[LIST]");
for (Map.Entry<String, Map<String, Resource>> entry : jar.getDirectories().entrySet()) {
String name = entry.getKey();
Map<String, Resource> contents = entry.getValue();
out.println(name);
if (contents != null) {
for (String element : contents.keySet()) {
int n = element.lastIndexOf('/');
if (n > 0)
element = element.substring(n + 1);
out.print(" ");
out.print(element);
String path = element;
if (name.length() != 0)
path = name + "/" + element;
Resource r = contents.get(path);
if (r != null) {
String extra = r.getExtra();
if (extra != null) {
out.print(" extra='" + escapeUnicode(extra) + "'");
}
}
out.println();
}
} else {
out.println(name + " <no contents>");
}
}
out.println();
}
}
use of aQute.lib.collections.MultiMap in project bnd by bndtools.
the class bnd method _bsn2url.
public void _bsn2url(Bsn2UrlOptions opts) throws Exception {
Project p = getProject(opts.project());
if (p == null) {
error("You need to be in a project or specify the project with -p/--project");
return;
}
MultiMap<String, Version> revisions = new MultiMap<String, Version>();
for (RepositoryPlugin repo : p.getPlugins(RepositoryPlugin.class)) {
if (!(repo instanceof InfoRepository))
continue;
for (String bsn : repo.list(null)) {
revisions.addAll(bsn, repo.versions(bsn));
}
}
for (List<Version> versions : revisions.values()) {
Collections.sort(versions, Collections.reverseOrder());
}
List<String> files = opts._arguments();
for (String f : files) {
try (BufferedReader r = IO.reader(getFile(f))) {
String line;
nextLine: while ((line = r.readLine()) != null) {
Matcher matcher = LINE_P.matcher(line);
if (!matcher.matches())
continue nextLine;
line = matcher.group(1);
Parameters bundles = new Parameters(line, this);
for (Map.Entry<String, Attrs> entry : bundles.entrySet()) {
String bsn = entry.getKey();
VersionRange range = new VersionRange(entry.getValue().getVersion());
List<Version> versions = revisions.get(bsn);
if (versions == null) {
error("No for versions for %s", bsn);
break nextLine;
}
for (Version version : versions) {
if (range.includes(version)) {
for (RepositoryPlugin repo : p.getPlugins(RepositoryPlugin.class)) {
if (!(repo instanceof InfoRepository))
continue;
InfoRepository rp = (InfoRepository) repo;
ResourceDescriptor descriptor = rp.getDescriptor(bsn, version);
if (descriptor == null) {
error("Found bundle, but no descriptor %s;version=%s", bsn, version);
return;
}
out.println(descriptor.url + " #" + descriptor.bsn + ";version=" + descriptor.version);
}
}
}
}
}
} catch (Exception e) {
error("failed to create url list from file %s : %s", f, e);
}
}
}
use of aQute.lib.collections.MultiMap in project bnd by bndtools.
the class bnd method _xref.
/**
* Cross reference every class in the jar file to the files it references
*/
@Description("Show a cross references for all classes in a set of jars.")
public void _xref(xrefOptions options) throws IOException, Exception {
Analyzer analyzer = new Analyzer();
final MultiMap<TypeRef, TypeRef> table = new MultiMap<TypeRef, TypeRef>();
final MultiMap<PackageRef, PackageRef> packages = new MultiMap<PackageRef, PackageRef>();
Set<TypeRef> set = Create.set();
Instructions filter = new Instructions(options.match());
for (String arg : options._arguments()) {
try {
File file = new File(arg);
try (Jar jar = new Jar(file.getName(), file)) {
for (Map.Entry<String, Resource> entry : jar.getResources().entrySet()) {
String key = entry.getKey();
Resource r = entry.getValue();
if (key.endsWith(".class")) {
TypeRef ref = analyzer.getTypeRefFromPath(key);
if (filter.matches(ref.toString())) {
set.add(ref);
try (InputStream in = r.openInputStream()) {
Clazz clazz = new Clazz(analyzer, key, r);
// TODO use the proper bcp instead
// of using the default layout
Set<TypeRef> s = clazz.parseClassFile();
for (Iterator<TypeRef> t = s.iterator(); t.hasNext(); ) {
TypeRef tr = t.next();
if (tr.isJava() || tr.isPrimitive())
t.remove();
else
packages.add(ref.getPackageRef(), tr.getPackageRef());
}
table.addAll(ref, s);
set.addAll(s);
}
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
boolean to = options.to();
boolean from = options.from();
if (to == false && from == false)
to = from = true;
if (options.classes()) {
if (to)
printxref(table, ">");
if (from)
printxref(table.transpose(), "<");
} else {
if (to)
printxref(packages, ">");
if (from)
printxref(packages.transpose(), "<");
}
}
use of aQute.lib.collections.MultiMap in project bnd by bndtools.
the class bnd method _info.
@Description("Show key project variables")
public void _info(infoOptions options) throws Exception {
Project p = getProject(options.project());
if (p == null) {
messages.NoProject();
return;
}
boolean any = options.runbundles() || options.buildpath() || options.classpath() || options.dependsOn() || options.vmpath();
MultiMap<String, Object> table = new MultiMap<String, Object>();
if (any || options.runbundles()) {
table.addAll("Run", p.getRunbundles());
}
if (any || options.buildpath()) {
table.addAll("Build", p.getBuildpath());
}
if (any || options.buildpath()) {
table.addAll("Depends on", p.getDependson());
}
if (any || options.sourcepath()) {
table.addAll("Source", p.getSourcePath());
}
if (any || options.classpath()) {
table.addAll("Class path", p.getClasspath());
}
if (any || options.vmpath()) {
table.addAll("Run path", p.getRunpath());
}
printMultiMap(table);
}
use of aQute.lib.collections.MultiMap in project bnd by bndtools.
the class ResourcesRepository method findProviders.
@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Map<Requirement, Collection<Capability>> findProviders(Collection<? extends Requirement> requirements) {
MultiMap<Requirement, Capability> result = new MultiMap<>();
for (Requirement requirement : requirements) {
List<Capability> capabilities = findProvider(requirement);
result.put(requirement, capabilities);
}
return (Map) result;
}
Aggregations