package org.apache.aries.subsystem.itests.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.jar.Attributes;
import java.util.jar.Manifest;
import org.ops4j.pax.tinybundles.core.TinyBundle;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.service.subsystem.SubsystemConstants;
import aQute.bnd.osgi.Constants;
public class SubsystemArchiveBuilder {
public static final String ESA_EXTENSION = ".esa";
public static final String JAR_EXTENSION = ".jar";
public static final String SUBSYSTEM_MANIFEST_FILE = "OSGI-INF/SUBSYSTEM.MF";
private final TinyBundle bundle;
private final Manifest manifest;
public SubsystemArchiveBuilder() {
bundle = TinyBundles.bundle();
manifest = new Manifest();
Attributes attributes = manifest.getMainAttributes();
attributes.putValue(Attributes.Name.MANIFEST_VERSION.toString(), "1.0");
}
public InputStream build() throws IOException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
manifest.write(baos);
baos.close();
return bundle
.add(SUBSYSTEM_MANIFEST_FILE, new ByteArrayInputStream(baos.toByteArray()))
.build();
}
public SubsystemArchiveBuilder bundle(String name, InputStream value) {
return file(name + JAR_EXTENSION, value);
}
public SubsystemArchiveBuilder content(String value) {
return header(SubsystemConstants.SUBSYSTEM_CONTENT, value);
}
public SubsystemArchiveBuilder exportPackage(String value) {
return header(Constants.EXPORT_PACKAGE, value);
}
public SubsystemArchiveBuilder exportService(String value) {
return header(SubsystemConstants.SUBSYSTEM_EXPORTSERVICE, value);
}
public SubsystemArchiveBuilder file(String name, InputStream value) {
bundle.add(name, value);
return this;
}
public SubsystemArchiveBuilder header(String name, String value) {
manifest.getMainAttributes().putValue(name, value);
return this;
}
public SubsystemArchiveBuilder importPackage(String value) {
return header(Constants.IMPORT_PACKAGE, value);
}
public SubsystemArchiveBuilder importService(String value) {
return header(SubsystemConstants.SUBSYSTEM_IMPORTSERVICE, value);
}
public SubsystemArchiveBuilder provideCapability(String value) {
return header(Constants.PROVIDE_CAPABILITY, value);
}
public SubsystemArchiveBuilder requireBundle(String value) {
return header(Constants.REQUIRE_BUNDLE, value);
}
public SubsystemArchiveBuilder requireCapability(String value) {
return header(Constants.REQUIRE_CAPABILITY, value);
}
public SubsystemArchiveBuilder subsystem(String name, InputStream value) {
return file(name + ESA_EXTENSION, value);
}
public SubsystemArchiveBuilder symbolicName(String value) {
return header(SubsystemConstants.SUBSYSTEM_SYMBOLICNAME, value);
}
public SubsystemArchiveBuilder type(String value) {
return header(SubsystemConstants.SUBSYSTEM_TYPE, value);
}
}