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