bug347904 - Consume new shell from Equinox in Virgo, shell per region support
diff --git a/build-kernel/bin/dmk.bat b/build-kernel/bin/dmk.bat index eabefdd..0ac7bb7 100755 --- a/build-kernel/bin/dmk.bat +++ b/build-kernel/bin/dmk.bat
@@ -178,6 +178,9 @@ set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.authentication.file="%CONFIG_DIR%\org.eclipse.virgo.kernel.users.properties" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Djava.io.tmpdir="%TMP_DIR%" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.virgo.kernel.home="%KERNEL_HOME%" + set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dorg.eclipse.equinox.console.jaas.file="%CONFIG_DIR%/store" + set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dssh.server.keystore="%CONFIG_DIR%/hostkey.ser" + set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -Dgosh.args="--nointeractive" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -classpath "%CLASSPATH%" set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% org.eclipse.virgo.osgi.launcher.Launcher set KERNEL_JAVA_PARMS=%KERNEL_JAVA_PARMS% -config "%KERNEL_HOME%\lib\org.eclipse.virgo.kernel.launch.properties"
diff --git a/build-kernel/bin/dmk.sh b/build-kernel/bin/dmk.sh index 5f8112b..b0de63f 100755 --- a/build-kernel/bin/dmk.sh +++ b/build-kernel/bin/dmk.sh
@@ -176,6 +176,9 @@ -Dorg.eclipse.virgo.kernel.authentication.file=$CONFIG_DIR/org.eclipse.virgo.kernel.users.properties \ -Djava.io.tmpdir=$TMP_DIR \ -Dorg.eclipse.virgo.kernel.home=$KERNEL_HOME \ + -Dorg.eclipse.equinox.console.jaas.file="$CONFIG_DIR/store" \ + -Dssh.server.keystore="$CONFIG_DIR/hostkey.ser" \ + -Dgosh.args="--nointeractive" \ -classpath $CLASSPATH \ org.eclipse.virgo.osgi.launcher.Launcher \ -config $KERNEL_HOME/lib/org.eclipse.virgo.kernel.launch.properties \
diff --git a/build-kernel/build.xml b/build-kernel/build.xml index f1e14ad..1fab054 100644 --- a/build-kernel/build.xml +++ b/build-kernel/build.xml
@@ -91,6 +91,10 @@ <filter token="SPRING.VERSION" value="${org.springframework}"/> <filter token="UTIL.VERSION" value="${org.eclipse.virgo.util}"/> <filter token="OSGI.EXTENSIONS.VERSION" value="${org.eclipse.virgo.osgi}"/> + <filter token="FELIX.GOGO.VERSION" value="${org.apache.felix.gogo}"/> + <filter token="MINA.CORE.VERSION" value="${com.springsource.org.apache.mina.core}"/> + <filter token="SSHD.CORE.VERSION" value="${com.springsource.org.apache.sshd.core}"/> + <filter token="EQUINOX.CONSOLE.VERSION" value="${org.eclipse.equinox.console.supportability}"/> </filterset> </copy> @@ -110,6 +114,10 @@ <filter token="SPRING.DM.VERSION" value="${org.springframework.osgi}"/> <filter token="SPRING.VERSION" value="${org.springframework}"/> <filter token="UTIL.VERSION" value="${org.eclipse.virgo.util}"/> + <filter token="FELIX.GOGO.VERSION" value="${org.apache.felix.gogo}"/> + <filter token="MINA.CORE.VERSION" value="${com.springsource.org.apache.mina.core}"/> + <filter token="SSHD.CORE.VERSION" value="${com.springsource.org.apache.sshd.core}"/> + <filter token="EQUINOX.CONSOLE.VERSION" value="${org.eclipse.equinox.console.supportability}"/> </filterset> </copy>
diff --git a/build-kernel/config/org.eclipse.virgo.kernel.authentication.config b/build-kernel/config/org.eclipse.virgo.kernel.authentication.config index 5adc6b8..be90e61 100644 --- a/build-kernel/config/org.eclipse.virgo.kernel.authentication.config +++ b/build-kernel/config/org.eclipse.virgo.kernel.authentication.config
@@ -1,3 +1,6 @@ virgo-kernel { org.eclipse.virgo.kernel.authentication.KernelLoginModule REQUIRED; }; +equinox_console { + org.eclipse.equinox.console.jaas.SecureStorageLoginModule REQUIRED; +};
diff --git a/build-kernel/config/org.eclipse.virgo.kernel.userregion.properties b/build-kernel/config/org.eclipse.virgo.kernel.userregion.properties index 53bb86a..16c8aa0 100644 --- a/build-kernel/config/org.eclipse.virgo.kernel.userregion.properties +++ b/build-kernel/config/org.eclipse.virgo.kernel.userregion.properties
@@ -1,6 +1,14 @@ baseBundles = \ + file:lib/kernel/org.eclipse.equinox.cm-@EQUINOX.CONFIGADMIN.VERSION@.jar@start,\ file:lib/kernel/org.eclipse.virgo.kernel.userregion-@KERNEL.VERSION@.jar@start,\ - file:lib/kernel/org.eclipse.virgo.kernel.osgicommand-@KERNEL.VERSION@.jar@start + file:lib/kernel/org.eclipse.virgo.kernel.osgicommand-@KERNEL.VERSION@.jar@start,\ + file:lib/kernel/org.eclipse.osgi.services-@OSGI.SERVICES.VERSION@.jar@start,\ + file:lib/kernel/com.springsource.org.apache.mina.core-@MINA.CORE.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.command-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.runtime-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.shell-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/org.eclipse.equinox.console.supportability-@EQUINOX.CONSOLE.VERSION@.jar@start,\ + file:lib/kernel/com.springsource.org.apache.sshd.core-@SSHD.CORE.VERSION@.jar@start bundleImports = org.eclipse.osgi;bundle-version="0" @@ -9,6 +17,7 @@ org.eclipse.virgo.kernel.core;version="0",\ org.eclipse.virgo.kernel.deployer.core;version="0",\ org.eclipse.virgo.kernel.deployer.core.event;version="0",\ + org.eclipse.virgo.kernel.deployer.config;version="0",\ org.eclipse.virgo.kernel.install.*;version="0",\ org.eclipse.virgo.kernel.osgi.*;version="0",\ org.eclipse.virgo.kernel.model;version="0",\ @@ -27,7 +36,6 @@ org.apache.commons.logging;version="[1.0.0,2.0.0)",\ org.apache.commons.logging.impl;version="[1.0.0,2.0.0)",\ org.aspectj.*;version="[1.6.5.RELEASE,2.0.0)",\ - org.osgi.service.cm;version="0",\ org.osgi.service.event;version="0",\ org.osgi.service.log;version="0",\ org.eclipse.equinox.region;version="1",\ @@ -52,7 +60,6 @@ org.eclipse.virgo.medic.eventlog.EventLoggerFactory,\ org.eclipse.virgo.repository.Repository,\ org.eclipse.virgo.kernel.core.Shutdown,\ - org.osgi.service.cm.ConfigurationAdmin,\ org.osgi.service.event.EventAdmin,\ org.osgi.service.log.LogService,\ org.eclipse.virgo.medic.eventlog.EventLogger,\ @@ -61,7 +68,8 @@ org.eclipse.virgo.kernel.shim.serviceability.TracingService,\ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\ org.eclipse.osgi.service.resolver.PlatformAdmin,\ - org.osgi.service.packageadmin.PackageAdmin + org.osgi.service.packageadmin.PackageAdmin,\ + org.eclipse.virgo.kernel.core.ConfigurationExporter serviceExports =\ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\ @@ -75,10 +83,8 @@ org.eclipse.virgo.kernel.osgi.framework.PackageAdminUtil,\ org.eclipse.equinox.region.Region,\ org.osgi.service.event.EventHandler,\ - org.osgi.service.cm.ConfigurationListener,\ - org.osgi.service.cm.ManagedService,\ - org.osgi.service.cm.ManagedServiceFactory,\ - org.osgi.framework.BundleContext + org.osgi.framework.BundleContext,\ + org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer # the next line must not be broken with back-slashes initialArtifacts = repository:plan/org.eclipse.virgo.kernel.userregion.springdm
diff --git a/build-kernel/config/osgi.console.ssh.properties b/build-kernel/config/osgi.console.ssh.properties new file mode 100644 index 0000000..24c060a --- /dev/null +++ b/build-kernel/config/osgi.console.ssh.properties
@@ -0,0 +1,2 @@ +port=2402 +host=localhost \ No newline at end of file
diff --git a/build-kernel/config/osgi.console.telnet.properties b/build-kernel/config/osgi.console.telnet.properties new file mode 100644 index 0000000..8c6787d --- /dev/null +++ b/build-kernel/config/osgi.console.telnet.properties
@@ -0,0 +1,2 @@ +port=2401 +host=localhost \ No newline at end of file
diff --git a/build-kernel/kernel-ivy.xml b/build-kernel/kernel-ivy.xml index 558022d..0292ac2 100644 --- a/build-kernel/kernel-ivy.xml +++ b/build-kernel/kernel-ivy.xml
@@ -22,6 +22,11 @@ <dependency org="org.eclipse.osgi" name="org.eclipse.equinox.ds" rev="${org.eclipse.equinox.ds}" conf="lib-kernel->runtime"/> <dependency org="org.eclipse.osgi" name="org.eclipse.equinox.util" rev="${org.eclipse.equinox.util}" conf="lib-kernel->runtime"/> <dependency org="org.eclipse.osgi" name='org.eclipse.equinox.region' rev='${org.eclipse.equinox.region}' conf='lib-kernel->runtime' /> + <dependency org="org.apache.felix" name="org.apache.felix.gogo.command" rev="${org.apache.felix.gogo}" conf="lib-kernel->runtime" /> + <dependency org="org.apache.felix" name="org.apache.felix.gogo.runtime" rev="${org.apache.felix.gogo}" conf="lib-kernel->runtime" /> + <dependency org="org.apache.felix" name="org.apache.felix.gogo.shell" rev="${org.apache.felix.gogo}" conf="lib-kernel->runtime" /> + <dependency org="org.apache.mina" name="com.springsource.org.apache.mina.core" rev="${com.springsource.org.apache.mina.core}" conf="lib-kernel->runtime" /> + <dependency org="org.apache.mina" name="com.springsource.org.apache.sshd.core" rev="${com.springsource.org.apache.sshd.core}" conf="lib-kernel->runtime" /> <!-- repository-ext --> <dependency org="org.springframework.osgi" name="org.springframework.osgi.core" rev="${org.springframework.osgi}" conf="repository-ext->runtime"/>
diff --git a/build-kernel/lib-ivy.xml b/build-kernel/lib-ivy.xml index 896e0c3..94f2e35 100644 --- a/build-kernel/lib-ivy.xml +++ b/build-kernel/lib-ivy.xml
@@ -17,6 +17,7 @@ <dependency org="org.eclipse.virgo.osgi" name="org.eclipse.virgo.osgi.extensions.equinox" rev="${org.eclipse.virgo.osgi}" conf="lib->runtime"/> <dependency org="org.eclipse.virgo.osgi" name="org.eclipse.virgo.osgi.console" rev="${org.eclipse.virgo.osgi}" conf="lib->runtime"/> <dependency org="javax.transaction" name="com.springsource.javax.transaction" rev="${javax.transaction}" conf="lib->runtime"/> + <dependency org="org.eclipse.osgi" name="org.eclipse.equinox.console.supportability" rev="${org.eclipse.equinox.console.supportability}" conf="lib->runtime" /> </dependencies> </ivy-module>
diff --git a/build-kernel/lib/org.eclipse.virgo.kernel.launch.properties b/build-kernel/lib/org.eclipse.virgo.kernel.launch.properties index 6ced8fd..10d3718 100644 --- a/build-kernel/lib/org.eclipse.virgo.kernel.launch.properties +++ b/build-kernel/lib/org.eclipse.virgo.kernel.launch.properties
@@ -39,7 +39,13 @@ file:lib/kernel/org.eclipse.virgo.kernel.shell-@KERNEL.VERSION@.jar@start,\ file:lib/kernel/org.eclipse.virgo.kernel.osgi-@KERNEL.VERSION@.jar@start,\ file:lib/kernel/org.eclipse.virgo.kernel.core-@KERNEL.VERSION@.jar@start,\ - file:lib/kernel/org.eclipse.virgo.kernel.userregionfactory-@KERNEL.VERSION@.jar@start + file:lib/kernel/org.eclipse.virgo.kernel.userregionfactory-@KERNEL.VERSION@.jar@start,\ + file:lib/kernel/com.springsource.org.apache.mina.core-@MINA.CORE.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.command-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.runtime-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/kernel/org.apache.felix.gogo.shell-@FELIX.GOGO.VERSION@.jar@start,\ + file:lib/org.eclipse.equinox.console.supportability-@EQUINOX.CONSOLE.VERSION@.jar@start,\ + file:lib/kernel/com.springsource.org.apache.sshd.core-@SSHD.CORE.VERSION@.jar@start #Equinox Configuration osgi.parentClassloader=fwk @@ -51,12 +57,14 @@ # osgi console support # osgi.console=2401 +osgi.console.enable.builtin=false +osgi.console.ssh.useDefaultSecureStorage=true +osgi.console.useConfigAdmin=true osgi.java.profile=file:lib/java6-server.profile osgi.java.profile.bootdelegation=override osgi.hook.configurators.include=\ - org.eclipse.virgo.osgi.extensions.equinox.hooks.ExtensionsHookConfigurator,\ - org.eclipse.virgo.osgi.console.telnet.hook.TelnetHookConfigurator + org.eclipse.virgo.osgi.extensions.equinox.hooks.ExtensionsHookConfigurator org.eclipse.virgo.medic.log.config.path=config/serviceability.xml org.eclipse.virgo.suppress.heap.dumps=false
diff --git a/build-kernel/repository/ext/org.eclipse.virgo.kernel.userregion.springdm.plan b/build-kernel/repository/ext/org.eclipse.virgo.kernel.userregion.springdm.plan index d6d6b19..93938df 100644 --- a/build-kernel/repository/ext/org.eclipse.virgo.kernel.userregion.springdm.plan +++ b/build-kernel/repository/ext/org.eclipse.virgo.kernel.userregion.springdm.plan
@@ -12,5 +12,6 @@ <artifact type="bundle" name="org.eclipse.virgo.kernel.deployer.dm" version="[3.0, 4.0)"/> <artifact type="bundle" name="org.eclipse.equinox.ds" version="0.0.0"/> <artifact type="bundle" name="org.eclipse.equinox.util" version="0.0.0"/> - <artifact type="bundle" name="org.eclipse.osgi.services" version="0.0.0"/> + <artifact type="configuration" name="osgi.console.telnet" version="0"/> + <artifact type="configuration" name="osgi.console.ssh" version="0"/> </plan>
diff --git a/build-kernel/repository/ext/osgi.console.ssh.properties b/build-kernel/repository/ext/osgi.console.ssh.properties new file mode 100644 index 0000000..cf1f3a4 --- /dev/null +++ b/build-kernel/repository/ext/osgi.console.ssh.properties
@@ -0,0 +1,2 @@ +port=2502 +host=localhost \ No newline at end of file
diff --git a/build-kernel/repository/ext/osgi.console.telnet.properties b/build-kernel/repository/ext/osgi.console.telnet.properties new file mode 100644 index 0000000..7829577 --- /dev/null +++ b/build-kernel/repository/ext/osgi.console.telnet.properties
@@ -0,0 +1,2 @@ +port=2501 +host=localhost \ No newline at end of file
diff --git a/build.versions b/build.versions index ddfbd1a..b9b4b44 100644 --- a/build.versions +++ b/build.versions
@@ -5,6 +5,7 @@ org.eclipse.equinox.ds=1.3.0.v20110124-0830 org.eclipse.equinox.cm=1.0.300.v20101204 org.eclipse.equinox.region=1.0.0.v20110503 +org.eclipse.equinox.console.supportability=1.0.0.N20110626-2000 org.aspectj=1.6.6.RELEASE org.eclipse.osgi=3.7.0.v20110224 org.eclipse.virgo.medic=3.0.0.D-20110617120547 @@ -15,6 +16,9 @@ org.slf4j.spi=1.6.1 org.springframework.osgi=1.2.1 org.springframework=3.0.5.RELEASE +org.apache.felix.gogo=0.8.0.v201105062003 +com.springsource.org.apache.mina.core=2.0.2 +com.springsource.org.apache.sshd.core=0.5.0 # Test org.springframework.old=2.5.6.SEC01
diff --git a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationInitialiser.java b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationInitialiser.java index 8962142..5ab2163 100644 --- a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationInitialiser.java +++ b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationInitialiser.java
@@ -67,6 +67,7 @@ new CommandLinePropertiesSource(context, eventLogger) }; ConfigurationPublisher configPublisher = new ConfigurationPublisher(configAdmin, sources); configPublisher.publishConfigurations(); + configPublisher.registerConfigurationExporterService(context); } private void initializeDumpContributor(BundleContext context, ConfigurationAdmin configAdmin) {
diff --git a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationPublisher.java b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationPublisher.java index 859826e..3f5c841 100644 --- a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationPublisher.java +++ b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/ConfigurationPublisher.java
@@ -18,9 +18,11 @@ import java.util.Properties; import java.util.Map.Entry; +import org.osgi.framework.BundleContext; import org.osgi.service.cm.Configuration; import org.osgi.service.cm.ConfigurationAdmin; +import org.eclipse.virgo.kernel.core.ConfigurationExporter; import org.eclipse.virgo.kernel.serviceability.NonNull; import org.eclipse.virgo.util.common.IterableEnumeration; import org.eclipse.virgo.util.common.StringUtils; @@ -46,6 +48,10 @@ private final PropertiesSource[] sources; + private final static String KERNEL_REGION_CONFIGURATION_PID = KernelConfigurationPropertiesSource.KERNEL_CONFIGURATION_PID; + + private final static String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion"; + ConfigurationPublisher(ConfigurationAdmin configAdmin, PropertiesSource... sources) { this.configAdmin = configAdmin; this.sources = (sources == null ? new PropertiesSource[0] : sources); @@ -60,8 +66,20 @@ } } } - } + + void registerConfigurationExporterService(@NonNull BundleContext context) throws IOException { + ConfigurationExporter configurationExporter = createConfigurationExporterService(); + context.registerService(ConfigurationExporter.class, configurationExporter, null); + } + + private ConfigurationExporter createConfigurationExporterService() throws IOException { + Configuration kernelregionConfiguration = this.configAdmin.getConfiguration(KERNEL_REGION_CONFIGURATION_PID); + Configuration userregionConfiguration = this.configAdmin.getConfiguration(USER_REGION_CONFIGURATION_PID); + + ConfigurationExporter configurationExporter = new StandardConfigurationExporter(userregionConfiguration, kernelregionConfiguration); + return configurationExporter; + } @SuppressWarnings("unchecked") private void populateConfigurationWithProperties(@NonNull String pid, @NonNull Properties properties) throws IOException {
diff --git a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/StandardConfigurationExporter.java b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/StandardConfigurationExporter.java new file mode 100644 index 0000000..4960654 --- /dev/null +++ b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/config/internal/StandardConfigurationExporter.java
@@ -0,0 +1,42 @@ +package org.eclipse.virgo.kernel.config.internal; + +import java.util.Dictionary; + +import org.eclipse.virgo.kernel.core.ConfigurationExporter; +import org.osgi.service.cm.Configuration; + +/** + * ConfigurationExporter + * <p /> + * + * <strong>Concurrent Semantics</strong><br /> + * threadsafe + * + */ +public class StandardConfigurationExporter implements ConfigurationExporter { + + private Configuration userregionConfiguration; + + private Configuration kernelregionConfiguration; + + public StandardConfigurationExporter (Configuration userregionConfiguration, Configuration kernelregionConfiguraion) { + this.userregionConfiguration = userregionConfiguration; + this.kernelregionConfiguration = kernelregionConfiguraion; + } + + /* (non-Javadoc) + * @see org.eclipse.virgo.kernel.config.internal.ConfigurationExporter#getUserregionConfiguration() + */ + @Override + public Dictionary getUserRegionConfigurationProperties() { + return userregionConfiguration.getProperties(); + } + + /* (non-Javadoc) + * @see org.eclipse.virgo.kernel.config.internal.ConfigurationExporter#getKernelregionConfiguration() + */ + @Override + public Dictionary getKernelRegionConfigurationProperties() { + return kernelregionConfiguration.getProperties(); + } +}
diff --git a/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/core/ConfigurationExporter.java b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/core/ConfigurationExporter.java new file mode 100644 index 0000000..86673d1 --- /dev/null +++ b/org.eclipse.virgo.kernel.core/src/main/java/org/eclipse/virgo/kernel/core/ConfigurationExporter.java
@@ -0,0 +1,24 @@ +package org.eclipse.virgo.kernel.core; + +import java.util.Dictionary; + +/** + * This Service exports the user region and kernel region configurations, so that + * they are available to bundles in the user region. + * + * <strong>Concurrent Semantics</strong><br /> + * Implementations should be threadsafe. + */ +public interface ConfigurationExporter { + + /** + * Retrieve user region configuration properties + */ + Dictionary getUserRegionConfigurationProperties(); + + /** + * Retrieve kernel region configuration properties + */ + Dictionary getKernelRegionConfigurationProperties(); + +} \ No newline at end of file
diff --git a/org.eclipse.virgo.kernel.core/src/main/resources/OSGI-INF/kernelcore.xml b/org.eclipse.virgo.kernel.core/src/main/resources/OSGI-INF/kernelcore.xml index e08d39a..86d91f7 100644 --- a/org.eclipse.virgo.kernel.core/src/main/resources/OSGI-INF/kernelcore.xml +++ b/org.eclipse.virgo.kernel.core/src/main/resources/OSGI-INF/kernelcore.xml
@@ -1,16 +1,17 @@ <?xml version="1.0" encoding="UTF-8"?> <component name="kernelcore" immediate="true" xmlns:src="http://www.osgi.org/xmlns/src/v1.1.0"> <implementation class="org.eclipse.virgo.kernel.core.internal.CoreBundleActivator"/> + <reference name="EventLogger" interface="org.eclipse.virgo.medic.eventlog.EventLogger" - policy="dynamic"/> + policy="static"/> <reference name="DumpGenerator" interface="org.eclipse.virgo.medic.dump.DumpGenerator" - policy="dynamic"/> + policy="static"/> <reference name="ConfigAdmin" interface="org.osgi.service.cm.ConfigurationAdmin" - policy="dynamic"/> + policy="static"/> <reference name="EventAdmin" interface="org.osgi.service.event.EventAdmin" - policy="dynamic"/> + policy="static"/> </component> \ No newline at end of file
diff --git a/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties b/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties index 9e5b3a8..63ef42d 100644 --- a/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties +++ b/org.eclipse.virgo.kernel.deployer.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
@@ -12,6 +12,7 @@ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.ds/1.3.0.v20110124-0830/org.eclipse.equinox.ds-1.3.0.v20110124-0830.jar@start,\ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.util/1.0.200.v20100503/org.eclipse.equinox.util-1.0.200.v20100503.jar@start,\ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.osgi.services/3.3.0.v20110110/org.eclipse.osgi.services-3.3.0.v20110110.jar,\ + file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.cm/1.0.300.v20101204/org.eclipse.equinox.cm-1.0.300.v20101204.jar,\ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\ file:../org.eclipse.virgo.kernel.deployer.dm/target/classes@start,\ file:../org.eclipse.virgo.kernel.dmfragment/target/classes,\ @@ -30,6 +31,7 @@ org.eclipse.virgo.kernel.core;version="0",\ org.eclipse.virgo.kernel.deployer.core;version="0",\ org.eclipse.virgo.kernel.deployer.core.event;version="0",\ + org.eclipse.virgo.kernel.deployer.config;version="0",\ org.eclipse.virgo.kernel.install.*;version="0",\ org.eclipse.virgo.kernel.osgi.*;version="0",\ org.eclipse.virgo.kernel.model;version="0",\ @@ -79,7 +81,8 @@ org.eclipse.virgo.kernel.shim.serviceability.TracingService,\ org.eclipse.virgo.kernel.model.RuntimeArtifactRepository,\ org.eclipse.osgi.service.resolver.PlatformAdmin,\ - org.osgi.service.packageadmin.PackageAdmin + org.osgi.service.packageadmin.PackageAdmin,\ + org.eclipse.virgo.kernel.core.ConfigurationExporter serviceExports =\ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\ @@ -96,4 +99,5 @@ org.osgi.service.cm.ConfigurationListener,\ org.osgi.service.cm.ManagedService,\ org.osgi.service.cm.ManagedServiceFactory,\ - org.osgi.framework.BundleContext + org.osgi.framework.BundleContext,\ + org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer
diff --git a/org.eclipse.virgo.kernel.deployer/ivy.xml b/org.eclipse.virgo.kernel.deployer/ivy.xml index 193766d..e6a9678 100644 --- a/org.eclipse.virgo.kernel.deployer/ivy.xml +++ b/org.eclipse.virgo.kernel.deployer/ivy.xml
@@ -56,6 +56,8 @@ <dependency name='org.eclipse.virgo.repository' rev='${org.eclipse.virgo.repository}' conf='compile->compile' org='org.eclipse.virgo.repository'/> + <dependency org="org.eclipse.virgo.kernel" name="org.eclipse.virgo.kernel.userregion" rev="latest.integration" conf="compile->compile"/> + <override org="org.springframework" rev="${org.springframework}"/> <override org="org.eclipse.virgo.util" rev="${org.eclipse.virgo.util}"/>
diff --git a/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/config/ConfigurationDeployer.java b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/config/ConfigurationDeployer.java new file mode 100644 index 0000000..130f4bb --- /dev/null +++ b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/deployer/config/ConfigurationDeployer.java
@@ -0,0 +1,29 @@ +package org.eclipse.virgo.kernel.deployer.config; + +import java.io.IOException; +import java.util.Properties; + +import org.eclipse.virgo.kernel.serviceability.NonNull; + +/** + * Publishes and Deletes configurations from the config admin that is present in the implementor's region + * + * + */ +public interface ConfigurationDeployer { + + /** + * Publishes configuration with the specified pid and configuration properties in the implementor's config admin + * @param pid - the pid of the published configuration + * @param configurationProperties + * @throws IOException - if the operation isn't successful + */ + void publishConfiguration(@NonNull String pid, @NonNull Properties configurationProperties) throws IOException; + + /** + * Deletes the configuration with the specified pid in the implementor's config admin + * @param pid - the pid of the configuration to delete + * @throws IOException - if the operation isn't successful + */ + void deleteConfiguration(@NonNull String pid) throws IOException; +}
diff --git a/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactTreeFactory.java b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactTreeFactory.java index dcea020..475e359 100644 --- a/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactTreeFactory.java +++ b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigInstallArtifactTreeFactory.java
@@ -14,8 +14,6 @@ import java.util.Map; import org.osgi.framework.BundleContext; -import org.osgi.service.cm.ConfigurationAdmin; - import org.eclipse.virgo.kernel.deployer.core.DeploymentException; import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity; @@ -47,9 +45,9 @@ private final EventLogger eventLogger; - ConfigInstallArtifactTreeFactory(BundleContext bundleContext, ConfigurationAdmin configurationAdmin, EventLogger eventLogger) { + ConfigInstallArtifactTreeFactory(BundleContext bundleContext, EventLogger eventLogger) { this.bundleContext = bundleContext; - this.lifecycleEngine = new ConfigLifecycleEngine(configurationAdmin); + this.lifecycleEngine = new ConfigLifecycleEngine(bundleContext); this.eventLogger = eventLogger; }
diff --git a/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java index 9935c1c..525d174 100644 --- a/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java +++ b/org.eclipse.virgo.kernel.deployer/src/main/java/org/eclipse/virgo/kernel/install/artifact/internal/ConfigLifecycleEngine.java
@@ -15,13 +15,13 @@ import java.io.InputStream; import java.util.Properties; -import org.osgi.service.cm.Configuration; -import org.osgi.service.cm.ConfigurationAdmin; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; import org.slf4j.Logger; import org.slf4j.LoggerFactory; - import org.eclipse.virgo.kernel.artifact.fs.ArtifactFS; +import org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer; import org.eclipse.virgo.kernel.install.artifact.ArtifactIdentity; import org.eclipse.virgo.util.io.IOUtils; @@ -29,13 +29,17 @@ private final Logger logger = LoggerFactory.getLogger(this.getClass()); - private final ConfigurationAdmin configurationAdmin; + private BundleContext context; + private ConfigurationDeployer configurationDeployer; - public ConfigLifecycleEngine(ConfigurationAdmin configurationAdmin) { - this.configurationAdmin = configurationAdmin; + public ConfigLifecycleEngine(BundleContext context) { + this.context = context; } public void start(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StartException { + + initialiseConfigurationDeployer(); + try { updateConfiguration(artifactIdentity, artifactFS); } catch (IOException e) { @@ -45,6 +49,11 @@ } } + private void initialiseConfigurationDeployer() { + ServiceReference<ConfigurationDeployer> configurationImporterRef = context.getServiceReference(ConfigurationDeployer.class); + this.configurationDeployer = context.getService(configurationImporterRef); + } + public void refresh(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws RefreshException { try { updateConfiguration(artifactIdentity, artifactFS); @@ -59,9 +68,7 @@ InputStream inputStream = null; try { inputStream = artifactFS.getEntry("").getInputStream(); - - Configuration configuration = getConfiguration(artifactIdentity); - configuration.update(getProperties(inputStream)); + configurationDeployer.publishConfiguration(artifactIdentity.getName(), getProperties(inputStream)); } finally { IOUtils.closeQuietly(inputStream); } @@ -75,8 +82,7 @@ public void stop(ArtifactIdentity artifactIdentity, ArtifactFS artifactFS) throws StopException { try { - Configuration configuration = getConfiguration(artifactIdentity); - configuration.delete(); + configurationDeployer.deleteConfiguration(artifactIdentity.getName()); } catch (IOException e) { String message = String.format("Unable to stop configuration '%s'", artifactIdentity.getName()); logger.error(message); @@ -84,8 +90,4 @@ } } - private Configuration getConfiguration(ArtifactIdentity artifactIdentity) throws IOException { - return this.configurationAdmin.getConfiguration(artifactIdentity.getName(), null); - } - }
diff --git a/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml b/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml index 64cdbac..72cd262 100644 --- a/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml +++ b/org.eclipse.virgo.kernel.deployer/src/main/resources/META-INF/spring/deployer-context.xml
@@ -275,7 +275,6 @@ <beans:bean id="configInstallArtifactTreeFactory" class="org.eclipse.virgo.kernel.install.artifact.internal.ConfigInstallArtifactTreeFactory"> <beans:constructor-arg ref="bundleContext" /> - <beans:constructor-arg ref="configAdmin" /> <beans:constructor-arg ref="eventLogger" /> </beans:bean>
diff --git a/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties b/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties index 4328b6d..3d0ffa2 100644 --- a/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties +++ b/org.eclipse.virgo.kernel.test/src/test/resources/config/org.eclipse.virgo.kernel.userregion.properties
@@ -12,6 +12,7 @@ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.ds/1.3.0.v20110124-0830/org.eclipse.equinox.ds-1.3.0.v20110124-0830.jar@start,\ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.util/1.0.200.v20100503/org.eclipse.equinox.util-1.0.200.v20100503.jar@start,\ file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.osgi.services/3.3.0.v20110110/org.eclipse.osgi.services-3.3.0.v20110110.jar,\ + file:../ivy-cache/repository/org.eclipse.osgi/org.eclipse.equinox.cm/1.0.300.v20101204/org.eclipse.equinox.cm-1.0.300.v20101204.jar,\ file:../org.eclipse.virgo.kernel.agent.dm/target/classes@start,\ file:../org.eclipse.virgo.kernel.deployer.dm/target/classes@start,\ file:../org.eclipse.virgo.kernel.dmfragment/target/classes,\ @@ -25,6 +26,7 @@ org.eclipse.virgo.kernel.core;version="0",\ org.eclipse.virgo.kernel.deployer.core;version="0",\ org.eclipse.virgo.kernel.deployer.core.event;version="0",\ + org.eclipse.virgo.kernel.deployer.config;version="0",\ org.eclipse.virgo.kernel.install.*;version="0",\ org.eclipse.virgo.kernel.osgi.*;version="0",\ org.eclipse.virgo.kernel.module;version="0",\ @@ -74,7 +76,8 @@ org.eclipse.virgo.kernel.shim.scope.ScopeFactory,\ org.eclipse.virgo.kernel.shim.serviceability.TracingService,\ org.eclipse.osgi.service.resolver.PlatformAdmin,\ - org.osgi.service.packageadmin.PackageAdmin + org.osgi.service.packageadmin.PackageAdmin,\ + org.eclipse.virgo.kernel.core.ConfigurationExporter serviceExports =\ org.eclipse.virgo.kernel.install.artifact.InstallArtifactLifecycleListener,\ @@ -91,4 +94,5 @@ org.osgi.service.cm.ConfigurationListener,\ org.osgi.service.cm.ManagedService,\ org.osgi.service.cm.ManagedServiceFactory,\ - org.osgi.framework.BundleContext + org.osgi.framework.BundleContext,\ + org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer
diff --git a/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java b/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java index 7869146..325df73 100644 --- a/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java +++ b/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/Activator.java
@@ -15,13 +15,16 @@ import java.util.Dictionary; import java.util.HashSet; import java.util.Hashtable; +import java.util.Properties; import java.util.Set; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; import org.eclipse.equinox.region.RegionDigraph; import org.eclipse.osgi.service.resolver.PlatformAdmin; +import org.eclipse.virgo.kernel.core.ConfigurationExporter; import org.eclipse.virgo.kernel.core.Shutdown; +import org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer; import org.eclipse.virgo.kernel.deployer.core.ApplicationDeployer; import org.eclipse.virgo.kernel.deployer.core.DeployUriNormaliser; import org.eclipse.virgo.kernel.install.artifact.ScopeServiceRepository; @@ -80,6 +83,10 @@ private static final String PROPERTY_USER_REGION_ARTIFACTS = "initialArtifacts"; private static final String PROPERTY_USER_REGION_COMMANDLINE_ARTIFACTS = "commandLineArtifacts"; + + private static final String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion"; + + private static final String KERNEL_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel"; private final ServiceRegistrationTracker registrationTracker = new ServiceRegistrationTracker(); @@ -89,6 +96,7 @@ * {@inheritDoc} */ public void start(BundleContext context) throws Exception { + publishConfigurations(context); ResolutionFailureDetective rfd = createResolutionFailureDetective(context); Repository repository = getPotentiallyDelayedService(context, Repository.class); PackageAdmin packageAdmin = getPotentiallyDelayedService(context, PackageAdmin.class); @@ -125,7 +133,31 @@ this.registrationTracker.track(context.registerService(ModuleContextAccessor.class.getName(), new EmptyModuleContextAccessor(), properties)); scheduleInitialArtifactDeployerCreation(context, eventLogger); + + context.registerService(ConfigurationDeployer.class, new UserRegionConfigurationDeployer(context), null); } + + /** + * This method gets the kernel and user regions configurations from the kernel region and publishes them in the + * configuration admin in the user region. + * @throws Exception + */ + private void publishConfigurations(BundleContext context) throws Exception { + ConfigurationExporter configurationExporter = getPotentiallyDelayedService(context, ConfigurationExporter.class); + ConfigurationAdmin admin = getPotentiallyDelayedService(context, ConfigurationAdmin.class); + + try { + publishConfigurationFromKernelRegion(configurationExporter.getUserRegionConfigurationProperties(), admin.getConfiguration(USER_REGION_CONFIGURATION_PID)); + publishConfigurationFromKernelRegion(configurationExporter.getKernelRegionConfigurationProperties(), admin.getConfiguration(KERNEL_REGION_CONFIGURATION_PID)); + } catch (IOException e) { + throw new RuntimeException("Failed to publish required configurations. Startup sequence can't continue", e); + } + } + + @SuppressWarnings("rawtypes") + private void publishConfigurationFromKernelRegion(Dictionary configurationProperties, Configuration config) throws IOException { + config.update(configurationProperties); + } private ResolutionFailureDetective createResolutionFailureDetective(BundleContext context) { PlatformAdmin platformAdmin = OsgiFrameworkUtils.getService(context, PlatformAdmin.class).getService(); @@ -241,8 +273,6 @@ private static final class InitialArtifactDeployerCreatingRunnable implements Runnable { - private static final String USER_REGION_CONFIGURATION_PID = "org.eclipse.virgo.kernel.userregion"; - private final BundleContext context; private final EventLogger eventLogger; @@ -300,6 +330,7 @@ throw new RuntimeException("Failed to read region artifact configuration", ioe); } } + } private static <T> T getPotentiallyDelayedService(BundleContext context, Class<T> serviceClass) throws TimeoutException, InterruptedException { @@ -328,4 +359,5 @@ Thread.sleep(100); return (System.currentTimeMillis() - before); } + }
diff --git a/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java b/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java new file mode 100644 index 0000000..96e8f6c --- /dev/null +++ b/org.eclipse.virgo.kernel.userregion/src/main/java/org/eclipse/virgo/kernel/userregion/internal/UserRegionConfigurationDeployer.java
@@ -0,0 +1,50 @@ +package org.eclipse.virgo.kernel.userregion.internal; + +import java.io.IOException; +import java.util.Properties; + +import org.eclipse.virgo.kernel.deployer.config.ConfigurationDeployer; +import org.eclipse.virgo.kernel.osgi.framework.OsgiFrameworkUtils; +import org.osgi.framework.BundleContext; +import org.osgi.service.cm.Configuration; +import org.osgi.service.cm.ConfigurationAdmin; + +/** + * This service is registered in the user region so that it has access to the configuration admin in the + * user region. The kernel region can use it as a proxy to access the configuration admin in the user region. + * + * <strong>Concurrent Semantics</strong><br /> + * Thread-safe. + */ +public class UserRegionConfigurationDeployer implements ConfigurationDeployer { + + private ConfigurationAdmin configurationAdmin; + private Object monitor = new Object(); + + public UserRegionConfigurationDeployer(BundleContext context) { + this.configurationAdmin = OsgiFrameworkUtils.getService(context, ConfigurationAdmin.class).getService(); + } + + /** + * {@inheritDoc} + */ + @Override + public void publishConfiguration(String pid, Properties configurationProperties) throws IOException { + synchronized (monitor) { + Configuration configuration = this.configurationAdmin.getConfiguration(pid, null); + configuration.update(configurationProperties); + } + } + + /** + * {@inheritDoc} + */ + @Override + public void deleteConfiguration(String pid) throws IOException { + synchronized (monitor) { + Configuration configuration = this.configurationAdmin.getConfiguration(pid, null); + configuration.delete(); + } + } + +}
diff --git a/org.eclipse.virgo.kernel.userregion/template.mf b/org.eclipse.virgo.kernel.userregion/template.mf index 19f9721..fcd0eec 100644 --- a/org.eclipse.virgo.kernel.userregion/template.mf +++ b/org.eclipse.virgo.kernel.userregion/template.mf
@@ -15,6 +15,7 @@ org.eclipse.virgo.medic.*;version="${org.eclipse.virgo.medic:[=.=.=, =.+1)}", org.eclipse.virgo.repository.*;version="${org.eclipse.virgo.repository:[=.=.=, =.+1)}", org.eclipse.virgo.util.*;version="${org.eclipse.virgo.util:[=.=.=, =.+1)}", + org.eclipse.virgo.kernel.deployer.config.*;version="0", org.aspectj.*;version="${org.aspectj:[=.=.=.=, +1)}", org.eclipse.osgi.*;version="0", org.eclipse.equinox.region.*;version="${org.eclipse.equinox.region:[=.=.=, =.+1)}",