1 package org
.argeo
.slc
.tool
;
3 import java
.lang
.management
.ManagementFactory
;
4 import java
.nio
.file
.Path
;
5 import java
.nio
.file
.Paths
;
7 import java
.util
.concurrent
.ForkJoinPool
;
9 import org
.apache
.commons
.cli
.CommandLine
;
10 import org
.apache
.commons
.cli
.Option
;
11 import org
.apache
.commons
.cli
.Options
;
12 import org
.argeo
.api
.acr
.spi
.ProvidedRepository
;
13 import org
.argeo
.api
.cms
.CmsApp
;
14 import org
.argeo
.cms
.cli
.CommandsCli
;
15 import org
.argeo
.cms
.cli
.DescribedCommand
;
16 import org
.argeo
.cms
.runtime
.StaticCms
;
17 import org
.argeo
.cms
.swt
.app
.CmsUserApp
;
18 import org
.argeo
.cms
.ui
.rcp
.CmsRcpDisplayFactory
;
19 import org
.argeo
.util
.register
.Component
;
20 import org
.argeo
.util
.register
.SimpleRegister
;
22 public class CmsCli
extends CommandsCli
{
24 public CmsCli(String commandName
) {
26 addCommand("static", new Launch());
30 public String
getDescription() {
31 return "Argeo CMS utilities.";
34 static class Launch
implements DescribedCommand
<String
> {
35 private Option dataOption
;
36 private Option uiOption
;
39 public Options
getOptions() {
40 Options options
= new Options();
41 dataOption
= Option
.builder().longOpt("data").hasArg().required()
42 .desc("path to the writable data area (mandatory)").build();
43 uiOption
= Option
.builder().longOpt("ui").desc("open a user interface").build();
44 options
.addOption(dataOption
);
45 options
.addOption(uiOption
);
50 public String
apply(List
<String
> args
) {
51 CommandLine cl
= toCommandLine(args
);
52 String dataÜath
= cl
.getOptionValue(dataOption
);
53 boolean ui
= cl
.hasOption(uiOption
);
55 Path instancePath
= Paths
.get(dataÜath
);
56 System
.setProperty("osgi.instance.area", instancePath
.toUri().toString());
58 StaticCms staticCms
= new StaticCms() {
60 protected void addComponents(SimpleRegister register
) {
62 Component
<?
extends ProvidedRepository
> contentRepositoryC
= register
63 .find(ProvidedRepository
.class, null).first();
64 CmsUserApp cmsApp
= new CmsUserApp();
65 Component
<CmsUserApp
> cmsAppC
= new Component
.Builder
<>(cmsApp
) //
66 .addType(CmsApp
.class) //
67 .addType(CmsUserApp
.class) //
68 .addDependency(contentRepositoryC
.getType(ProvidedRepository
.class),
69 cmsApp
::setContentRepository
, null) //
72 CmsRcpDisplayFactory displayFactory
= new CmsRcpDisplayFactory();
73 Component
<CmsRcpDisplayFactory
> displayFactoryC
= new Component
.Builder
<>(displayFactory
) //
74 .addActivation(displayFactory
::init
) //
75 .addDeactivation(displayFactory
::destroy
) //
82 protected void postActivation(SimpleRegister register
) {
84 Component
<?
extends CmsUserApp
> cmsAppC
= register
.find(CmsUserApp
.class, null).first();
85 CmsRcpDisplayFactory
.openCmsApp(null, cmsAppC
.get(), "data", (e
) -> {
86 // asynchronous in order to avoid deadlock in UI thread
87 ForkJoinPool
.commonPool().execute(() -> stop());
93 Runtime
.getRuntime().addShutdownHook(new Thread(() -> staticCms
.stop(), "Static CMS Shutdown"));
96 long jvmUptime
= ManagementFactory
.getRuntimeMXBean().getUptime();
97 System
.out
.println("Static CMS available in " + jvmUptime
+ " ms.");
99 staticCms
.waitForStop();
105 public String
getDescription() {
106 return "Launch a static CMS.";