Hi Guillaume,

Besides the felix preference service, to install gshell-features bundle, I also need install bundles like
          getBundle("com.google.code.sshd", "sshd"),
getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-vfs"), getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-jexl"), getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.commons-httpclient"), getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.mina"), getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.oro"), getBundle("org.apache.servicemix.bundles", "org.apache.servicemix.bundles.jline"), getBundle("org.apache.servicemix.kernel", "org.apache.servicemix.kernel.filemonitor"), getBundle("org.apache.servicemix.kernel.gshell", "org.apache.servicemix.kernel.gshell.core"), to overcome the "Unresolved constraint in bundle xx" exception. But with more bundles involved, seems I aslo need set properties for placeholders in the bundles spring dm configuration. The gshell-features bundle import package org.apache.geronimo.gshell.wisdom.command, which provided by gshell-core, and so lots of other bundles gshell-core needed get involved. For me, to install gshell-features bundle I almost need start the whole SMX kernel.
Do I miss something?
Thanks
Freeman

Guillaume Nodet wrote:
What are the other bundles needed ?  Maybe the felix preference service, is
there any other needed ?

On Thu, Mar 12, 2009 at 08:29, Freeman Fang <[email protected]> wrote:

Hi,

I've tried your suggestion first, but it also means we need install several
other bundles, which I though too heavy for the test framework.
It's kind of trade off, for me, I prefer to as least as possible bundles
needed for the test framework.
What dou you think?

Freeman


Guillaume Nodet wrote:

I'm not very keen on having a lot of duplicated classes and logic.
 Wouldn't
it be simpler to just install the gshell-features bundle and call the
FeaturesService instead ?

On Thu, Mar 12, 2009 at 08:30, <[email protected]> wrote:



Author: ffang
Date: Thu Mar 12 07:30:22 2009
New Revision: 752790

URL: http://svn.apache.org/viewvc?rev=752790&view=rev
Log:
[SMX4KNL-213]Improve testing framework to support easily installation of
features

Added:
  servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/


 
servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml
 (with props)


 
servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java
 (with props)


 
servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java
 (with props)


 
servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java
 (with props)


 
servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java
 (with props)
Modified:
  servicemix/smx4/kernel/trunk/gshell/itests/pom.xml


 
servicemix/smx4/kernel/trunk/gshell/itests/src/test/java/org/apache/servicemix/kernel/gshell/itests/CoreTest.java
  servicemix/smx4/kernel/trunk/testing/support/pom.xml


 
servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/AbstractIntegrationTest.java

Modified: servicemix/smx4/kernel/trunk/gshell/itests/pom.xml
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/itests/pom.xml?rev=752790&r1=752789&r2=752790&view=diff


==============================================================================
--- servicemix/smx4/kernel/trunk/gshell/itests/pom.xml (original)
+++ servicemix/smx4/kernel/trunk/gshell/itests/pom.xml Thu Mar 12
07:30:22
2009
@@ -72,6 +72,27 @@

   <build>
       <plugins>
+            <plugin>
+        <artifactId>maven-resources-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>copy-resources</id>
+            <phase>validate</phase>
+            <goals>
+              <goal>copy-resources</goal>
+            </goals>
+            <configuration>
+
 <outputDirectory>${pom.basedir}/target/test-classes/</outputDirectory>
+              <resources>
+                <resource>
+
 <directory>${pom.basedir}/src/test/filtered-resources</directory>
+                  <filtering>true</filtering>
+                </resource>
+              </resources>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
           <!-- generate dependencies versions -->
           <plugin>
               <groupId>org.apache.servicemix.tooling</groupId>
@@ -109,4 +130,4 @@
       </profile>
   </profiles>

-</project>
\ No newline at end of file
+</project>

Added:

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml?rev=752790&view=auto


==============================================================================
---

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml
(added)
+++

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml
Thu Mar 12 07:30:22 2009
@@ -0,0 +1,27 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+
+      Licensed to the Apache Software Foundation (ASF) under one or more
+      contributor license agreements.  See the NOTICE file distributed
with
+      this work for additional information regarding copyright
ownership.
+      The ASF licenses this file to You 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.
+-->
+<features>
+    <feature name="wrapper" version="${version}">
+

 
<bundle>mvn:org.apache.servicemix.kernel.gshell/org.apache.servicemix.kernel.gshell.wrapper/${version}</bundle>
+    </feature>
+    <feature name="obr" version="${version}">
+

 
<bundle>mvn:org.apache.felix/org.apache.felix.bundlerepository/${felix.bundlerepository.version}</bundle>
+

 
<bundle>mvn:org.apache.servicemix.kernel.gshell/org.apache.servicemix.kernel.gshell.obr/${version}</bundle>
+    </feature>
+</features>

Propchange:

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml


------------------------------------------------------------------------------
  svn:eol-style = native

Propchange:

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml


------------------------------------------------------------------------------
  svn:keywords = Rev Date

Propchange:

servicemix/smx4/kernel/trunk/gshell/itests/src/test/filtered-resources/features.xml


------------------------------------------------------------------------------
  svn:mime-type = text/xml

Modified:

servicemix/smx4/kernel/trunk/gshell/itests/src/test/java/org/apache/servicemix/kernel/gshell/itests/CoreTest.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/gshell/itests/src/test/java/org/apache/servicemix/kernel/gshell/itests/CoreTest.java?rev=752790&r1=752789&r2=752790&view=diff


==============================================================================
---

servicemix/smx4/kernel/trunk/gshell/itests/src/test/java/org/apache/servicemix/kernel/gshell/itests/CoreTest.java
(original)
+++

servicemix/smx4/kernel/trunk/gshell/itests/src/test/java/org/apache/servicemix/kernel/gshell/itests/CoreTest.java
Thu Mar 12 07:30:22 2009
@@ -87,6 +87,31 @@
       shell.execute("help");
       shell.execute("..");
   }
+
+    public void testInstallFeature() throws Exception {
+        Shell shell = getOsgiService(Shell.class);
+
+        try {
+            shell.execute("obr");
+            fail("command should not exist");
+        } catch (CommandLineExecutionFailed e) {
+            assertNotNull(e.getCause());
+            assertTrue(e.getCause() instanceof NoSuchCommandException);
+        }
+        try {
+            shell.execute("wrapper");
+            fail("command should not exist");
+        } catch (CommandLineExecutionFailed e) {
+            assertNotNull(e.getCause());
+            assertTrue(e.getCause() instanceof NoSuchCommandException);
+        }
+        String url =
getClass().getClassLoader().getResource("features.xml").toString();
+        addFeatureRepo(url);
+        installFeature("obr");
+        installFeature("wrapper");
+        shell.execute("obr");
+        shell.execute("wrapper");
+    }

   /**
    * TODO: This test seems to fail, there must be a timing issue
somewhere

Modified: servicemix/smx4/kernel/trunk/testing/support/pom.xml
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/pom.xml?rev=752790&r1=752789&r2=752790&view=diff


==============================================================================
--- servicemix/smx4/kernel/trunk/testing/support/pom.xml (original)
+++ servicemix/smx4/kernel/trunk/testing/support/pom.xml Thu Mar 12
07:30:22 2009
@@ -94,6 +94,10 @@
           <groupId>org.apache.servicemix.bundles</groupId>
           <artifactId>org.apache.servicemix.bundles.jaxp-ri</artifactId>
       </dependency>
+        <dependency>
+            <groupId>org.ops4j.pax.url</groupId>
+            <artifactId>pax-url-mvn</artifactId>
+        </dependency>
   </dependencies>

   <build>

Modified:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/AbstractIntegrationTest.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/AbstractIntegrationTest.java?rev=752790&r1=752789&r2=752790&view=diff


==============================================================================
---

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/AbstractIntegrationTest.java
(original)
+++

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/AbstractIntegrationTest.java
Thu Mar 12 07:30:22 2009
@@ -19,6 +19,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.net.URI;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Properties;
@@ -36,6 +37,7 @@
 import org.springframework.util.Assert;
 import org.springframework.util.StringUtils;

+
 public class AbstractIntegrationTest extends
AbstractConfigurableBundleCreatorTests {

   static {
@@ -55,6 +57,7 @@
   }

   private Properties dependencies;
+    private FeatureInstaller featureInstaller;

   @Override
   protected String getPlatformName() {
@@ -109,8 +112,9 @@
           getBundle("org.springframework.osgi", "spring-osgi-extender"),
           getBundle("org.springframework.osgi", "spring-osgi-test"),
           getBundle("org.springframework.osgi",
"spring-osgi-annotation"),
+            getBundle("org.ops4j.pax.url", "pax-url-mvn"),
           getBundle("org.apache.servicemix.kernel.testing",
"org.apache.servicemix.kernel.testing.support"),
-               };
+        };
   }

   protected Bundle installBundle(String groupId, String artifactId,
String classifier, String type) throws Exception {
@@ -120,7 +124,28 @@
       bundle.start();
       return bundle;
   }
+
+    protected void addFeatureRepo(String url) throws Exception {
+        if (featureInstaller == null) {
+            featureInstaller = new FeatureInstaller();
+            featureInstaller.setBundleContext(bundleContext);
+        }
+        featureInstaller.addRepository(new URI(url));
+    }
+
+    protected void installFeature(String name) throws Exception {
+        installFeature(name, FeatureImpl.DEFAULT_VERSION);
+    }

+    protected void installFeature(String name, String version) throws
Exception {
+        if (featureInstaller == null) {
+            featureInstaller = new FeatureInstaller();
+            featureInstaller.setBundleContext(bundleContext);
+
+        }
+        featureInstaller.installFeature(name, version);
+    }
+
   protected Resource locateBundle(String bundleId) {
       Assert.hasText(bundleId, "bundleId should not be empty");


Added:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java?rev=752790&view=auto


==============================================================================
---

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java
(added)
+++

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java
Thu Mar 12 07:30:22 2009
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.kernel.testing.support;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * A feature is a list of bundles associated identified by its name.
+ */
+public interface Feature {
+
+    String getId();
+
+    String getName();
+
+    String getVersion();
+
+    List<Feature> getDependencies();
+
+    List<String> getBundles();
+
+    Map<String, Map<String, String>> getConfigurations();
+
+    void addDependency(Feature dependency);
+
+    void addBundle(String bundle);
+
+    void addConfig(String name, Map<String,String> properties);
+
+}

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java


------------------------------------------------------------------------------
  svn:eol-style = native

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/Feature.java


------------------------------------------------------------------------------
  svn:keywords = Rev Date

Added:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java?rev=752790&view=auto


==============================================================================
---

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java
(added)
+++

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java
Thu Mar 12 07:30:22 2009
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.kernel.testing.support;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+
+public class FeatureImpl implements Feature {
+
+    private String id;
+    private String name;
+    private String version;
+    private List<Feature> dependencies = new ArrayList<Feature>();
+    private List<String> bundles = new ArrayList<String>();
+    private Map<String, Map<String,String>> configs = new
HashMap<String,
Map<String,String>>();
+    public static String SPLIT_FOR_NAME_AND_VERSION =
"_split_for_name_and_version_";
+    public static String DEFAULT_VERSION = "0.0.0";
+
+    public FeatureImpl(String name) {
+        this(name, DEFAULT_VERSION);
+    }
+
+    public FeatureImpl(String name, String version) {
+        this.name = name;
+        this.version = version;
+        this.id = name + "-" + version;
+    }
+
+
+    public String getId() {
+        return id;
+    }
+
+
+    public String getName() {
+        return name;
+    }
+
+
+    public String getVersion() {
+        return version;
+    }
+
+    public void setVersion(String version) {
+        this.version = version;
+    }
+
+
+    public List<Feature> getDependencies() {
+        return dependencies;
+    }
+
+    public List<String> getBundles() {
+        return bundles;
+    }
+
+    public Map<String, Map<String, String>> getConfigurations() {
+        return configs;
+    }
+
+    public void addDependency(Feature dependency) {
+        dependencies.add(dependency);
+    }
+
+    public void addBundle(String bundle) {
+        bundles.add(bundle);
+    }
+
+    public void addConfig(String name, Map<String,String> properties) {
+        configs.put(name, properties);
+    }
+
+    public String toString() {
+        String ret = getName() + SPLIT_FOR_NAME_AND_VERSION +
getVersion();
+        return ret;
+    }
+
+    public static Feature valueOf(String str) {
+        if (str.indexOf(SPLIT_FOR_NAME_AND_VERSION) >= 0) {
+            String strName = str.substring(0,
str.indexOf(SPLIT_FOR_NAME_AND_VERSION));
+            String strVersion =
str.substring(str.indexOf(SPLIT_FOR_NAME_AND_VERSION)
+                    + SPLIT_FOR_NAME_AND_VERSION.length(),
str.length());
+            return new FeatureImpl(strName, strVersion);
+        } else {
+            return new FeatureImpl(str);
+        }
+
+
+    }
+
+    public boolean equals(Object o) {
+        if (this == o) return true;
+        if (o == null || getClass() != o.getClass()) return false;
+
+        FeatureImpl feature = (FeatureImpl) o;
+
+        if (!name.equals(feature.name)) return false;
+        if (!version.equals(feature.version)) return false;
+
+        return true;
+    }
+
+    public int hashCode() {
+        int result = name.hashCode();
+        result = 31 * result + version.hashCode();
+        return result;
+    }
+}

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java


------------------------------------------------------------------------------
  svn:eol-style = native

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureImpl.java


------------------------------------------------------------------------------
  svn:keywords = Rev Date

Added:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java?rev=752790&view=auto


==============================================================================
---

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java
(added)
+++

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java
Thu Mar 12 07:30:22 2009
@@ -0,0 +1,246 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.kernel.testing.support;
+
+import java.io.BufferedInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.URI;
+import java.net.URL;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+import java.util.jar.JarInputStream;
+import java.util.jar.Manifest;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+
+
+import org.osgi.framework.Bundle;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.BundleException;
+import org.osgi.framework.Constants;
+import org.osgi.framework.Version;
+
+
+public class FeatureInstaller {
+
+    private Map<URI, FeatureRepositoryImpl> repositories = new
HashMap<URI, FeatureRepositoryImpl>();
+    private Map<String, Map<String, Feature>> features;
+    private BundleContext bundleContext;
+
+    public void addRepository(URI uri) throws Exception {
+        if (!repositories.values().contains(uri)) {
+            internalAddRepository(uri);
+        }
+    }
+
+    protected FeatureRepositoryImpl internalAddRepository(URI uri)
throws
Exception {
+        FeatureRepositoryImpl repo = new FeatureRepositoryImpl(uri);
+        repositories.put(uri, repo);
+        features = null;
+        return repo;
+    }
+
+    public void setBundleContext(BundleContext bundleContext) {
+        this.bundleContext = bundleContext;
+    }
+
+
+    public void installFeature(String name, String version) throws
Exception {
+        Feature f = getFeature(name, version);
+        if (f == null) {
+            throw new Exception("No feature named '" + name
+                    + "' with version '" + version + "' available");
+        }
+        for (Feature dependency : f.getDependencies()) {
+            installFeature(dependency.getName(),
dependency.getVersion());
+        }
+
+        Set<Long> bundles = new HashSet<Long>();
+        for (String bundleLocation : f.getBundles()) {
+            Bundle b = installBundleIfNeeded(bundleLocation);
+            bundles.add(b.getBundleId());
+        }
+        for (long id : bundles) {
+            bundleContext.getBundle(id).start();
+        }
+
+
+    }
+
+    protected Feature getFeature(String name, String version) throws
Exception {
+        Map<String, Feature> versions = getFeatures().get(name);
+        if (versions == null || versions.isEmpty()) {
+            return null;
+        } else {
+            Feature feature = versions.get(version);
+            if (feature == null &&
FeatureImpl.DEFAULT_VERSION.equals(version)) {
+                Version latest = new Version(cleanupVersion(version));
+                for (String available : versions.keySet()) {
+                    Version availableVersion = new
Version(cleanupVersion(available));
+                    if (availableVersion.compareTo(latest) > 0) {
+                        feature = versions.get(available);
+                        latest = availableVersion;
+                    }
+                }
+            }
+            return feature;
+        }
+    }
+
+    protected Map<String, Map<String, Feature>> getFeatures() throws
Exception {
+        if (features == null) {
+            //the outer map's key is feature name, the inner map's key
is
feature version
+            Map<String, Map<String, Feature>> map = new HashMap<String,
Map<String, Feature>>();
+            // Two phase load:
+            // * first load dependent repositories
+            for (;;) {
+                boolean newRepo = false;
+                for (FeatureRepositoryImpl repo : listRepositories()) {
+                    for (URI uri : repo.getRepositories()) {
+                        if (!repositories.keySet().contains(uri)) {
+                            internalAddRepository(uri);
+                            newRepo = true;
+                        }
+                    }
+                }
+                if (!newRepo) {
+                    break;
+                }
+            }
+            // * then load all features
+            for (FeatureRepositoryImpl repo : repositories.values()) {
+                for (Feature f : repo.getFeatures()) {
+                    if (map.get(f.getName()) == null) {
+                        Map<String, Feature> versionMap = new
HashMap<String, Feature>();
+                        versionMap.put(f.getVersion(), f);
+                        map.put(f.getName(), versionMap);
+                    } else {
+                        map.get(f.getName()).put(f.getVersion(), f);
+                    }
+                }
+            }
+            features = map;
+        }
+        return features;
+    }
+
+    public FeatureRepositoryImpl[] listRepositories() {
+        Collection<FeatureRepositoryImpl> repos = repositories.values();
+        return repos.toArray(new FeatureRepositoryImpl[repos.size()]);
+    }
+
+    protected Bundle installBundleIfNeeded(String bundleLocation) throws
IOException, BundleException {
+        InputStream is = new BufferedInputStream(new
URL(bundleLocation).openStream());
+        try {
+            is.mark(256 * 1024);
+            JarInputStream jar = new JarInputStream(is);
+            Manifest m = jar.getManifest();
+            String sn =
m.getMainAttributes().getValue(Constants.BUNDLE_SYMBOLICNAME);
+            String vStr =
m.getMainAttributes().getValue(Constants.BUNDLE_VERSION);
+            Version v = vStr == null ? Version.emptyVersion :
Version.parseVersion(vStr);
+            for (Bundle b : bundleContext.getBundles()) {
+                if (b.getSymbolicName() != null &&
b.getSymbolicName().equals(sn)) {
+                    vStr = (String)
b.getHeaders().get(Constants.BUNDLE_VERSION);
+                    Version bv = vStr == null ? Version.emptyVersion :
Version.parseVersion(vStr);
+                    if (v.equals(bv)) {
+                        return b;
+                    }
+                }
+            }
+            try {
+                is.reset();
+            } catch (IOException e) {
+                is.close();
+                is = new BufferedInputStream(new
URL(bundleLocation).openStream());
+            }
+            return getBundleContext().installBundle(bundleLocation, is);
+        } finally {
+            is.close();
+        }
+    }
+
+    private BundleContext getBundleContext() {
+        return this.bundleContext;
+    }
+
+    /**
+     * Clean up version parameters. Other builders use more fuzzy
definitions of
+     * the version syntax. This method cleans up such a version to match
an OSGi
+     * version.
+     *
+     * @param version
+     * @return
+     */
+    static Pattern fuzzyVersion  =
Pattern.compile("(\\d+)(\\.(\\d+)(\\.(\\d+))?)?([^a-zA-Z0-9](.*))?",
+                                                   Pattern.DOTALL);
+    static Pattern fuzzyModifier = Pattern.compile("(\\d+[.-])*(.*)",
+                                                   Pattern.DOTALL);
+    static public String cleanupVersion(String version) {
+        Matcher m = fuzzyVersion.matcher(version);
+        if (m.matches()) {
+            StringBuffer result = new StringBuffer();
+            String d1 = m.group(1);
+            String d2 = m.group(3);
+            String d3 = m.group(5);
+            String qualifier = m.group(7);
+
+            if (d1 != null) {
+                result.append(d1);
+                if (d2 != null) {
+                    result.append(".");
+                    result.append(d2);
+                    if (d3 != null) {
+                        result.append(".");
+                        result.append(d3);
+                        if (qualifier != null) {
+                            result.append(".");
+                            cleanupModifier(result, qualifier);
+                        }
+                    } else if (qualifier != null) {
+                        result.append(".0.");
+                        cleanupModifier(result, qualifier);
+                    }
+                } else if (qualifier != null) {
+                    result.append(".0.0.");
+                    cleanupModifier(result, qualifier);
+                }
+                return result.toString();
+            }
+        }
+        return version;
+    }
+
+    static void cleanupModifier(StringBuffer result, String modifier) {
+        Matcher m = fuzzyModifier.matcher(modifier);
+        if (m.matches())
+            modifier = m.group(2);
+
+        for (int i = 0; i < modifier.length(); i++) {
+            char c = modifier.charAt(i);
+            if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z')
+                    || (c >= 'A' && c <= 'Z') || c == '_' || c == '-')
+                result.append(c);
+        }
+    }
+
+}

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java


------------------------------------------------------------------------------
  svn:eol-style = native

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureInstaller.java


------------------------------------------------------------------------------
  svn:keywords = Rev Date

Added:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java
URL:

http://svn.apache.org/viewvc/servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java?rev=752790&view=auto


==============================================================================
---

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java
(added)
+++

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java
Thu Mar 12 07:30:22 2009
@@ -0,0 +1,139 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You 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.apache.servicemix.kernel.testing.support;
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.Hashtable;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import javax.xml.parsers.DocumentBuilderFactory;
+import javax.xml.parsers.ParserConfigurationException;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.xml.sax.SAXException;
+
+
+
+/**
+ * The repository implementation.
+ */
+
+public class FeatureRepositoryImpl {
+
+    private URI uri;
+    private List<Feature> features;
+    private List<URI> repositories;
+
+    public FeatureRepositoryImpl(URI uri) {
+        this.uri = uri;
+    }
+
+
+    public URI getURI() {
+        return uri;
+    }
+
+    public URI[] getRepositories() throws Exception {
+        if (repositories == null) {
+            load();
+        }
+        return repositories.toArray(new URI[repositories.size()]);
+    }
+
+    public Feature[] getFeatures() throws Exception {
+        if (features == null) {
+            load();
+        }
+        return features.toArray(new Feature[features.size()]);
+    }
+
+    public void load() throws IOException {
+        try {
+            repositories = new ArrayList<URI>();
+            features = new ArrayList<Feature>();
+            DocumentBuilderFactory factory =
DocumentBuilderFactory.newInstance();
+            Document doc =
factory.newDocumentBuilder().parse(uri.toURL().openStream());
+            NodeList nodes = doc.getDocumentElement().getChildNodes();
+            for (int i = 0; i < nodes.getLength(); i++) {
+                Node node = nodes.item(i);
+                if (!(node instanceof Element)) {
+                    continue;
+                }
+                if ("repository".equals(node.getNodeName())) {
+                    Element e = (Element) nodes.item(i);
+                    repositories.add(new URI(e.getTextContent()));
+                } else if ("feature".equals(node.getNodeName())) {
+                    Element e = (Element) nodes.item(i);
+                    String name = e.getAttribute("name");
+                    String version = e.getAttribute("version");
+                    Feature f;
+                    if (version != null && version.length() > 0) {
+                        f = new FeatureImpl(name, version);
+                    } else {
+                        f = new FeatureImpl(name);
+                    }
+
+                    NodeList featureNodes =
e.getElementsByTagName("feature");
+                    for (int j = 0; j < featureNodes.getLength(); j++) {
+                        Element b = (Element) featureNodes.item(j);
+                        String dependencyFeatureVersion =
b.getAttribute("version");
+                        if (dependencyFeatureVersion != null &&
dependencyFeatureVersion.length() > 0) {
+                            f.addDependency(new
FeatureImpl(b.getTextContent(), dependencyFeatureVersion));
+                        } else {
+                            f.addDependency(new
FeatureImpl(b.getTextContent()));
+                        }
+                    }
+                    NodeList configNodes =
e.getElementsByTagName("config");
+                    for (int j = 0; j < configNodes.getLength(); j++) {
+                        Element c = (Element) configNodes.item(j);
+                        String cfgName = c.getAttribute("name");
+                        String data = c.getTextContent();
+                        Properties properties = new Properties();
+                        properties.load(new
ByteArrayInputStream(data.getBytes()));
+                        Map<String, String> hashtable = new
Hashtable<String, String>();
+                        for (Object key : properties.keySet()) {
+                            String n = key.toString();
+                            hashtable.put(n, properties.getProperty(n));
+                        }
+                        f.addConfig(cfgName, hashtable);
+                    }
+                    NodeList bundleNodes =
e.getElementsByTagName("bundle");
+                    for (int j = 0; j < bundleNodes.getLength(); j++) {
+                        Element b = (Element) bundleNodes.item(j);
+                        f.addBundle(b.getTextContent());
+                    }
+                    features.add(f);
+                }
+            }
+        } catch (SAXException e) {
+            throw (IOException) new IOException().initCause(e);
+        } catch (ParserConfigurationException e) {
+            throw (IOException) new IOException().initCause(e);
+        } catch (URISyntaxException e) {
+            throw (IOException) new IOException().initCause(e);
+        }
+    }
+
+}

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java


------------------------------------------------------------------------------
  svn:eol-style = native

Propchange:

servicemix/smx4/kernel/trunk/testing/support/src/main/java/org/apache/servicemix/kernel/testing/support/FeatureRepositoryImpl.java


------------------------------------------------------------------------------
  svn:keywords = Rev Date










Reply via email to