package org.simpleflatmapper.osgi;
import org.apache.commons.io.IOUtils;
import org.apache.poi.ss.usermodel.Cell;
import org.junit.Test;
import org.ops4j.pax.tinybundles.core.TinyBundles;
import org.osgi.framework.Bundle;
import org.osgi.framework.BundleException;
import org.osgi.framework.Constants;
import org.simpleflatmapper.converter.Converter;
import org.simpleflatmapper.map.Mapper;
import org.simpleflatmapper.csv.CsvParser;
import org.simpleflatmapper.poi.SheetMapper;
import org.simpleflatmapper.reflect.Getter;
import org.simpleflatmapper.tuple.Tuple2;
import org.simpleflatmapper.util.ErrorHelper;
import java.io.*;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.jar.Attributes;
import java.util.jar.JarEntry;
import java.util.jar.JarInputStream;
import java.util.jar.JarOutputStream;
import java.util.jar.Manifest;
public class OsgiTest {
private static final URL FELIX = url("http://repo1.maven.org/maven2/org/apache/felix/org.apache.felix.log/1.0.1/org.apache.felix.log-1.0.1.jar");
private static final URL ASM = url("http://repo1.maven.org/maven2/org/ow2/asm/asm-all/5.0.4/asm-all-5.0.4.jar");
private static final URL ASM6 = url("http://repo1.maven.org/maven2/org/ow2/asm/asm-all/6.0_ALPHA/asm-all-6.0_ALPHA.jar");
private static final URL ARIES = url("http://repo1.maven.org/maven2/org/apache/aries/org.apache.aries.util/1.1.1/org.apache.aries.util-1.1.1.jar");
private static final URL SPLIFLY = url("http://repo1.maven.org/maven2/org/apache/aries/spifly/org.apache.aries.spifly.dynamic.bundle/1.0.8/org.apache.aries.spifly.dynamic.bundle-1.0.8.jar");
private static URL url(String s) {
try {
return new URL(s);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
@Test
public void testCsvParser() throws BundleException, InterruptedException, IOException {
HostApplication hostApplication = new HostApplication();
try {
installFelix(hostApplication);
installSfmMap(hostApplication);
hostApplication.deployBundleWithClass(CsvParser.class);
InputStream is =
TinyBundles.bundle().add(CsvActivator.class)
.add(TestClass.class)
.set(Constants.BUNDLE_ACTIVATOR, CsvActivator.class.getName())
.set(Constants.IMPORT_PACKAGE, "org.osgi.framework,org.simpleflatmapper.csv" )
.build();
Bundle bundle = hostApplication.install("tinyBundle", is);
bundle.start();
} finally {
hostApplication.shutdownApplication();
}
}
@Test
public void testPoiParser() throws BundleException, InterruptedException, IOException {
HostApplication hostApplication = new HostApplication();
try {
installFelix(hostApplication);
hostApplication.deployWrapBundleWithClass(Cell.class);
installSfmMap(hostApplication);
hostApplication.deployBundleWithClass(CsvParser.class);
hostApplication.deployBundleWithClass(SheetMapper.class);
InputStream is =
TinyBundles.bundle().add(PoiActivator.class)
.add(TestClass.class)
.set(Constants.BUNDLE_ACTIVATOR, PoiActivator.class.getName())
.set(Constants.IMPORT_PACKAGE, "org.osgi.framework,org.simpleflatmapper.poi,org.apache.poi.ss.usermodel,org.apache.poi.hssf.usermodel" )
.build();
Bundle bundle = hostApplication.install("tinyBundle", is);
bundle.start();
} finally {
hostApplication.shutdownApplication();
}
}
public void installSfmMap(HostApplication hostApplication) throws BundleException, IOException {
hostApplication.deployBundleWithClass(Tuple2.class);
hostApplication.deployBundleWithClass(ErrorHelper.class);
hostApplication.deployBundleWithClass(Converter.class);
hostApplication.deployBundleWithClass(Getter.class);
hostApplication.deployBundleWithClass(Mapper.class);
}
private void installFelix(HostApplication hostApplication) throws IOException, BundleException {
hostApplication.install(FELIX);
String javaVersion = System.getProperty("java.version");
System.out.println("javaVersion = " + javaVersion);
if (!javaVersion.contains("9-ea")) {
hostApplication.install(ASM);
hostApplication.install(ARIES);
hostApplication.install(SPLIFLY);
} else {
hostApplication.install(repackage(ASM));
hostApplication.install(repackage(ARIES));
hostApplication.install(repackage(SPLIFLY));
}
}
private URL repackage(URL asm6) throws IOException {
File tmpFile = File.createTempFile("bundle", "jar");
try (InputStream fis = asm6.openStream();
JarInputStream jis = new JarInputStream(fis);
) {
Manifest man = jis.getManifest();
Attributes mainAttributes = man.getMainAttributes();
System.out.println("mainAttributes = " + mainAttributes.keySet());
mainAttributes.remove(new Attributes.Name("Bundle-RequiredExecutionEnvironment"));
mainAttributes.remove(new Attributes.Name("Require-Capability"));
try (FileOutputStream fos = new FileOutputStream(tmpFile);
JarOutputStream jos = new JarOutputStream(fos, man)
) {
JarEntry zentry;
while ((zentry = jis.getNextJarEntry()) != null) {
jos.putNextEntry(zentry);
IOUtils.copy(jis, jos);
}
}
}
return tmpFile.toURI().toURL();
}
}