X-Git-Url: http://git.argeo.org/?a=blobdiff_plain;f=runtime%2Forg.argeo.slc.repo%2Fsrc%2Fmain%2Fjava%2Forg%2Fargeo%2Fslc%2Frepo%2Fosgi%2FNormalizeGroup.java;h=99f31bb0414ae047c913ed7c6641ae1e09f60bee;hb=5686259eb6e4da5006034087c71f349b3097be8d;hp=bc228285a0b88ad633a93c8a6993cf20075895a1;hpb=cbc768fdb716aced92dace492bdaf4fafb5f02a6;p=gpl%2Fargeo-slc.git 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 index bc228285a..99f31bb04 100644 --- 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 @@ -20,6 +20,7 @@ import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.StringTokenizer; import java.util.TreeSet; import javax.jcr.Node; @@ -38,6 +39,7 @@ 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.RepoConstants; import org.argeo.slc.repo.RepoUtils; import org.argeo.slc.repo.maven.MavenConventionsUtils; import org.osgi.framework.Constants; @@ -48,12 +50,12 @@ import org.sonatype.aether.util.artifact.DefaultArtifact; /** * Make sure that all JCR metadata and Maven metadata are consistent for this * group of OSGi bundles. + * + * The job is now done via the various {@code NodeIndexer} of the + * WorkspaceManager. TODO import dependencies in the workspace. */ +@Deprecated 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; @@ -130,6 +132,17 @@ public class NormalizeGroup implements Runnable, SlcNames { if (allArtifactsHighestVersion == null) allArtifactsHighestVersion = aVersion; + // BS will fail if artifacts arrive in this order + // Name1 - V1, name2 - V3, V1 will remain the + // allArtifactsHighestVersion + // Fixed below + else { + Version currVersion = extractOsgiVersion(aVersion); + Version highestVersion = extractOsgiVersion(allArtifactsHighestVersion); + if (currVersion.compareTo(highestVersion) > 0) + allArtifactsHighestVersion = aVersion; + } + } else { Version currVersion = extractOsgiVersion(aVersion); Version currentHighestVersion = extractOsgiVersion(highestAVersion); @@ -161,7 +174,7 @@ public class NormalizeGroup implements Runnable, SlcNames { } } - // if version not set or empty, use the highets version + // if version not set or empty, use the highest version // useful when indexing a product maven repository where // all artifacts have the same version for a given release // => the version can then be left empty @@ -170,8 +183,9 @@ public class NormalizeGroup implements Runnable, SlcNames { version = allArtifactsHighestVersion.getProperty( SLC_ARTIFACT_VERSION).getString(); else - throw new SlcException("Group version " + version - + " is empty."); + version = "0.0"; + // throw new SlcException("Group version " + version + // + " is empty."); int bundleCount = symbolicNamesToNodes.size(); if (log.isDebugEnabled()) @@ -190,13 +204,14 @@ public class NormalizeGroup implements Runnable, SlcNames { // indexes Set indexes = new TreeSet( new ArtifactIdComparator()); - Artifact indexArtifact = writeIndex(session, BINARIES_ARTIFACT_ID, - binaries); + Artifact indexArtifact = writeIndex(session, + RepoConstants.BINARIES_ARTIFACT_ID, binaries); indexes.add(indexArtifact); - indexArtifact = writeIndex(session, SOURCES_ARTIFACT_ID, sources); + indexArtifact = writeIndex(session, RepoConstants.SOURCES_ARTIFACT_ID, + sources); indexes.add(indexArtifact); // sdk - writeIndex(session, SDK_ARTIFACT_ID, indexes); + writeIndex(session, RepoConstants.SDK_ARTIFACT_ID, indexes); if (monitor != null) monitor.worked(1); } @@ -206,7 +221,46 @@ public class NormalizeGroup implements Runnable, SlcNames { String rawVersion = artifactVersion.getProperty(SLC_ARTIFACT_VERSION) .getString(); String cleanVersion = rawVersion.replace("-SNAPSHOT", ".SNAPSHOT"); - return new Version(cleanVersion); + Version osgiVersion = null; + // log invalid version value to enable tracking them + try { + osgiVersion = new Version(cleanVersion); + } catch (IllegalArgumentException e) { + log.error("Version string " + cleanVersion + " is invalid "); + String twickedVersion = twickInvalidVersion(cleanVersion); + osgiVersion = new Version(twickedVersion); + log.error("Using " + twickedVersion + " instead"); + // throw e; + } + return osgiVersion; + } + + private String twickInvalidVersion(String tmpVersion) { + String[] tokens = tmpVersion.split("\\."); + if (tokens.length == 3 && tokens[2].lastIndexOf("-") > 0) { + String newSuffix = tokens[2].replaceFirst("-", "."); + tmpVersion = tmpVersion.replaceFirst(tokens[2], newSuffix); + } else if (tokens.length > 4) { + // FIXME manually remove other "." + StringTokenizer st = new StringTokenizer(tmpVersion, ".", true); + StringBuilder builder = new StringBuilder(); + // Major + builder.append(st.nextToken()).append(st.nextToken()); + // Minor + builder.append(st.nextToken()).append(st.nextToken()); + // Micro + builder.append(st.nextToken()).append(st.nextToken()); + // Qualifier + builder.append(st.nextToken()); + while (st.hasMoreTokens()) { + // consume delimiter + st.nextToken(); + if (st.hasMoreTokens()) + builder.append("-").append(st.nextToken()); + } + tmpVersion = builder.toString(); + } + return tmpVersion; } private Artifact writeIndex(Session session, String artifactId, @@ -234,12 +288,8 @@ public class NormalizeGroup implements Runnable, SlcNames { protected void preProcessBundleArtifact(Node bundleNode) throws RepositoryException { - // we assume nodes are already indexed - // 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'? String bundleName = RepoUtils @@ -304,7 +354,6 @@ public class NormalizeGroup implements Runnable, SlcNames { 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)) @@ -405,8 +454,9 @@ public class NormalizeGroup implements Runnable, SlcNames { p.append("\n"); p.append("\t").append(groupId).append("\n"); p.append("\t") - .append(ownSymbolicName.endsWith(".source") ? SOURCES_ARTIFACT_ID - : BINARIES_ARTIFACT_ID).append("\n"); + .append(ownSymbolicName.endsWith(".source") ? RepoConstants.SOURCES_ARTIFACT_ID + : RepoConstants.BINARIES_ARTIFACT_ID) + .append("\n"); p.append("\t").append(version).append("\n"); p.append("\tpom\n"); p.append("\timport\n"); @@ -418,6 +468,7 @@ public class NormalizeGroup implements Runnable, SlcNames { return p.toString(); } + /* DEPENDENCY INJECTION */ public void setRepository(Repository repository) { this.repository = repository; }