Index: features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java (revision 65a5426c36b670cd807c262e65efe4083f9cbd46) +++ features/core/src/test/java/org/apache/karaf/features/FeaturesServiceTest.java (revision ) @@ -16,24 +16,12 @@ */ package org.apache.karaf.features; -import static org.easymock.EasyMock.eq; -import static org.easymock.EasyMock.expect; -import static org.easymock.EasyMock.replay; -import static org.easymock.EasyMock.reset; -import static org.easymock.EasyMock.verify; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.PrintWriter; import java.net.MalformedURLException; import java.net.URI; -import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.EnumSet; @@ -51,8 +39,10 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; import org.osgi.framework.BundleException; -import org.osgi.service.packageadmin.PackageAdmin; +import static org.easymock.EasyMock.*; +import static org.junit.Assert.*; + public class FeaturesServiceTest extends TestBase { private static final String FEATURE_WITH_INVALID_BUNDLE = "" + " %szfs:unknown" @@ -434,6 +424,35 @@ verify(bundleManager); } + @Test + public void testInstallFeatureRepositoryWithSystemPropertyInterpolation() throws Exception { + + URI repo = createTempRepo(""); + + + final String fullPath = repo.toString().substring("file:/".length()); + final String uri = "file:/${karaf.test.fullPath}"; + System.setProperty("karaf.test.fullPath", fullPath); + + BundleContext bundleContext = EasyMock.createMock(BundleContext.class); + BundleManager bundleManager = new BundleManager(bundleContext); + expect(bundleContext.getBundles()).andReturn(new Bundle[0]).anyTimes(); + File stateFile = new File("target/FeaturesServiceState.properties"); + try { + expect(bundleContext.getDataFile("FeaturesServiceState.properties")).andReturn(stateFile).anyTimes(); + replay(bundleContext); + FeaturesServiceImpl svc = new FeaturesServiceImpl(bundleManager); + svc.setUrls(uri); + svc.start(); + Repository repository = svc.getRepository(repo); + verify(bundleContext); + assertNotNull(repository); + svc.stop(); + } finally { + assertTrue("Unable to remove state file, subsequent tests will fail (clean install required).", stateFile.delete()); + System.getProperties().remove("karaf.test.fullPath"); + } + } @Test public void testInstallBatchFeatureWithoutContinueOnFailureNoClean() throws Exception { String bundle1Uri = "file:bundle1"; Index: features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java IDEA additional info: Subsystem: com.intellij.openapi.diff.impl.patch.CharsetEP <+>UTF-8 =================================================================== --- features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (revision 65a5426c36b670cd807c262e65efe4083f9cbd46) +++ features/core/src/main/java/org/apache/karaf/features/internal/FeaturesServiceImpl.java (revision ) @@ -16,45 +16,27 @@ */ package org.apache.karaf.features.internal; +import java.io.*; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.*; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.apache.felix.utils.properties.InterpolationHelper; import org.apache.felix.utils.version.VersionRange; import org.apache.felix.utils.version.VersionTable; -import org.apache.karaf.features.BundleInfo; -import org.apache.karaf.features.Conditional; -import org.apache.karaf.features.Dependency; -import org.apache.karaf.features.Feature; -import org.apache.karaf.features.FeatureEvent; -import org.apache.karaf.features.FeaturesListener; -import org.apache.karaf.features.FeaturesService; -import org.apache.karaf.features.Repository; -import org.apache.karaf.features.RepositoryEvent; -import org.apache.karaf.features.Resolver; +import org.apache.karaf.features.*; import org.apache.karaf.features.internal.BundleManager.BundleInstallerResult; import org.apache.karaf.util.collections.CopyOnWriteArrayIdentityList; -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; +import org.osgi.framework.*; import org.osgi.framework.startlevel.BundleStartLevel; import org.osgi.util.tracker.ServiceTracker; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.InputStream; -import java.io.OutputStream; -import java.net.URI; -import java.net.URISyntaxException; -import java.util.*; -import java.util.concurrent.ConcurrentHashMap; -import java.util.concurrent.atomic.AtomicBoolean; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - import static java.lang.String.format; /** @@ -148,6 +130,7 @@ this.uris = new HashSet(); for (String value : s) { value = value.trim(); + value = InterpolationHelper.substVars(value, "featuresRepositories", null, null); if (!value.isEmpty()) { this.uris.add(new URI(value)); }