]> git.argeo.org Git - gpl/argeo-slc.git/blob - swt/rap/org.argeo.tool.rap.cli/src/org/argeo/tool/rap/cli/CmsRapCli.java
Move RAP and RCP cli from Argeo Commons to SLC
[gpl/argeo-slc.git] / swt / rap / org.argeo.tool.rap.cli / src / org / argeo / tool / rap / cli / CmsRapCli.java
1 package org.argeo.tool.rap.cli;
2
3 import java.io.IOException;
4 import java.lang.management.ManagementFactory;
5 import java.nio.file.Path;
6 import java.nio.file.Paths;
7 import java.util.List;
8
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.cli.CommandsCli;
14 import org.argeo.api.cli.DescribedCommand;
15 import org.argeo.api.cms.CmsApp;
16 import org.argeo.api.cms.CmsContext;
17 import org.argeo.api.cms.CmsState;
18 import org.argeo.cms.jetty.CmsJettyServer;
19 import org.argeo.cms.runtime.StaticCms;
20 import org.argeo.cms.swt.app.CmsUserApp;
21 import org.argeo.cms.web.CmsWebApp;
22 import org.argeo.util.register.Component;
23 import org.argeo.util.register.ComponentRegister;
24 import org.eclipse.rap.rwt.application.ApplicationConfiguration;
25
26 public class CmsRapCli extends CommandsCli {
27
28 public CmsRapCli(String commandName) {
29 super(commandName);
30 addCommand("user", new Launch());
31 }
32
33 @Override
34 public String getDescription() {
35 return "Argeo CMS utilities.";
36 }
37
38 public static void main(String[] args) {
39 mainImpl(new CmsRapCli("web"), args);
40 }
41
42 static class Launch implements DescribedCommand<String> {
43 private Option dataOption;
44 private Option uiOption;
45
46 @Override
47 public Options getOptions() {
48 Options options = new Options();
49 dataOption = Option.builder().longOpt("data").hasArg().required()
50 .desc("path to the writable data area (mandatory)").build();
51 uiOption = Option.builder().longOpt("ui").desc("open a user interface").build();
52 options.addOption(dataOption);
53 options.addOption(uiOption);
54 return options;
55 }
56
57 @Override
58 public String apply(List<String> args) {
59 CommandLine cl = toCommandLine(args);
60 String dataPath = cl.getOptionValue(dataOption);
61 boolean ui = cl.hasOption(uiOption);
62
63 Path instancePath = Paths.get(dataPath);
64 System.setProperty("osgi.instance.area", instancePath.toUri().toString());
65 System.setProperty("argeo.http.port", "0");
66
67 StaticCms staticCms = new StaticCms() {
68 @Override
69 protected void addComponents(ComponentRegister register) {
70 if (ui) {
71 CmsUserApp cmsApp = new CmsUserApp();
72 Component<CmsUserApp> cmsAppC = new Component.Builder<>(cmsApp) //
73 .addType(CmsApp.class) //
74 .addType(CmsUserApp.class) //
75 .addDependency(register.getSingleton(CmsContext.class), cmsApp::setCmsContext, null) //
76 .addDependency(register.getSingleton(ProvidedRepository.class),
77 cmsApp::setContentRepository, null) //
78 .build(register);
79
80 CmsWebApp cmsWebApp = new CmsWebApp();
81 Component<CmsWebApp> cmsWebAppC = new Component.Builder<>(cmsWebApp) //
82 .addType(ApplicationConfiguration.class) //
83 .addType(CmsWebApp.class) //
84 .addDependency(cmsAppC.getType(CmsApp.class), cmsWebApp::setCmsApp, null) //
85 .build(register);
86
87 RapJettyServer rwtRunner = new RapJettyServer();
88 Component<RapJettyServer> rwtRunnerC = new Component.Builder<>(rwtRunner) //
89 .addActivation(rwtRunner::start) //
90 .addDeactivation(rwtRunner::stop) //
91 .addType(CmsJettyServer.class) //
92 .addDependency(register.getSingleton(CmsState.class), rwtRunner::setCmsState, null) //
93 .addDependency(cmsWebAppC.getType(CmsWebApp.class), rwtRunner::setCmsWebApp, null) //
94 .build(register);
95 }
96 }
97
98 };
99 Runtime.getRuntime().addShutdownHook(new Thread(() -> staticCms.stop(), "Static CMS Shutdown"));
100 staticCms.start();
101
102 long jvmUptime = ManagementFactory.getRuntimeMXBean().getUptime();
103 System.out.println("Static CMS available in " + jvmUptime + " ms.");
104
105 if (ui) {
106 try {
107 // open browser in app mode
108 Thread.sleep(2000);// wait for RWT to be ready
109 String browserCommand = "google-chrome --app=http://localhost:"
110 + staticCms.getComponentRegister().getObject(CmsJettyServer.class).getHttpPort() + "/data";
111 Runtime.getRuntime().exec(browserCommand);
112 } catch (InterruptedException | IOException e) {
113 e.printStackTrace();
114 }
115 }
116
117 staticCms.waitForStop();
118
119 return null;
120 }
121
122 @Override
123 public String getDescription() {
124 return "Launch a static CMS.";
125 }
126
127 }
128 }