From 6100175ea489062df9ad9a47fb5bbbb904595b2f Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 19 May 2012 10:54:55 +0000 Subject: [PATCH] Introduce NormalizeGroup Group indexes (binaries, sources, sdk) git-svn-id: https://svn.argeo.org/slc/trunk@5307 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- .../dist/commands/NormalizeDistribution.java | 1 + .../java/org/argeo/slc/repo/RepoUtils.java | 12 + .../repo/maven/ImportMavenDependencies.java | 7 +- .../slc/repo/maven/MavenConventionsUtils.java | 77 ++-- .../argeo/slc/repo/maven/Migration_01_03.java | 19 +- .../argeo/slc/repo/osgi/NormalizeGroup.java | 340 ++++++++++++++++++ .../org/argeo/slc/repo/osgi/OsgiProfile.java | 55 +++ .../slc/aether/ArtifactIdComparator.java | 20 ++ 8 files changed, 489 insertions(+), 42 deletions(-) create mode 100644 runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/NormalizeGroup.java create mode 100644 runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiProfile.java create mode 100644 runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ArtifactIdComparator.java diff --git a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java index 3dfee960e..85a336e8d 100644 --- a/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java +++ b/eclipse/plugins/org.argeo.slc.client.ui.dist/src/main/java/org/argeo/slc/client/ui/dist/commands/NormalizeDistribution.java @@ -54,6 +54,7 @@ public class NormalizeDistribution extends AbstractHandler implements SlcNames { private Repository repository; private String workspace; + private String groupId; private ArtifactIndexer artifactIndexer = new ArtifactIndexer(); private JarFileIndexer jarFileIndexer = new JarFileIndexer(); diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java index 242cbe0e4..df8a01daa 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/RepoUtils.java @@ -23,11 +23,13 @@ import org.apache.commons.io.FilenameUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; import org.argeo.slc.BasicNameVersion; import org.argeo.slc.NameVersion; import org.argeo.slc.SlcException; import org.argeo.slc.jcr.SlcNames; import org.argeo.slc.jcr.SlcTypes; +import org.argeo.slc.repo.maven.MavenConventionsUtils; import org.osgi.framework.Constants; import org.sonatype.aether.artifact.Artifact; import org.sonatype.aether.util.artifact.DefaultArtifact; @@ -268,6 +270,16 @@ public class RepoUtils implements SlcNames { } } + public static Node copyBytesAsArtifact(Node artifactsBase, + Artifact artifact, byte[] bytes) throws RepositoryException { + String parentPath = MavenConventionsUtils.artifactParentPath( + artifactsBase.getPath(), artifact); + Node folderNode = JcrUtils.mkfolders(artifactsBase.getSession(), + parentPath); + return JcrUtils.copyBytesAsFile(folderNode, + MavenConventionsUtils.artifactFileName(artifact), bytes); + } + private RepoUtils() { } } diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java index 0bda72b7e..684e75cda 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/ImportMavenDependencies.java @@ -36,6 +36,7 @@ import org.argeo.jcr.JcrUtils; import org.argeo.slc.NameVersion; import org.argeo.slc.SlcException; import org.argeo.slc.aether.AetherTemplate; +import org.argeo.slc.aether.ArtifactIdComparator; import org.argeo.slc.repo.ArtifactIndexer; import org.argeo.slc.repo.JarFileIndexer; import org.argeo.slc.repo.RepoConstants; @@ -64,11 +65,7 @@ public class ImportMavenDependencies implements Runnable { private ArtifactIndexer artifactIndexer = new ArtifactIndexer(); private JarFileIndexer jarFileIndexer = new JarFileIndexer(); - private Comparator artifactComparator = new Comparator() { - public int compare(Artifact o1, Artifact o2) { - return o1.getArtifactId().compareTo(o2.getArtifactId()); - } - }; + private Comparator artifactComparator = new ArtifactIdComparator(); public void run() { // resolve diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java index 5296895a6..a19e0725a 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/MavenConventionsUtils.java @@ -76,6 +76,12 @@ public class MavenConventionsUtils { + artifactParentPath(artifact); } + /** Absolute path to the directory of this group */ + public static String groupPath(String artifactBasePath, String groupId) { + return artifactBasePath + (artifactBasePath.endsWith("/") ? "" : "/") + + groupId.replace('.', '/'); + } + /** Relative path to the directories where the files will be stored */ public static String artifactParentPath(Artifact artifact) { return artifact.getGroupId().replace('.', '/') + '/' @@ -84,58 +90,61 @@ public class MavenConventionsUtils { public static String artifactsAsDependencyPom(Artifact pomArtifact, Set artifacts) { - StringBuffer b = new StringBuffer(); + StringBuffer p = new StringBuffer(); // XML header - b.append("\n"); - b.append("\n"); - b.append("4.0.0"); + p.append("\n"); + p.append("\n"); + p.append("4.0.0"); // Artifact - b.append("org.argeoparent1.2.0\n"); - b.append("").append(pomArtifact.getGroupId()) + p.append("org.argeoparent1.2.0\n"); + p.append("").append(pomArtifact.getGroupId()) .append("\n"); - b.append("").append(pomArtifact.getArtifactId()) + p.append("").append(pomArtifact.getArtifactId()) .append("\n"); - b.append("").append(pomArtifact.getVersion()) + p.append("").append(pomArtifact.getVersion()) .append("\n"); - b.append("pom\n"); + p.append("pom\n"); // Dependencies - b.append("\n"); - for (Artifact artifact : artifacts) { - b.append("\t"); - b.append("").append(artifact.getArtifactId()) + p.append("\n"); + for (Artifact a : artifacts) { + p.append("\t"); + p.append("").append(a.getArtifactId()) .append(""); - b.append("").append(artifact.getGroupId()) - .append(""); - b.append("\n"); + p.append("").append(a.getGroupId()).append(""); + if (!a.getExtension().equals("jar")) + p.append("").append(a.getExtension()).append(""); + p.append("\n"); } - b.append("\n"); + p.append("\n"); // Dependency management - b.append("\n"); - b.append("\n"); - for (Artifact artifact : artifacts) { - b.append("\t"); - b.append("").append(artifact.getArtifactId()) + p.append("\n"); + p.append("\n"); + for (Artifact a : artifacts) { + p.append("\t"); + p.append("").append(a.getArtifactId()) .append(""); - b.append("").append(artifact.getVersion()) - .append(""); - b.append("").append(artifact.getGroupId()) - .append(""); - b.append("\n"); + p.append("").append(a.getVersion()).append(""); + p.append("").append(a.getGroupId()).append(""); + if (a.getExtension().equals("pom")) { + p.append("").append(a.getExtension()).append(""); + p.append("import"); + } + p.append("\n"); } - b.append("\n"); - b.append("\n"); + p.append("\n"); + p.append("\n"); // Repositories - b.append("\n"); - b.append("argeohttp://maven.argeo.org/argeo\n"); - b.append("\n"); + p.append("\n"); + p.append("argeohttp://maven.argeo.org/argeo\n"); + p.append("\n"); - b.append("\n"); - return b.toString(); + p.append("\n"); + return p.toString(); } /** diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java index 1f59f82bd..325d352b0 100644 --- a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/maven/Migration_01_03.java @@ -34,6 +34,7 @@ import org.argeo.slc.jcr.SlcTypes; import org.argeo.slc.repo.ArtifactIndexer; import org.argeo.slc.repo.JarFileIndexer; import org.argeo.slc.repo.RepoUtils; +import org.argeo.slc.repo.osgi.OsgiProfile; import org.osgi.framework.Constants; import org.sonatype.aether.artifact.Artifact; import org.sonatype.aether.util.artifact.DefaultArtifact; @@ -54,6 +55,7 @@ public class Migration_01_03 implements Runnable, SlcNames { private Repository repository; private String sourceWorkspace; private String targetWorkspace; + private String osgiProfile = "JavaSE-1.6.profile"; private List excludedBundles = new ArrayList(); private Map symbolicNamesMapping = new HashMap(); @@ -61,7 +63,8 @@ public class Migration_01_03 implements Runnable, SlcNames { private Session origSession; private Session targetSession; - private List systemPackages; + private List systemPackages = OsgiProfile.PROFILE_JAVA_SE_1_6 + .getSystemPackages(); private String artifactBasePath = "/"; @@ -75,8 +78,8 @@ public class Migration_01_03 implements Runnable, SlcNames { targetWorkspace); // works only in OSGi!! - systemPackages = Arrays.asList(System.getProperty( - "org.osgi.framework.system.packages").split(",")); + // systemPackages = Arrays.asList(System.getProperty( + // "org.osgi.framework.system.packages").split(",")); } public void destroy() { @@ -121,6 +124,16 @@ public class Migration_01_03 implements Runnable, SlcNames { protected void processOrigArtifactVersion(Node origArtifactNode) throws RepositoryException, IOException { Artifact origArtifact = RepoUtils.asArtifact(origArtifactNode); + + // skip eclipse artifacts + if ((origArtifact.getGroupId().startsWith("org.eclipse") && !origArtifact + .getArtifactId().equals("org.eclipse.osgi")) + || (origArtifact.getArtifactId().startsWith("org.polymap"))) { + if (log.isDebugEnabled()) + log.debug("Skip " + origArtifact); + return; + } + String origJarNodeName = MavenConventionsUtils .artifactFileName(origArtifact); if (!origArtifactNode.hasNode(origJarNodeName)) diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/NormalizeGroup.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/NormalizeGroup.java new file mode 100644 index 000000000..4c9a3d592 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/NormalizeGroup.java @@ -0,0 +1,340 @@ +/* + * Copyright (C) 2007-2012 Mathieu Baudier + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.argeo.slc.repo.osgi; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.TreeSet; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Repository; +import javax.jcr.RepositoryException; +import javax.jcr.Session; + +import org.apache.commons.io.FilenameUtils; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; +import org.argeo.jcr.JcrUtils; +import org.argeo.slc.SlcException; +import org.argeo.slc.aether.ArtifactIdComparator; +import org.argeo.slc.jcr.SlcNames; +import org.argeo.slc.jcr.SlcTypes; +import org.argeo.slc.repo.ArtifactIndexer; +import org.argeo.slc.repo.JarFileIndexer; +import org.argeo.slc.repo.RepoUtils; +import org.argeo.slc.repo.maven.MavenConventionsUtils; +import org.osgi.framework.Constants; +import org.sonatype.aether.artifact.Artifact; +import org.sonatype.aether.util.artifact.DefaultArtifact; + +/** + * Make sure that all JCR metadata and Maven metadata are consistent for this + * group of OSGi bundles. + */ +public class NormalizeGroup implements Runnable, SlcNames { + public final static String BINARIES_ARTIFACT_ID = "binaries"; + public final static String SOURCES_ARTIFACT_ID = "sources"; + public final static String SDK_ARTIFACT_ID = "sdk"; + + private final static Log log = LogFactory.getLog(NormalizeGroup.class); + + private Repository repository; + private String workspace; + private String groupId; + private String artifactBasePath = "/"; + private String version = "1.3.0"; + + private ArtifactIndexer artifactIndexer = new ArtifactIndexer(); + private JarFileIndexer jarFileIndexer = new JarFileIndexer(); + + private List systemPackages = OsgiProfile.PROFILE_JAVA_SE_1_6 + .getSystemPackages(); + + // indexes + private Map packagesToSymbolicNames = new HashMap(); + private Map symbolicNamesToNodes = new HashMap(); + + private Set binaries = new TreeSet( + new ArtifactIdComparator()); + private Set sources = new TreeSet( + new ArtifactIdComparator()); + + public void run() { + Session session = null; + try { + session = repository.login(workspace); + + Node groupNode = session.getNode(MavenConventionsUtils.groupPath( + artifactBasePath, groupId)); + // TODO factorize with a traverser pattern? + for (NodeIterator artifactBases = groupNode.getNodes(); artifactBases + .hasNext();) { + Node artifactBase = artifactBases.nextNode(); + if (artifactBase.isNodeType(SlcTypes.SLC_ARTIFACT_BASE)) { + for (NodeIterator artifactVersions = artifactBase + .getNodes(); artifactVersions.hasNext();) { + Node artifactVersion = artifactVersions.nextNode(); + if (artifactVersion + .isNodeType(SlcTypes.SLC_ARTIFACT_VERSION_BASE)) + for (NodeIterator files = artifactVersion + .getNodes(); files.hasNext();) { + Node file = files.nextNode(); + if (file.isNodeType(SlcTypes.SLC_BUNDLE_ARTIFACT)) { + preProcessBundleArtifact(file); + file.getSession().save(); + if (log.isDebugEnabled()) + log.debug("Pre-processed " + + file.getName()); + } + + } + } + } + } + // NodeIterator bundlesIt = listBundleArtifacts(session); + // + // while (bundlesIt.hasNext()) { + // Node bundleNode = bundlesIt.nextNode(); + // preProcessBundleArtifact(bundleNode); + // bundleNode.getSession().save(); + // if (log.isDebugEnabled()) + // log.debug("Pre-processed " + bundleNode.getName()); + // } + + int bundleCount = symbolicNamesToNodes.size(); + if (log.isDebugEnabled()) + log.debug("Indexed " + bundleCount + " bundles"); + + int count = 1; + for (Node bundleNode : symbolicNamesToNodes.values()) { + processBundleArtifact(bundleNode); + bundleNode.getSession().save(); + if (log.isDebugEnabled()) + log.debug(count + "/" + bundleCount + " Processed " + + bundleNode.getName()); + count++; + } + + // indexes + Set indexes = new TreeSet( + new ArtifactIdComparator()); + Artifact indexArtifact = writeIndex(session, BINARIES_ARTIFACT_ID, + binaries); + indexes.add(indexArtifact); + indexArtifact = writeIndex(session, SOURCES_ARTIFACT_ID, sources); + indexes.add(indexArtifact); + // sdk + writeIndex(session, SDK_ARTIFACT_ID, indexes); + } catch (Exception e) { + throw new SlcException("Cannot normalize group " + groupId + " in " + + workspace, e); + } finally { + JcrUtils.logoutQuietly(session); + } + } + + private Artifact writeIndex(Session session, String artifactId, + Set artifacts) throws RepositoryException { + Artifact artifact = new DefaultArtifact(groupId, artifactId, "pom", + version); + String pom = MavenConventionsUtils.artifactsAsDependencyPom(artifact, + artifacts); + Node node = RepoUtils.copyBytesAsArtifact( + session.getNode(artifactBasePath), artifact, pom.getBytes()); + artifactIndexer.index(node); + session.save(); + return artifact; + } + + protected void preProcessBundleArtifact(Node bundleNode) + throws RepositoryException { + artifactIndexer.index(bundleNode); + jarFileIndexer.index(bundleNode); + + String symbolicName = JcrUtils.get(bundleNode, SLC_SYMBOLIC_NAME); + + if (symbolicName.endsWith(".source")) { + // TODO make a shared node with classifier 'sources' + sources.add(RepoUtils.asArtifact(bundleNode)); + return; + } + + NodeIterator exportPackages = bundleNode.getNodes(SLC_ + + Constants.EXPORT_PACKAGE); + while (exportPackages.hasNext()) { + Node exportPackage = exportPackages.nextNode(); + String pkg = JcrUtils.get(exportPackage, SLC_NAME); + packagesToSymbolicNames.put(pkg, symbolicName); + } + + symbolicNamesToNodes.put(symbolicName, bundleNode); + binaries.add(RepoUtils.asArtifact(bundleNode)); + } + + protected void processBundleArtifact(Node bundleNode) + throws RepositoryException { + Node artifactFolder = bundleNode.getParent(); + String baseName = FilenameUtils.getBaseName(bundleNode.getName()); + + // pom + String pom = generatePomForBundle(bundleNode); + String pomName = baseName + ".pom"; + Node pomNode = JcrUtils.copyBytesAsFile(artifactFolder, pomName, + pom.getBytes()); + + // checksum + String bundleSha = JcrUtils.checksumFile(bundleNode, "SHA-1"); + JcrUtils.copyBytesAsFile(artifactFolder, + bundleNode.getName() + ".sha1", bundleSha.getBytes()); + String pomSha = JcrUtils.checksumFile(bundleNode, "SHA-1"); + JcrUtils.copyBytesAsFile(artifactFolder, pomNode.getName() + ".sha1", + pomSha.getBytes()); + } + + private String generatePomForBundle(Node n) throws RepositoryException { + String ownSymbolicName = JcrUtils.get(n, SLC_SYMBOLIC_NAME); + + StringBuffer p = new StringBuffer(); + + // XML header + p.append("\n"); + p.append("\n"); + p.append("4.0.0"); + + // Artifact + // p.append("org.argeoparent1.2.0\n"); + p.append("").append(JcrUtils.get(n, SLC_GROUP_ID)) + .append("\n"); + p.append("").append(JcrUtils.get(n, SLC_ARTIFACT_ID)) + .append("\n"); + p.append("").append(JcrUtils.get(n, SLC_ARTIFACT_VERSION)) + .append("\n"); + p.append("pom\n"); + if (n.hasProperty(SLC_ + Constants.BUNDLE_NAME)) + p.append("") + .append(JcrUtils.get(n, SLC_ + Constants.BUNDLE_NAME)) + .append("\n"); + if (n.hasProperty(SLC_ + Constants.BUNDLE_DESCRIPTION)) + p.append("") + .append(JcrUtils + .get(n, SLC_ + Constants.BUNDLE_DESCRIPTION)) + .append("\n"); + + // Dependencies + Set dependenciesSymbolicNames = new TreeSet(); + Set optionalSymbolicNames = new TreeSet(); + NodeIterator importPackages = n.getNodes(SLC_ + + Constants.IMPORT_PACKAGE); + while (importPackages.hasNext()) { + Node importPackage = importPackages.nextNode(); + String pkg = JcrUtils.get(importPackage, SLC_NAME); + if (packagesToSymbolicNames.containsKey(pkg)) { + String dependencySymbolicName = packagesToSymbolicNames + .get(pkg); + if (JcrUtils.check(importPackage, SLC_OPTIONAL)) + optionalSymbolicNames.add(dependencySymbolicName); + else + dependenciesSymbolicNames.add(dependencySymbolicName); + } else { + if (!JcrUtils.check(importPackage, SLC_OPTIONAL) + && !systemPackages.contains(importPackage)) + log.warn("No bundle found for pkg " + pkg); + } + } + + if (n.hasNode(SLC_ + Constants.FRAGMENT_HOST)) { + String fragmentHost = JcrUtils.get( + n.getNode(SLC_ + Constants.FRAGMENT_HOST), + SLC_SYMBOLIC_NAME); + dependenciesSymbolicNames.add(fragmentHost); + } + + // TODO require bundles + + List dependencyNodes = new ArrayList(); + for (String depSymbName : dependenciesSymbolicNames) { + if (depSymbName.equals(ownSymbolicName)) + continue;// skip self + + if (symbolicNamesToNodes.containsKey(depSymbName)) + dependencyNodes.add(symbolicNamesToNodes.get(depSymbName)); + else + log.warn("Could not find node for " + depSymbName); + } + List optionalDependencyNodes = new ArrayList(); + for (String depSymbName : optionalSymbolicNames) { + if (symbolicNamesToNodes.containsKey(depSymbName)) + optionalDependencyNodes.add(symbolicNamesToNodes + .get(depSymbName)); + else + log.warn("Could not find node for " + depSymbName); + } + + p.append("\n"); + for (Node dependencyNode : dependencyNodes) { + p.append("\n"); + p.append("\t") + .append(JcrUtils.get(dependencyNode, SLC_GROUP_ID)) + .append("\n"); + p.append("\t") + .append(JcrUtils.get(dependencyNode, SLC_ARTIFACT_ID)) + .append("\n"); + p.append("\n"); + } + + if (optionalDependencyNodes.size() > 0) + p.append("\n"); + for (Node dependencyNode : optionalDependencyNodes) { + p.append("\n"); + p.append("\t") + .append(JcrUtils.get(dependencyNode, SLC_GROUP_ID)) + .append("\n"); + p.append("\t") + .append(JcrUtils.get(dependencyNode, SLC_ARTIFACT_ID)) + .append("\n"); + p.append("\ttrue\n"); + p.append("\n"); + } + p.append("\n"); + + // Dependency management + p.append("\n"); + p.append("\n"); + // TODO import SDK + p.append("\n"); + p.append("\n"); + + p.append("\n"); + return p.toString(); + } + + public void setRepository(Repository repository) { + this.repository = repository; + } + + public void setWorkspace(String workspace) { + this.workspace = workspace; + } + + public void setGroupId(String groupId) { + this.groupId = groupId; + } + +} diff --git a/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiProfile.java b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiProfile.java new file mode 100644 index 000000000..b15ed5d29 --- /dev/null +++ b/runtime/org.argeo.slc.repo/src/main/java/org/argeo/slc/repo/osgi/OsgiProfile.java @@ -0,0 +1,55 @@ +package org.argeo.slc.repo.osgi; + +import java.io.InputStream; +import java.net.URL; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Properties; + +import org.apache.commons.io.IOUtils; +import org.argeo.slc.SlcException; + +/** + * Wraps an OSGi profile, simplifying access to its values such as system + * packages, etc. + */ +public class OsgiProfile { + public final static String PROP_SYSTEM_PACKAGES = "org.osgi.framework.system.packages"; + + public final static OsgiProfile PROFILE_JAVA_SE_1_6 = new OsgiProfile( + "JavaSE-1.6.profile"); + + private final URL url; + private final Properties properties; + + public OsgiProfile(URL url) { + this.url = url; + properties = new Properties(); + InputStream in = null; + try { + properties.load(this.url.openStream()); + } catch (Exception e) { + throw new SlcException("Cannot initalize OSGi profile " + url, e); + } finally { + IOUtils.closeQuietly(in); + } + } + + public OsgiProfile(String name) { + this(OsgiProfile.class.getClassLoader().getResource( + '/' + + OsgiProfile.class.getPackage().getName() + .replace('.', '/') + '/' + name)); + } + + public List getSystemPackages() { + String[] splitted = properties.getProperty(PROP_SYSTEM_PACKAGES).split( + ","); + List res = new ArrayList(); + for (String pkg : splitted) { + res.add(pkg.trim()); + } + return Collections.unmodifiableList(res); + } +} diff --git a/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ArtifactIdComparator.java b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ArtifactIdComparator.java new file mode 100644 index 000000000..649e01140 --- /dev/null +++ b/runtime/org.argeo.slc.support.aether/src/main/java/org/argeo/slc/aether/ArtifactIdComparator.java @@ -0,0 +1,20 @@ +package org.argeo.slc.aether; + +import java.util.Comparator; +import java.util.TreeMap; +import java.util.TreeSet; + +import org.sonatype.aether.artifact.Artifact; + +/** + * Compare two artifacts, for use in {@link TreeSet} / {@link TreeMap}, consider + * artifactId first THEN groupId + */ +public class ArtifactIdComparator implements Comparator { + public int compare(Artifact o1, Artifact o2) { + if (o1.getArtifactId().equals(o2.getArtifactId())) + return o1.getGroupId().compareTo(o2.getGroupId()); + return o1.getArtifactId().compareTo(o2.getArtifactId()); + } + +} -- 2.39.2