private final static String COMMON_BND = "common.bnd";
private Path originBase;
- private Path factoryBase;
+ private Path a2Base;
/** key is URI prefix, value list of base URLs */
private Map<String, List<String>> mirrors = new HashMap<String, List<String>>();
- public A2Factory(Path originBase, Path factoryBase) {
- super();
- this.originBase = originBase;
- this.factoryBase = factoryBase;
+ public A2Factory(Path a2Base) {
+ this.originBase = Paths.get(System.getProperty("user.home"), ".cache", "argeo/slc/origin");
+ this.a2Base = a2Base;
// TODO make it configurable
List<String> eclipseMirrors = new ArrayList<>();
public void processSingleM2ArtifactDistributionUnit(Path bndFile) {
try {
String category = bndFile.getParent().getFileName().toString();
- Path targetCategoryBase = factoryBase.resolve(category);
+ Path targetCategoryBase = a2Base.resolve(category);
Properties fileProps = new Properties();
try (InputStream in = Files.newInputStream(bndFile)) {
fileProps.load(in);
public void processM2BasedDistributionUnit(Path duDir) {
try {
String category = duDir.getParent().getFileName().toString();
- Path targetCategoryBase = factoryBase.resolve(category);
+ Path targetCategoryBase = a2Base.resolve(category);
Path commonBnd = duDir.resolve(COMMON_BND);
Properties commonProps = new Properties();
try (InputStream in = Files.newInputStream(commonBnd)) {
}
String m2Version = commonProps.getProperty(SLC_ORIGIN_M2.toString());
+ if (m2Version == null) {
+ logger.log(Level.WARNING, "Ignoring " + duDir + " as it is not an M2-based distribution unit");
+ return;// ignore, this is probably an Eclipse archive
+ }
if (!m2Version.startsWith(":")) {
throw new IllegalStateException("Only the M2 version can be specified: " + m2Version);
}
.getOrDefault(ManifestConstants.SLC_ORIGIN_MANIFEST_NOT_MODIFIED.toString(), "false").toString());
// we always force the symbolic name
- if (artifact != null) {
- if (!fileProps.containsKey(BUNDLE_SYMBOLICNAME.toString())) {
- fileProps.put(BUNDLE_SYMBOLICNAME.toString(), artifact.getName());
- }
- if (!fileProps.containsKey(BUNDLE_VERSION.toString())) {
- fileProps.put(BUNDLE_VERSION.toString(), artifact.getVersion());
- }
- }
-
+
if (doNotModify) {
fileEntries: for (Object key : fileProps.keySet()) {
if (ManifestConstants.SLC_ORIGIN_M2.toString().equals(key))
additionalEntries.put(key.toString(), value);
}
} else {
+ if (artifact != null) {
+ if (!fileProps.containsKey(BUNDLE_SYMBOLICNAME.toString())) {
+ fileProps.put(BUNDLE_SYMBOLICNAME.toString(), artifact.getName());
+ }
+ if (!fileProps.containsKey(BUNDLE_VERSION.toString())) {
+ fileProps.put(BUNDLE_VERSION.toString(), artifact.getVersion());
+ }
+ }
if (!fileProps.containsKey(EXPORT_PACKAGE.toString())) {
fileProps.put(EXPORT_PACKAGE.toString(),
public void processEclipseArchive(Path duDir) {
try {
String category = duDir.getParent().getFileName().toString();
- Path targetCategoryBase = factoryBase.resolve(category);
+ Path targetCategoryBase = a2Base.resolve(category);
Files.createDirectories(targetCategoryBase);
+ // first delete all directories from previous builds
+ for (Path dir : Files.newDirectoryStream(targetCategoryBase, (p) -> Files.isDirectory(p))) {
+ deleteDirectory(dir);
+ }
+
Files.createDirectories(originBase);
Path commonBnd = duDir.resolve(COMMON_BND);
@Override
public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
pathMatchers: for (PathMatcher pathMatcher : pathMatchers) {
- if (pathMatcher.matches(file)) {
-// Path target = targetBase.resolve(file.getFileName().toString());
-// if (!Files.exists(target)) {
-// Files.copy(file, target);
-// logger.log(Level.DEBUG, () -> "Copied " + target + " from " + downloaded);
-// } else {
-// logger.log(Level.DEBUG, () -> target + " already exists.");
-//
-// }
+ if (pathMatcher.matches(file)) {
if (file.getFileName().toString().contains(".source_")) {
processEclipseSourceJar(file, targetCategoryBase);
logger.log(Level.DEBUG, () -> "Processed source " + file);
processBundleJar(file, targetCategoryBase, new HashMap<>());
logger.log(Level.DEBUG, () -> "Processed " + file);
}
- continue pathMatchers;
+ break pathMatchers;
}
}
- return super.visitFile(file, attrs);
+ return FileVisitResult.CONTINUE;
}
});
}
protected Path processBundleJar(Path file, Path targetBase, Map<String, String> entries) throws IOException {
- NameVersion nameVersion;
+ DefaultNameVersion nameVersion;
Path targetBundleDir;
try (JarInputStream jarIn = new JarInputStream(Files.newInputStream(file), false)) {
Manifest manifest = new Manifest(jarIn.getManifest());
logger.log(Level.WARNING, "Original version is " + nameVersion.getVersion()
+ " while new version is " + versionFromEntries);
}
+ if (symbolicNameFromEntries != null) {
+ // we always force our symbolic name
+ nameVersion.setName(symbolicNameFromEntries);
+ }
}
targetBundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch());
// TODO make it less dangerous?
- if (Files.exists(targetBundleDir)) {
- deleteDirectory(targetBundleDir);
- }
+// if (Files.exists(targetBundleDir)) {
+// deleteDirectory(targetBundleDir);
+// }
// copy entries
JarEntry entry;
String value = entries.get(key);
Object previousValue = manifest.getMainAttributes().putValue(key, value);
if (previousValue != null && !previousValue.equals(value)) {
- logger.log(Level.WARNING,
- file.getFileName() + ": " + key + " was " + previousValue + ", overridden with " + value);
+ if (ManifestConstants.IMPORT_PACKAGE.toString().equals(key)
+ || ManifestConstants.EXPORT_PACKAGE.toString().equals(key))
+ logger.log(Level.WARNING, file.getFileName() + ": " + key + " was modified");
+
+ else
+ logger.log(Level.WARNING, file.getFileName() + ": " + key + " was " + previousValue
+ + ", overridden with " + value);
}
}
try (OutputStream out = Files.newOutputStream(manifestPath)) {
}
protected void processEclipseSourceJar(Path file, Path targetBase) throws IOException {
- // NameVersion nameVersion;
- Path targetBundleDir;
- try (JarInputStream jarIn = new JarInputStream(Files.newInputStream(file), false)) {
- Manifest manifest = jarIn.getManifest();
- // nameVersion = nameVersionFromManifest(manifest);
-
- String[] relatedBundle = manifest.getMainAttributes().getValue("Eclipse-SourceBundle").split(";");
- String version = relatedBundle[1].substring("version=\"".length());
- version = version.substring(0, version.length() - 1);
- NameVersion nameVersion = new DefaultNameVersion(relatedBundle[0], version);
- targetBundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch());
-
- Path targetSourceDir = targetBundleDir.resolve("OSGI-OPT/src");
-
- // TODO make it less dangerous?
- if (Files.exists(targetSourceDir)) {
- deleteDirectory(targetSourceDir);
- } else {
- Files.createDirectories(targetSourceDir);
- }
+ try {
+ Path targetBundleDir;
+ try (JarInputStream jarIn = new JarInputStream(Files.newInputStream(file), false)) {
+ Manifest manifest = jarIn.getManifest();
+
+ String[] relatedBundle = manifest.getMainAttributes().getValue("Eclipse-SourceBundle").split(";");
+ String version = relatedBundle[1].substring("version=\"".length());
+ version = version.substring(0, version.length() - 1);
+ NameVersion nameVersion = new DefaultNameVersion(relatedBundle[0], version);
+ targetBundleDir = targetBase.resolve(nameVersion.getName() + "." + nameVersion.getBranch());
+
+ Path targetSourceDir = targetBundleDir.resolve("OSGI-OPT/src");
+
+ // TODO make it less dangerous?
+ if (Files.exists(targetSourceDir)) {
+// deleteDirectory(targetSourceDir);
+ } else {
+ Files.createDirectories(targetSourceDir);
+ }
- // copy entries
- JarEntry entry;
- entries: while ((entry = jarIn.getNextJarEntry()) != null) {
- if (entry.isDirectory())
- continue entries;
- if (entry.getName().startsWith("META-INF"))// skip META-INF entries
- continue entries;
- Path target = targetSourceDir.resolve(entry.getName());
- Files.createDirectories(target.getParent());
- Files.copy(jarIn, target);
- logger.log(Level.TRACE, () -> "Copied source " + target);
- }
+ // copy entries
+ JarEntry entry;
+ entries: while ((entry = jarIn.getNextJarEntry()) != null) {
+ if (entry.isDirectory())
+ continue entries;
+ if (entry.getName().startsWith("META-INF"))// skip META-INF entries
+ continue entries;
+ Path target = targetSourceDir.resolve(entry.getName());
+ Files.createDirectories(target.getParent());
+ Files.copy(jarIn, target);
+ logger.log(Level.TRACE, () -> "Copied source " + target);
+ }
- // copy MANIFEST
+ // copy MANIFEST
// Path manifestPath = targetBundleDir.resolve("META-INF/MANIFEST.MF");
// Files.createDirectories(manifestPath.getParent());
// try (OutputStream out = Files.newOutputStream(manifestPath)) {
// manifest.write(out);
// }
+ }
+ } catch (IOException e) {
+ throw new IllegalStateException("Cannot process " + file, e);
}
}
});
}
- protected NameVersion nameVersionFromManifest(Manifest manifest) {
+ protected DefaultNameVersion nameVersionFromManifest(Manifest manifest) {
Attributes attrs = manifest.getMainAttributes();
// symbolic name
String symbolicName = attrs.getValue(ManifestConstants.BUNDLE_SYMBOLICNAME.toString());
}
public static void main(String[] args) {
- Path originBase = Paths.get("../output/origin").toAbsolutePath().normalize();
- Path factoryBase = Paths.get("../output/a2").toAbsolutePath().normalize();
- A2Factory factory = new A2Factory(originBase, factoryBase);
+ Path factoryBase = Paths.get("../../output/a2").toAbsolutePath().normalize();
+ A2Factory factory = new A2Factory(factoryBase);
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.jetty/jetty"));
- factory.processM2BasedDistributionUnit(descriptorsBase.resolve("org.argeo.tp.jetty/jetty-websocket"));
+// 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.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.poi"));
System.exit(0);
// Eclipse