From 262cb3cf9141d0d604c3cac100a6b9a009125513 Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Wed, 14 Oct 2020 08:28:27 +0200 Subject: [PATCH] Introduce CMS UI RCP. --- rcp/org.argeo.cms.ui.rcp/.classpath | 7 + rcp/org.argeo.cms.ui.rcp/.gitignore | 2 + rcp/org.argeo.cms.ui.rcp/.project | 33 ++++ rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore | 1 + .../OSGI-INF/cmsRcpApp.xml | 6 + rcp/org.argeo.cms.ui.rcp/bnd.bnd | 9 + rcp/org.argeo.cms.ui.rcp/build.properties | 5 + rcp/org.argeo.cms.ui.rcp/pom.xml | 22 +++ .../src/org/argeo/cms/ui/rcp/CmsRcpApp.java | 184 ++++++++++++++++++ rcp/pom.xml | 1 + 10 files changed, 270 insertions(+) create mode 100644 rcp/org.argeo.cms.ui.rcp/.classpath create mode 100644 rcp/org.argeo.cms.ui.rcp/.gitignore create mode 100644 rcp/org.argeo.cms.ui.rcp/.project create mode 100644 rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore create mode 100644 rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml create mode 100644 rcp/org.argeo.cms.ui.rcp/bnd.bnd create mode 100644 rcp/org.argeo.cms.ui.rcp/build.properties create mode 100644 rcp/org.argeo.cms.ui.rcp/pom.xml create mode 100644 rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java diff --git a/rcp/org.argeo.cms.ui.rcp/.classpath b/rcp/org.argeo.cms.ui.rcp/.classpath new file mode 100644 index 000000000..e801ebfb4 --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/.classpath @@ -0,0 +1,7 @@ + + + + + + + diff --git a/rcp/org.argeo.cms.ui.rcp/.gitignore b/rcp/org.argeo.cms.ui.rcp/.gitignore new file mode 100644 index 000000000..09e3bc9b2 --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/.gitignore @@ -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 index 000000000..c9c2a44bf --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/.project @@ -0,0 +1,33 @@ + + + org.argeo.cms.ui.rcp + + + + + + org.eclipse.jdt.core.javabuilder + + + + + org.eclipse.pde.ManifestBuilder + + + + + org.eclipse.pde.SchemaBuilder + + + + + org.eclipse.pde.ds.core.builder + + + + + + org.eclipse.pde.PluginNature + org.eclipse.jdt.core.javanature + + 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 index 000000000..4854a41b9 --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/META-INF/.gitignore @@ -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 index 000000000..3b7f26091 --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/OSGI-INF/cmsRcpApp.xml @@ -0,0 +1,6 @@ + + + + + + diff --git a/rcp/org.argeo.cms.ui.rcp/bnd.bnd b/rcp/org.argeo.cms.ui.rcp/bnd.bnd new file mode 100644 index 000000000..8e906757a --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/bnd.bnd @@ -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 index 000000000..6210e849b --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/build.properties @@ -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 index 000000000..8611981ec --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/pom.xml @@ -0,0 +1,22 @@ + + + 4.0.0 + + org.argeo.slc.rcp + argeo-rcp + 2.1.86-SNAPSHOT + .. + + org.argeo.cms.ui.rcp + CMS UI RCP + jar + + + org.argeo.commons + org.argeo.cms.ui + ${version.argeo-commons} + + + \ 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 index 000000000..4ce89789d --- /dev/null +++ b/rcp/org.argeo.cms.ui.rcp/src/org/argeo/cms/ui/rcp/CmsRcpApp.java @@ -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 properties) { + uiThread = new CmsUiThread(); + uiThread.start(); + + } + + public void destroy(Map 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) () -> { + 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 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; + } + +} diff --git a/rcp/pom.xml b/rcp/pom.xml index a1386b928..32a46170a 100644 --- a/rcp/pom.xml +++ b/rcp/pom.xml @@ -15,6 +15,7 @@ org.argeo.minidesktop org.argeo.eclipse.ui.rcp + org.argeo.cms.ui.rcp org.argeo.cms.e4.rcp dep dist -- 2.39.2