use of aQute.bnd.osgi.Verifier in project bnd by bndtools.
the class RemoteCommand method _distro.
public void _distro(DistroOptions opts) throws Exception {
List<String> args = opts._arguments();
String bsn;
String version;
bsn = args.remove(0);
if (!Verifier.isBsn(bsn)) {
error("Not a bundle symbolic name %s", bsn);
}
if (args.isEmpty())
version = "0";
else {
version = args.remove(0);
if (!Version.isVersion(version)) {
error("Invalid version %s", version);
}
}
File output = getFile(opts.output("distro.jar"));
if (output.getParentFile() == null || !output.getParentFile().isDirectory()) {
error("Cannot write to %s because parent not a directory", output);
}
if (output.isFile() && !output.canWrite()) {
error("Cannot write to %s", output);
}
logger.debug("Starting distro {};{}", bsn, version);
List<BundleRevisionDTO> bundleRevisons = agent.getBundleRevisons();
logger.debug("Found {} bundle revisions", bundleRevisons.size());
Parameters packages = new Parameters();
List<Parameters> provided = new ArrayList<>();
for (BundleRevisionDTO brd : bundleRevisons) {
for (CapabilityDTO c : brd.capabilities) {
CapabilityBuilder cb = new CapabilityBuilder(c.namespace);
for (Entry<String, Object> e : c.attributes.entrySet()) {
String key = e.getKey();
Object value = e.getValue();
if (key.equals("version")) {
if (value instanceof Collection || value.getClass().isArray())
value = Converter.cnv(tref, value);
else
value = new Version((String) value);
}
cb.addAttribute(key, value);
}
cb.addDirectives(c.directives);
Attrs attrs = cb.toAttrs();
if (cb.isPackage()) {
attrs.remove(Constants.BUNDLE_SYMBOLIC_NAME_ATTRIBUTE);
attrs.remove(Constants.BUNDLE_VERSION_ATTRIBUTE);
String pname = attrs.remove(PackageNamespace.PACKAGE_NAMESPACE);
if (pname == null) {
warning("Invalid package capability found %s", c);
} else
packages.put(pname, attrs);
logger.debug("P: {};{}", pname, attrs);
} else if (NativeNamespace.NATIVE_NAMESPACE.equals(c.namespace)) {
Attrs newAttrs = new Attrs();
for (Entry<String, String> entry : attrs.entrySet()) {
if (entry.getKey().startsWith(NativeNamespace.NATIVE_NAMESPACE)) {
newAttrs.put(entry.getKey(), entry.getValue());
}
}
Parameters p = new Parameters();
p.put(c.namespace, newAttrs);
provided.add(p);
} else if (!IGNORED_NAMESPACES.contains(c.namespace)) {
logger.debug("C {};{}", c.namespace, attrs);
Parameters p = new Parameters();
p.put(c.namespace, attrs);
provided.add(p);
}
}
}
if (isOk()) {
Manifest m = new Manifest();
Attributes main = m.getMainAttributes();
main.putValue(Constants.BUNDLE_MANIFESTVERSION, "2");
main.putValue(Constants.BUNDLE_SYMBOLICNAME, bsn);
main.putValue(Constants.BUNDLE_VERSION, version);
main.putValue(Constants.EXPORT_PACKAGE, packages.toString());
// Make distro unresolvable
Parameters unresolveable = new Parameters("osgi.unresolvable; filter:='(&(must.not.resolve=*)(!(must.not.resolve=*)))'");
main.putValue(Constants.REQUIRE_CAPABILITY, unresolveable.toString());
provided.add(new Parameters("osgi.unresolvable"));
StringBuilder sb = new StringBuilder();
for (Parameters parameter : provided) {
sb.append(parameter.toString());
sb.append(",");
}
String capabilities = sb.toString().substring(0, sb.length() - 1);
main.putValue(Constants.PROVIDE_CAPABILITY, capabilities);
if (opts.description() != null)
main.putValue(Constants.BUNDLE_DESCRIPTION, opts.description());
if (opts.license() != null)
main.putValue(Constants.BUNDLE_LICENSE, opts.license());
if (opts.copyright() != null)
main.putValue(Constants.BUNDLE_COPYRIGHT, opts.copyright());
if (opts.vendor() != null)
main.putValue(Constants.BUNDLE_VENDOR, opts.vendor());
Jar jar = new Jar("distro");
jar.setManifest(m);
Verifier v = new Verifier(jar);
v.setProperty(Constants.FIXUPMESSAGES, "osgi.* namespace must not be specified with generic capabilities");
v.verify();
v.getErrors();
if (isFailOk() || v.isOk()) {
jar.updateModified(System.currentTimeMillis(), "Writing distro jar");
jar.write(output);
} else
getInfo(v);
}
}
use of aQute.bnd.osgi.Verifier in project bnd by bndtools.
the class NativeHeader method testSimple.
public static void testSimple() throws Exception {
Verifier v = new Verifier(b);
v.doNative("\rnative/libclib_jiio.so ;\r" + "native/libmlib_jai.so;\r" + "osname=Linux ;\r" + "processor=amd64\r");
assertOk(v);
}
use of aQute.bnd.osgi.Verifier in project bnd by bndtools.
the class NativeHeader method testFunnyHeader.
public static void testFunnyHeader() throws Exception {
Verifier v = new Verifier(b);
v.doNative("org/osgi/test/cases/framework/fragments/tb8/linux_x86/libNative.so; osname=Linux; processor=x86; osversion=\"(1000,10000]\",");
assertBad(v, "name");
}
use of aQute.bnd.osgi.Verifier 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.bnd.osgi.Verifier in project bnd by bndtools.
the class BuilderTest method testVerify.
public void testVerify() throws Exception {
System.err.println("Erroneous bundle: tb1.jar");
Jar jar = new Jar("test", getClass().getResourceAsStream("tb1.jar"));
Verifier verifier = new Verifier(jar);
verifier.verify();
assertTrue(verifier.check());
jar.close();
verifier.close();
}
Aggregations