You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@karaf.apache.org by dj...@apache.org on 2011/03/19 00:29:46 UTC

svn commit: r1083108 - in /karaf/trunk: assemblies/features/framework/src/main/filtered-resources/resources/etc/ main/src/main/java/org/apache/karaf/main/ tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/

Author: djencks
Date: Fri Mar 18 23:29:46 2011
New Revision: 1083108

URL: http://svn.apache.org/viewvc?rev=1083108&view=rev
Log:
KARAF-523 use mvn: style maven ids by default and add comments into startup.properties

Modified:
    karaf/trunk/assemblies/features/framework/src/main/filtered-resources/resources/etc/startup.properties
    karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
    karaf/trunk/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java

Modified: karaf/trunk/assemblies/features/framework/src/main/filtered-resources/resources/etc/startup.properties
URL: http://svn.apache.org/viewvc/karaf/trunk/assemblies/features/framework/src/main/filtered-resources/resources/etc/startup.properties?rev=1083108&r1=1083107&r2=1083108&view=diff
==============================================================================
--- karaf/trunk/assemblies/features/framework/src/main/filtered-resources/resources/etc/startup.properties (original)
+++ karaf/trunk/assemblies/features/framework/src/main/filtered-resources/resources/etc/startup.properties Fri Mar 18 23:29:46 2011
@@ -23,53 +23,53 @@
 #
 # Startup core services like logging
 #
-org.ops4j.pax.url\:pax-url-mvn\:${pax.url.version}=5
-org.ops4j.pax.url\:pax-url-wrap\:${pax.url.version}=5
-org.ops4j.pax.logging\:pax-logging-api\:${pax.logging.version}=8
-org.ops4j.pax.logging\:pax-logging-service\:${pax.logging.version}=8
-org.apache.felix\:org.apache.felix.configadmin\:${felix.configadmin.version}=10
-org.apache.felix\:org.apache.felix.fileinstall\:${felix.fileinstall.version}=11
+mvn\:org.ops4j.pax.url/pax-url-mvn/${pax.url.version}=5
+mvn\:org.ops4j.pax.url/pax-url-wrap/${pax.url.version}=5
+mvn\:org.ops4j.pax.logging/pax-logging-api/${pax.logging.version}=8
+mvn\:org.ops4j.pax.logging/pax-logging-service/${pax.logging.version}=8
+mvn\:org.apache.felix/org.apache.felix.configadmin/${felix.configadmin.version}=10
+mvn\:org.apache.felix/org.apache.felix.fileinstall/${felix.fileinstall.version}=11
 
 #
 # The rest of the services..
 #
-org.apache.servicemix.bundles\:org.apache.servicemix.bundles.asm\:${asm.bundle.version}=20
-org.apache.aries\:org.apache.aries.util\:${aries.util.version}=20
-org.apache.aries.proxy\:org.apache.aries.proxy\:${aries.proxy.version}=20
-org.apache.aries.blueprint\:org.apache.aries.blueprint\:${aries.blueprint.version}=20
-
-org.apache.karaf.shell\:org.apache.karaf.shell.console\:${project.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.osgi\:${project.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.log\:${project.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.packages\:${project.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.commands\:${project.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.dev\:${project.version}=30
-org.apache.karaf.jaas\:org.apache.karaf.jaas.config\:${project.version}=30
-org.apache.karaf.jaas\:org.apache.karaf.jaas.modules\:${project.version}=30
-org.apache.karaf.jaas\:org.apache.karaf.jaas.command\:${project.version}=30
-org.apache.karaf.features\:org.apache.karaf.features.core\:${project.version}=30
-org.apache.karaf.features\:org.apache.karaf.features.command\:${project.version}=30
-org.apache.karaf.features\:org.apache.karaf.features.management\:${project.version}=30
-
-org.apache.karaf.diagnostic\:org.apache.karaf.diagnostic.core\:${project.version}=30
-org.apache.karaf.diagnostic\:org.apache.karaf.diagnostic.common\:${project.version}=30
-org.apache.karaf.diagnostic\:org.apache.karaf.diagnostic.command\:${project.version}=30
-org.apache.karaf.diagnostic\:org.apache.karaf.diagnostic.management\:${project.version}=30
-
-org.apache.karaf\:org.apache.karaf.management\:${project.version}=30
-org.apache.aries.jmx\:org.apache.aries.jmx\:${aries.jmx.version}=30
-org.apache.aries.jmx\:org.apache.aries.jmx.blueprint\:${aries.jmx.version}=30
-
-org.apache.karaf.admin\:org.apache.karaf.admin.core\:${project.version}=30
-org.apache.karaf.admin\:org.apache.karaf.admin.command\:${project.version}=30
-org.apache.karaf.admin\:org.apache.karaf.admin.management\:${project.version}=30
-
-org.apache.mina\:mina-core\:${mina.version}=30
-org.apache.sshd\:sshd-core\:${sshd.version}=30
-org.apache.karaf.shell\:org.apache.karaf.shell.ssh\:${project.version}=30
-
-org.apache.karaf.deployer\:org.apache.karaf.deployer.spring\:${project.version}=30
-org.apache.karaf.deployer\:org.apache.karaf.deployer.blueprint\:${project.version}=30
-org.apache.karaf.deployer\:org.apache.karaf.deployer.features\:${project.version}=30
-org.apache.karaf.deployer\:org.apache.karaf.deployer.kar\:${project.version}=30
-org.apache.karaf.deployer\:org.apache.karaf.deployer.wrap\:${project.version}=30
+mvn\:org.apache.servicemix.bundles/org.apache.servicemix.bundles.asm/${asm.bundle.version}=20
+mvn\:org.apache.aries/org.apache.aries.util/${aries.util.version}=20
+mvn\:org.apache.aries.proxy/org.apache.aries.proxy/${aries.proxy.version}=20
+mvn\:org.apache.aries.blueprint/org.apache.aries.blueprint/${aries.blueprint.version}=20
+
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.console/${project.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.osgi/${project.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.log/${project.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.packages/${project.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.commands/${project.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.dev/${project.version}=30
+mvn\:org.apache.karaf.jaas/org.apache.karaf.jaas.config/${project.version}=30
+mvn\:org.apache.karaf.jaas/org.apache.karaf.jaas.modules/${project.version}=30
+mvn\:org.apache.karaf.jaas/org.apache.karaf.jaas.command/${project.version}=30
+mvn\:org.apache.karaf.features/org.apache.karaf.features.core/${project.version}=30
+mvn\:org.apache.karaf.features/org.apache.karaf.features.command/${project.version}=30
+mvn\:org.apache.karaf.features/org.apache.karaf.features.management/${project.version}=30
+
+mvn\:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.core/${project.version}=30
+mvn\:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.common/${project.version}=30
+mvn\:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.command/${project.version}=30
+mvn\:org.apache.karaf.diagnostic/org.apache.karaf.diagnostic.management/${project.version}=30
+
+mvn\:org.apache.karaf/org.apache.karaf.management/${project.version}=30
+mvn\:org.apache.aries.jmx/org.apache.aries.jmx/${aries.jmx.version}=30
+mvn\:org.apache.aries.jmx/org.apache.aries.jmx.blueprint/${aries.jmx.version}=30
+
+mvn\:org.apache.karaf.admin/org.apache.karaf.admin.core/${project.version}=30
+mvn\:org.apache.karaf.admin/org.apache.karaf.admin.command/${project.version}=30
+mvn\:org.apache.karaf.admin/org.apache.karaf.admin.management/${project.version}=30
+
+mvn\:org.apache.mina/mina-core/${mina.version}=30
+mvn\:org.apache.sshd/sshd-core/${sshd.version}=30
+mvn\:org.apache.karaf.shell/org.apache.karaf.shell.ssh/${project.version}=30
+
+mvn\:org.apache.karaf.deployer/org.apache.karaf.deployer.spring/${project.version}=30
+mvn\:org.apache.karaf.deployer/org.apache.karaf.deployer.blueprint/${project.version}=30
+mvn\:org.apache.karaf.deployer/org.apache.karaf.deployer.features/${project.version}=30
+mvn\:org.apache.karaf.deployer/org.apache.karaf.deployer.kar/${project.version}=30
+mvn\:org.apache.karaf.deployer/org.apache.karaf.deployer.wrap/${project.version}=30

Modified: karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java
URL: http://svn.apache.org/viewvc/karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java?rev=1083108&r1=1083107&r2=1083108&view=diff
==============================================================================
--- karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java (original)
+++ karaf/trunk/main/src/main/java/org/apache/karaf/main/Main.java Fri Mar 18 23:29:46 2011
@@ -1064,9 +1064,7 @@ public class Main {
     }
 
     private static File findFile(File dir, String name) {
-        if (name.indexOf(':') > -1) {
-            name = fromMaven(name);
-        }
+        name = fromMaven(name);
         File theFile = new File(dir, name);
 
         if (theFile.exists() && !theFile.isDirectory()) {
@@ -1075,22 +1073,40 @@ public class Main {
         return null;
     }
 
+    /**
+     * Returns a path for an srtifact.
+     * Input: path (no ':') returns path
+     * Input: mvn:<groupId>/<artifactId>/<version>/<type>/<classifier> converts to default repo location path
+     * Input:  <groupId>:<artifactId>:<version>:<type>:<classifier> converts to default repo location path
+     * type and classifier are optional.
+     *
+     *
+     * @param name input artifact info
+     * @return path as supplied or a default maven repo path
+     */
     private static String fromMaven(String name) {
-        String[] bits = name.split(":");
-        StringBuilder b = new StringBuilder(bits[0]);
+        if (name.indexOf(':') == -1) {
+            return name;
+        }
+        int firstBit = 0;
+        if (name.startsWith("mvn:")) {
+            firstBit = 1;
+        }
+        String[] bits = name.split("[:/]");
+        StringBuilder b = new StringBuilder(bits[firstBit]);
         for (int i = 0; i < b.length(); i++) {
             if (b.charAt(i) == '.') {
                 b.setCharAt(i, '/');
             }
         }
-        b.append('/').append(bits[1]); //artifactId
-        b.append('/').append(bits[2]);//version
-        b.append('/').append(bits[1]).append('-').append(bits[2]);
-        if (bits.length == 5) {
-            b.append('-').append(bits[4]); //classifier
+        b.append('/').append(bits[firstBit + 1]); //artifactId
+        b.append('/').append(bits[firstBit + 2]); //version
+        b.append('/').append(bits[firstBit + 1]).append('-').append(bits[firstBit + 2]);
+        if (bits.length == firstBit + 5 && !bits[firstBit + 4].isEmpty()) {
+            b.append('-').append(bits[firstBit + 4]); //classifier
         }
-        if (bits.length >=4) {
-            b.append('.').append(bits[3]);
+        if (bits.length >= firstBit + 4 && !bits[firstBit + 3].isEmpty()) {
+            b.append('.').append(bits[firstBit + 3]);
         } else {
             b.append(".jar");
         }

Modified: karaf/trunk/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java
URL: http://svn.apache.org/viewvc/karaf/trunk/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java?rev=1083108&r1=1083107&r2=1083108&view=diff
==============================================================================
--- karaf/trunk/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java (original)
+++ karaf/trunk/tooling/features-maven-plugin/src/main/java/org/apache/karaf/tooling/features/InstallKarsMojo.java Fri Mar 18 23:29:46 2011
@@ -25,11 +25,14 @@ import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.InputStream;
 import java.io.OutputStream;
+import java.lang.reflect.Field;
 import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.EnumSet;
-import java.util.LinkedHashMap;
+import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
@@ -42,9 +45,6 @@ import org.apache.karaf.features.interna
 import org.apache.karaf.features.internal.model.Feature;
 import org.apache.karaf.features.internal.model.JaxbUtil;
 import org.apache.maven.artifact.Artifact;
-import org.apache.maven.artifact.repository.ArtifactRepository;
-import org.apache.maven.artifact.repository.DefaultArtifactRepository;
-import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
 import org.apache.maven.artifact.repository.layout.DefaultRepositoryLayout;
 import org.apache.maven.plugin.MojoExecutionException;
 import org.apache.maven.plugin.MojoFailureException;
@@ -168,7 +168,7 @@ public class InstallKarsMojo extends Moj
                 }
             } else {
                 getLog().info("Installing feature to system and startup.properties");
-                Properties startupProperties = new Properties();
+                CommentProperties startupProperties = new CommentProperties();
                 if (startupPropertiesFile.exists()) {
                     InputStream in = new FileInputStream(startupPropertiesFile);
                     try {
@@ -195,6 +195,7 @@ public class InstallKarsMojo extends Moj
                     in.close();
                 }
                 for (Feature feature: features.getFeature()) {
+                    List<String> comment = Arrays.asList(new String[] {"", "# feature: " + feature.getName() + " version: " + feature.getVersion()});
                     for (Bundle bundle: feature.getBundle()) {
                         String location = bundle.getLocation();
                         String startLevel = Integer.toString(bundle.getStartLevel());
@@ -203,9 +204,21 @@ public class InstallKarsMojo extends Moj
 //                            getLog().warn("bad bundle: " + location);
 //                        } else {
 //                        Artifact bundleArtifact = factory.createArtifact(bits[1], bits[2], bits[3], null, bits.length == 4? "jar": bits[4]);
-                        String bundlePath = location.startsWith("mvn:")? location.substring("mvn:".length()).replaceAll("/", ":"): location;
+//                        String bundlePath = location.startsWith("mvn:")? location.substring("mvn:".length()).replaceAll("/", ":"): location;
                         //layout.pathOf(bundleArtifact);
-                        startupProperties.put(bundlePath, startLevel);
+                        if (startupProperties.containsKey(location)) {
+                            int oldStartLevel = Integer.decode(startupProperties.get(location));
+                            if (oldStartLevel > bundle.getStartLevel()) {
+                                startupProperties.put(location, startLevel);
+                            }
+                        } else {
+                            if (comment == null) {
+                                startupProperties.put(location, startLevel);
+                            } else {
+                                startupProperties.put(location, comment, startLevel);
+                                comment = null;
+                            }
+                        }
                     }
                 }
 
@@ -271,4 +284,108 @@ public class InstallKarsMojo extends Moj
         }
     }
 
+    // when FELIX-2887 is ready we can use plain Properties again
+    private static class CommentProperties extends Properties {
+
+        private Map<String, Layout> layout;
+        private Map<String, String> storage;
+
+        public CommentProperties() {
+            this.layout = (Map<String, Layout>) getField("layout");
+            storage = (Map<String, String>) getField("storage");
+        }
+
+        private Object getField(String fieldName)  {
+            try {
+                Field l = Properties.class.getDeclaredField(fieldName);
+                boolean old = l.isAccessible();
+                l.setAccessible(true);
+                Object layout = l.get(this);
+                l.setAccessible(old);
+                return layout;
+            } catch (Exception e) {
+                throw new RuntimeException("Could not access field " + fieldName, e);
+            }
+        }
+
+        public String put(String key, List<String> commentLines, List<String> valueLines) {
+            commentLines = new ArrayList<String>(commentLines);
+            valueLines = new ArrayList<String>(valueLines);
+            String escapedKey = escapeKey(key);
+            int lastLine = valueLines.size() - 1;
+            if (valueLines.isEmpty()) {
+                valueLines.add(escapedKey + "=");
+            } else if (!valueLines.get(0).trim().startsWith(escapedKey)) {
+                valueLines.set(0, escapedKey + " = " + escapeJava(valueLines.get(0)) + (0 < lastLine? "\\": ""));
+            }
+            for (int i = 1; i < valueLines.size(); i++) {
+                valueLines.set(i, escapeJava(valueLines.get(i)) + (i < lastLine? "\\": ""));
+            }
+            StringBuilder value = new StringBuilder();
+            for (String line: valueLines) {
+                value.append(line);
+            }
+            this.layout.put(key, new Layout(commentLines, valueLines));
+            return storage.put(key, unescapeJava(value.toString()));
+        }
+
+        public String put(String key, List<String> commentLines, String value) {
+            commentLines = new ArrayList<String>(commentLines);
+            this.layout.put(key, new Layout(commentLines, null));
+            return storage.put(key, value);
+        }
+
+        public String put(String key, String comment, String value) {
+            return put(key, Collections.singletonList(comment), value);
+        }
+
+        public List<String> getRaw(String key) {
+            if (layout.containsKey(key)) {
+                if (layout.get(key).getValueLines() != null) {
+                    return new ArrayList<String>(layout.get(key).getValueLines());
+                }
+            }
+            List<String> result = new ArrayList<String>();
+            if (storage.containsKey(key)) {
+                result.add(storage.get(key));
+            }
+            return result;
+        }
+
+        /** The list of possible key/value separators */
+        private static final char[] SEPARATORS = new char[] {'=', ':'};
+
+        /** The white space characters used as key/value separators. */
+        private static final char[] WHITE_SPACE = new char[] {' ', '\t', '\f'};
+        /**
+         * Escape the separators in the key.
+         *
+         * @param key the key
+         * @return the escaped key
+         */
+        private static String escapeKey(String key)
+        {
+            StringBuffer newkey = new StringBuffer();
+
+            for (int i = 0; i < key.length(); i++)
+            {
+                char c = key.charAt(i);
+
+                if (contains(SEPARATORS, c) || contains(WHITE_SPACE, c))
+                {
+                    // escape the separator
+                    newkey.append('\\');
+                    newkey.append(c);
+                }
+                else
+                {
+                    newkey.append(c);
+                }
+            }
+
+            return newkey.toString();
+        }
+
+    }
+
 }