Move SLC Init activator to SLC Runtime
authorMathieu Baudier <mbaudier@argeo.org>
Thu, 7 Mar 2024 18:45:49 +0000 (19:45 +0100)
committerMathieu Baudier <mbaudier@argeo.org>
Thu, 7 Mar 2024 18:45:49 +0000 (19:45 +0100)
29 files changed:
org.argeo.slc.cms/bnd.bnd
org.argeo.slc.cms/build.properties
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsTargetData.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2Distribution.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/test/CmsSmokeTest.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/cms/test/MinimalJvm.java [deleted file]
org.argeo.slc.cms/src/org/argeo/slc/init/osgi/SlcInitActivator.java [deleted file]
org.argeo.slc.runtime/bnd.bnd
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsTargetData.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2Distribution.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/test/CmsSmokeTest.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/cms/test/MinimalJvm.java [new file with mode: 0644]
org.argeo.slc.runtime/src/org/argeo/slc/internal/runtime/osgi/SlcInitActivator.java [new file with mode: 0644]

index 737ccf8cd7f7b7a5ce72095d92f29d0373714bdb..5decbd1fc7fea58eec6d169fd523b6f2e5257bad 100644 (file)
@@ -1,6 +1,4 @@
 
-Bundle-Activator: org.argeo.slc.init.osgi.SlcInitActivator
-
 Import-Package: \
 org.apache.commons.logging,\
 org.postgresql;version="[42,43)";resolution:=optional,\
index 5d082eaf6b26b7e5312bb461f335d96028189808..34d2e4d2dad529ceaeb953bfcdb63c51d69ffed2 100644 (file)
@@ -2,4 +2,3 @@ source.. = src/
 output.. = bin/
 bin.includes = META-INF/,\
                .
-additional.bundles = org.argeo.init
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java
deleted file mode 100644 (file)
index feec64f..0000000
+++ /dev/null
@@ -1,7 +0,0 @@
-package org.argeo.slc.cms.deploy;
-
-import org.argeo.slc.deploy.DeployedSystem;
-
-public interface CmsDeployedSystem extends DeployedSystem {
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java
deleted file mode 100644 (file)
index 17cecd8..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.argeo.slc.cms.deploy;
-
-import java.util.List;
-
-import org.argeo.slc.deploy.DeploymentData;
-
-public interface CmsDeploymentData extends DeploymentData {
-       List<String> getModulesToActivate(int startLevel);
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsTargetData.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/CmsTargetData.java
deleted file mode 100644 (file)
index 8e8d147..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.slc.cms.deploy;
-
-import java.nio.file.Path;
-
-import org.argeo.slc.deploy.TargetData;
-
-public interface CmsTargetData extends TargetData {
-       Path getInstanceData();
-
-       String getHost();
-
-       Integer getHttpPort();
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java
deleted file mode 100644 (file)
index c95f441..0000000
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.argeo.slc.cms.deploy;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-import java.util.TreeMap;
-
-public class SimpleCmsDeploymentData implements CmsDeploymentData {
-       private Map<Integer, List<String>> startLevels = new TreeMap<>();
-
-       @Override
-       public List<String> getModulesToActivate(int startLevel) {
-               startLevels.putIfAbsent(startLevel, new ArrayList<>());
-               return startLevels.get(startLevel);
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java
deleted file mode 100644 (file)
index 081fb89..0000000
+++ /dev/null
@@ -1,40 +0,0 @@
-package org.argeo.slc.cms.deploy;
-
-import java.nio.file.Path;
-
-public class SimpleCmsTargetData implements CmsTargetData {
-       private Path instanceData;
-       private String host;
-       private Integer httpPort;
-
-       public SimpleCmsTargetData(Path instanceData, String host, Integer httpPort) {
-               this.instanceData = instanceData;
-               this.host = host;
-               this.httpPort = httpPort;
-       }
-
-       public String getHost() {
-               return host;
-       }
-
-       public void setHost(String hostname) {
-               this.host = hostname;
-       }
-
-       public Integer getHttpPort() {
-               return httpPort;
-       }
-
-       public void setHttpPort(Integer httpPort) {
-               this.httpPort = httpPort;
-       }
-
-       public Path getInstanceData() {
-               return instanceData;
-       }
-
-       public void setInstanceData(Path instanceData) {
-               this.instanceData = instanceData;
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java
deleted file mode 100644 (file)
index 25d57b8..0000000
+++ /dev/null
@@ -1,50 +0,0 @@
-package org.argeo.slc.cms.deploy.osgi;
-
-import org.argeo.slc.build.Distribution;
-import org.argeo.slc.build.ModularDistribution;
-import org.argeo.slc.cms.deploy.CmsDeployedSystem;
-import org.argeo.slc.cms.deploy.CmsDeploymentData;
-import org.argeo.slc.cms.deploy.CmsTargetData;
-import org.argeo.slc.deploy.DeploymentData;
-import org.argeo.slc.deploy.TargetData;
-import org.osgi.framework.BundleContext;
-
-/** A deployed OSGi-based Argeo CMS system. */
-public class OsgiCmsDeployedSystem implements CmsDeployedSystem {
-       private ModularDistribution distribution;
-       private CmsTargetData targetData;
-       private CmsDeploymentData deploymentData;
-
-       // private BundleContext systemBundleContext;
-
-       public OsgiCmsDeployedSystem(BundleContext systemBundleContext, ModularDistribution distribution,
-                       CmsTargetData targetData, CmsDeploymentData deploymentData) {
-               // this.systemBundleContext = systemBundleContext;
-
-               this.distribution = distribution;
-               this.targetData = targetData;
-               this.deploymentData = deploymentData;
-       }
-
-       @Override
-       public String getDeployedSystemId() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public Distribution getDistribution() {
-               return distribution;
-       }
-
-       @Override
-       public DeploymentData getDeploymentData() {
-               return deploymentData;
-       }
-
-       @Override
-       public TargetData getTargetData() {
-               return targetData;
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java
deleted file mode 100644 (file)
index 1c472e7..0000000
+++ /dev/null
@@ -1,228 +0,0 @@
-package org.argeo.slc.cms.deploy.osgi;
-
-import java.io.IOException;
-import java.lang.System.Logger;
-import java.lang.System.Logger.Level;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.StringJoiner;
-import java.util.TreeMap;
-
-import org.argeo.api.a2.A2Source;
-import org.argeo.api.a2.FsA2Source;
-import org.argeo.api.init.InitConstants;
-import org.argeo.api.init.RuntimeContext;
-import org.argeo.cms.CmsDeployProperty;
-import org.argeo.init.osgi.OsgiRuntimeContext;
-import org.argeo.slc.WellKnownConstants;
-import org.argeo.slc.build.Distribution;
-import org.argeo.slc.cms.deploy.CmsDeployedSystem;
-import org.argeo.slc.cms.deploy.CmsDeploymentData;
-import org.argeo.slc.cms.deploy.CmsTargetData;
-import org.argeo.slc.cms.deploy.SimpleCmsDeploymentData;
-import org.argeo.slc.cms.distribution.A2Distribution;
-import org.argeo.slc.deploy.DeployedSystem;
-import org.argeo.slc.deploy.Deployment;
-import org.argeo.slc.deploy.DeploymentData;
-import org.argeo.slc.deploy.TargetData;
-
-/** The process of deploying an OSGi based Argeo CMS system. */
-public class OsgiCmsDeployment implements Deployment {
-       private final static Logger logger = System.getLogger(OsgiCmsDeployment.class.getName());
-
-       private A2Distribution distribution;
-       private CmsTargetData targetData;
-       private CmsDeploymentData deploymentData;
-
-       private CmsDeployedSystem deployedSystem;
-
-       private OsgiRuntimeContext runtimeContext;
-
-       @Override
-       public void run() {
-               try {
-                       Map<String, String> config = new TreeMap<>();
-
-                       // sources
-                       StringJoiner sourcesProperty = new StringJoiner(",");
-                       for (A2Source a2Source : distribution.getA2Sources()) {
-                               sourcesProperty.add(a2Source.getUri().toString());
-                       }
-                       config.put(InitConstants.PROP_ARGEO_OSGI_SOURCES, sourcesProperty.toString());
-
-                       // target
-                       config.put(WellKnownConstants.OSGI_INSTANCE_AREA,
-                                       targetData.getInstanceData().toRealPath().toUri().toString());
-
-                       if (targetData.getHost() != null) {
-                               config.put(CmsDeployProperty.HOST.getProperty(), targetData.getHost().toString());
-                       }
-
-                       if (targetData.getHttpPort() != null) {
-                               config.put(CmsDeployProperty.HTTP_PORT.getProperty(), targetData.getHttpPort().toString());
-                       }
-
-                       Path configurationArea = Files.createTempDirectory("slc-cms-test");
-                       config.put(WellKnownConstants.OSGI_CONFIGURATION_AREA, configurationArea.toUri().toString());
-
-                       // modules activation
-                       for (int startLevel = 0; startLevel <= 6; startLevel++) {
-                               List<String> modules = deploymentData.getModulesToActivate(startLevel);
-                               if (modules.size() != 0) {
-                                       String startProperty = String.join(",", modules);
-                                       config.put(InitConstants.PROP_ARGEO_OSGI_START + "." + startLevel, startProperty);
-                               }
-                       }
-
-                       config.put("org.eclipse.equinox.http.jetty.autostart", "false");
-                       config.put("org.osgi.framework.system.packages.extra",
-                                       "sun.security.util,sun.security.internal.spec,sun.security.provider,com.sun.net.httpserver,com.sun.jndi.ldap,com.sun.jndi.ldap.sasl,com.sun.jndi.dns,com.sun.security.jgss,com.sun.nio.file,com.sun.nio.sctp");
-                       config.put("eclipse.ignoreApp", "true");
-                       config.put("osgi.noShutdown", "true");
-                       config.put("osgi.clean", "true");
-                       config.put("osgi.framework.useSystemProperties", "false");
-
-                       config.put("argeo.directory", "dc=example,dc=com.ldif");
-
-                       if (targetData instanceof OsgiCmsTargetData osgiCmsTargetData
-                                       && osgiCmsTargetData.getTelnetPort() != null) {
-                               String hostStr = "";
-                               if (targetData.getHost() != null) {
-                                       hostStr = targetData.getHost().toString() + ":";
-                               }
-                               config.put("osgi.console", hostStr + osgiCmsTargetData.getTelnetPort().toString());
-                       }
-
-                       // initialise
-                       for (String key : config.keySet()) {
-//                             System.out.println(key + "=" + config.get(key));
-                               logger.log(Level.TRACE, () -> key + "=" + config.get(key));
-                       }
-
-                       // FIXME use runtime manager
-                       runtimeContext = new OsgiRuntimeContext(config);
-                       runtimeContext.run();
-
-//                     deployedSystem = new OsgiCmsDeployedSystem(runtimeContext.getFramework().getBundleContext(), distribution,
-//                                     targetData, deploymentData);
-
-               } catch (Exception e) {
-                       throw new IllegalStateException("Cannot run OSGi deployment", e);
-               }
-
-       }
-
-       @Override
-       public DeployedSystem getDeployedSystem() {
-               return deployedSystem;
-       }
-
-       @Override
-       public void setTargetData(TargetData targetData) {
-               this.targetData = (CmsTargetData) targetData;
-       }
-
-       @Override
-       public void setDeploymentData(DeploymentData deploymentData) {
-               this.deploymentData = (CmsDeploymentData) deploymentData;
-       }
-
-       @Override
-       public void setDistribution(Distribution distribution) {
-               this.distribution = (A2Distribution) distribution;
-       }
-
-       public OsgiRuntimeContext getRuntimeContext() {
-               return runtimeContext;
-       }
-
-       public static void main(String[] args) {
-               RuntimeContext runtimeContext = test();
-               try {
-                       runtimeContext.waitForStop(0);
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
-               }
-       }
-
-       public static RuntimeContext test() {
-               try {
-                       Path userHome = Paths.get(System.getProperty("user.home"));
-
-                       // distribution
-                       Path a2Base = userHome.resolve("dev/git/unstable/output/a2");
-                       A2Distribution distribution = new A2Distribution();
-                       Map<String, String> xOr = new HashMap<>();
-                       xOr.put("osgi", "equinox");
-                       xOr.put("swt", "rap");
-                       xOr.put("log", "syslogger");
-                       xOr.put("crypto", "fips");
-                       distribution.getA2Sources().add(new FsA2Source(a2Base, xOr, true, null, null));
-
-                       // target data
-                       Path instanceData = userHome.resolve("dev/git/unstable/argeo-slc/sdk/exec/cms-deployment/data");
-                       Files.createDirectories(instanceData);
-                       OsgiCmsTargetData targetData = new OsgiCmsTargetData(instanceData, "host1", 7070, 2323);
-
-                       // deployment data
-                       SimpleCmsDeploymentData deploymentData = new SimpleCmsDeploymentData();
-                       deploymentData.getModulesToActivate(2).add("org.eclipse.equinox.http.servlet");
-                       deploymentData.getModulesToActivate(2).add("org.apache.felix.scr");
-                       deploymentData.getModulesToActivate(2).add("org.eclipse.rap.rwt.osgi");
-                       deploymentData.getModulesToActivate(2).add("org.eclipse.equinox.console");
-
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms");
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.ee");
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.sshd");
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.equinox");
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.jetty");
-                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.swt.rap");
-
-                       deploymentData.getModulesToActivate(4).add("org.argeo.cms.jcr");
-                       deploymentData.getModulesToActivate(4).add("org.argeo.app.profile.acr.fs");
-
-                       deploymentData.getModulesToActivate(5).add("org.argeo.app.core");
-                       deploymentData.getModulesToActivate(5).add("org.argeo.app.ui");
-                       deploymentData.getModulesToActivate(5).add("org.argeo.app.theme.default");
-                       deploymentData.getModulesToActivate(5).add("org.argeo.app.jcr");
-
-                       deploymentData.getModulesToActivate(5).add("org.example.suite.theme");
-                       deploymentData.getModulesToActivate(5).add("org.example.suite.core");
-                       deploymentData.getModulesToActivate(5).add("org.example.suite.ui");
-                       deploymentData.getModulesToActivate(5).add("org.example.suite.ui.rap");
-
-                       OsgiCmsDeployment deployment = new OsgiCmsDeployment();
-                       deployment.setDistribution(distribution);
-                       deployment.setTargetData(targetData);
-                       deployment.setDeploymentData(deploymentData);
-                       deployment.run();
-
-                       boolean multiple = true;
-                       if (multiple) {
-                               // wait a bit
-//                             Thread.sleep(5000);
-
-                               Path instanceData2 = userHome.resolve("dev/git/unstable/argeo-slc/sdk/exec/cms-deployment2/data");
-                               Files.createDirectories(instanceData2);
-                               OsgiCmsTargetData targetData2 = new OsgiCmsTargetData(instanceData2, "host2", 7070, 2323);
-
-                               OsgiCmsDeployment deployment2 = new OsgiCmsDeployment();
-                               deployment2.setDistribution(distribution);
-                               deployment2.setTargetData(targetData2);
-                               deployment2.setDeploymentData(deploymentData);
-                               deployment2.run();
-                       }
-
-                       return deployment.getRuntimeContext();
-               } catch (IOException e) {
-                       e.printStackTrace();
-                       System.exit(1);
-                       return null;
-               }
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java
deleted file mode 100644 (file)
index dc4bf3b..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.argeo.slc.cms.deploy.osgi;
-
-import java.nio.file.Path;
-
-import org.argeo.slc.cms.deploy.SimpleCmsTargetData;
-
-public class OsgiCmsTargetData extends SimpleCmsTargetData {
-       private Integer telnetPort;
-
-       public OsgiCmsTargetData(Path instanceData, String host, Integer httpPort, Integer telnetPort) {
-               super(instanceData, host, httpPort);
-               this.telnetPort = telnetPort;
-       }
-
-       public Integer getTelnetPort() {
-               return telnetPort;
-       }
-
-       public void setTelnetPort(Integer telnetPort) {
-               this.telnetPort = telnetPort;
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2Distribution.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2Distribution.java
deleted file mode 100644 (file)
index 435d2d6..0000000
+++ /dev/null
@@ -1,75 +0,0 @@
-package org.argeo.slc.cms.distribution;
-
-import java.util.ArrayList;
-import java.util.Iterator;
-import java.util.List;
-
-import org.argeo.api.a2.A2Branch;
-import org.argeo.api.a2.A2Component;
-import org.argeo.api.a2.A2Contribution;
-import org.argeo.api.a2.A2Module;
-import org.argeo.api.a2.A2Source;
-import org.argeo.slc.CategoryNameVersion;
-import org.argeo.slc.DefaultCategoryNameVersion;
-import org.argeo.slc.NameVersion;
-import org.argeo.slc.build.Distribution;
-import org.argeo.slc.build.ModularDistribution;
-
-public class A2Distribution implements ModularDistribution {
-       private List<A2Source> a2Sources = new ArrayList<>();
-
-       @Override
-       public String getDistributionId() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public String getName() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public String getVersion() {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public Iterator<? extends NameVersion> nameVersions() {
-               List<CategoryNameVersion> nameVersions = new ArrayList<>();
-               for (A2Source a2Source : a2Sources) {
-                       for (A2Contribution a2Contribution : a2Source.listContributions(null)) {
-                               for (A2Component a2Component : a2Contribution.listComponents(null)) {
-                                       for (A2Branch a2Branch : a2Component.listBranches(null)) {
-                                               for (A2Module a2Module : a2Branch.listModules(null)) {
-                                                       CategoryNameVersion nameVersion = new DefaultCategoryNameVersion(a2Contribution.getId(),
-                                                                       a2Component.getId(), a2Module.getVersion().toString());
-                                                       nameVersions.add(nameVersion);
-                                               }
-                                       }
-                               }
-                       }
-               }
-               return nameVersions.iterator();
-       }
-
-       @Override
-       public Distribution getModuleDistribution(String moduleName, String moduleVersion) {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       @Override
-       public Object getModulesDescriptor(String descriptorType) {
-               // TODO Auto-generated method stub
-               return null;
-       }
-
-       public List<A2Source> getA2Sources() {
-               return a2Sources;
-       }
-
-       
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java
deleted file mode 100644 (file)
index 9e90bce..0000000
+++ /dev/null
@@ -1,14 +0,0 @@
-package org.argeo.slc.cms.distribution;
-
-import org.argeo.api.a2.A2Module;
-import org.argeo.slc.build.Distribution;
-
-public class A2ModuleDistribution implements Distribution {
-       private A2Module a2Module;
-
-       @Override
-       public String getDistributionId() {
-               return a2Module.getCoordinates();
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/test/CmsSmokeTest.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/test/CmsSmokeTest.java
deleted file mode 100644 (file)
index 10b088c..0000000
+++ /dev/null
@@ -1,20 +0,0 @@
-package org.argeo.slc.cms.test;
-
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-public class CmsSmokeTest {
-
-       public static void main(String[] args) throws IOException {
-               Path instanceData;
-               if (args.length > 0) {
-                       instanceData = Paths.get(args[0]);
-               } else {
-                       instanceData = Files.createTempDirectory("cms-test");
-               }
-
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/cms/test/MinimalJvm.java b/org.argeo.slc.cms/src/org/argeo/slc/cms/test/MinimalJvm.java
deleted file mode 100644 (file)
index 87eefd9..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.argeo.slc.cms.test;
-
-/**
- * A program doing nothing and loading no classes, to be used as a baseline for
- * memory usage of the JVM.
- */
-public class MinimalJvm {
-
-       synchronized void sleep() {
-               try {
-                       wait();
-               } catch (InterruptedException e) {
-                       e.printStackTrace();
-               }
-       }
-
-       public static void main(String[] args) {
-               new MinimalJvm().sleep();
-       }
-
-}
diff --git a/org.argeo.slc.cms/src/org/argeo/slc/init/osgi/SlcInitActivator.java b/org.argeo.slc.cms/src/org/argeo/slc/init/osgi/SlcInitActivator.java
deleted file mode 100644 (file)
index 542aac9..0000000
+++ /dev/null
@@ -1,88 +0,0 @@
-package org.argeo.slc.init.osgi;
-
-import java.nio.file.Path;
-import java.nio.file.Paths;
-
-import org.argeo.api.cms.CmsLog;
-import org.argeo.api.init.RuntimeManager;
-import org.argeo.cms.CmsDeployProperty;
-import org.osgi.framework.BundleActivator;
-import org.osgi.framework.BundleContext;
-import org.osgi.framework.ServiceReference;
-import org.osgi.util.tracker.ServiceTracker;
-
-public class SlcInitActivator implements BundleActivator {
-       private final static CmsLog log = CmsLog.getLog(SlcInitActivator.class);
-
-       private ServiceTracker<RuntimeManager, RuntimeManager> runtimeManagerSt;
-
-       @Override
-       public void start(BundleContext context) throws Exception {
-               Path userHome = Paths.get(System.getProperty("user.home"));
-
-//             {
-//                     EquinoxFactory equinoxFactory = new EquinoxFactory();
-//                     Map<String, String> config = new HashMap<>();
-//                     config.put("osgi.console", "host1:2023");
-//                     config.put("osgi.frameworkParentClassloader", "app");
-//                     config.put("osgi.parentClassLoader", "app");
-//                     RuntimeManager.loadConfig(Paths.get("/usr/local/etc/argeo/user/cms/test3"), config);
-//                     Framework framework = equinoxFactory.newFramework(config);
-//                     framework.start();
-//                     OsgiBoot osgiBoot = new OsgiBoot(framework.getBundleContext());
-//                     osgiBoot.bootstrap(config);
-//             }
-
-               // OsgiCmsDeployment.test();
-
-               runtimeManagerSt = new ServiceTracker<>(context, RuntimeManager.class, null) {
-
-                       @Override
-                       public RuntimeManager addingService(ServiceReference<RuntimeManager> reference) {
-                               RuntimeManager runtimeManager = super.addingService(reference);
-                               log.debug("Found runtime manager " + runtimeManager);
-                               new Thread() {
-                                       public void run() {
-//                                             try {
-//                                                     Thread.sleep(5000);
-//                                             } catch (InterruptedException e) {
-//                                                     return;
-//                                             }
-
-                                               runtimeManager.startRuntime("native/test1", (config) -> {
-                                                       config.put("osgi.console", "host1:2023");
-                                                       config.put(CmsDeployProperty.SSHD_PORT.getProperty(), "2222");
-                                                       config.put(CmsDeployProperty.HTTP_PORT.getProperty(), "7070");
-                                                       config.put(CmsDeployProperty.HOST.getProperty(), "host1");
-//                                                     for (String key : config.keySet()) {
-//                                                             System.out.println(key + "=" + config.get(key));
-////                                                           log.debug(() -> key + "=" + config.get(key));
-//                                                     }
-//                                                     config.put("argeo.osgi.start.6", "org.argeo.swt.minidesktop");
-                                               });
-                                               runtimeManager.startRuntime("native/test2", (config) -> {
-                                                       config.put("osgi.console", "host2:2023");
-                                                       config.put(CmsDeployProperty.SSHD_PORT.getProperty(), "2222");
-                                                       // config.put(CmsDeployProperty.HTTP_PORT.getProperty(), "7070");
-                                                       config.put(CmsDeployProperty.HOST.getProperty(), "host2");
-//                                                     config.put("argeo.osgi.start.6", "org.argeo.swt.minidesktop");
-////                                                   config.put("argeo.directory", "ipa:///");
-//                                                     Path instanceData = userHome
-//                                                                     .resolve("dev/git/unstable/argeo-slc/sdk/exec/cms-deployment/data");
-//                                                     config.put(InitConstants.PROP_OSGI_INSTANCE_AREA, instanceData.toUri().toString());
-                                               });
-                                       }
-                               }.start();
-
-                               return runtimeManager;
-                       }
-
-               };
-               runtimeManagerSt.open(false);
-       }
-
-       @Override
-       public void stop(BundleContext context) throws Exception {
-       }
-
-}
index 6956a159b2245bfba2cfaf0e1611072a9148420e..263e792e0bc638c316a2b018f96efcd892945e5c 100644 (file)
@@ -1,3 +1,5 @@
+Bundle-Activator: org.argeo.slc.internal.runtime.osgi.SlcInitActivator
+
 Import-Package: \
 org.argeo.slc.deploy,\
 org.apache.commons.exec.*;resolution:=optional,\
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeployedSystem.java
new file mode 100644 (file)
index 0000000..feec64f
--- /dev/null
@@ -0,0 +1,7 @@
+package org.argeo.slc.cms.deploy;
+
+import org.argeo.slc.deploy.DeployedSystem;
+
+public interface CmsDeployedSystem extends DeployedSystem {
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsDeploymentData.java
new file mode 100644 (file)
index 0000000..17cecd8
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.slc.cms.deploy;
+
+import java.util.List;
+
+import org.argeo.slc.deploy.DeploymentData;
+
+public interface CmsDeploymentData extends DeploymentData {
+       List<String> getModulesToActivate(int startLevel);
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsTargetData.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/CmsTargetData.java
new file mode 100644 (file)
index 0000000..8e8d147
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.slc.cms.deploy;
+
+import java.nio.file.Path;
+
+import org.argeo.slc.deploy.TargetData;
+
+public interface CmsTargetData extends TargetData {
+       Path getInstanceData();
+
+       String getHost();
+
+       Integer getHttpPort();
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsDeploymentData.java
new file mode 100644 (file)
index 0000000..c95f441
--- /dev/null
@@ -0,0 +1,17 @@
+package org.argeo.slc.cms.deploy;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+
+public class SimpleCmsDeploymentData implements CmsDeploymentData {
+       private Map<Integer, List<String>> startLevels = new TreeMap<>();
+
+       @Override
+       public List<String> getModulesToActivate(int startLevel) {
+               startLevels.putIfAbsent(startLevel, new ArrayList<>());
+               return startLevels.get(startLevel);
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/SimpleCmsTargetData.java
new file mode 100644 (file)
index 0000000..081fb89
--- /dev/null
@@ -0,0 +1,40 @@
+package org.argeo.slc.cms.deploy;
+
+import java.nio.file.Path;
+
+public class SimpleCmsTargetData implements CmsTargetData {
+       private Path instanceData;
+       private String host;
+       private Integer httpPort;
+
+       public SimpleCmsTargetData(Path instanceData, String host, Integer httpPort) {
+               this.instanceData = instanceData;
+               this.host = host;
+               this.httpPort = httpPort;
+       }
+
+       public String getHost() {
+               return host;
+       }
+
+       public void setHost(String hostname) {
+               this.host = hostname;
+       }
+
+       public Integer getHttpPort() {
+               return httpPort;
+       }
+
+       public void setHttpPort(Integer httpPort) {
+               this.httpPort = httpPort;
+       }
+
+       public Path getInstanceData() {
+               return instanceData;
+       }
+
+       public void setInstanceData(Path instanceData) {
+               this.instanceData = instanceData;
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployedSystem.java
new file mode 100644 (file)
index 0000000..25d57b8
--- /dev/null
@@ -0,0 +1,50 @@
+package org.argeo.slc.cms.deploy.osgi;
+
+import org.argeo.slc.build.Distribution;
+import org.argeo.slc.build.ModularDistribution;
+import org.argeo.slc.cms.deploy.CmsDeployedSystem;
+import org.argeo.slc.cms.deploy.CmsDeploymentData;
+import org.argeo.slc.cms.deploy.CmsTargetData;
+import org.argeo.slc.deploy.DeploymentData;
+import org.argeo.slc.deploy.TargetData;
+import org.osgi.framework.BundleContext;
+
+/** A deployed OSGi-based Argeo CMS system. */
+public class OsgiCmsDeployedSystem implements CmsDeployedSystem {
+       private ModularDistribution distribution;
+       private CmsTargetData targetData;
+       private CmsDeploymentData deploymentData;
+
+       // private BundleContext systemBundleContext;
+
+       public OsgiCmsDeployedSystem(BundleContext systemBundleContext, ModularDistribution distribution,
+                       CmsTargetData targetData, CmsDeploymentData deploymentData) {
+               // this.systemBundleContext = systemBundleContext;
+
+               this.distribution = distribution;
+               this.targetData = targetData;
+               this.deploymentData = deploymentData;
+       }
+
+       @Override
+       public String getDeployedSystemId() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Distribution getDistribution() {
+               return distribution;
+       }
+
+       @Override
+       public DeploymentData getDeploymentData() {
+               return deploymentData;
+       }
+
+       @Override
+       public TargetData getTargetData() {
+               return targetData;
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsDeployment.java
new file mode 100644 (file)
index 0000000..f6e55ca
--- /dev/null
@@ -0,0 +1,227 @@
+package org.argeo.slc.cms.deploy.osgi;
+
+import java.io.IOException;
+import java.lang.System.Logger;
+import java.lang.System.Logger.Level;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.StringJoiner;
+import java.util.TreeMap;
+
+import org.argeo.api.a2.A2Source;
+import org.argeo.api.a2.FsA2Source;
+import org.argeo.api.init.InitConstants;
+import org.argeo.api.init.RuntimeContext;
+import org.argeo.init.osgi.OsgiRuntimeContext;
+import org.argeo.slc.WellKnownConstants;
+import org.argeo.slc.build.Distribution;
+import org.argeo.slc.cms.deploy.CmsDeployedSystem;
+import org.argeo.slc.cms.deploy.CmsDeploymentData;
+import org.argeo.slc.cms.deploy.CmsTargetData;
+import org.argeo.slc.cms.deploy.SimpleCmsDeploymentData;
+import org.argeo.slc.cms.distribution.A2Distribution;
+import org.argeo.slc.deploy.DeployedSystem;
+import org.argeo.slc.deploy.Deployment;
+import org.argeo.slc.deploy.DeploymentData;
+import org.argeo.slc.deploy.TargetData;
+
+/** The process of deploying an OSGi based Argeo CMS system. */
+public class OsgiCmsDeployment implements Deployment {
+       private final static Logger logger = System.getLogger(OsgiCmsDeployment.class.getName());
+
+       private A2Distribution distribution;
+       private CmsTargetData targetData;
+       private CmsDeploymentData deploymentData;
+
+       private CmsDeployedSystem deployedSystem;
+
+       private OsgiRuntimeContext runtimeContext;
+
+       @Override
+       public void run() {
+               try {
+                       Map<String, String> config = new TreeMap<>();
+
+                       // sources
+                       StringJoiner sourcesProperty = new StringJoiner(",");
+                       for (A2Source a2Source : distribution.getA2Sources()) {
+                               sourcesProperty.add(a2Source.getUri().toString());
+                       }
+                       config.put(InitConstants.PROP_ARGEO_OSGI_SOURCES, sourcesProperty.toString());
+
+                       // target
+                       config.put(WellKnownConstants.OSGI_INSTANCE_AREA,
+                                       targetData.getInstanceData().toRealPath().toUri().toString());
+
+                       if (targetData.getHost() != null) {
+                               config.put("argeo.host", targetData.getHost().toString());
+                       }
+
+                       if (targetData.getHttpPort() != null) {
+                               config.put("argeo.http.port", targetData.getHttpPort().toString());
+                       }
+
+                       Path configurationArea = Files.createTempDirectory("slc-cms-test");
+                       config.put(WellKnownConstants.OSGI_CONFIGURATION_AREA, configurationArea.toUri().toString());
+
+                       // modules activation
+                       for (int startLevel = 0; startLevel <= 6; startLevel++) {
+                               List<String> modules = deploymentData.getModulesToActivate(startLevel);
+                               if (modules.size() != 0) {
+                                       String startProperty = String.join(",", modules);
+                                       config.put(InitConstants.PROP_ARGEO_OSGI_START + "." + startLevel, startProperty);
+                               }
+                       }
+
+                       config.put("org.eclipse.equinox.http.jetty.autostart", "false");
+                       config.put("org.osgi.framework.system.packages.extra",
+                                       "sun.security.util,sun.security.internal.spec,sun.security.provider,com.sun.net.httpserver,com.sun.jndi.ldap,com.sun.jndi.ldap.sasl,com.sun.jndi.dns,com.sun.security.jgss,com.sun.nio.file,com.sun.nio.sctp");
+                       config.put("eclipse.ignoreApp", "true");
+                       config.put("osgi.noShutdown", "true");
+                       config.put("osgi.clean", "true");
+                       config.put("osgi.framework.useSystemProperties", "false");
+
+                       config.put("argeo.directory", "dc=example,dc=com.ldif");
+
+                       if (targetData instanceof OsgiCmsTargetData osgiCmsTargetData
+                                       && osgiCmsTargetData.getTelnetPort() != null) {
+                               String hostStr = "";
+                               if (targetData.getHost() != null) {
+                                       hostStr = targetData.getHost().toString() + ":";
+                               }
+                               config.put("osgi.console", hostStr + osgiCmsTargetData.getTelnetPort().toString());
+                       }
+
+                       // initialise
+                       for (String key : config.keySet()) {
+//                             System.out.println(key + "=" + config.get(key));
+                               logger.log(Level.TRACE, () -> key + "=" + config.get(key));
+                       }
+
+                       // FIXME use runtime manager
+                       runtimeContext = new OsgiRuntimeContext(config);
+                       runtimeContext.run();
+
+//                     deployedSystem = new OsgiCmsDeployedSystem(runtimeContext.getFramework().getBundleContext(), distribution,
+//                                     targetData, deploymentData);
+
+               } catch (Exception e) {
+                       throw new IllegalStateException("Cannot run OSGi deployment", e);
+               }
+
+       }
+
+       @Override
+       public DeployedSystem getDeployedSystem() {
+               return deployedSystem;
+       }
+
+       @Override
+       public void setTargetData(TargetData targetData) {
+               this.targetData = (CmsTargetData) targetData;
+       }
+
+       @Override
+       public void setDeploymentData(DeploymentData deploymentData) {
+               this.deploymentData = (CmsDeploymentData) deploymentData;
+       }
+
+       @Override
+       public void setDistribution(Distribution distribution) {
+               this.distribution = (A2Distribution) distribution;
+       }
+
+       public OsgiRuntimeContext getRuntimeContext() {
+               return runtimeContext;
+       }
+
+       public static void main(String[] args) {
+               RuntimeContext runtimeContext = test();
+               try {
+                       runtimeContext.waitForStop(0);
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public static RuntimeContext test() {
+               try {
+                       Path userHome = Paths.get(System.getProperty("user.home"));
+
+                       // distribution
+                       Path a2Base = userHome.resolve("dev/git/unstable/output/a2");
+                       A2Distribution distribution = new A2Distribution();
+                       Map<String, String> xOr = new HashMap<>();
+                       xOr.put("osgi", "equinox");
+                       xOr.put("swt", "rap");
+                       xOr.put("log", "syslogger");
+                       xOr.put("crypto", "fips");
+                       distribution.getA2Sources().add(new FsA2Source(a2Base, xOr, true, null, null));
+
+                       // target data
+                       Path instanceData = userHome.resolve("dev/git/unstable/argeo-slc/sdk/exec/cms-deployment/data");
+                       Files.createDirectories(instanceData);
+                       OsgiCmsTargetData targetData = new OsgiCmsTargetData(instanceData, "host1", 7070, 2323);
+
+                       // deployment data
+                       SimpleCmsDeploymentData deploymentData = new SimpleCmsDeploymentData();
+                       deploymentData.getModulesToActivate(2).add("org.eclipse.equinox.http.servlet");
+                       deploymentData.getModulesToActivate(2).add("org.apache.felix.scr");
+                       deploymentData.getModulesToActivate(2).add("org.eclipse.rap.rwt.osgi");
+                       deploymentData.getModulesToActivate(2).add("org.eclipse.equinox.console");
+
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms");
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.ee");
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.sshd");
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.equinox");
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.lib.jetty");
+                       deploymentData.getModulesToActivate(3).add("org.argeo.cms.swt.rap");
+
+                       deploymentData.getModulesToActivate(4).add("org.argeo.cms.jcr");
+                       deploymentData.getModulesToActivate(4).add("org.argeo.app.profile.acr.fs");
+
+                       deploymentData.getModulesToActivate(5).add("org.argeo.app.core");
+                       deploymentData.getModulesToActivate(5).add("org.argeo.app.ui");
+                       deploymentData.getModulesToActivate(5).add("org.argeo.app.theme.default");
+                       deploymentData.getModulesToActivate(5).add("org.argeo.app.jcr");
+
+                       deploymentData.getModulesToActivate(5).add("org.example.suite.theme");
+                       deploymentData.getModulesToActivate(5).add("org.example.suite.core");
+                       deploymentData.getModulesToActivate(5).add("org.example.suite.ui");
+                       deploymentData.getModulesToActivate(5).add("org.example.suite.ui.rap");
+
+                       OsgiCmsDeployment deployment = new OsgiCmsDeployment();
+                       deployment.setDistribution(distribution);
+                       deployment.setTargetData(targetData);
+                       deployment.setDeploymentData(deploymentData);
+                       deployment.run();
+
+                       boolean multiple = true;
+                       if (multiple) {
+                               // wait a bit
+//                             Thread.sleep(5000);
+
+                               Path instanceData2 = userHome.resolve("dev/git/unstable/argeo-slc/sdk/exec/cms-deployment2/data");
+                               Files.createDirectories(instanceData2);
+                               OsgiCmsTargetData targetData2 = new OsgiCmsTargetData(instanceData2, "host2", 7070, 2323);
+
+                               OsgiCmsDeployment deployment2 = new OsgiCmsDeployment();
+                               deployment2.setDistribution(distribution);
+                               deployment2.setTargetData(targetData2);
+                               deployment2.setDeploymentData(deploymentData);
+                               deployment2.run();
+                       }
+
+                       return deployment.getRuntimeContext();
+               } catch (IOException e) {
+                       e.printStackTrace();
+                       System.exit(1);
+                       return null;
+               }
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/deploy/osgi/OsgiCmsTargetData.java
new file mode 100644 (file)
index 0000000..dc4bf3b
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.slc.cms.deploy.osgi;
+
+import java.nio.file.Path;
+
+import org.argeo.slc.cms.deploy.SimpleCmsTargetData;
+
+public class OsgiCmsTargetData extends SimpleCmsTargetData {
+       private Integer telnetPort;
+
+       public OsgiCmsTargetData(Path instanceData, String host, Integer httpPort, Integer telnetPort) {
+               super(instanceData, host, httpPort);
+               this.telnetPort = telnetPort;
+       }
+
+       public Integer getTelnetPort() {
+               return telnetPort;
+       }
+
+       public void setTelnetPort(Integer telnetPort) {
+               this.telnetPort = telnetPort;
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2Distribution.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2Distribution.java
new file mode 100644 (file)
index 0000000..435d2d6
--- /dev/null
@@ -0,0 +1,75 @@
+package org.argeo.slc.cms.distribution;
+
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+
+import org.argeo.api.a2.A2Branch;
+import org.argeo.api.a2.A2Component;
+import org.argeo.api.a2.A2Contribution;
+import org.argeo.api.a2.A2Module;
+import org.argeo.api.a2.A2Source;
+import org.argeo.slc.CategoryNameVersion;
+import org.argeo.slc.DefaultCategoryNameVersion;
+import org.argeo.slc.NameVersion;
+import org.argeo.slc.build.Distribution;
+import org.argeo.slc.build.ModularDistribution;
+
+public class A2Distribution implements ModularDistribution {
+       private List<A2Source> a2Sources = new ArrayList<>();
+
+       @Override
+       public String getDistributionId() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getName() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public String getVersion() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Iterator<? extends NameVersion> nameVersions() {
+               List<CategoryNameVersion> nameVersions = new ArrayList<>();
+               for (A2Source a2Source : a2Sources) {
+                       for (A2Contribution a2Contribution : a2Source.listContributions(null)) {
+                               for (A2Component a2Component : a2Contribution.listComponents(null)) {
+                                       for (A2Branch a2Branch : a2Component.listBranches(null)) {
+                                               for (A2Module a2Module : a2Branch.listModules(null)) {
+                                                       CategoryNameVersion nameVersion = new DefaultCategoryNameVersion(a2Contribution.getId(),
+                                                                       a2Component.getId(), a2Module.getVersion().toString());
+                                                       nameVersions.add(nameVersion);
+                                               }
+                                       }
+                               }
+                       }
+               }
+               return nameVersions.iterator();
+       }
+
+       @Override
+       public Distribution getModuleDistribution(String moduleName, String moduleVersion) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public Object getModulesDescriptor(String descriptorType) {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       public List<A2Source> getA2Sources() {
+               return a2Sources;
+       }
+
+       
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/distribution/A2ModuleDistribution.java
new file mode 100644 (file)
index 0000000..9e90bce
--- /dev/null
@@ -0,0 +1,14 @@
+package org.argeo.slc.cms.distribution;
+
+import org.argeo.api.a2.A2Module;
+import org.argeo.slc.build.Distribution;
+
+public class A2ModuleDistribution implements Distribution {
+       private A2Module a2Module;
+
+       @Override
+       public String getDistributionId() {
+               return a2Module.getCoordinates();
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/test/CmsSmokeTest.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/test/CmsSmokeTest.java
new file mode 100644 (file)
index 0000000..10b088c
--- /dev/null
@@ -0,0 +1,20 @@
+package org.argeo.slc.cms.test;
+
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+
+public class CmsSmokeTest {
+
+       public static void main(String[] args) throws IOException {
+               Path instanceData;
+               if (args.length > 0) {
+                       instanceData = Paths.get(args[0]);
+               } else {
+                       instanceData = Files.createTempDirectory("cms-test");
+               }
+
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/cms/test/MinimalJvm.java b/org.argeo.slc.runtime/src/org/argeo/slc/cms/test/MinimalJvm.java
new file mode 100644 (file)
index 0000000..87eefd9
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.slc.cms.test;
+
+/**
+ * A program doing nothing and loading no classes, to be used as a baseline for
+ * memory usage of the JVM.
+ */
+public class MinimalJvm {
+
+       synchronized void sleep() {
+               try {
+                       wait();
+               } catch (InterruptedException e) {
+                       e.printStackTrace();
+               }
+       }
+
+       public static void main(String[] args) {
+               new MinimalJvm().sleep();
+       }
+
+}
diff --git a/org.argeo.slc.runtime/src/org/argeo/slc/internal/runtime/osgi/SlcInitActivator.java b/org.argeo.slc.runtime/src/org/argeo/slc/internal/runtime/osgi/SlcInitActivator.java
new file mode 100644 (file)
index 0000000..547cda1
--- /dev/null
@@ -0,0 +1,79 @@
+package org.argeo.slc.internal.runtime.osgi;
+
+import org.argeo.api.init.RuntimeManager;
+import org.osgi.framework.BundleActivator;
+import org.osgi.framework.BundleContext;
+import org.osgi.framework.ServiceReference;
+import org.osgi.util.tracker.ServiceTracker;
+
+public class SlcInitActivator implements BundleActivator {
+//     private final static CmsLog log = CmsLog.getLog(SlcInitActivator.class);
+
+       private ServiceTracker<RuntimeManager, RuntimeManager> runtimeManagerSt;
+
+       @Override
+       public void start(BundleContext context) throws Exception {
+//             Path userHome = Paths.get(System.getProperty("user.home"));
+
+//             {
+//                     EquinoxFactory equinoxFactory = new EquinoxFactory();
+//                     Map<String, String> config = new HashMap<>();
+//                     config.put("osgi.console", "host1:2023");
+//                     config.put("osgi.frameworkParentClassloader", "app");
+//                     config.put("osgi.parentClassLoader", "app");
+//                     RuntimeManager.loadConfig(Paths.get("/usr/local/etc/argeo/user/cms/test3"), config);
+//                     Framework framework = equinoxFactory.newFramework(config);
+//                     framework.start();
+//                     OsgiBoot osgiBoot = new OsgiBoot(framework.getBundleContext());
+//                     osgiBoot.bootstrap(config);
+//             }
+
+               // OsgiCmsDeployment.test();
+
+               runtimeManagerSt = new ServiceTracker<>(context, RuntimeManager.class, null) {
+
+                       @Override
+                       public RuntimeManager addingService(ServiceReference<RuntimeManager> reference) {
+                               RuntimeManager runtimeManager = super.addingService(reference);
+                               new Thread() {
+                                       public void run() {
+//                                             try {
+//                                                     Thread.sleep(5000);
+//                                             } catch (InterruptedException e) {
+//                                                     return;
+//                                             }
+
+//                                             runtimeManager.startRuntime("rcp/test1", (config) -> {
+//                                                     config.put("osgi.console", "host1:2023");
+//                                                     config.put(CmsDeployProperty.SSHD_PORT.getProperty(), "2222");
+////                                                   config.put(CmsDeployProperty.HTTP_PORT.getProperty(), "7070");
+//                                                     config.put(CmsDeployProperty.HOST.getProperty(), "host1");
+////                                                   config.put("argeo.osgi.start.6", "org.argeo.swt.minidesktop");
+//                                             });
+
+                                               runtimeManager.startRuntime("rap/test2", (config) -> {
+                                                       config.put("osgi.console", "host2:2023");
+                                                       config.put("argeo.sshd.port", "2222");
+                                                       config.put("argeo.http.port", "7070");
+                                                       config.put("argeo.host", "host2");
+                                                       String a2Source = config.get("argeo.osgi.sources");
+                                                       config.put("argeo.osgi.sources", a2Source
+                                                                       + ",a2+reference:///home/mbaudier/dev/git/unstable/output/a2?include=eu.netiket.on.apaf");
+                                                       config.put("argeo.osgi.start.6", "eu.netiket.on.apaf");
+////                                                   config.put("argeo.directory", "ipa:///");
+                                               });
+                                       }
+                               }.start();
+
+                               return runtimeManager;
+                       }
+
+               };
+               runtimeManagerSt.open(false);
+       }
+
+       @Override
+       public void stop(BundleContext context) throws Exception {
+       }
+
+}