Introduce CMS UI RCP.
authorMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2020 06:28:27 +0000 (08:28 +0200)
committerMathieu Baudier <mbaudier@argeo.org>
Wed, 14 Oct 2020 06:28:27 +0000 (08:28 +0200)
rcp/org.argeo.cms.ui.rcp/.classpath [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/.project [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/bnd.bnd [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/build.properties [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/pom.xml [new file with mode: 0644]
rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java [new file with mode: 0644]
rcp/pom.xml

diff --git a/rcp/org.argeo.cms.ui.rcp/.classpath b/rcp/org.argeo.cms.ui.rcp/.classpath
new file mode 100644 (file)
index 0000000..e801ebf
--- /dev/null
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+       <classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11"/>
+       <classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+       <classpathentry kind="src" path="src"/>
+       <classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/rcp/org.argeo.cms.ui.rcp/.gitignore b/rcp/org.argeo.cms.ui.rcp/.gitignore
new file mode 100644 (file)
index 0000000..09e3bc9
--- /dev/null
@@ -0,0 +1,2 @@
+/bin/
+/target/
diff --git a/rcp/org.argeo.cms.ui.rcp/.project b/rcp/org.argeo.cms.ui.rcp/.project
new file mode 100644 (file)
index 0000000..c9c2a44
--- /dev/null
@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+       <name>org.argeo.cms.ui.rcp</name>
+       <comment></comment>
+       <projects>
+       </projects>
+       <buildSpec>
+               <buildCommand>
+                       <name>org.eclipse.jdt.core.javabuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ManifestBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.SchemaBuilder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+               <buildCommand>
+                       <name>org.eclipse.pde.ds.core.builder</name>
+                       <arguments>
+                       </arguments>
+               </buildCommand>
+       </buildSpec>
+       <natures>
+               <nature>org.eclipse.pde.PluginNature</nature>
+               <nature>org.eclipse.jdt.core.javanature</nature>
+       </natures>
+</projectDescription>
diff --git a/rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore b/rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore
new file mode 100644 (file)
index 0000000..4854a41
--- /dev/null
@@ -0,0 +1 @@
+/MANIFEST.MF
diff --git a/rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml b/rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml
new file mode 100644 (file)
index 0000000..3b7f260
--- /dev/null
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" activate="init" deactivate="destroy" name="CMS RCP App">
+   <implementation class="org.argeo.cms.ui.rcp.CmsRcpApp"/>
+   <reference bind="setCmsApp" cardinality="1..1" interface="org.argeo.cms.ui.CmsApp" name="CmsApp" policy="dynamic"/>
+   <reference bind="setEventAdmin" cardinality="1..1" interface="org.osgi.service.event.EventAdmin" name="EventAdmin" policy="static"/>
+</scr:component>
diff --git a/rcp/org.argeo.cms.ui.rcp/bnd.bnd b/rcp/org.argeo.cms.ui.rcp/bnd.bnd
new file mode 100644 (file)
index 0000000..8e90675
--- /dev/null
@@ -0,0 +1,9 @@
+
+Service-Component: OSGI-INF/cmsRcpApp.xml
+
+Import-Package:\
+org.argeo.api,\
+org.argeo.cms.auth,\
+org.eclipse.swt,\
+org.eclipse.swt.graphics,\
+*
diff --git a/rcp/org.argeo.cms.ui.rcp/build.properties b/rcp/org.argeo.cms.ui.rcp/build.properties
new file mode 100644 (file)
index 0000000..6210e84
--- /dev/null
@@ -0,0 +1,5 @@
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               OSGI-INF/
+source.. = src/
diff --git a/rcp/org.argeo.cms.ui.rcp/pom.xml b/rcp/org.argeo.cms.ui.rcp/pom.xml
new file mode 100644 (file)
index 0000000..8611981
--- /dev/null
@@ -0,0 +1,22 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+       <modelVersion>4.0.0</modelVersion>
+       <parent>
+               <groupId>org.argeo.slc.rcp</groupId>
+               <artifactId>argeo-rcp</artifactId>
+               <version>2.1.86-SNAPSHOT</version>
+               <relativePath>..</relativePath>
+       </parent>
+       <artifactId>org.argeo.cms.ui.rcp</artifactId>
+       <name>CMS UI RCP</name>
+       <packaging>jar</packaging>
+       <dependencies>
+               <dependency>
+                       <groupId>org.argeo.commons</groupId>
+                       <artifactId>org.argeo.cms.ui</artifactId>
+                       <version>${version.argeo-commons}</version>
+               </dependency>
+       </dependencies>
+</project>
\ No newline at end of file
diff --git a/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java b/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java
new file mode 100644 (file)
index 0000000..4ce8978
--- /dev/null
@@ -0,0 +1,184 @@
+package org.argeo.cms.ui.rcp;
+
+import java.security.PrivilegedAction;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+import javax.security.auth.Subject;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+
+import org.argeo.api.NodeConstants;
+import org.argeo.cms.ui.CmsApp;
+import org.argeo.cms.ui.CmsImageManager;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.UxContext;
+import org.argeo.cms.ui.util.CmsUiUtils;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+import org.osgi.service.event.Event;
+import org.osgi.service.event.EventAdmin;
+
+/** Runs a {@link CmsApp} as an SWT desktop application. */
+public class CmsRcpApp implements CmsView {
+       private Display display;
+       private Shell shell;
+       private CmsApp cmsApp;
+       private CmsUiThread uiThread;
+
+       // CMS View
+       private String uid;
+       private LoginContext loginContext;
+       
+       private EventAdmin eventAdmin;
+
+       public CmsRcpApp() {
+               uid = UUID.randomUUID().toString();
+       }
+
+       public void init(Map<String, String> properties) {
+               uiThread = new CmsUiThread();
+               uiThread.start();
+
+       }
+
+       public void destroy(Map<String, String> properties) {
+               if (!shell.isDisposed())
+                       shell.dispose();
+               try {
+                       uiThread.join();
+               } catch (InterruptedException e) {
+                       // silent
+               } finally {
+                       uiThread = null;
+               }
+       }
+
+       class CmsUiThread extends Thread {
+
+               public CmsUiThread() {
+                       super("CMS UI");
+               }
+
+               @Override
+               public void run() {
+                       display = new Display();
+                       shell = new Shell(display);
+                       shell.setText("Argeo CMS");
+                       Composite parent = shell;
+                       parent.setLayout(new GridLayout());
+                       CmsView.registerCmsView(shell, CmsRcpApp.this);
+
+//                     Subject subject = new Subject();
+//                     CmsLoginShell loginShell = new CmsLoginShell(CmsRcpApp.this);
+//                     loginShell.setSubject(subject);
+                       try {
+                               // try pre-auth
+//                             loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_USER, subject, loginShell);
+                               loginContext = new LoginContext(NodeConstants.LOGIN_CONTEXT_SINGLE_USER);
+                               loginContext.login();
+                       } catch (LoginException e) {
+                               throw new IllegalStateException("Could not log in.", e);
+//                             loginShell.createUi();
+//                             loginShell.open();
+//
+//                             while (!loginShell.getShell().isDisposed()) {
+//                                     if (!display.readAndDispatch())
+//                                             display.sleep();
+//                             }
+                       }
+
+                       Subject.doAs(loginContext.getSubject(), (PrivilegedAction<Void>) () -> {
+                               Composite ui = cmsApp.initUi(parent);
+                               // ui.setData(CmsApp.UI_NAME_PROPERTY, uiName);
+                               ui.setLayoutData(CmsUiUtils.fillAll());
+
+                               shell.open();
+                               while (!shell.isDisposed()) {
+                                       if (!display.readAndDispatch())
+                                               display.sleep();
+                               }
+                               display.dispose();
+                               return null;
+                       });
+               }
+
+       }
+
+       /*
+        * CMS VIEW
+        */
+
+       @Override
+       public String getUid() {
+               return uid;
+       }
+
+       @Override
+       public UxContext getUxContext() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public void navigateTo(String state) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void authChange(LoginContext loginContext) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void logout() {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public void exception(Throwable e) {
+               // TODO Auto-generated method stub
+
+       }
+
+       @Override
+       public CmsImageManager getImageManager() {
+               // TODO Auto-generated method stub
+               return null;
+       }
+
+       @Override
+       public boolean isAnonymous() {
+               // TODO Auto-generated method stub
+               return false;
+       }
+
+       @Override
+       public void sendEvent(String topic, Map<String, Object> properties) {
+               if (properties == null)
+                       properties = new HashMap<>();
+               if (properties.containsKey(CMS_VIEW_UID_PROPERTY) && !properties.get(CMS_VIEW_UID_PROPERTY).equals(uid))
+                       throw new IllegalArgumentException("Property " + CMS_VIEW_UID_PROPERTY + " is set to another CMS view uid ("
+                                       + properties.get(CMS_VIEW_UID_PROPERTY) + ") then " + uid);
+               properties.put(CMS_VIEW_UID_PROPERTY, uid);
+               eventAdmin.sendEvent(new Event(topic, properties));
+       }
+
+       /*
+        * DEPENDENCY INJECTION
+        */
+       public void setCmsApp(CmsApp cmsApp) {
+               this.cmsApp = cmsApp;
+       }
+
+       public void setEventAdmin(EventAdmin eventAdmin) {
+               this.eventAdmin = eventAdmin;
+       }
+
+}
index a1386b9282a493e718061af44b0e1f5170066f0f..32a46170ac49dbfaae649734c9d97054520db402 100644 (file)
@@ -15,6 +15,7 @@
        <modules>
                <module>org.argeo.minidesktop</module>
                <module>org.argeo.eclipse.ui.rcp</module>
+               <module>org.argeo.cms.ui.rcp</module>
                <module>org.argeo.cms.e4.rcp</module>
                <module>dep</module>
                <module>dist</module>