Move UI classes to cms.ui
authorBruno Sinou <bsinou@argeo.org>
Thu, 15 Sep 2016 11:45:36 +0000 (11:45 +0000)
committerBruno Sinou <bsinou@argeo.org>
Thu, 15 Sep 2016 11:45:36 +0000 (11:45 +0000)
git-svn-id: https://svn.argeo.org/commons/trunk@9159 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc

55 files changed:
org.argeo.cms.ui/src/org/argeo/cms/forms/FormEditorHeader.java
org.argeo.cms.ui/src/org/argeo/cms/forms/FormPageViewer.java
org.argeo.cms.ui/src/org/argeo/cms/forms/FormUtils.java
org.argeo.cms.ui/src/org/argeo/cms/maintenance/Browse.java
org.argeo.cms.ui/src/org/argeo/cms/maintenance/NonAdminPage.java
org.argeo.cms.ui/src/org/argeo/cms/text/CustomTextEditor.java
org.argeo.cms.ui/src/org/argeo/cms/text/Img.java
org.argeo.cms.ui/src/org/argeo/cms/text/StandardTextEditor.java
org.argeo.cms.ui/src/org/argeo/cms/text/TextEditorHeader.java
org.argeo.cms.ui/src/org/argeo/cms/text/WikiPage.java
org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsEntryPoint.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsConstants.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditable.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditionEvent.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsImageManager.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsStyles.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiProvider.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/LifeCycleUiProvider.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/UxContext.java [new file with mode: 0644]
org.argeo.cms.ui/src/org/argeo/cms/ui/internal/Activator.java
org.argeo.cms.ui/src/org/argeo/cms/ui/internal/ImageManagerImpl.java
org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java
org.argeo.cms.ui/src/org/argeo/cms/ui/internal/text/AbstractTextViewer.java
org.argeo.cms.ui/src/org/argeo/cms/util/CmsLink.java
org.argeo.cms.ui/src/org/argeo/cms/util/CmsUtils.java
org.argeo.cms.ui/src/org/argeo/cms/util/LoginEntryPoint.java
org.argeo.cms.ui/src/org/argeo/cms/util/MenuLink.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleApp.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleCmsHeader.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleDynamicPages.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleErgonomics.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleStaticPage.java
org.argeo.cms.ui/src/org/argeo/cms/util/SimpleUxContext.java
org.argeo.cms.ui/src/org/argeo/cms/util/SystemNotifications.java
org.argeo.cms.ui/src/org/argeo/cms/util/UserMenuLink.java
org.argeo.cms.ui/src/org/argeo/cms/util/useradmin/UserAdminUtils.java
org.argeo.cms.ui/src/org/argeo/cms/viewers/AbstractPageViewer.java
org.argeo.cms.ui/src/org/argeo/cms/viewers/JcrVersionCmsEditable.java
org.argeo.cms.ui/src/org/argeo/cms/widgets/StyledControl.java
org.argeo.cms.ui/src/org/argeo/cms/widgets/auth/CmsLogin.java
org.argeo.cms.ui/src/org/argeo/cms/widgets/auth/CmsLoginShell.java
org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsConstants.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsEditable.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsEditionEvent.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsExtension.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsImageManager.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsStyles.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsUiProvider.java [deleted file]
org.argeo.cms/src/org/argeo/cms/CmsView.java [deleted file]
org.argeo.cms/src/org/argeo/cms/DataMigration.java [deleted file]
org.argeo.cms/src/org/argeo/cms/LifeCycleUiProvider.java [deleted file]
org.argeo.cms/src/org/argeo/cms/UxContext.java [deleted file]
org.argeo.cms/src/org/argeo/cms/internal/backup/RepositoryMigration.java [deleted file]

index c12e2f000e8a4bcda29a36b27a189488142f935d..92ce9da0ca73222cba269268407975cd0d91ea1d 100644 (file)
@@ -5,7 +5,7 @@ import java.util.Observer;
 
 import javax.jcr.Node;
 
-import org.argeo.cms.CmsEditable;
+import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
index 8526fcaca11148b31df485bed075e618fe51691b..afc7cb15b657b5a932ed92a8a82207e39e996b7d 100644 (file)
@@ -16,11 +16,11 @@ import javax.jcr.ValueFormatException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.text.Img;
+import org.argeo.cms.ui.CmsEditable;
+import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.cms.ui.internal.text.MarkupValidatorCopy;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.AbstractPageViewer;
index f8d08b08d8a418299e75fc553a2f520c411ad511..d0fa9269c4d7b7acd1c8a02ecb878b8f76fb0545 100644 (file)
@@ -12,7 +12,7 @@ import javax.jcr.RepositoryException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsView;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.eclipse.jface.fieldassist.ControlDecoration;
index 7dafd72c4b8075678b533cf850bec25849c6a568..0389205ca096574d7e066fe43424f8b494d7f737 100644 (file)
@@ -18,8 +18,8 @@ import javax.jcr.Value;
 
 import org.argeo.cms.CmsException;
 import org.argeo.cms.CmsTypes;
-import org.argeo.cms.CmsUiProvider;
 import org.argeo.cms.text.Img;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.util.CmsLink;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.widgets.EditableImage;
index b27d506592a020a7bde95f4d8851820c953bc8c7..8a903448f644270f98ad4cc67d6db189819dbf82 100644 (file)
@@ -3,7 +3,7 @@ package org.argeo.cms.maintenance;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
index c7491e02c2a128d999f3c56dde0012dd3ec7abca..442ad7815b5b9eb5f12082eb4e367e3519904bb6 100644 (file)
@@ -5,7 +5,7 @@ import static org.argeo.cms.util.CmsUtils.fillWidth;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsEditable;
+import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.ui.internal.text.AbstractTextViewer;
 import org.argeo.cms.viewers.Section;
 import org.eclipse.swt.widgets.Composite;
index e0cf21624660dfebb78fb22ce46299298748b46a..12f65f35e256b044804fc38e946823e5f192e16e 100644 (file)
@@ -4,7 +4,7 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
+import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.cms.ui.internal.JcrFileUploadReceiver;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.NodePart;
index 3d1dc3f6f0d2b665ce76b29ea5e5668249962063..f39317ac2e77c6f14922535d90f20b7988f486c2 100644 (file)
@@ -6,8 +6,8 @@ import javax.jcr.Node;
 import javax.jcr.Property;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsTypes;
+import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.ui.internal.text.AbstractTextViewer;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.Section;
index e70a4d06e850f9a8f3155b3e7a93a3d2af662c9c..5ae0536839cd6df1a9fb32c5abc61f6177f88763 100644 (file)
@@ -3,7 +3,7 @@ package org.argeo.cms.text;
 import java.util.Observable;
 import java.util.Observer;
 
-import org.argeo.cms.CmsEditable;
+import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.SelectionEvent;
index 38af381a59927a17ed361fc86f7e60bc2699d4e3..a01cc3551a8fca1225397bfdb35e272c32cd01ae 100644 (file)
@@ -6,10 +6,10 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 
-import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsTypes;
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsEditable;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.cms.util.CmsLink;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.JcrVersionCmsEditable;
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsEntryPoint.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/AbstractCmsEntryPoint.java
new file mode 100644 (file)
index 0000000..4729c5b
--- /dev/null
@@ -0,0 +1,334 @@
+package org.argeo.cms.ui;
+
+import java.security.PrivilegedAction;
+import java.util.HashMap;
+import java.util.Map;
+
+import javax.jcr.Node;
+import javax.jcr.PathNotFoundException;
+import javax.jcr.Property;
+import javax.jcr.Repository;
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+import javax.jcr.nodetype.NodeType;
+import javax.security.auth.Subject;
+import javax.security.auth.login.CredentialNotFoundException;
+import javax.security.auth.login.LoginContext;
+import javax.security.auth.login.LoginException;
+import javax.servlet.http.HttpServletRequest;
+
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+import org.argeo.cms.CmsException;
+import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.eclipse.ui.specific.UiContext;
+import org.argeo.jcr.JcrUtils;
+import org.argeo.node.NodeAuthenticated;
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.rap.rwt.application.AbstractEntryPoint;
+import org.eclipse.rap.rwt.client.WebClient;
+import org.eclipse.rap.rwt.client.service.BrowserNavigation;
+import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
+import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
+import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.swt.widgets.Shell;
+
+/** Manages history and navigation */
+public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements CmsView {
+       private final Log log = LogFactory.getLog(AbstractCmsEntryPoint.class);
+
+       private final Subject subject;
+       private LoginContext loginContext;
+
+       private final Repository repository;
+       private final String workspace;
+       private final String defaultPath;
+       private final Map<String, String> factoryProperties;
+
+       // Current state
+       private Session session;
+       private Node node;
+       private String nodePath;// useful when changing auth
+       private String state;
+       private String page;
+       private Throwable exception;
+
+       // Client services
+       private final JavaScriptExecutor jsExecutor;
+       private final BrowserNavigation browserNavigation;
+
+       public AbstractCmsEntryPoint(Repository repository, String workspace, String defaultPath,
+                       Map<String, String> factoryProperties) {
+               this.repository = repository;
+               this.workspace = workspace;
+               this.defaultPath = defaultPath;
+               this.factoryProperties = new HashMap<String, String>(factoryProperties);
+               subject = new Subject();
+
+               // Initial login
+               try {
+                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER, subject,
+                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest()));
+                       loginContext.login();
+               } catch (CredentialNotFoundException e) {
+                       try {
+                               loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
+                               loginContext.login();
+                       } catch (LoginException e1) {
+                               throw new CmsException("Cannot log as anonymous", e);
+                       }
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot initialize subject", e);
+               }
+               authChange(loginContext);
+
+               jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class);
+               browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
+               if (browserNavigation != null)
+                       browserNavigation.addBrowserNavigationListener(new CmsNavigationListener());
+       }
+
+       @Override
+       protected Shell createShell(Display display) {
+               Shell shell = super.createShell(display);
+               shell.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_SHELL);
+               display.disposeExec(new Runnable() {
+
+                       @Override
+                       public void run() {
+                               if (log.isTraceEnabled())
+                                       log.trace("Logging out " + session);
+                               JcrUtils.logoutQuietly(session);
+                       }
+               });
+               return shell;
+       }
+
+       @Override
+       protected final void createContents(final Composite parent) {
+               UiContext.setData(NodeAuthenticated.KEY, this);
+               Subject.doAs(subject, new PrivilegedAction<Void>() {
+                       @Override
+                       public Void run() {
+                               try {
+                                       initUi(parent);
+                               } catch (Exception e) {
+                                       throw new CmsException("Cannot create entrypoint contents", e);
+                               }
+                               return null;
+                       }
+               });
+       }
+
+       /** Create UI */
+       protected abstract void initUi(Composite parent);
+
+       /** Recreate UI after navigation or auth change */
+       protected abstract void refresh();
+
+       /**
+        * The node to return when no node was found (for authenticated users and
+        * anonymous)
+        */
+       protected Node getDefaultNode(Session session) throws RepositoryException {
+               if (!session.hasPermission(defaultPath, "read")) {
+                       if (session.getUserID().equals(AuthConstants.ROLE_ANONYMOUS))
+                               // TODO throw a special exception
+                               throw new CmsException("Login required");
+                       else
+                               throw new CmsException("Unauthorized");
+               }
+               return session.getNode(defaultPath);
+       }
+
+       protected String getBaseTitle() {
+               return factoryProperties.get(WebClient.PAGE_TITLE);
+       }
+
+       public void navigateTo(String state) {
+               exception = null;
+               String title = setState(state);
+               doRefresh();
+               if (browserNavigation != null)
+                       browserNavigation.pushState(state, title);
+       }
+
+       @Override
+       public synchronized Subject getSubject() {
+               return subject;
+       }
+
+       @Override
+       public synchronized void logout() {
+               if (loginContext == null)
+                       throw new CmsException("Login context should not be null");
+               try {
+                       loginContext.logout();
+                       LoginContext anonymousLc = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
+                       anonymousLc.login();
+                       authChange(anonymousLc);
+               } catch (LoginException e) {
+                       throw new CmsException("Cannot logout", e);
+               }
+       }
+
+       @Override
+       public synchronized void authChange(LoginContext loginContext) {
+               if (loginContext == null)
+                       throw new CmsException("Login context cannot be null");
+               this.loginContext = loginContext;
+               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
+
+                       @Override
+                       public Void run() {
+                               try {
+                                       JcrUtils.logoutQuietly(session);
+                                       session = repository.login(workspace);
+                                       if (nodePath != null)
+                                               try {
+                                                       node = session.getNode(nodePath);
+                                               } catch (PathNotFoundException e) {
+                                                       // logout();
+                                                       // session = repository.login(workspace);
+                                                       navigateTo("~");
+                                                       // throw e;
+                                               }
+
+                                       // refresh UI
+                                       doRefresh();
+                               } catch (RepositoryException e) {
+                                       throw new CmsException("Cannot perform auth change", e);
+                               }
+                               return null;
+                       }
+
+               });
+
+       }
+
+       @Override
+       public void exception(final Throwable e) {
+               AbstractCmsEntryPoint.this.exception = e;
+               log.error("Unexpected exception in CMS", e);
+               doRefresh();
+       }
+
+       protected synchronized void doRefresh() {
+               Subject.doAs(subject, new PrivilegedAction<Void>() {
+                       @Override
+                       public Void run() {
+                               refresh();
+                               return null;
+                       }
+               });
+       }
+
+       /** Sets the state of the entry point and retrieve the related JCR node. */
+       protected synchronized String setState(String newState) {
+               String previousState = this.state;
+
+               Node node = null;
+               page = null;
+               this.state = newState;
+               if (newState.equals("~"))
+                       this.state = "";
+
+               try {
+                       int firstSlash = state.indexOf('/');
+                       if (firstSlash == 0) {
+                               if (session.nodeExists(state))
+                                       node = session.getNode(state);
+                               else
+                                       throw new CmsException("Data " + state + " does not exist");
+                               page = "";
+                       } else if (firstSlash > 0) {
+                               String prefix = state.substring(0, firstSlash);
+                               String path = state.substring(firstSlash);
+                               if (session.nodeExists(path))
+                                       node = session.getNode(path);
+                               else
+                                       throw new CmsException("Data " + path + " does not exist");
+                               page = prefix;
+                       } else {
+                               node = getDefaultNode(session);
+                               page = state;
+                       }
+                       setNode(node);
+                       String title = publishMetaData(node);
+
+                       if (log.isTraceEnabled())
+                               log.trace("node=" + node + ", state=" + state + " (page=" + page + ")");
+
+                       return title;
+               } catch (Exception e) {
+                       log.error("Cannot set state '" + state + "'", e);
+                       if (previousState.equals(""))
+                               previousState = "~";
+                       navigateTo(previousState);
+                       throw new CmsException("Unexpected issue when accessing #" + newState, e);
+               }
+       }
+
+       private String publishMetaData(Node node) throws RepositoryException {
+               // Title
+               String title;
+               if (node.isNodeType(NodeType.MIX_TITLE) && node.hasProperty(Property.JCR_TITLE))
+                       title = node.getProperty(Property.JCR_TITLE).getString() + " - " + getBaseTitle();
+               else
+                       title = getBaseTitle();
+
+               HttpServletRequest request = UiContext.getHttpRequest();
+               if (request == null)
+                       return null;
+
+               StringBuilder js = new StringBuilder();
+               title = title.replace("'", "\\'");// sanitize
+               js.append("document.title = '" + title + "';");
+               jsExecutor.execute(js.toString());
+               return title;
+       }
+
+       // Simply remove some illegal character
+       // private String clean(String stringToClean) {
+       // return stringToClean.replaceAll("'", "").replaceAll("\\n", "")
+       // .replaceAll("\\t", "");
+       // }
+
+       protected synchronized Node getNode() {
+               return node;
+       }
+
+       private synchronized void setNode(Node node) throws RepositoryException {
+               this.node = node;
+               this.nodePath = node == null ? null : node.getPath();
+       }
+
+       protected String getState() {
+               return state;
+       }
+
+       protected Throwable getException() {
+               return exception;
+       }
+
+       protected void resetException() {
+               exception = null;
+       }
+
+       protected Session getSession() {
+               return session;
+       }
+
+       private class CmsNavigationListener implements BrowserNavigationListener {
+               private static final long serialVersionUID = -3591018803430389270L;
+
+               @Override
+               public void navigated(BrowserNavigationEvent event) {
+                       setState(event.getState());
+                       refresh();
+               }
+       }
+}
\ No newline at end of file
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsConstants.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsConstants.java
new file mode 100644 (file)
index 0000000..dcbc024
--- /dev/null
@@ -0,0 +1,22 @@
+package org.argeo.cms.ui;
+
+import org.eclipse.rap.rwt.RWT;
+import org.eclipse.swt.graphics.Point;
+
+/** Commons constants */
+public interface CmsConstants {
+       // DATAKEYS
+       public final static String STYLE = RWT.CUSTOM_VARIANT;
+       public final static String MARKUP = RWT.MARKUP_ENABLED;
+       public final static String ITEM_HEIGHT = RWT.CUSTOM_ITEM_HEIGHT;
+
+       // EVENT DETAILS
+       public final static int HYPERLINK = RWT.HYPERLINK;
+
+       // STANDARD RESOURCES
+       public final static String LOADING_IMAGE = "icons/loading.gif";
+
+       public final static String NO_IMAGE = "icons/noPic-square-640px.png";
+       public final static Point NO_IMAGE_SIZE = new Point(640, 640);
+       public final static Float NO_IMAGE_RATIO = 1f;
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditable.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditable.java
new file mode 100644 (file)
index 0000000..687e3e8
--- /dev/null
@@ -0,0 +1,36 @@
+package org.argeo.cms.ui;
+
+/** API NOT STABLE (yet). */
+public interface CmsEditable {
+
+       /** Whether the calling thread can edit, the value is immutable */
+       public Boolean canEdit();
+
+       public Boolean isEditing();
+
+       public void startEditing();
+
+       public void stopEditing();
+
+       public static CmsEditable NON_EDITABLE = new CmsEditable() {
+
+               @Override
+               public void stopEditing() {
+               }
+
+               @Override
+               public void startEditing() {
+               }
+
+               @Override
+               public Boolean isEditing() {
+                       return false;
+               }
+
+               @Override
+               public Boolean canEdit() {
+                       return false;
+               }
+       };
+
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditionEvent.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsEditionEvent.java
new file mode 100644 (file)
index 0000000..872142b
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.cms.ui;
+
+import java.util.EventObject;
+
+/** Notify of the edition lifecycle */
+public class CmsEditionEvent extends EventObject {
+       private static final long serialVersionUID = 950914736016693110L;
+
+       public final static Integer START_EDITING = 0;
+       public final static Integer STOP_EDITING = 1;
+
+       private final Integer type;
+
+       public CmsEditionEvent(Object source, Integer type) {
+               super(source);
+               this.type = type;
+       }
+
+       public Integer getType() {
+               return type;
+       }
+
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsImageManager.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsImageManager.java
new file mode 100644 (file)
index 0000000..ddae600
--- /dev/null
@@ -0,0 +1,48 @@
+package org.argeo.cms.ui;
+
+import java.io.InputStream;
+
+import javax.jcr.Binary;
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.eclipse.swt.graphics.Image;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.widgets.Control;
+
+/** Read and write access to images. */
+public interface CmsImageManager {
+       /** Load image in control */
+       public Boolean load(Node node, Control control, Point size)
+                       throws RepositoryException;
+
+       /** @return (0,0) if not available */
+       public Point getImageSize(Node node) throws RepositoryException;
+
+       /**
+        * The related <img tag, with src, width and height set. @return null if not
+        * available
+        */
+       public String getImageTag(Node node) throws RepositoryException;
+
+       /**
+        * The related <img tag, with url, width and height set. Caller must close
+        * the tag (or add additional attributes). @return null if not available
+        */
+       public StringBuilder getImageTagBuilder(Node node, Point size)
+                       throws RepositoryException;
+
+       /**
+        * Returns the remotely accessible URL of the image (registering it if
+        * needed) @return null if not available
+        */
+       public String getImageUrl(Node node) throws RepositoryException;
+
+       public Binary getImageBinary(Node node) throws RepositoryException;
+
+       public Image getSwtImage(Node node) throws RepositoryException;
+
+       /** @return URL */
+       public String uploadImage(Node parentNode, String fileName, InputStream in)
+                       throws RepositoryException;
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsStyles.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsStyles.java
new file mode 100644 (file)
index 0000000..2df1ea0
--- /dev/null
@@ -0,0 +1,26 @@
+package org.argeo.cms.ui;
+
+/** Styles references in the CSS. */
+public interface CmsStyles {
+       // General
+       public final static String CMS_SHELL = "cms_shell";
+       public final static String CMS_MENU_LINK = "cms_menu_link";
+
+       // Header
+       public final static String CMS_HEADER = "cms_header";
+       public final static String CMS_HEADER_LEAD = "cms_header-lead";
+       public final static String CMS_HEADER_CENTER = "cms_header-center";
+       public final static String CMS_HEADER_END = "cms_header-end";
+       public final static String CMS_USER_MENU = "cms_user_menu";
+       public final static String CMS_USER_MENU_LINK = "cms_user_menu-link";
+       public final static String CMS_USER_MENU_ITEM = "cms_user_menu-item";
+       public final static String CMS_LOGIN_DIALOG = "cms_login_dialog";
+       public final static String CMS_LOGIN_DIALOG_USERNAME = "cms_login_dialog-username";
+       public final static String CMS_LOGIN_DIALOG_PASSWORD = "cms_login_dialog-password";
+
+       // Body
+       public final static String CMS_SCROLLED_AREA = "cms_scrolled_area";
+       public final static String CMS_BODY = "cms_body";
+       public final static String CMS_STATIC_TEXT = "cms_static-text";
+       public final static String CMS_LINK = "cms_link";
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiProvider.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsUiProvider.java
new file mode 100644 (file)
index 0000000..7e0e4fa
--- /dev/null
@@ -0,0 +1,21 @@
+package org.argeo.cms.ui;
+
+import javax.jcr.Node;
+import javax.jcr.RepositoryException;
+
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+
+/** Stateless factory building an SWT user interface given a JCR context. */
+public interface CmsUiProvider {
+       /**
+        * Initialises a user interface.
+        * 
+        * @param parent
+        *            the parent composite
+        * @param a
+        *            context node or null
+        */
+       public Control createUi(Composite parent, Node context)
+                       throws RepositoryException;
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsView.java
new file mode 100644 (file)
index 0000000..8ef468a
--- /dev/null
@@ -0,0 +1,23 @@
+package org.argeo.cms.ui;
+
+import javax.security.auth.login.LoginContext;
+
+import org.argeo.node.NodeAuthenticated;
+
+/** Provides interaction with the CMS system. UNSTABLE API at this stage. */
+public interface CmsView extends NodeAuthenticated {
+       UxContext getUxContext();
+
+       // NAVIGATION
+       void navigateTo(String state);
+
+       // SECURITY
+       void authChange(LoginContext loginContext);
+
+       void logout();
+
+       // SERVICES
+       void exception(Throwable e);
+
+       CmsImageManager getImageManager();
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/LifeCycleUiProvider.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/LifeCycleUiProvider.java
new file mode 100644 (file)
index 0000000..5d77c15
--- /dev/null
@@ -0,0 +1,11 @@
+package org.argeo.cms.ui;
+
+import javax.jcr.RepositoryException;
+import javax.jcr.Session;
+
+/** CmsUiProvider notified of initialisation with a system session. */
+public interface LifeCycleUiProvider extends CmsUiProvider {
+       public void init(Session adminSession) throws RepositoryException;
+
+       public void destroy();
+}
diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/UxContext.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/UxContext.java
new file mode 100644 (file)
index 0000000..f03b88b
--- /dev/null
@@ -0,0 +1,9 @@
+package org.argeo.cms.ui;
+
+public interface UxContext {
+       boolean isPortrait();
+       boolean isLandscape();
+       boolean isSquare();
+       
+       boolean isSmall();
+}
index ffc162b0f131ac109fd9d199fa11763ec13f4cca..052762ec0e76b2f1a6d9cc972270d8d81b948ced 100644 (file)
@@ -1,7 +1,7 @@
 package org.argeo.cms.ui.internal;
 
-import org.argeo.cms.CmsStyles;
 import org.argeo.cms.maintenance.MaintenanceUi;
+import org.argeo.cms.ui.CmsStyles;
 import org.argeo.cms.ui.internal.rwt.UserUi;
 import org.argeo.node.NodeState;
 import org.argeo.util.LangUtils;
index 92f237a4c5488e65fe601ed076300c0d4906b97a..855446284ba040f894fe4cf3effa1de538b001af 100644 (file)
@@ -4,8 +4,8 @@ import static javax.jcr.Node.JCR_CONTENT;
 import static javax.jcr.Property.JCR_DATA;
 import static javax.jcr.nodetype.NodeType.NT_FILE;
 import static javax.jcr.nodetype.NodeType.NT_RESOURCE;
-import static org.argeo.cms.CmsConstants.NO_IMAGE_SIZE;
 import static org.argeo.cms.CmsTypes.CMS_STYLED;
+import static org.argeo.cms.ui.CmsConstants.NO_IMAGE_SIZE;
 
 import java.io.ByteArrayInputStream;
 import java.io.IOException;
@@ -21,9 +21,9 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsTypes;
+import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.rwt.RWT;
index 2b157eb61fa3278c997ebc6e69c121aee584cd50..47eb191f9c1e25bf1ac02656074966f9ab3b2cb6 100644 (file)
@@ -12,8 +12,8 @@ import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.io.FilenameUtils;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
+import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.fileupload.FileDetails;
 import org.eclipse.rap.fileupload.FileUploadReceiver;
index c4b6060f9daa56a424bda5315c89f9db2ac737a4..aabf6856447d4e85d741c88441970a2ebac9bb34 100644 (file)
@@ -18,15 +18,15 @@ import javax.jcr.nodetype.NodeType;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
 import org.argeo.cms.CmsNames;
 import org.argeo.cms.CmsTypes;
 import org.argeo.cms.text.Img;
 import org.argeo.cms.text.Paragraph;
 import org.argeo.cms.text.TextInterpreter;
 import org.argeo.cms.text.TextSection;
+import org.argeo.cms.ui.CmsEditable;
+import org.argeo.cms.ui.CmsImageManager;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.cms.viewers.AbstractPageViewer;
 import org.argeo.cms.viewers.EditablePart;
index 01b1fde2ff4cd1babfdc080c045856ef6f2ef714..3778515dcc70c56a338ef271db0a69df304b8e5a 100644 (file)
@@ -10,8 +10,8 @@ import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsStyles;
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsStyles;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.service.ResourceManager;
 import org.eclipse.swt.SWT;
index 5ebfeb831917d130e4f23b46e311661c71b47f02..a1908106296f1f18bd3177e9f4b51bf97571d78b 100644 (file)
@@ -13,10 +13,10 @@ import javax.servlet.http.HttpServletRequest;
 import org.apache.commons.io.IOUtils;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsConstants;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsView;
 import org.argeo.cms.auth.AuthConstants;
+import org.argeo.cms.ui.CmsConstants;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.eclipse.ui.specific.UiContext;
 import org.argeo.jcr.ArgeoJcrConstants;
 import org.argeo.jcr.JcrUtils;
index 2dea8d3f7e6eb04b896006a80963a3110226b80d..424b8b23c68c7686837348bfe79de5fde716d5e6 100644 (file)
@@ -9,12 +9,12 @@ import javax.security.auth.login.LoginException;
 import javax.servlet.http.HttpServletRequest;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
-import org.argeo.cms.CmsView;
-import org.argeo.cms.UxContext;
 import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.HttpRequestCallbackHandler;
+import org.argeo.cms.ui.CmsImageManager;
+import org.argeo.cms.ui.CmsView;
+import org.argeo.cms.ui.UxContext;
 import org.argeo.cms.widgets.auth.CmsLogin;
 import org.argeo.cms.widgets.auth.CmsLoginShell;
 import org.argeo.eclipse.ui.specific.UiContext;
index d491d3ca291d7a8c663f0db9609c287809677561..c91674d7b2ede0844ee72ea5d34b046a13dfb812 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.util;
 
-import org.argeo.cms.CmsStyles;
+import org.argeo.cms.ui.CmsStyles;
 
 /**
  * Convenience class setting the custom style {@link CmsStyles#CMS_MENU_LINK} on
index 39e75070b450c032cc3665b427925802b680b82d..a0dc732624051108ebf391a91a1c1d8b8de0cbc9 100644 (file)
@@ -18,10 +18,10 @@ import javax.jcr.version.VersionManager;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsConstants;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.LifeCycleUiProvider;
+import org.argeo.cms.ui.CmsConstants;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.LifeCycleUiProvider;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.rap.rwt.application.Application;
index aa1bb73401681cb02cdb8d6a3d020d65afd934a0..3f79c7fffea16e61a9a861b7688c050b15010797 100644 (file)
@@ -7,8 +7,8 @@ import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsStyles;
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsStyles;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.layout.GridData;
index b6155cf31eb2e1cecf9400d604a51f0dbf17590a..dd95e7f354fd0392c62e0bc64c7697cd7ff4808b 100644 (file)
@@ -12,7 +12,7 @@ import javax.jcr.RepositoryException;
 import javax.jcr.Value;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.argeo.jcr.JcrUtils;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
index 8ada61fdf462d88bb88f0646e7bd13d2bbbe7539..620bc5302ae65f5224cacece398f840b394bf74b 100644 (file)
@@ -7,12 +7,12 @@ import javax.jcr.RepositoryException;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.AbstractCmsEntryPoint;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsImageManager;
-import org.argeo.cms.CmsStyles;
-import org.argeo.cms.CmsUiProvider;
-import org.argeo.cms.UxContext;
+import org.argeo.cms.ui.AbstractCmsEntryPoint;
+import org.argeo.cms.ui.CmsImageManager;
+import org.argeo.cms.ui.CmsStyles;
+import org.argeo.cms.ui.CmsUiProvider;
+import org.argeo.cms.ui.UxContext;
 import org.argeo.cms.ui.internal.ImageManagerImpl;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
index 6e09000e9a6b0459fe2fddb928f7f40affb4db85..8ac3e963a2085a95cb6fd07dea8ad2ccadba0b4f 100644 (file)
@@ -3,8 +3,8 @@ package org.argeo.cms.util;
 import javax.jcr.Node;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsStyles;
-import org.argeo.cms.CmsUiProvider;
+import org.argeo.cms.ui.CmsStyles;
+import org.argeo.cms.ui.CmsUiProvider;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Composite;
index c5a6e6f4c284698fae04c74d7412c2cfa97b1e0a..6cb37bde4f4a71ddf659d785a8d9b76e5657f485 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.util;
 
-import org.argeo.cms.UxContext;
+import org.argeo.cms.ui.UxContext;
 import org.eclipse.swt.graphics.Point;
 import org.eclipse.swt.graphics.Rectangle;
 import org.eclipse.swt.widgets.Display;
index 54e8eb544755b8262e22d2f2a9f3dc70d505ceec..5fa79a33199b8bbec2cfcf6ccb93cb98fd97b64f 100644 (file)
@@ -9,7 +9,7 @@ import java.util.Date;
 
 import org.apache.commons.io.IOUtils;
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsStyles;
+import org.argeo.cms.ui.CmsStyles;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.MouseEvent;
index 1b7ca03f44f2fcc937498a208d6274840a9947b5..f7c9a7c8f52f3c4cc063036f3149624c6e998d81 100644 (file)
@@ -4,9 +4,9 @@ import javax.jcr.Node;
 import javax.security.auth.Subject;
 
 import org.argeo.cms.CmsMsg;
-import org.argeo.cms.CmsStyles;
 import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.CmsStyles;
 import org.eclipse.swt.events.DisposeEvent;
 import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.MouseEvent;
index 9ccc3057f3a355d66d369cdd06f3bd5633f2567f..953eb02c3c8a5727bb66f078635dec5b3f505dfa 100644 (file)
@@ -11,9 +11,9 @@ import javax.security.auth.Subject;
 import javax.security.auth.x500.X500Principal;
 
 import org.argeo.cms.CmsException;
-import org.argeo.cms.CmsView;
 import org.argeo.cms.auth.AuthConstants;
 import org.argeo.cms.auth.CurrentUser;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.util.CmsUtils;
 import org.argeo.eclipse.ui.EclipseUiUtils;
 import org.argeo.jcr.JcrUtils;
index b52f76be52f5afe769c436d5cdbed3e5dfc0b11f..31d54c00c302bdcf9d197e7806b8982b0d188670 100644 (file)
@@ -9,8 +9,8 @@ import javax.jcr.Session;
 
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.CmsEditable;
 import org.argeo.cms.CmsException;
+import org.argeo.cms.ui.CmsEditable;
 import org.argeo.cms.widgets.ScrolledPage;
 import org.eclipse.jface.viewers.ContentViewer;
 import org.eclipse.jface.viewers.ISelection;
index 2d7daae594905c19bc05e408e9d1273dc9b6577e..bc3166307d7b6ec0b298416d3fdde549a051e36d 100644 (file)
@@ -8,9 +8,9 @@ import javax.jcr.Session;
 import javax.jcr.nodetype.NodeType;
 import javax.jcr.version.VersionManager;
 
-import org.argeo.cms.CmsEditable;
-import org.argeo.cms.CmsEditionEvent;
 import org.argeo.cms.CmsException;
+import org.argeo.cms.ui.CmsEditable;
+import org.argeo.cms.ui.CmsEditionEvent;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Display;
index ec1dbe77e3f2af14849090ee7ff1ff4355f326d0..210318995dd998cda8efd8884478d8d3010bc7ac 100644 (file)
@@ -3,8 +3,8 @@ package org.argeo.cms.widgets;
 import javax.jcr.Item;
 import javax.jcr.RepositoryException;
 
-import org.argeo.cms.CmsConstants;
 import org.argeo.cms.CmsNames;
+import org.argeo.cms.ui.CmsConstants;
 import org.argeo.cms.util.CmsUtils;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.FocusListener;
index 21f101aea4628ae3a87bc0eac0b0430da95df97f..c8b1fcfd613f8c9f298965cd72030b8bcd357c59 100644 (file)
@@ -23,11 +23,11 @@ import javax.security.auth.login.LoginException;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.argeo.cms.CmsMsg;
-import org.argeo.cms.CmsStyles;
-import org.argeo.cms.CmsView;
 import org.argeo.cms.auth.CurrentUser;
 import org.argeo.cms.auth.HttpRequestCallback;
 import org.argeo.cms.i18n.LocaleUtils;
+import org.argeo.cms.ui.CmsStyles;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.cms.ui.internal.Activator;
 import org.argeo.cms.util.CmsUtils;
 import org.eclipse.rap.rwt.RWT;
index 29a3f54e64990016889add8de4d15c0d440988f3..6afaa767c7b3506b9a4d63e80d4d78ee36739796 100644 (file)
@@ -1,6 +1,6 @@
 package org.argeo.cms.widgets.auth;
 
-import org.argeo.cms.CmsView;
+import org.argeo.cms.ui.CmsView;
 import org.argeo.eclipse.ui.dialogs.ErrorFeedback;
 import org.eclipse.rap.rwt.RWT;
 import org.eclipse.swt.SWT;
diff --git a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java
deleted file mode 100644 (file)
index 2632a14..0000000
+++ /dev/null
@@ -1,333 +0,0 @@
-package org.argeo.cms;
-
-import java.security.PrivilegedAction;
-import java.util.HashMap;
-import java.util.Map;
-
-import javax.jcr.Node;
-import javax.jcr.PathNotFoundException;
-import javax.jcr.Property;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-import javax.jcr.nodetype.NodeType;
-import javax.security.auth.Subject;
-import javax.security.auth.login.CredentialNotFoundException;
-import javax.security.auth.login.LoginContext;
-import javax.security.auth.login.LoginException;
-import javax.servlet.http.HttpServletRequest;
-
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
-import org.argeo.cms.auth.AuthConstants;
-import org.argeo.cms.auth.HttpRequestCallbackHandler;
-import org.argeo.eclipse.ui.specific.UiContext;
-import org.argeo.jcr.JcrUtils;
-import org.argeo.node.NodeAuthenticated;
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.rap.rwt.application.AbstractEntryPoint;
-import org.eclipse.rap.rwt.client.WebClient;
-import org.eclipse.rap.rwt.client.service.BrowserNavigation;
-import org.eclipse.rap.rwt.client.service.BrowserNavigationEvent;
-import org.eclipse.rap.rwt.client.service.BrowserNavigationListener;
-import org.eclipse.rap.rwt.client.service.JavaScriptExecutor;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-
-/** Manages history and navigation */
-public abstract class AbstractCmsEntryPoint extends AbstractEntryPoint implements CmsView {
-       private final Log log = LogFactory.getLog(AbstractCmsEntryPoint.class);
-
-       private final Subject subject;
-       private LoginContext loginContext;
-
-       private final Repository repository;
-       private final String workspace;
-       private final String defaultPath;
-       private final Map<String, String> factoryProperties;
-
-       // Current state
-       private Session session;
-       private Node node;
-       private String nodePath;// useful when changing auth
-       private String state;
-       private String page;
-       private Throwable exception;
-
-       // Client services
-       private final JavaScriptExecutor jsExecutor;
-       private final BrowserNavigation browserNavigation;
-
-       public AbstractCmsEntryPoint(Repository repository, String workspace, String defaultPath,
-                       Map<String, String> factoryProperties) {
-               this.repository = repository;
-               this.workspace = workspace;
-               this.defaultPath = defaultPath;
-               this.factoryProperties = new HashMap<String, String>(factoryProperties);
-               subject = new Subject();
-
-               // Initial login
-               try {
-                       loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_USER, subject,
-                                       new HttpRequestCallbackHandler(UiContext.getHttpRequest()));
-                       loginContext.login();
-               } catch (CredentialNotFoundException e) {
-                       try {
-                               loginContext = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
-                               loginContext.login();
-                       } catch (LoginException e1) {
-                               throw new CmsException("Cannot log as anonymous", e);
-                       }
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot initialize subject", e);
-               }
-               authChange(loginContext);
-
-               jsExecutor = RWT.getClient().getService(JavaScriptExecutor.class);
-               browserNavigation = RWT.getClient().getService(BrowserNavigation.class);
-               if (browserNavigation != null)
-                       browserNavigation.addBrowserNavigationListener(new CmsNavigationListener());
-       }
-
-       @Override
-       protected Shell createShell(Display display) {
-               Shell shell = super.createShell(display);
-               shell.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_SHELL);
-               display.disposeExec(new Runnable() {
-
-                       @Override
-                       public void run() {
-                               if (log.isTraceEnabled())
-                                       log.trace("Logging out " + session);
-                               JcrUtils.logoutQuietly(session);
-                       }
-               });
-               return shell;
-       }
-
-       @Override
-       protected final void createContents(final Composite parent) {
-               UiContext.setData(NodeAuthenticated.KEY, this);
-               Subject.doAs(subject, new PrivilegedAction<Void>() {
-                       @Override
-                       public Void run() {
-                               try {
-                                       initUi(parent);
-                               } catch (Exception e) {
-                                       throw new CmsException("Cannot create entrypoint contents", e);
-                               }
-                               return null;
-                       }
-               });
-       }
-
-       /** Create UI */
-       protected abstract void initUi(Composite parent);
-
-       /** Recreate UI after navigation or auth change */
-       protected abstract void refresh();
-
-       /**
-        * The node to return when no node was found (for authenticated users and
-        * anonymous)
-        */
-       protected Node getDefaultNode(Session session) throws RepositoryException {
-               if (!session.hasPermission(defaultPath, "read")) {
-                       if (session.getUserID().equals(AuthConstants.ROLE_ANONYMOUS))
-                               // TODO throw a special exception
-                               throw new CmsException("Login required");
-                       else
-                               throw new CmsException("Unauthorized");
-               }
-               return session.getNode(defaultPath);
-       }
-
-       protected String getBaseTitle() {
-               return factoryProperties.get(WebClient.PAGE_TITLE);
-       }
-
-       public void navigateTo(String state) {
-               exception = null;
-               String title = setState(state);
-               doRefresh();
-               if (browserNavigation != null)
-                       browserNavigation.pushState(state, title);
-       }
-
-       @Override
-       public synchronized Subject getSubject() {
-               return subject;
-       }
-
-       @Override
-       public synchronized void logout() {
-               if (loginContext == null)
-                       throw new CmsException("Login context should not be null");
-               try {
-                       loginContext.logout();
-                       LoginContext anonymousLc = new LoginContext(AuthConstants.LOGIN_CONTEXT_ANONYMOUS, subject);
-                       anonymousLc.login();
-                       authChange(anonymousLc);
-               } catch (LoginException e) {
-                       throw new CmsException("Cannot logout", e);
-               }
-       }
-
-       @Override
-       public synchronized void authChange(LoginContext loginContext) {
-               if (loginContext == null)
-                       throw new CmsException("Login context cannot be null");
-               this.loginContext = loginContext;
-               Subject.doAs(loginContext.getSubject(), new PrivilegedAction<Void>() {
-
-                       @Override
-                       public Void run() {
-                               try {
-                                       JcrUtils.logoutQuietly(session);
-                                       session = repository.login(workspace);
-                                       if (nodePath != null)
-                                               try {
-                                                       node = session.getNode(nodePath);
-                                               } catch (PathNotFoundException e) {
-                                                       // logout();
-                                                       // session = repository.login(workspace);
-                                                       navigateTo("~");
-                                                       // throw e;
-                                               }
-
-                                       // refresh UI
-                                       doRefresh();
-                               } catch (RepositoryException e) {
-                                       throw new CmsException("Cannot perform auth change", e);
-                               }
-                               return null;
-                       }
-
-               });
-
-       }
-
-       @Override
-       public void exception(final Throwable e) {
-               AbstractCmsEntryPoint.this.exception = e;
-               log.error("Unexpected exception in CMS", e);
-               doRefresh();
-       }
-
-       protected synchronized void doRefresh() {
-               Subject.doAs(subject, new PrivilegedAction<Void>() {
-                       @Override
-                       public Void run() {
-                               refresh();
-                               return null;
-                       }
-               });
-       }
-
-       /** Sets the state of the entry point and retrieve the related JCR node. */
-       protected synchronized String setState(String newState) {
-               String previousState = this.state;
-
-               Node node = null;
-               page = null;
-               this.state = newState;
-               if (newState.equals("~"))
-                       this.state = "";
-
-               try {
-                       int firstSlash = state.indexOf('/');
-                       if (firstSlash == 0) {
-                               if (session.nodeExists(state))
-                                       node = session.getNode(state);
-                               else
-                                       throw new CmsException("Data " + state + " does not exist");
-                               page = "";
-                       } else if (firstSlash > 0) {
-                               String prefix = state.substring(0, firstSlash);
-                               String path = state.substring(firstSlash);
-                               if (session.nodeExists(path))
-                                       node = session.getNode(path);
-                               else
-                                       throw new CmsException("Data " + path + " does not exist");
-                               page = prefix;
-                       } else {
-                               node = getDefaultNode(session);
-                               page = state;
-                       }
-                       setNode(node);
-                       String title = publishMetaData(node);
-
-                       if (log.isTraceEnabled())
-                               log.trace("node=" + node + ", state=" + state + " (page=" + page + ")");
-
-                       return title;
-               } catch (Exception e) {
-                       log.error("Cannot set state '" + state + "'", e);
-                       if (previousState.equals(""))
-                               previousState = "~";
-                       navigateTo(previousState);
-                       throw new CmsException("Unexpected issue when accessing #" + newState, e);
-               }
-       }
-
-       private String publishMetaData(Node node) throws RepositoryException {
-               // Title
-               String title;
-               if (node.isNodeType(NodeType.MIX_TITLE) && node.hasProperty(Property.JCR_TITLE))
-                       title = node.getProperty(Property.JCR_TITLE).getString() + " - " + getBaseTitle();
-               else
-                       title = getBaseTitle();
-
-               HttpServletRequest request = UiContext.getHttpRequest();
-               if (request == null)
-                       return null;
-
-               StringBuilder js = new StringBuilder();
-               title = title.replace("'", "\\'");// sanitize
-               js.append("document.title = '" + title + "';");
-               jsExecutor.execute(js.toString());
-               return title;
-       }
-
-       // Simply remove some illegal character
-       // private String clean(String stringToClean) {
-       // return stringToClean.replaceAll("'", "").replaceAll("\\n", "")
-       // .replaceAll("\\t", "");
-       // }
-
-       protected synchronized Node getNode() {
-               return node;
-       }
-
-       private synchronized void setNode(Node node) throws RepositoryException {
-               this.node = node;
-               this.nodePath = node == null ? null : node.getPath();
-       }
-
-       protected String getState() {
-               return state;
-       }
-
-       protected Throwable getException() {
-               return exception;
-       }
-
-       protected void resetException() {
-               exception = null;
-       }
-
-       protected Session getSession() {
-               return session;
-       }
-
-       private class CmsNavigationListener implements BrowserNavigationListener {
-               private static final long serialVersionUID = -3591018803430389270L;
-
-               @Override
-               public void navigated(BrowserNavigationEvent event) {
-                       setState(event.getState());
-                       refresh();
-               }
-       }
-}
\ No newline at end of file
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsConstants.java b/org.argeo.cms/src/org/argeo/cms/CmsConstants.java
deleted file mode 100644 (file)
index 6f21b57..0000000
+++ /dev/null
@@ -1,22 +0,0 @@
-package org.argeo.cms;
-
-import org.eclipse.rap.rwt.RWT;
-import org.eclipse.swt.graphics.Point;
-
-/** Commons constants */
-public interface CmsConstants {
-       // DATAKEYS
-       public final static String STYLE = RWT.CUSTOM_VARIANT;
-       public final static String MARKUP = RWT.MARKUP_ENABLED;
-       public final static String ITEM_HEIGHT = RWT.CUSTOM_ITEM_HEIGHT;
-
-       // EVENT DETAILS
-       public final static int HYPERLINK = RWT.HYPERLINK;
-
-       // STANDARD RESOURCES
-       public final static String LOADING_IMAGE = "icons/loading.gif";
-
-       public final static String NO_IMAGE = "icons/noPic-square-640px.png";
-       public final static Point NO_IMAGE_SIZE = new Point(640, 640);
-       public final static Float NO_IMAGE_RATIO = 1f;
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsEditable.java b/org.argeo.cms/src/org/argeo/cms/CmsEditable.java
deleted file mode 100644 (file)
index 3c666ff..0000000
+++ /dev/null
@@ -1,36 +0,0 @@
-package org.argeo.cms;
-
-/** API NOT STABLE (yet). */
-public interface CmsEditable {
-
-       /** Whether the calling thread can edit, the value is immutable */
-       public Boolean canEdit();
-
-       public Boolean isEditing();
-
-       public void startEditing();
-
-       public void stopEditing();
-
-       public static CmsEditable NON_EDITABLE = new CmsEditable() {
-
-               @Override
-               public void stopEditing() {
-               }
-
-               @Override
-               public void startEditing() {
-               }
-
-               @Override
-               public Boolean isEditing() {
-                       return false;
-               }
-
-               @Override
-               public Boolean canEdit() {
-                       return false;
-               }
-       };
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsEditionEvent.java b/org.argeo.cms/src/org/argeo/cms/CmsEditionEvent.java
deleted file mode 100644 (file)
index 920f6d9..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.argeo.cms;
-
-import java.util.EventObject;
-
-/** Notify of the edition lifecycle */
-public class CmsEditionEvent extends EventObject {
-       private static final long serialVersionUID = 950914736016693110L;
-
-       public final static Integer START_EDITING = 0;
-       public final static Integer STOP_EDITING = 1;
-
-       private final Integer type;
-
-       public CmsEditionEvent(Object source, Integer type) {
-               super(source);
-               this.type = type;
-       }
-
-       public Integer getType() {
-               return type;
-       }
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsExtension.java b/org.argeo.cms/src/org/argeo/cms/CmsExtension.java
deleted file mode 100644 (file)
index b574dc5..0000000
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.argeo.cms;
-
-import java.util.List;
-
-import javax.jcr.Session;
-
-public interface CmsExtension {
-       public List<String> getDataModels();
-
-       public List<String> getRoles();
-
-       public void onInit(Session adminSession);
-
-       public void onStart(Session adminSession);
-
-       public void onShutdown(Session adminSession);
-
-       public void onDestroy(Session adminSession);
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsImageManager.java b/org.argeo.cms/src/org/argeo/cms/CmsImageManager.java
deleted file mode 100644 (file)
index 2577dc7..0000000
+++ /dev/null
@@ -1,48 +0,0 @@
-package org.argeo.cms;
-
-import java.io.InputStream;
-
-import javax.jcr.Binary;
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.graphics.Point;
-import org.eclipse.swt.widgets.Control;
-
-/** Read and write access to images. */
-public interface CmsImageManager {
-       /** Load image in control */
-       public Boolean load(Node node, Control control, Point size)
-                       throws RepositoryException;
-
-       /** @return (0,0) if not available */
-       public Point getImageSize(Node node) throws RepositoryException;
-
-       /**
-        * The related <img tag, with src, width and height set. @return null if not
-        * available
-        */
-       public String getImageTag(Node node) throws RepositoryException;
-
-       /**
-        * The related <img tag, with url, width and height set. Caller must close
-        * the tag (or add additional attributes). @return null if not available
-        */
-       public StringBuilder getImageTagBuilder(Node node, Point size)
-                       throws RepositoryException;
-
-       /**
-        * Returns the remotely accessible URL of the image (registering it if
-        * needed) @return null if not available
-        */
-       public String getImageUrl(Node node) throws RepositoryException;
-
-       public Binary getImageBinary(Node node) throws RepositoryException;
-
-       public Image getSwtImage(Node node) throws RepositoryException;
-
-       /** @return URL */
-       public String uploadImage(Node parentNode, String fileName, InputStream in)
-                       throws RepositoryException;
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsStyles.java b/org.argeo.cms/src/org/argeo/cms/CmsStyles.java
deleted file mode 100644 (file)
index 69ce810..0000000
+++ /dev/null
@@ -1,26 +0,0 @@
-package org.argeo.cms;
-
-/** Styles references in the CSS. */
-public interface CmsStyles {
-       // General
-       public final static String CMS_SHELL = "cms_shell";
-       public final static String CMS_MENU_LINK = "cms_menu_link";
-
-       // Header
-       public final static String CMS_HEADER = "cms_header";
-       public final static String CMS_HEADER_LEAD = "cms_header-lead";
-       public final static String CMS_HEADER_CENTER = "cms_header-center";
-       public final static String CMS_HEADER_END = "cms_header-end";
-       public final static String CMS_USER_MENU = "cms_user_menu";
-       public final static String CMS_USER_MENU_LINK = "cms_user_menu-link";
-       public final static String CMS_USER_MENU_ITEM = "cms_user_menu-item";
-       public final static String CMS_LOGIN_DIALOG = "cms_login_dialog";
-       public final static String CMS_LOGIN_DIALOG_USERNAME = "cms_login_dialog-username";
-       public final static String CMS_LOGIN_DIALOG_PASSWORD = "cms_login_dialog-password";
-
-       // Body
-       public final static String CMS_SCROLLED_AREA = "cms_scrolled_area";
-       public final static String CMS_BODY = "cms_body";
-       public final static String CMS_STATIC_TEXT = "cms_static-text";
-       public final static String CMS_LINK = "cms_link";
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsUiProvider.java b/org.argeo.cms/src/org/argeo/cms/CmsUiProvider.java
deleted file mode 100644 (file)
index 27799b0..0000000
+++ /dev/null
@@ -1,21 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.Node;
-import javax.jcr.RepositoryException;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-
-/** Stateless factory building an SWT user interface given a JCR context. */
-public interface CmsUiProvider {
-       /**
-        * Initialises a user interface.
-        * 
-        * @param parent
-        *            the parent composite
-        * @param a
-        *            context node or null
-        */
-       public Control createUi(Composite parent, Node context)
-                       throws RepositoryException;
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/CmsView.java b/org.argeo.cms/src/org/argeo/cms/CmsView.java
deleted file mode 100644 (file)
index ad4796e..0000000
+++ /dev/null
@@ -1,23 +0,0 @@
-package org.argeo.cms;
-
-import javax.security.auth.login.LoginContext;
-
-import org.argeo.node.NodeAuthenticated;
-
-/** Provides interaction with the CMS system. UNSTABLE API at this stage. */
-public interface CmsView extends NodeAuthenticated {
-       UxContext getUxContext();
-
-       // NAVIGATION
-       void navigateTo(String state);
-
-       // SECURITY
-       void authChange(LoginContext loginContext);
-
-       void logout();
-
-       // SERVICES
-       void exception(Throwable e);
-
-       CmsImageManager getImageManager();
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/DataMigration.java b/org.argeo.cms/src/org/argeo/cms/DataMigration.java
deleted file mode 100644 (file)
index f75e66b..0000000
+++ /dev/null
@@ -1,18 +0,0 @@
-package org.argeo.cms;
-
-import java.util.Map;
-
-import javax.jcr.Session;
-
-public interface DataMigration {
-       /** Migrate data between two workspaces, at JCR level. */
-       Boolean migrate(Session source, Session target);
-
-       /**
-        * Keys are the source workspaces and values the target workspaces. If null
-        * is returned, only the default workspace will be migrated, to the default
-        * workspace of the target repository.
-        */
-       Map<String, String> workspacesToMigrate();
-
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/LifeCycleUiProvider.java b/org.argeo.cms/src/org/argeo/cms/LifeCycleUiProvider.java
deleted file mode 100644 (file)
index bb64b64..0000000
+++ /dev/null
@@ -1,11 +0,0 @@
-package org.argeo.cms;
-
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-/** CmsUiProvider notified of initialisation with a system session. */
-public interface LifeCycleUiProvider extends CmsUiProvider {
-       public void init(Session adminSession) throws RepositoryException;
-
-       public void destroy();
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/UxContext.java b/org.argeo.cms/src/org/argeo/cms/UxContext.java
deleted file mode 100644 (file)
index b6674b9..0000000
+++ /dev/null
@@ -1,9 +0,0 @@
-package org.argeo.cms;
-
-public interface UxContext {
-       boolean isPortrait();
-       boolean isLandscape();
-       boolean isSquare();
-       
-       boolean isSmall();
-}
diff --git a/org.argeo.cms/src/org/argeo/cms/internal/backup/RepositoryMigration.java b/org.argeo.cms/src/org/argeo/cms/internal/backup/RepositoryMigration.java
deleted file mode 100644 (file)
index d708f90..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-package org.argeo.cms.internal.backup;
-
-import java.security.PrivilegedExceptionAction;
-import java.util.Map;
-
-import javax.jcr.Credentials;
-import javax.jcr.Repository;
-import javax.jcr.RepositoryException;
-import javax.jcr.Session;
-
-import org.argeo.cms.DataMigration;
-import org.argeo.jcr.JcrUtils;
-
-/** Migrate data between two workspaces, at JCR level. */
-public class RepositoryMigration implements PrivilegedExceptionAction<Boolean> {
-       private final Repository sourceRepository;
-       private final Repository targetRepository;
-       private final DataMigration dataMigration;
-
-       private Credentials sourceCredentials = null;
-       private Credentials targetCredentials = null;
-
-       public RepositoryMigration(Repository sourceRepository,
-                       Repository targetRepository, DataMigration dataMigration) {
-               this.sourceRepository = sourceRepository;
-               this.targetRepository = targetRepository;
-               this.dataMigration = dataMigration;
-       }
-
-       @Override
-       public Boolean run() throws Exception {
-               Map<String, String> wk = dataMigration.workspacesToMigrate();
-               if (wk == null)
-                       return migrate(sourceRepository, null, targetRepository, null);
-               else {
-                       for (String sourceWorkspace : wk.keySet()) {
-                               String targetWorkspace = wk.get(sourceWorkspace);
-                               boolean ok = migrate(sourceRepository, sourceWorkspace,
-                                               targetRepository, targetWorkspace);
-                               if (!ok)
-                                       return false;
-                       }
-                       return true;
-               }
-       }
-
-       protected final boolean migrate(Repository sourceRepository,
-                       String sourceWorkspace, Repository targetRepository,
-                       String targetWorkspace) throws RepositoryException {
-               Session source = null, target = null;
-               try {
-                       source = sourceRepository.login(sourceCredentials, sourceWorkspace);
-                       target = targetRepository.login(targetCredentials, targetWorkspace);
-                       return dataMigration.migrate(source, target);
-               } finally {
-                       JcrUtils.logoutQuietly(source);
-                       JcrUtils.logoutQuietly(target);
-               }
-       }
-
-       public void setSourceCredentials(Credentials sourceCredentials) {
-               this.sourceCredentials = sourceCredentials;
-       }
-
-       public void setTargetCredentials(Credentials targetCredentials) {
-               this.targetCredentials = targetCredentials;
-       }
-
-}