]> git.argeo.org Git - gpl/argeo-slc.git/commitdiff
Introduce bundle register
authorMathieu Baudier <mbaudier@argeo.org>
Sat, 11 Dec 2010 19:18:01 +0000 (19:18 +0000)
committerMathieu Baudier <mbaudier@argeo.org>
Sat, 11 Dec 2010 19:18:01 +0000 (19:18 +0000)
git-svn-id: https://svn.argeo.org/slc/trunk@3966 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/BundleRegister.java [new file with mode: 0644]
runtime/org.argeo.slc.support.osgi/src/main/java/org/argeo/slc/osgi/FileSystemBundleRegister.java [new file with mode: 0644]
runtime/org.argeo.slc.support.osgi/src/test/resources/log4j.properties [new file with mode: 0644]

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 (file)
index 0000000..8d3dfce
--- /dev/null
@@ -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 (file)
index 0000000..fc27269
--- /dev/null
@@ -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<String> 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<String> exportPackageToPackageNames(String exportPackage) {
+               Set<String> exportedPackages = new HashSet<String>();
+               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 (file)
index 0000000..a912c0c
--- /dev/null
@@ -0,0 +1,12 @@
+# Set root logger level to DEBUG and its only appender to A1.\r
+log4j.rootLogger=WARN, console\r
+\r
+## Levels\r
+log4j.logger.org.argeo=DEBUG\r
+log4j.logger.org.argeo.slc.osgi.FileSystemBundleRegister=DEBUG\r
+\r
+## Appenders\r
+log4j.appender.console=org.apache.log4j.ConsoleAppender\r
+log4j.appender.console.layout=org.apache.log4j.PatternLayout\r
+log4j.appender.console.layout.ConversionPattern= %-5p %d{ISO8601} %m - %c%n\r
+\r