From d00482eedbd988497bf33fc202bb2b2b1282f30b Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 11 Dec 2010 19:18:01 +0000 Subject: [PATCH 1/1] Introduce bundle register git-svn-id: https://svn.argeo.org/slc/trunk@3966 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../org/argeo/slc/osgi/BundleRegister.java | 13 ++ .../slc/osgi/FileSystemBundleRegister.java | 112 ++++++++++++++++++ .../src/test/resources/log4j.properties | 12 ++ 3 files changed, 137 insertions(+) create mode 100644 runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundleRegister.java create mode 100644 runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/FileSystemBundleRegister.java create mode 100644 runtime/org.argeo.slc.support.osgi/src/test/resources/log4j.properties diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundleRegister.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundleRegister.java new file mode 100644 index 000000000..8d3dfce73 --- /dev/null +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundleRegister.java @@ -0,0 +1,13 @@ +package org.argeo.slc.osgi; + +/** A structured set of OSGi bundles. */ +public interface BundleRegister { + /** + * @param pkg + * the Java package + * @param version + * the version, can be only major.minor or null + * @return the bundle providing this package or null if none was found + */ + public String bundleProvidingPackage(String pkg, String version); +} diff --git a/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/FileSystemBundleRegister.java b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/FileSystemBundleRegister.java new file mode 100644 index 000000000..fc272693d --- /dev/null +++ b/runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/FileSystemBundleRegister.java @@ -0,0 +1,112 @@ +package org.argeo.slc.osgi; + +import java.io.File; +import java.util.HashSet; +import java.util.Properties; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.jar.JarFile; +import java.util.jar.Manifest; + +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.osgi.framework.Constants; + +public class FileSystemBundleRegister implements BundleRegister { + private final static Log log = LogFactory + .getLog(FileSystemBundleRegister.class); + + private File baseDirectory; + + private Properties packagesBundles = null; + + public String bundleProvidingPackage(String pkg, String version) { + if (packagesBundles == null) + return null; + return packagesBundles.getProperty(pkg); + } + + protected void scan(File baseDirectory) { + long begin = System.currentTimeMillis(); + int bundleCount = 0; + int packageCount = 0; + + packagesBundles = new Properties(); + + File[] files = baseDirectory.listFiles(); + for (File file : files) { + if (file.isDirectory()) { + + } else { + try { + JarFile jarFile = new JarFile(file); + Manifest manifest = jarFile.getManifest(); + String symbolicName = manifest.getMainAttributes() + .getValue(Constants.BUNDLE_SYMBOLICNAME); + String exportPackage = manifest.getMainAttributes() + .getValue(Constants.EXPORT_PACKAGE); + + // List exported packages + Set exportedPackages = exportPackageToPackageNames(exportPackage); + + for (String exportedPackage : exportedPackages) { + packagesBundles.put(exportedPackage, symbolicName); + packageCount++; + if (log.isTraceEnabled()) + log.trace("Register " + exportedPackage + "=" + + symbolicName); + } + bundleCount++; + } catch (Exception e) { + log.warn("Cannot scan " + file, e); + if (log.isTraceEnabled()) + e.printStackTrace(); + } + } + } + if (log.isDebugEnabled()) + log.debug("Scanned " + bundleCount + " bundles with " + + packageCount + " packages in " + + (System.currentTimeMillis() - begin) + " ms"); + } + + protected Set exportPackageToPackageNames(String exportPackage) { + Set exportedPackages = new HashSet(); + if (exportPackage == null) + return exportedPackages; + char[] arr = exportPackage.toCharArray(); + + StringBuffer currentPkg = new StringBuffer(""); + boolean skip = false; + boolean inQuote = false; + for (char c : arr) { + if (c == ' ' || c == '\n') { + // ignore + } else if (c == ';') { + if (!skip) + skip = true; + } else if (c == ',') { + if (skip && !inQuote) { + skip = false; + // add new package + exportedPackages.add(currentPkg.toString()); + currentPkg = new StringBuffer(""); + } + } else if (c == '\"') { + inQuote = inQuote ? false : true; + } else { + if (!skip) + currentPkg.append(c); + } + } + + return exportedPackages; + } + + public static void main(String[] args) { + FileSystemBundleRegister fsbr = new FileSystemBundleRegister(); + fsbr.scan(new File( + "/home/mbaudier/dev/src/slc/dist/org.argeo.slc.sdk/target/lib")); + + } +} diff --git a/runtime/org.argeo.slc.support.osgi/src/test/resources/log4j.properties b/runtime/org.argeo.slc.support.osgi/src/test/resources/log4j.properties new file mode 100644 index 000000000..a912c0c65 --- /dev/null +++ b/runtime/org.argeo.slc.support.osgi/src/test/resources/log4j.properties @@ -0,0 +1,12 @@ +# Set root logger level to DEBUG and its only appender to A1. +log4j.rootLogger=WARN, console + +## Levels +log4j.logger.org.argeo=DEBUG +log4j.logger.org.argeo.slc.osgi.FileSystemBundleRegister=DEBUG + +## Appenders +log4j.appender.console=org.apache.log4j.ConsoleAppender +log4j.appender.console.layout=org.apache.log4j.PatternLayout +log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n + -- 2.39.2