X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=org.argeo.slc.factory%2Fsrc%2Forg%2Fargeo%2Fslc%2Ffactory%2FA2Factory.java;h=4bab07aa14ac5e3ac723ccc55ef0410936e2285c;hb=04e7ba0710e74d9f18322dcc2c730f972b7ea10c;hp=5aa9d9d5370a977f6b5f178b4be2bcb674d40a15;hpb=fbc38873a20bc5d5974c81e9bd4ec6904c708fed;p=gpl%2Fargeo-slc.git diff --git a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java index 5aa9d9d53..4bab07aa1 100644 --- a/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java +++ b/org.argeo.slc.factory/src/org/argeo/slc/factory/A2Factory.java @@ -36,6 +36,7 @@ import java.util.jar.JarEntry; import java.util.jar.JarInputStream; import java.util.jar.JarOutputStream; import java.util.jar.Manifest; +import java.util.zip.Deflater; import org.argeo.slc.DefaultCategoryNameVersion; import org.argeo.slc.DefaultNameVersion; @@ -249,6 +250,8 @@ public class A2Factory { try (InputStream in = Files.newInputStream(mergeBnd)) { mergeProps.load(in); } + + // Version String m2Version = mergeProps.getProperty(SLC_ORIGIN_M2.toString()); if (m2Version == null) { logger.log(Level.WARNING, "Ignoring " + duDir + " as it is not an M2-based distribution unit"); @@ -258,6 +261,7 @@ public class A2Factory { throw new IllegalStateException("Only the M2 version can be specified: " + m2Version); } m2Version = m2Version.substring(1); + mergeProps.put(ManifestConstants.BUNDLE_VERSION.toString(), m2Version); String artifactsStr = mergeProps.getProperty(ManifestConstants.SLC_ORIGIN_M2_MERGE.toString()); String repoStr = mergeProps.containsKey(SLC_ORIGIN_M2_REPO.toString()) @@ -265,6 +269,8 @@ public class A2Factory { : null; String bundleSymbolicName = mergeProps.getProperty(ManifestConstants.BUNDLE_SYMBOLICNAME.toString()); + if (bundleSymbolicName == null) + throw new IllegalArgumentException("Bundle-SymbolicName must be set in " + mergeBnd); DefaultCategoryNameVersion nameVersion = new DefaultArtifact( category + ":" + bundleSymbolicName + ":" + m2Version); Path targetBundleDir = targetCategoryBase.resolve(bundleSymbolicName + "." + nameVersion.getBranch()); @@ -294,6 +300,8 @@ public class A2Factory { continue entries; if (entry.getName().equals("META-INF/NOTICE")) continue entries; + if (entry.getName().equals("META-INF/NOTICE.txt")) + continue entries; if (entry.getName().equals("META-INF/LICENSE")) continue entries; Path target = targetBundleDir.resolve(entry.getName()); @@ -306,13 +314,13 @@ public class A2Factory { out.write("\n".getBytes()); jarIn.transferTo(out); if (logger.isLoggable(DEBUG)) - logger.log(DEBUG, "Appended " + entry.getName()); + logger.log(DEBUG, artifact.getArtifactId() + " - Appended " + entry.getName()); } } else if (entry.getName().startsWith("org/apache/batik/")) { logger.log(Level.WARNING, "Skip " + entry.getName()); continue entries; } else { - throw new IllegalStateException("File " + target + " already exists"); + throw new IllegalStateException("File " + target + " from " + artifact + " already exists"); } } logger.log(Level.TRACE, () -> "Copied " + target); @@ -322,6 +330,21 @@ public class A2Factory { downloadAndProcessM2Sources(repoStr, artifact, targetBundleDir); } + // additional service files + Path servicesDir = duDir.resolve("services"); + if (Files.exists(servicesDir)) { + for (Path p : Files.newDirectoryStream(servicesDir)) { + Path target = targetBundleDir.resolve("META-INF/services/").resolve(p.getFileName()); + try (InputStream in = Files.newInputStream(p); + OutputStream out = Files.newOutputStream(target, StandardOpenOption.APPEND);) { + out.write("\n".getBytes()); + in.transferTo(out); + if (logger.isLoggable(DEBUG)) + logger.log(DEBUG, "Appended " + p); + } + } + } + Map entries = new TreeMap<>(); try (Analyzer bndAnalyzer = new Analyzer()) { bndAnalyzer.setProperties(mergeProps); @@ -342,7 +365,7 @@ public class A2Factory { && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\"")) continue keys;// hack for very old classes entries.put(key.toString(), value.toString()); - logger.log(DEBUG, () -> key + "=" + value); + // logger.log(DEBUG, () -> key + "=" + value); } } catch (Exception e) { @@ -356,6 +379,13 @@ public class A2Factory { String value = entries.get(key); manifest.getMainAttributes().putValue(key, value); } + +// // Use Maven version as Bundle-Version +// String bundleVersion = manifest.getMainAttributes().getValue(ManifestConstants.BUNDLE_VERSION.toString()); +// if (bundleVersion == null || bundleVersion.trim().equals("0")) { +// // TODO check why it is sometimes set to "0" +// manifest.getMainAttributes().putValue(ManifestConstants.BUNDLE_VERSION.toString(), m2Version); +// } try (OutputStream out = Files.newOutputStream(manifestPath)) { manifest.write(out); } @@ -419,7 +449,7 @@ public class A2Factory { && value.toString().equals("osgi.ee;filter:=\"(&(osgi.ee=JavaSE)(version=1.1))\"")) continue keys;// hack for very old classes additionalEntries.put(key.toString(), value.toString()); - logger.log(DEBUG, () -> key + "=" + value); + // logger.log(DEBUG, () -> key + "=" + value); } } @@ -450,7 +480,7 @@ public class A2Factory { URL sourcesUrl = MavenConventionsUtils.mavenRepoUrl(repoStr, sourcesArtifact); Path sourcesDownloaded = download(sourcesUrl, originBase, artifact, true); processM2SourceJar(sourcesDownloaded, targetBundleDir); - logger.log(Level.DEBUG, () -> "Processed source " + sourcesDownloaded); + logger.log(Level.TRACE, () -> "Processed source " + sourcesDownloaded); } @@ -475,6 +505,8 @@ public class A2Factory { continue entries; if (entry.getName().startsWith("module-info.java"))// skip META-INF entries continue entries; + if (entry.getName().startsWith("/")) // absolute paths + continue entries; Path target = targetSourceDir.resolve(entry.getName()); Files.createDirectories(target.getParent()); if (!Files.exists(target)) { @@ -832,6 +864,28 @@ public class A2Factory { /** Create a JAR file from a directory. */ protected Path createJar(Path bundleDir) throws IOException { + // Remove from source the resources already in the jar file +// Path srcDir = bundleDir.resolve("OSGI-OPT/src"); +// Files.walkFileTree(srcDir, new SimpleFileVisitor() { +// +// @Override +// public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException { +// // always keep .java file +// if (file.getFileName().toString().endsWith(".java")) +// return super.visitFile(file, attrs); +// +// Path relPath = srcDir.relativize(file); +// Path bundlePath = bundleDir.resolve(relPath); +// if (Files.exists(bundlePath)) { +// Files.delete(file); +// logger.log(DEBUG, () -> "Removed " + file + " from sources."); +// } +// return super.visitFile(file, attrs); +// } +// +// }); + + // Create the jar Path jarPath = bundleDir.getParent().resolve(bundleDir.getFileName() + ".jar"); Path manifestPath = bundleDir.resolve("META-INF/MANIFEST.MF"); Manifest manifest; @@ -839,6 +893,7 @@ public class A2Factory { manifest = new Manifest(in); } try (JarOutputStream jarOut = new JarOutputStream(Files.newOutputStream(jarPath), manifest)) { + jarOut.setLevel(Deflater.DEFAULT_COMPRESSION); Files.walkFileTree(bundleDir, new SimpleFileVisitor() { @Override @@ -865,23 +920,14 @@ public class A2Factory { Path descriptorsBase = Paths.get("../tp").toAbsolutePath().normalize(); // factory.processSingleM2ArtifactDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache").resolve("org.apache.xml.resolver.bnd")); -// factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache/apache-sshd")); + factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.apache/apache-sshd")); // factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty")); -// factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty-websocket")); +// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.jetty.websocket")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp.apache")); // factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats")); -// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.formats")); - factory.processEclipseArchive( - descriptorsBase.resolve("org.argeo.tp.eclipse.equinox").resolve("eclipse-equinox")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rwt").resolve("eclipse-rwt")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rap").resolve("eclipse-rap")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-swt")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-nebula")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-equinox")); - factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp").resolve("eclipse-rcp")); - factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp")); +// factory.processCategory(descriptorsBase.resolve("org.argeo.tp.gis")); System.exit(0); // Eclipse @@ -894,7 +940,6 @@ public class A2Factory { factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.swt").resolve("eclipse-equinox")); factory.processEclipseArchive(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp").resolve("eclipse-rcp")); factory.processCategory(descriptorsBase.resolve("org.argeo.tp.eclipse.rcp")); - System.exit(0); // Maven factory.processCategory(descriptorsBase.resolve("org.argeo.tp.sdk"));