From: Mathieu Baudier Date: Wed, 11 Feb 2015 17:34:41 +0000 (+0000) Subject: Clean up and re-organise CMS X-Git-Tag: argeo-commons-2.1.30~396 X-Git-Url: http://git.argeo.org/?a=commitdiff_plain;h=d546fc1b9e19a86eb0e33ac4be824b52239316fc;p=lgpl%2Fargeo-commons.git Clean up and re-organise CMS git-svn-id: https://svn.argeo.org/commons/trunk@7791 4cfe0d0a-d680-48aa-b62c-e0a02a3f76cc --- diff --git a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java index 1c9fc483d..49a7b98df 100644 --- a/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java +++ b/org.argeo.cms/src/org/argeo/cms/AbstractCmsEntryPoint.java @@ -14,6 +14,7 @@ import javax.servlet.http.HttpSession; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; +import org.argeo.cms.i18n.Msg; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.application.AbstractEntryPoint; diff --git a/org.argeo.cms/src/org/argeo/cms/BundleResourceLoader.java b/org.argeo.cms/src/org/argeo/cms/BundleResourceLoader.java index e42a00184..8740c0d26 100644 --- a/org.argeo.cms/src/org/argeo/cms/BundleResourceLoader.java +++ b/org.argeo.cms/src/org/argeo/cms/BundleResourceLoader.java @@ -9,7 +9,7 @@ import org.osgi.framework.Bundle; import org.osgi.framework.BundleContext; /** {@link ResourceLoader} implementation wrapping an {@link Bundle}. */ -public class BundleResourceLoader implements ResourceLoader { +class BundleResourceLoader implements ResourceLoader { private final BundleContext bundleContext; public BundleResourceLoader(BundleContext bundleContext) { diff --git a/org.argeo.cms/src/org/argeo/cms/CmsApplication.java b/org.argeo.cms/src/org/argeo/cms/CmsApplication.java index 90df56a61..e113d7b2e 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsApplication.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsApplication.java @@ -22,6 +22,7 @@ import org.apache.commons.io.IOUtils; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.cms.internal.ImageManagerImpl; +import org.argeo.cms.util.CmsUtils; import org.argeo.jcr.JcrUtils; import org.eclipse.gemini.blueprint.context.BundleContextAware; import org.eclipse.rap.rwt.RWT; diff --git a/org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java b/org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java deleted file mode 100644 index 873ae8131..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsEntryPointFactory.java +++ /dev/null @@ -1,280 +0,0 @@ -package org.argeo.cms; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Arrays; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; - -import javax.jcr.Node; -import javax.jcr.Repository; -import javax.jcr.RepositoryException; -import javax.jcr.Session; -import javax.jcr.security.Privilege; -import javax.jcr.version.VersionManager; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.argeo.cms.internal.ImageManagerImpl; -import org.argeo.jcr.JcrUtils; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.rap.rwt.application.EntryPoint; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.FillLayout; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Text; - -/** Creates and registers an {@link EntryPoint} */ -@Deprecated -class CmsEntryPointFactory { - private final static Log log = LogFactory - .getLog(CmsEntryPointFactory.class); - - private Repository repository; - private String workspace = null; - private String basePath = "/"; - private List roPrincipals = Arrays.asList("anonymous", "everyone"); - private List rwPrincipals = Arrays.asList("everyone"); - - private CmsLogin cmsLogin; - - private CmsUiProvider header; - private Map pages = new LinkedHashMap(); - - private Integer headerHeight = 40; - - // Managers - private CmsImageManager imageManager = new ImageManagerImpl(); - - public EntryPoint create() { - CmsEntryPoint cmsEntryPoint = new CmsEntryPoint(repository, workspace); - CmsSession.current.set(cmsEntryPoint); - return cmsEntryPoint; - } - - public void init() throws RepositoryException { - if (workspace == null) - throw new CmsException( - "Workspace must be set when calling initialization." - + " Please make sure that read-only and read-write roles" - + " have been properly configured:" - + " the defaults are open."); - - Session session = null; - try { - session = JcrUtils.loginOrCreateWorkspace(repository, workspace); - VersionManager vm = session.getWorkspace().getVersionManager(); - if (!vm.isCheckedOut("/")) - vm.checkout("/"); - JcrUtils.mkdirs(session, basePath); - for (String principal : rwPrincipals) - JcrUtils.addPrivilege(session, basePath, principal, - Privilege.JCR_WRITE); - for (String principal : roPrincipals) - JcrUtils.addPrivilege(session, basePath, principal, - Privilege.JCR_READ); - - for (String pageName : pages.keySet()) { - try { - initPage(session, pages.get(pageName)); - session.save(); - } catch (Exception e) { - throw new CmsException( - "Cannot initialize page " + pageName, e); - } - } - - } finally { - JcrUtils.logoutQuietly(session); - } - } - - protected void initPage(Session adminSession, CmsUiProvider page) - throws RepositoryException { - if (page instanceof LifeCycleUiProvider) - ((LifeCycleUiProvider) page).init(adminSession); - } - - public void destroy() { - for (String pageName : pages.keySet()) { - try { - CmsUiProvider page = pages.get(pageName); - if (page instanceof LifeCycleUiProvider) - ((LifeCycleUiProvider) page).destroy(); - } catch (Exception e) { - log.error("Cannot destroy page " + pageName, e); - } - } - } - - public void setRepository(Repository repository) { - this.repository = repository; - } - - public void setWorkspace(String workspace) { - this.workspace = workspace; - } - - public void setCmsLogin(CmsLogin cmsLogin) { - this.cmsLogin = cmsLogin; - } - - public void setHeader(CmsUiProvider header) { - this.header = header; - } - - public void setPages(Map pages) { - this.pages = pages; - } - - public void setBasePath(String basePath) { - this.basePath = basePath; - } - - public void setRoPrincipals(List roPrincipals) { - this.roPrincipals = roPrincipals; - } - - public void setRwPrincipals(List rwPrincipals) { - this.rwPrincipals = rwPrincipals; - } - - public void setHeaderHeight(Integer headerHeight) { - this.headerHeight = headerHeight; - } - - private class CmsEntryPoint extends AbstractCmsEntryPoint { - private Composite headerArea; - private Composite bodyArea; - - public CmsEntryPoint(Repository repository, String workspace) { - super(repository, workspace); - } - - @Override - protected void createContents(Composite parent) { - try { - getShell().getDisplay().setData(CmsSession.KEY, this); - - parent.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - parent.setLayout(CmsUtils.noSpaceGridLayout()); - - headerArea = new Composite(parent, SWT.NONE); - headerArea.setLayout(new FillLayout()); - GridData headerData = new GridData(SWT.FILL, SWT.FILL, false, - false); - headerData.heightHint = headerHeight; - headerArea.setLayoutData(headerData); - refreshHeader(); - - bodyArea = new Composite(parent, SWT.NONE); - bodyArea.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_BODY); - bodyArea.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - bodyArea.setBackgroundMode(SWT.INHERIT_DEFAULT); - bodyArea.setLayout(CmsUtils.noSpaceGridLayout()); - } catch (Exception e) { - throw new CmsException("Cannot create entrypoint contents", e); - } - } - - @Override - protected void refreshHeader() { - if (headerArea == null) - return; - for (Control child : headerArea.getChildren()) - child.dispose(); - try { - header.createUi(headerArea, getNode()); - } catch (RepositoryException e) { - throw new CmsException("Cannot refresh header", e); - } - headerArea.layout(true, true); - } - - @SuppressWarnings("unused") - @Override - protected void refreshBody() { - if (bodyArea == null) - return; - // clear - for (Control child : bodyArea.getChildren()) - child.dispose(); - bodyArea.setLayout(CmsUtils.noSpaceGridLayout()); - - // Exception - Throwable exception = getException(); - if (exception != null) { - new Label(bodyArea, SWT.NONE).setText("Unreachable state : " - + getState()); - if (getNode() != null) - new Label(bodyArea, SWT.NONE).setText("Context : " - + getNode()); - - Text errorText = new Text(bodyArea, SWT.MULTI | SWT.H_SCROLL - | SWT.V_SCROLL); - errorText.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - StringWriter sw = new StringWriter(); - exception.printStackTrace(new PrintWriter(sw)); - errorText.setText(sw.toString()); - IOUtils.closeQuietly(sw); - resetException(); - // TODO report - } else { - String state = getState(); - String page = null; - try { - if (state == null) - throw new CmsException("State cannot be null"); - if (page == null) - throw new CmsException("Page cannot be null"); - // else if (state.length() == 0) - // log.debug("empty state"); - else if (pages.containsKey(page)) - pages.get(page).createUi(bodyArea, getNode()); - else { - // try { - // RWT.getResponse().sendError(404); - // } catch (IOException e) { - // log.error("Cannot send 404 code", e); - // } - throw new CmsException("Unsupported state " + state); - } - } catch (RepositoryException e) { - throw new CmsException("Cannot refresh body", e); - } - } - bodyArea.layout(true, true); - } - - @Override - protected void logAsAnonymous() { - cmsLogin.logInAsAnonymous(); - } - - @Override - protected Node getDefaultNode(Session session) - throws RepositoryException { - if (!session.hasPermission(basePath, "read")) { - if (session.getUserID().equals("anonymous")) - throw new CmsLoginRequiredException(); - else - throw new CmsException("Unauthorized"); - } - return session.getNode(basePath); - } - - @Override - public CmsImageManager getImageManager() { - return imageManager; - } - - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java b/org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java deleted file mode 100644 index d7c69d645..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsInstallPage.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.argeo.cms; - -import javax.jcr.Node; - -import org.eclipse.rap.rwt.RWT; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Text; - -public class CmsInstallPage implements CmsUiProvider { - private Text text; - - @Override - public Control createUi(Composite parent, Node context) { - text = new Text(parent, SWT.MULTI); - text.setData(RWT.CUSTOM_VARIANT, "cms_install"); - return text; - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/CmsLink.java b/org.argeo.cms/src/org/argeo/cms/CmsLink.java deleted file mode 100644 index 5ccfd63e3..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsLink.java +++ /dev/null @@ -1,270 +0,0 @@ -package org.argeo.cms; - -import java.io.InputStream; -import java.net.MalformedURLException; -import java.net.URL; - -import javax.jcr.Node; - -import org.apache.commons.io.IOUtils; -import org.apache.commons.logging.Log; -import org.apache.commons.logging.LogFactory; -import org.eclipse.gemini.blueprint.context.BundleContextAware; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.rap.rwt.service.ResourceManager; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseListener; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.osgi.framework.BundleContext; -import org.springframework.beans.factory.InitializingBean; - -/** A link to an internal or external location. */ -public class CmsLink implements CmsUiProvider, InitializingBean, - BundleContextAware { - private final static Log log = LogFactory.getLog(CmsLink.class); - - private String label; - private String custom; - private String target; - private String image; - private MouseListener mouseListener; - - private int verticalAlignment = SWT.CENTER; - - // internal - //private Boolean isUrl = false; - private Integer imageWidth, imageHeight; - - private BundleContext bundleContext; - - public CmsLink() { - super(); - } - - public CmsLink(String label, String target) { - this(label, target, null); - } - - public CmsLink(String label, String target, String custom) { - super(); - this.label = label; - this.target = target; - this.custom = custom; - afterPropertiesSet(); - } - - @Override - public void afterPropertiesSet() { -// if (target != null) { -// if (target.startsWith("/")) { -// isUrl = true; -// } else { -// try { -// new URL(target); -// isUrl = true; -// } catch (MalformedURLException e1) { -// isUrl = false; -// } -// } -// } - - if (image != null) { - ImageData image = loadImage(); - imageWidth = image.width; - imageHeight = image.height; - } - } - - @Override - public Control createUi(final Composite parent, Node context) { - Composite comp = new Composite(parent, SWT.BOTTOM); - comp.setLayout(CmsUtils.noSpaceGridLayout()); - - Label link = new Label(comp, SWT.NONE); - link.setData(RWT.MARKUP_ENABLED, Boolean.TRUE); - GridData layoutData = new GridData(SWT.CENTER, verticalAlignment, true, - true); - if (image != null) { - layoutData.heightHint = imageHeight; - if (label == null) - layoutData.widthHint = imageWidth; - } - - link.setLayoutData(layoutData); - if (custom != null) { - comp.setData(RWT.CUSTOM_VARIANT, custom); - link.setData(RWT.CUSTOM_VARIANT, custom); - } else { - comp.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK); - link.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK); - } - - // label - StringBuilder labelText = new StringBuilder(); - if (target != null) { - labelText - .append(""); - } - if (image != null) { - registerImageIfNeeded(); - String imageLocation = RWT.getResourceManager().getLocation(image); - labelText.append(""); - - // final Image img = loadImage(parent.getDisplay()); - // link.setImage(img); - // link.addDisposeListener(new DListener(img)); - } - - if (label != null) { - // link.setText(label); - labelText.append(' ').append(label); - } - - if (target != null) - labelText.append(""); - - link.setText(labelText.toString()); - - // link.setCursor(link.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); - // CmsSession cmsSession = (CmsSession) parent.getDisplay().getData( - // CmsSession.KEY); - if (mouseListener != null) - link.addMouseListener(mouseListener); - - return comp; - } - - private void registerImageIfNeeded() { - ResourceManager resourceManager = RWT.getResourceManager(); - if (!resourceManager.isRegistered(image)) { - URL res = getImageUrl(); - InputStream inputStream = null; - try { - IOUtils.closeQuietly(inputStream); - inputStream = res.openStream(); - resourceManager.register(image, inputStream); - if (log.isTraceEnabled()) - log.trace("Registered image " + image); - } catch (Exception e) { - throw new CmsException("Cannot load image " + image, e); - } finally { - IOUtils.closeQuietly(inputStream); - } - } - } - - private ImageData loadImage() { - URL url = getImageUrl(); - ImageData result = null; - InputStream inputStream = null; - try { - inputStream = url.openStream(); - result = new ImageData(inputStream); - if (log.isTraceEnabled()) - log.trace("Loaded image " + image); - } catch (Exception e) { - throw new CmsException("Cannot load image " + image, e); - } finally { - IOUtils.closeQuietly(inputStream); - } - return result; - } - - private URL getImageUrl() { - URL url; - try { - // pure URL - url = new URL(image); - } catch (MalformedURLException e1) { - // in OSGi bundle - if (bundleContext == null) - throw new CmsException("No bundle context available"); - url = bundleContext.getBundle().getResource(image); - } - - if (url == null) - throw new CmsException("No image " + image + " available."); - - return url; - } - - public void setLabel(String label) { - this.label = label; - } - - public void setCustom(String custom) { - this.custom = custom; - } - - public void setTarget(String target) { - this.target = target; - // try { - // new URL(target); - // isUrl = true; - // } catch (MalformedURLException e1) { - // isUrl = false; - // } - } - - public void setImage(String image) { - this.image = image; - } - - @Override - public void setBundleContext(BundleContext bundleContext) { - this.bundleContext = bundleContext; - } - - public void setMouseListener(MouseListener mouseListener) { - this.mouseListener = mouseListener; - } - - public void setvAlign(String vAlign) { - if ("bottom".equals(vAlign)) { - verticalAlignment = SWT.BOTTOM; - } else if ("top".equals(vAlign)) { - verticalAlignment = SWT.TOP; - } else if ("center".equals(vAlign)) { - verticalAlignment = SWT.CENTER; - } else { - throw new CmsException("Unsupported vertical allignment " + vAlign - + " (must be: top, bottom or center)"); - } - } - - // private class MListener extends MouseAdapter { - // private static final long serialVersionUID = 3634864186295639792L; - // - // @Override - // public void mouseDown(MouseEvent e) { - // if (e.button == 1) { - // } - // } - // } - // - // private class DListener implements DisposeListener { - // private static final long serialVersionUID = -3808587499269394812L; - // private final Image img; - // - // public DListener(Image img) { - // super(); - // this.img = img; - // } - // - // @Override - // public void widgetDisposed(DisposeEvent event) { - // img.dispose(); - // } - // - // } -} diff --git a/org.argeo.cms/src/org/argeo/cms/CmsLogin.java b/org.argeo.cms/src/org/argeo/cms/CmsLogin.java index 54ed1efcb..e8a2e48fd 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsLogin.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsLogin.java @@ -26,7 +26,7 @@ public class CmsLogin { private AuthenticationManager authenticationManager; private String systemKey = KernelConstants.DEFAULT_SECURITY_KEY; - protected void logInAsAnonymous() { + public void logInAsAnonymous() { // TODO Better deal with anonymous authentication try { List anonAuthorities = Collections @@ -45,7 +45,7 @@ public class CmsLogin { } } - protected void logInWithPassword(String username, char[] password) { + public void logInWithPassword(String username, char[] password) { UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken( username, password); Authentication authentication = authenticationManager diff --git a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java index a69d20970..bffd494ce 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsMsg.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsMsg.java @@ -1,5 +1,8 @@ package org.argeo.cms; +import org.argeo.cms.i18n.DefaultsResourceBundle; +import org.argeo.cms.i18n.Msg; + /** Standard CMS messages. */ public class CmsMsg extends DefaultsResourceBundle { public final static Msg username = new Msg("username"); diff --git a/org.argeo.cms/src/org/argeo/cms/CmsSession.java b/org.argeo.cms/src/org/argeo/cms/CmsSession.java index 0f4e54109..38c2b6c99 100644 --- a/org.argeo.cms/src/org/argeo/cms/CmsSession.java +++ b/org.argeo.cms/src/org/argeo/cms/CmsSession.java @@ -1,5 +1,7 @@ package org.argeo.cms; +import org.argeo.cms.i18n.Msg; + /** Provides interaction with the CMS system. UNSTABLE API at this stage. */ public interface CmsSession { public final static String KEY = "org.argeo.connect.web.cmsSession"; diff --git a/org.argeo.cms/src/org/argeo/cms/CmsUtils.java b/org.argeo.cms/src/org/argeo/cms/CmsUtils.java deleted file mode 100644 index 10e523873..000000000 --- a/org.argeo.cms/src/org/argeo/cms/CmsUtils.java +++ /dev/null @@ -1,176 +0,0 @@ -package org.argeo.cms; - -import java.io.InputStream; - -import javax.jcr.Item; -import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.RepositoryException; - -import org.apache.commons.io.IOUtils; -import org.argeo.jcr.JcrUtils; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.rap.rwt.service.ResourceManager; -import org.eclipse.swt.SWT; -import org.eclipse.swt.graphics.Image; -import org.eclipse.swt.graphics.ImageData; -import org.eclipse.swt.graphics.Point; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.layout.RowData; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Display; -import org.eclipse.swt.widgets.Widget; - -/** Static utilities for the CMS framework. */ -public class CmsUtils implements CmsConstants { - /** @deprecated Use rowData16px() instead. GridData should not be reused. */ - @Deprecated - public static RowData ROW_DATA_16px = new RowData(16, 16); - - public static GridLayout noSpaceGridLayout() { - return noSpaceGridLayout(new GridLayout()); - } - - public static GridLayout noSpaceGridLayout(GridLayout layout) { - layout.horizontalSpacing = 0; - layout.verticalSpacing = 0; - layout.marginWidth = 0; - layout.marginHeight = 0; - return layout; - } - - // - // GRID DATA - // - public static GridData fillWidth() { - return grabWidth(SWT.FILL, SWT.FILL); - } - - public static GridData fillAll() { - return new GridData(SWT.FILL, SWT.FILL, true, true); - } - - public static GridData grabWidth(int horizontalAlignment, - int verticalAlignment) { - return new GridData(horizontalAlignment, horizontalAlignment, true, - false); - } - - public static RowData rowData16px() { - return new RowData(16, 16); - } - - public static void style(Widget widget, String style) { - widget.setData(CmsConstants.STYLE, style); - } - - public static void markup(Widget widget) { - widget.setData(CmsConstants.MARKUP, true); - } - - /** @return the path or null if not instrumented */ - public static String getDataPath(Widget widget) { - // JCR item - Object data = widget.getData(); - if (data != null && data instanceof Item) { - try { - return ((Item) data).getPath(); - } catch (RepositoryException e) { - throw new CmsException("Cannot find data path of " + data - + " for " + widget); - } - } - - // JCR path - data = widget.getData(Property.JCR_PATH); - if (data != null) - return data.toString(); - - return null; - } - - /** Dispose all children of a Composite */ - public static void clear(Composite composite) { - for (Control child : composite.getChildren()) - child.dispose(); - } - - // - // JCR - // - public static Node getOrAddEmptyFile(Node parent, Enum child) - throws RepositoryException { - if (has(parent, child)) - return child(parent, child); - return JcrUtils.copyBytesAsFile(parent, child.name(), new byte[0]); - } - - public static Node child(Node parent, Enum en) - throws RepositoryException { - return parent.getNode(en.name()); - } - - public static Boolean has(Node parent, Enum en) - throws RepositoryException { - return parent.hasNode(en.name()); - } - - public static Node getOrAdd(Node parent, Enum en) - throws RepositoryException { - return getOrAdd(parent, en, null); - } - - public static Node getOrAdd(Node parent, Enum en, String primaryType) - throws RepositoryException { - if (has(parent, en)) - return child(parent, en); - else if (primaryType == null) - return parent.addNode(en.name()); - else - return parent.addNode(en.name(), primaryType); - } - - // IMAGES - public static String img(String src, String width, String height) { - return imgBuilder(src, width, height).append("/>").toString(); - } - - public static String img(String src, Point size) { - return img(src, Integer.toString(size.x), Integer.toString(size.y)); - } - - public static StringBuilder imgBuilder(String src, String width, - String height) { - return new StringBuilder(64).append(" getKeys() { - Vector res = new Vector(); - final Field[] fieldArray = getClass().getDeclaredFields(); - - for (Field field : fieldArray) { - if (Modifier.isStatic(field.getModifiers()) - && field.getType().isAssignableFrom(Msg.class)) { - res.add(field.getName()); - } - } - return res.elements(); - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java deleted file mode 100644 index c66cd866d..000000000 --- a/org.argeo.cms/src/org/argeo/cms/IdentityTextInterpreter.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.argeo.cms; - -import javax.jcr.Item; -import javax.jcr.Node; -import javax.jcr.Property; -import javax.jcr.RepositoryException; - -/** Based on HTML with a few Wiki-like shortcuts. */ -public class IdentityTextInterpreter implements TextInterpreter, CmsNames { - - @Override - public void write(Item item, String content) { - try { - if (item instanceof Node) { - Node node = (Node) item; - if (node.isNodeType(CmsTypes.CMS_STYLED)) { - String raw = convertToStorage(node, content); - node.setProperty(CMS_CONTENT, raw); - } else { - throw new CmsException("Don't know how to interpret " - + node); - } - } else {// property - Property property = (Property) item; - property.setValue(content); - } - item.getSession().save(); - } catch (RepositoryException e) { - throw new CmsException("Cannot set content on " + item, e); - } - } - - @Override - public String read(Item item) { - try { - String raw = raw(item); - return convertFromStorage(item, raw); - } catch (RepositoryException e) { - throw new CmsException("Cannot get " + item + " for edit", e); - } - } - - @Override - public String raw(Item item) { - try { - if (item instanceof Node) { - Node node = (Node) item; - if (node.isNodeType(CmsTypes.CMS_STYLED)) { - // WORKAROUND FOR BROKEN PARARAPHS - if (!node.hasProperty(CMS_CONTENT)) { - node.setProperty(CMS_CONTENT, ""); - node.getSession().save(); - } - - return node.getProperty(CMS_CONTENT).getString(); - } else { - throw new CmsException("Don't know how to interpret " - + node); - } - } else {// property - Property property = (Property) item; - return property.getString(); - } - } catch (RepositoryException e) { - throw new CmsException("Cannot get " + item + " content", e); - } - } - - protected String convertToStorage(Item item, String content) - throws RepositoryException { - return content; - - } - - protected String convertFromStorage(Item item, String content) - throws RepositoryException { - return content; - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/MenuLink.java b/org.argeo.cms/src/org/argeo/cms/MenuLink.java deleted file mode 100644 index 75be3f1ef..000000000 --- a/org.argeo.cms/src/org/argeo/cms/MenuLink.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.argeo.cms; - -/** - * Convenience class setting the custom style {@link CmsStyles#CMS_MENU_LINK} on - * a {@link CmsLink} when simple menus are used. - */ -public class MenuLink extends CmsLink { - public MenuLink() { - setCustom(CmsStyles.CMS_MENU_LINK); - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/Msg.java b/org.argeo.cms/src/org/argeo/cms/Msg.java deleted file mode 100644 index 057b74ab0..000000000 --- a/org.argeo.cms/src/org/argeo/cms/Msg.java +++ /dev/null @@ -1,84 +0,0 @@ -package org.argeo.cms; - -import java.lang.reflect.Field; -import java.lang.reflect.Modifier; - -import org.eclipse.rap.rwt.RWT; - -/** A single message to be internationalised. */ -public class Msg { - private String id; - private ClassLoader classLoader; - private final Object defaultLocal; - - public Msg() { - defaultLocal = null; - } - - public Msg(Object defaultMessage) { - this.defaultLocal = defaultMessage; - } - - public String getId() { - return id; - } - - public void setId(String id) { - this.id = id; - } - - public ClassLoader getClassLoader() { - return classLoader; - } - - public void setClassLoader(ClassLoader classLoader) { - this.classLoader = classLoader; - } - - public Object getDefault() { - return defaultLocal; - } - - public String toString() { - return local().toString(); - } - - /** When used as the first word of a sentence. */ - public String lead() { - String raw = toString(); - return raw.substring(0, 1).toUpperCase(RWT.getLocale()) - + raw.substring(1); - } - - public Object local() { - CmsSession cmSession = CmsSession.current.get(); - Object local = cmSession.local(this); - if (local == null) - local = getDefault(); - if (local == null) - throw new CmsException("No translation found for " + id); - return local; - } - - public static void init(Class clss) { - final Field[] fieldArray = clss.getDeclaredFields(); - ClassLoader loader = clss.getClassLoader(); - - for (Field field : fieldArray) { - if (Modifier.isStatic(field.getModifiers()) - && field.getType().isAssignableFrom(Msg.class)) { - try { - Object obj = field.get(null); - String id = clss.getCanonicalName() + "." + field.getName(); - obj.getClass().getMethod("setId", String.class) - .invoke(obj, id); - obj.getClass() - .getMethod("setClassLoader", ClassLoader.class) - .invoke(obj, loader); - } catch (Exception e) { - throw new CmsException("Cannot prepare field " + field); - } - } - } - } -} diff --git a/org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java b/org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java deleted file mode 100644 index 55c149ee1..000000000 --- a/org.argeo.cms/src/org/argeo/cms/OpenUserMenu.java +++ /dev/null @@ -1,23 +0,0 @@ -package org.argeo.cms; - -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.widgets.Control; - -/** Open the user menu when clicked */ -public class OpenUserMenu extends MouseAdapter { - private static final long serialVersionUID = 3634864186295639792L; - private CmsLogin cmsLogin; - - @Override - public void mouseDown(MouseEvent e) { - if (e.button == 1) { - new UserMenu(cmsLogin, (Control) e.getSource()); - } - } - - public void setCmsLogin(CmsLogin cmsLogin) { - this.cmsLogin = cmsLogin; - } - -} \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java b/org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java deleted file mode 100644 index 24c924217..000000000 --- a/org.argeo.cms/src/org/argeo/cms/SimpleCmsHeader.java +++ /dev/null @@ -1,85 +0,0 @@ -package org.argeo.cms; - -import java.util.ArrayList; -import java.util.List; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; - -import org.eclipse.rap.rwt.RWT; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; - -/** A header in three parts */ -public class SimpleCmsHeader implements CmsUiProvider { - private List lead = new ArrayList(); - private List center = new ArrayList(); - private List end = new ArrayList(); - - private Boolean subPartsSameWidth = false; - - @Override - public Control createUi(Composite parent, Node context) - throws RepositoryException { - Composite header = new Composite(parent, SWT.NONE); - header.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_HEADER); - header.setBackgroundMode(SWT.INHERIT_DEFAULT); - header.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(3, false))); - - configurePart(context, header, lead); - configurePart(context, header, center); - configurePart(context, header, end); - return header; - } - - protected void configurePart(Node context, Composite parent, - List partProviders) throws RepositoryException { - final int style; - final String custom; - if (lead == partProviders) { - style = SWT.LEAD; - custom = CmsStyles.CMS_HEADER_LEAD; - } else if (center == partProviders) { - style = SWT.CENTER; - custom = CmsStyles.CMS_HEADER_CENTER; - } else if (end == partProviders) { - style = SWT.END; - custom = CmsStyles.CMS_HEADER_END; - } else { - throw new CmsException("Unsupported part providers " - + partProviders); - } - - Composite part = new Composite(parent, SWT.NONE); - part.setData(RWT.CUSTOM_VARIANT, custom); - GridData gridData = new GridData(style, SWT.FILL, true, true); - part.setLayoutData(gridData); - part.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(partProviders - .size(), subPartsSameWidth))); - for (CmsUiProvider uiProvider : partProviders) { - Control subPart = uiProvider.createUi(part, context); - subPart.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, - true)); - } - } - - public void setLead(List lead) { - this.lead = lead; - } - - public void setCenter(List center) { - this.center = center; - } - - public void setEnd(List end) { - this.end = end; - } - - public void setSubPartsSameWidth(Boolean subPartsSameWidth) { - this.subPartsSameWidth = subPartsSameWidth; - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java b/org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java deleted file mode 100644 index 5de40bb50..000000000 --- a/org.argeo.cms/src/org/argeo/cms/SimpleDynamicPages.java +++ /dev/null @@ -1,116 +0,0 @@ -package org.argeo.cms; - -import java.text.DateFormat; -import java.text.SimpleDateFormat; - -import javax.jcr.Node; -import javax.jcr.NodeIterator; -import javax.jcr.Property; -import javax.jcr.PropertyIterator; -import javax.jcr.PropertyType; -import javax.jcr.RepositoryException; -import javax.jcr.Value; - -import org.argeo.jcr.JcrUtils; -import org.eclipse.rap.rwt.RWT; -import org.eclipse.swt.SWT; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; - -public class SimpleDynamicPages implements CmsUiProvider { - - @Override - public Control createUi(Composite parent, Node context) - throws RepositoryException { - if (context == null) - throw new CmsException("Context cannot be null"); - parent.setLayout(new GridLayout(2, false)); - - // parent - if (!context.getPath().equals("/")) { - new CmsLink("..", context.getParent().getPath()).createUi(parent, - context); - new Label(parent, SWT.NONE).setText(context.getParent() - .getPrimaryNodeType().getName()); - } - - // context - Label contextL = new Label(parent, SWT.NONE); - contextL.setData(RWT.MARKUP_ENABLED, true); - contextL.setText("" + context.getName() + ""); - new Label(parent, SWT.NONE).setText(context.getPrimaryNodeType() - .getName()); - - // children - // Label childrenL = new Label(parent, SWT.NONE); - // childrenL.setData(RWT.MARKUP_ENABLED, true); - // childrenL.setText("Children:"); - // childrenL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, - // false, 2, 1)); - - for (NodeIterator nIt = context.getNodes(); nIt.hasNext();) { - Node child = nIt.nextNode(); - new CmsLink(child.getName(), child.getPath()).createUi(parent, - context); - - new Label(parent, SWT.NONE).setText(child.getPrimaryNodeType() - .getName()); - } - - // properties - // Label propsL = new Label(parent, SWT.NONE); - // propsL.setData(RWT.MARKUP_ENABLED, true); - // propsL.setText("Properties:"); - // propsL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, - // 2, 1)); - for (PropertyIterator pIt = context.getProperties(); pIt.hasNext();) { - Property property = pIt.nextProperty(); - - Label label = new Label(parent, SWT.NONE); - label.setText(property.getName()); - label.setToolTipText(JcrUtils - .getPropertyDefinitionAsString(property)); - - new Label(parent, SWT.NONE).setText(getPropAsString(property)); - } - - return null; - } - - private String getPropAsString(Property property) - throws RepositoryException { - String result = ""; - DateFormat timeFormatter = new SimpleDateFormat(""); - if (property.isMultiple()) { - result = getMultiAsString(property, ", "); - } else { - Value value = property.getValue(); - if (value.getType() == PropertyType.BINARY) - result = ""; - else if (value.getType() == PropertyType.DATE) - result = timeFormatter.format(value.getDate().getTime()); - else - result = value.getString(); - } - return result; - } - - private String getMultiAsString(Property property, String separator) - throws RepositoryException { - if (separator == null) - separator = "; "; - Value[] values = property.getValues(); - StringBuilder builder = new StringBuilder(); - for (Value val : values) { - String currStr = val.getString(); - if (!"".equals(currStr.trim())) - builder.append(currStr).append(separator); - } - if (builder.lastIndexOf(separator) >= 0) - return builder.substring(0, builder.length() - separator.length()); - else - return builder.toString(); - } -} \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java b/org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java deleted file mode 100644 index 1cb030028..000000000 --- a/org.argeo.cms/src/org/argeo/cms/SimpleStaticPage.java +++ /dev/null @@ -1,30 +0,0 @@ -package org.argeo.cms; - -import javax.jcr.Node; -import javax.jcr.RepositoryException; - -import org.eclipse.rap.rwt.RWT; -import org.eclipse.swt.SWT; -import org.eclipse.swt.widgets.Composite; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; - -public class SimpleStaticPage implements CmsUiProvider { - private String text; - - @Override - public Control createUi(Composite parent, Node context) - throws RepositoryException { - Label textC = new Label(parent, SWT.WRAP); - textC.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_STATIC_TEXT); - textC.setData(RWT.MARKUP_ENABLED, Boolean.TRUE); - textC.setText(text); - - return textC; - } - - public void setText(String text) { - this.text = text; - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/TextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/TextInterpreter.java deleted file mode 100644 index f7cbca759..000000000 --- a/org.argeo.cms/src/org/argeo/cms/TextInterpreter.java +++ /dev/null @@ -1,12 +0,0 @@ -package org.argeo.cms; - -import javax.jcr.Item; - -/** Convert from/to data layer to/from presentation layer. */ -public interface TextInterpreter { - public String raw(Item item); - - public String read(Item item); - - public void write(Item item, String content); -} diff --git a/org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java b/org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java deleted file mode 100644 index fb4e2cd51..000000000 --- a/org.argeo.cms/src/org/argeo/cms/UrlResourceLoader.java +++ /dev/null @@ -1,25 +0,0 @@ -package org.argeo.cms; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URL; - -import org.eclipse.rap.rwt.service.ResourceLoader; - -/** {@link ResourceLoader} implementation wrapping an {@link URL}. */ -@Deprecated -public class UrlResourceLoader implements ResourceLoader { - private final URL url; - - public UrlResourceLoader(URL url) { - super(); - this.url = url; - } - - @Override - public InputStream getResourceAsStream(String resourceName) - throws IOException { - return url.openStream(); - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/UserMenu.java b/org.argeo.cms/src/org/argeo/cms/UserMenu.java deleted file mode 100644 index 41ff9ab7f..000000000 --- a/org.argeo.cms/src/org/argeo/cms/UserMenu.java +++ /dev/null @@ -1,139 +0,0 @@ -package org.argeo.cms; - -import static org.argeo.cms.internal.kernel.KernelConstants.SPRING_SECURITY_CONTEXT_KEY; - -import javax.servlet.http.HttpSession; - -import org.eclipse.rap.rwt.RWT; -import org.eclipse.swt.SWT; -import org.eclipse.swt.events.MouseAdapter; -import org.eclipse.swt.events.MouseEvent; -import org.eclipse.swt.events.ShellAdapter; -import org.eclipse.swt.events.ShellEvent; -import org.eclipse.swt.events.TraverseEvent; -import org.eclipse.swt.events.TraverseListener; -import org.eclipse.swt.layout.GridData; -import org.eclipse.swt.layout.GridLayout; -import org.eclipse.swt.widgets.Control; -import org.eclipse.swt.widgets.Label; -import org.eclipse.swt.widgets.Shell; -import org.eclipse.swt.widgets.Text; -import org.springframework.security.core.context.SecurityContextHolder; - -/** The site-related user menu */ -public class UserMenu extends Shell implements CmsStyles { - private static final long serialVersionUID = -5788157651532106301L; - - private CmsLogin cmsLogin; - private String username = null; - - public UserMenu(CmsLogin cmsLogin, Control source) { - super(source.getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); - this.cmsLogin = cmsLogin; - - setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU); - - username = SecurityContextHolder.getContext().getAuthentication() - .getName(); - if (username.equals("anonymous")) { - username = null; - anonymousUi(); - } else { - userUi(); - } - - pack(); - layout(); - setLocation(source.toDisplay(source.getSize().x - getSize().x, - source.getSize().y)); - - addShellListener(new ShellAdapter() { - private static final long serialVersionUID = 5178980294808435833L; - - @Override - public void shellDeactivated(ShellEvent e) { - close(); - dispose(); - } - - }); - - open(); - - } - - protected void userUi() { - setLayout(new GridLayout()); - - Label l = new Label(this, SWT.NONE); - l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM); - l.setData(RWT.MARKUP_ENABLED, true); - l.setLayoutData(CmsUtils.fillWidth()); - l.setText("" + username + ""); - - final CmsSession cmsSession = (CmsSession) getDisplay().getData( - CmsSession.KEY); - l = new Label(this, SWT.NONE); - l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM); - l.setText(CmsMsg.logout.lead()); - GridData lData = CmsUtils.fillWidth(); - lData.widthHint = 120; - l.setLayoutData(lData); - - l.addMouseListener(new MouseAdapter() { - private static final long serialVersionUID = 6444395812777413116L; - - public void mouseDown(MouseEvent e) { - SecurityContextHolder.getContext().setAuthentication(null); - HttpSession httpSession = RWT.getRequest().getSession(); - httpSession.removeAttribute(SPRING_SECURITY_CONTEXT_KEY); - close(); - dispose(); - cmsSession.authChange(); - } - }); - } - - protected void anonymousUi() { - Integer textWidth = 150; - setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU); - setLayout(new GridLayout(2, false)); - - new Label(this, SWT.NONE).setText(CmsMsg.username.lead()); - final Text username = new Text(this, SWT.BORDER); - username.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_USERNAME); - GridData gd = CmsUtils.fillWidth(); - gd.widthHint = textWidth; - username.setLayoutData(gd); - - new Label(this, SWT.NONE).setText(CmsMsg.password.lead()); - final Text password = new Text(this, SWT.BORDER | SWT.PASSWORD); - password.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_PASSWORD); - gd = CmsUtils.fillWidth(); - gd.widthHint = textWidth; - password.setLayoutData(gd); - - // Listeners - TraverseListener tl = new TraverseListener() { - private static final long serialVersionUID = -1158892811534971856L; - - public void keyTraversed(TraverseEvent e) { - if (e.detail == SWT.TRAVERSE_RETURN) - login(username.getText(), password.getTextChars()); - } - }; - username.addTraverseListener(tl); - password.addTraverseListener(tl); - } - - protected void login(String username, char[] password) { - CmsSession cmsSession = (CmsSession) getDisplay().getData( - CmsSession.KEY); - cmsLogin.logInWithPassword(username, password); - close(); - dispose(); - // refreshUi(source.getParent()); - cmsSession.authChange(); - } - -} diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java new file mode 100644 index 000000000..2fc9cbc5f --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/i18n/DefaultsResourceBundle.java @@ -0,0 +1,41 @@ +package org.argeo.cms.i18n; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; +import java.util.Enumeration; +import java.util.ResourceBundle; +import java.util.Vector; + +import org.argeo.cms.CmsException; + +/** Expose the default values as a {@link ResourceBundle} */ +public class DefaultsResourceBundle extends ResourceBundle { + + @Override + protected Object handleGetObject(String key) { + Object obj; + try { + Field field = getClass().getField(key); + obj = field.getType().getMethod("getDefault") + .invoke(field.get(null)); + } catch (Exception e) { + throw new CmsException("Cannot get default for " + key, e); + } + return obj; + } + + @Override + public Enumeration getKeys() { + Vector res = new Vector(); + final Field[] fieldArray = getClass().getDeclaredFields(); + + for (Field field : fieldArray) { + if (Modifier.isStatic(field.getModifiers()) + && field.getType().isAssignableFrom(Msg.class)) { + res.add(field.getName()); + } + } + return res.elements(); + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java new file mode 100644 index 000000000..dd38c7483 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/i18n/Msg.java @@ -0,0 +1,86 @@ +package org.argeo.cms.i18n; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import org.argeo.cms.CmsException; +import org.argeo.cms.CmsSession; +import org.eclipse.rap.rwt.RWT; + +/** A single message to be internationalised. */ +public class Msg { + private String id; + private ClassLoader classLoader; + private final Object defaultLocal; + + public Msg() { + defaultLocal = null; + } + + public Msg(Object defaultMessage) { + this.defaultLocal = defaultMessage; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public ClassLoader getClassLoader() { + return classLoader; + } + + public void setClassLoader(ClassLoader classLoader) { + this.classLoader = classLoader; + } + + public Object getDefault() { + return defaultLocal; + } + + public String toString() { + return local().toString(); + } + + /** When used as the first word of a sentence. */ + public String lead() { + String raw = toString(); + return raw.substring(0, 1).toUpperCase(RWT.getLocale()) + + raw.substring(1); + } + + public Object local() { + CmsSession cmSession = CmsSession.current.get(); + Object local = cmSession.local(this); + if (local == null) + local = getDefault(); + if (local == null) + throw new CmsException("No translation found for " + id); + return local; + } + + public static void init(Class clss) { + final Field[] fieldArray = clss.getDeclaredFields(); + ClassLoader loader = clss.getClassLoader(); + + for (Field field : fieldArray) { + if (Modifier.isStatic(field.getModifiers()) + && field.getType().isAssignableFrom(Msg.class)) { + try { + Object obj = field.get(null); + String id = clss.getCanonicalName() + "." + field.getName(); + obj.getClass().getMethod("setId", String.class) + .invoke(obj, id); + obj.getClass() + .getMethod("setClassLoader", ClassLoader.class) + .invoke(obj, loader); + } catch (Exception e) { + throw new CmsException("Cannot prepare field " + field); + } + } + } + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/internal/ImageManagerImpl.java b/org.argeo.cms/src/org/argeo/cms/internal/ImageManagerImpl.java index db36f719f..b1d27e516 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/ImageManagerImpl.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/ImageManagerImpl.java @@ -24,7 +24,7 @@ import org.argeo.cms.CmsException; import org.argeo.cms.CmsImageManager; import org.argeo.cms.CmsNames; import org.argeo.cms.CmsTypes; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.rwt.RWT; import org.eclipse.rap.rwt.service.ResourceManager; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/SimpleEditableImage.java b/org.argeo.cms/src/org/argeo/cms/internal/SimpleEditableImage.java index e3211ef13..67e500ffc 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/SimpleEditableImage.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/SimpleEditableImage.java @@ -2,7 +2,7 @@ package org.argeo.cms.internal; import javax.jcr.RepositoryException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.widgets.EditableImage; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/internal/text/AbstractTextViewer.java b/org.argeo.cms/src/org/argeo/cms/internal/text/AbstractTextViewer.java index cbed63e8c..57939b517 100644 --- a/org.argeo.cms/src/org/argeo/cms/internal/text/AbstractTextViewer.java +++ b/org.argeo.cms/src/org/argeo/cms/internal/text/AbstractTextViewer.java @@ -1,7 +1,7 @@ package org.argeo.cms.internal.text; import static javax.jcr.Property.JCR_TITLE; -import static org.argeo.cms.CmsUtils.fillWidth; +import static org.argeo.cms.util.CmsUtils.fillWidth; import java.util.ArrayList; import java.util.Iterator; @@ -24,12 +24,12 @@ import org.argeo.cms.CmsImageManager; import org.argeo.cms.CmsNames; import org.argeo.cms.CmsSession; import org.argeo.cms.CmsTypes; -import org.argeo.cms.CmsUtils; -import org.argeo.cms.IdentityTextInterpreter; -import org.argeo.cms.TextInterpreter; +import org.argeo.cms.text.IdentityTextInterpreter; 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.util.CmsUtils; import org.argeo.cms.viewers.AbstractPageViewer; import org.argeo.cms.viewers.EditablePart; import org.argeo.cms.viewers.NodePart; diff --git a/org.argeo.cms/src/org/argeo/cms/maintenance/Browse.java b/org.argeo.cms/src/org/argeo/cms/maintenance/Browse.java index 3fff4e421..e3561e104 100644 --- a/org.argeo.cms/src/org/argeo/cms/maintenance/Browse.java +++ b/org.argeo.cms/src/org/argeo/cms/maintenance/Browse.java @@ -18,11 +18,11 @@ import javax.jcr.Value; import org.argeo.ArgeoException; import org.argeo.cms.CmsException; -import org.argeo.cms.CmsLink; import org.argeo.cms.CmsTypes; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; import org.argeo.cms.text.Img; +import org.argeo.cms.util.CmsLink; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.widgets.EditableImage; import org.argeo.jcr.JcrUtils; import org.eclipse.jface.viewers.ColumnLabelProvider; diff --git a/org.argeo.cms/src/org/argeo/cms/maintenance/NonAdminPage.java b/org.argeo.cms/src/org/argeo/cms/maintenance/NonAdminPage.java index 7c1a18a14..b27d50659 100644 --- a/org.argeo.cms/src/org/argeo/cms/maintenance/NonAdminPage.java +++ b/org.argeo.cms/src/org/argeo/cms/maintenance/NonAdminPage.java @@ -4,7 +4,7 @@ import javax.jcr.Node; import javax.jcr.RepositoryException; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.layout.GridLayout; diff --git a/org.argeo.cms/src/org/argeo/cms/text/CustomTextEditor.java b/org.argeo.cms/src/org/argeo/cms/text/CustomTextEditor.java index 6ff78108f..900dce2ae 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/CustomTextEditor.java +++ b/org.argeo.cms/src/org/argeo/cms/text/CustomTextEditor.java @@ -1,6 +1,6 @@ package org.argeo.cms.text; -import static org.argeo.cms.CmsUtils.fillWidth; +import static org.argeo.cms.util.CmsUtils.fillWidth; import javax.jcr.Node; import javax.jcr.RepositoryException; diff --git a/org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java new file mode 100644 index 000000000..db90ea0f8 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/text/IdentityTextInterpreter.java @@ -0,0 +1,83 @@ +package org.argeo.cms.text; + +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; + +import org.argeo.cms.CmsException; +import org.argeo.cms.CmsNames; +import org.argeo.cms.CmsTypes; + +/** Based on HTML with a few Wiki-like shortcuts. */ +public class IdentityTextInterpreter implements TextInterpreter, CmsNames { + + @Override + public void write(Item item, String content) { + try { + if (item instanceof Node) { + Node node = (Node) item; + if (node.isNodeType(CmsTypes.CMS_STYLED)) { + String raw = convertToStorage(node, content); + node.setProperty(CMS_CONTENT, raw); + } else { + throw new CmsException("Don't know how to interpret " + + node); + } + } else {// property + Property property = (Property) item; + property.setValue(content); + } + item.getSession().save(); + } catch (RepositoryException e) { + throw new CmsException("Cannot set content on " + item, e); + } + } + + @Override + public String read(Item item) { + try { + String raw = raw(item); + return convertFromStorage(item, raw); + } catch (RepositoryException e) { + throw new CmsException("Cannot get " + item + " for edit", e); + } + } + + @Override + public String raw(Item item) { + try { + if (item instanceof Node) { + Node node = (Node) item; + if (node.isNodeType(CmsTypes.CMS_STYLED)) { + // WORKAROUND FOR BROKEN PARARAPHS + if (!node.hasProperty(CMS_CONTENT)) { + node.setProperty(CMS_CONTENT, ""); + node.getSession().save(); + } + + return node.getProperty(CMS_CONTENT).getString(); + } else { + throw new CmsException("Don't know how to interpret " + + node); + } + } else {// property + Property property = (Property) item; + return property.getString(); + } + } catch (RepositoryException e) { + throw new CmsException("Cannot get " + item + " content", e); + } + } + + protected String convertToStorage(Item item, String content) + throws RepositoryException { + return content; + + } + + protected String convertFromStorage(Item item, String content) + throws RepositoryException { + return content; + } +} diff --git a/org.argeo.cms/src/org/argeo/cms/text/Img.java b/org.argeo.cms/src/org/argeo/cms/text/Img.java index 83c32087f..54f702bba 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/Img.java +++ b/org.argeo.cms/src/org/argeo/cms/text/Img.java @@ -6,8 +6,8 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsException; import org.argeo.cms.CmsImageManager; import org.argeo.cms.CmsSession; -import org.argeo.cms.CmsUtils; import org.argeo.cms.internal.JcrFileUploadReceiver; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.NodePart; import org.argeo.cms.viewers.Section; import org.argeo.cms.viewers.SectionPart; diff --git a/org.argeo.cms/src/org/argeo/cms/text/Paragraph.java b/org.argeo.cms/src/org/argeo/cms/text/Paragraph.java index d917c45d4..a7a7964f4 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/Paragraph.java +++ b/org.argeo.cms/src/org/argeo/cms/text/Paragraph.java @@ -3,7 +3,7 @@ package org.argeo.cms.text; import javax.jcr.Node; import javax.jcr.RepositoryException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.Section; import org.argeo.cms.viewers.SectionPart; import org.argeo.cms.widgets.EditableText; diff --git a/org.argeo.cms/src/org/argeo/cms/text/StandardTextEditor.java b/org.argeo.cms/src/org/argeo/cms/text/StandardTextEditor.java index 7a3de3be9..4ce8d1fd9 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/StandardTextEditor.java +++ b/org.argeo.cms/src/org/argeo/cms/text/StandardTextEditor.java @@ -8,8 +8,8 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsEditable; import org.argeo.cms.CmsTypes; -import org.argeo.cms.CmsUtils; import org.argeo.cms.internal.text.AbstractTextViewer; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.Section; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/text/TextEditorHeader.java b/org.argeo.cms/src/org/argeo/cms/text/TextEditorHeader.java index 6821fcb53..e70a4d06e 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/TextEditorHeader.java +++ b/org.argeo.cms/src/org/argeo/cms/text/TextEditorHeader.java @@ -4,7 +4,7 @@ import java.util.Observable; import java.util.Observer; import org.argeo.cms.CmsEditable; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.SelectionEvent; import org.eclipse.swt.events.SelectionListener; diff --git a/org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java b/org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java new file mode 100644 index 000000000..f39a2b329 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/text/TextInterpreter.java @@ -0,0 +1,12 @@ +package org.argeo.cms.text; + +import javax.jcr.Item; + +/** Convert from/to data layer to/from presentation layer. */ +public interface TextInterpreter { + public String raw(Item item); + + public String read(Item item); + + public void write(Item item, String content); +} diff --git a/org.argeo.cms/src/org/argeo/cms/text/TextSection.java b/org.argeo.cms/src/org/argeo/cms/text/TextSection.java index 09456f2c7..ac93e4b65 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/TextSection.java +++ b/org.argeo.cms/src/org/argeo/cms/text/TextSection.java @@ -4,7 +4,7 @@ import javax.jcr.Node; import javax.jcr.RepositoryException; import org.argeo.cms.CmsNames; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.Section; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/text/WikiPage.java b/org.argeo.cms/src/org/argeo/cms/text/WikiPage.java index 17c3d9c3a..65afeca4b 100644 --- a/org.argeo.cms/src/org/argeo/cms/text/WikiPage.java +++ b/org.argeo.cms/src/org/argeo/cms/text/WikiPage.java @@ -6,11 +6,11 @@ import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import org.argeo.cms.CmsEditable; -import org.argeo.cms.CmsLink; import org.argeo.cms.CmsNames; import org.argeo.cms.CmsTypes; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsLink; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.JcrVersionCmsEditable; import org.argeo.cms.widgets.ScrolledPage; import org.argeo.jcr.JcrUtils; diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserPage.java b/org.argeo.cms/src/org/argeo/cms/users/UserPage.java index ef0e9313e..83998baad 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserPage.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserPage.java @@ -5,7 +5,7 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsEditable; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.JcrVersionCmsEditable; import org.argeo.cms.widgets.ScrolledPage; import org.argeo.security.UserAdminService; diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserPart.java b/org.argeo.cms/src/org/argeo/cms/users/UserPart.java index 66f50b885..1c42134f1 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserPart.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserPart.java @@ -9,7 +9,7 @@ import javax.jcr.Property; import javax.jcr.RepositoryException; import org.argeo.ArgeoException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.EditablePart; import org.argeo.cms.viewers.NodePart; import org.argeo.cms.widgets.StyledControl; diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java b/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java index 8efcba261..f4acb8a9d 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserRolesPart.java @@ -7,7 +7,7 @@ import javax.jcr.Item; import javax.jcr.RepositoryException; import org.argeo.ArgeoException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.EditablePart; import org.argeo.cms.viewers.NodePart; import org.argeo.cms.widgets.StyledControl; diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserViewer.java b/org.argeo.cms/src/org/argeo/cms/users/UserViewer.java index a520da1bd..48ca70a69 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserViewer.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserViewer.java @@ -5,7 +5,7 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsEditable; import org.argeo.cms.CmsException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.AbstractPageViewer; import org.argeo.cms.viewers.EditablePart; import org.eclipse.swt.SWT; diff --git a/org.argeo.cms/src/org/argeo/cms/users/UserViewerOld.java b/org.argeo.cms/src/org/argeo/cms/users/UserViewerOld.java index ad0b62f45..6b522f5d9 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/UserViewerOld.java +++ b/org.argeo.cms/src/org/argeo/cms/users/UserViewerOld.java @@ -11,7 +11,7 @@ import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.argeo.cms.CmsEditable; import org.argeo.cms.CmsException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.viewers.EditablePart; import org.argeo.cms.viewers.JcrVersionCmsEditable; import org.eclipse.jface.viewers.ContentViewer; diff --git a/org.argeo.cms/src/org/argeo/cms/users/Users.java b/org.argeo.cms/src/org/argeo/cms/users/Users.java index cc164b769..c5f0c7ee5 100644 --- a/org.argeo.cms/src/org/argeo/cms/users/Users.java +++ b/org.argeo.cms/src/org/argeo/cms/users/Users.java @@ -14,8 +14,8 @@ import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.argeo.ArgeoException; import org.argeo.cms.CmsUiProvider; -import org.argeo.cms.CmsUtils; import org.argeo.cms.maintenance.NonAdminPage; +import org.argeo.cms.util.CmsUtils; import org.argeo.eclipse.ui.dialogs.UserCreationWizard; import org.argeo.eclipse.ui.parts.UsersTable; import org.argeo.jcr.ArgeoNames; diff --git a/org.argeo.cms/src/org/argeo/cms/util/CmsLink.java b/org.argeo.cms/src/org/argeo/cms/util/CmsLink.java new file mode 100644 index 000000000..674dc3084 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/util/CmsLink.java @@ -0,0 +1,273 @@ +package org.argeo.cms.util; + +import java.io.InputStream; +import java.net.MalformedURLException; +import java.net.URL; + +import javax.jcr.Node; + +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.eclipse.gemini.blueprint.context.BundleContextAware; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.service.ResourceManager; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseListener; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.osgi.framework.BundleContext; +import org.springframework.beans.factory.InitializingBean; + +/** A link to an internal or external location. */ +public class CmsLink implements CmsUiProvider, InitializingBean, + BundleContextAware { + private final static Log log = LogFactory.getLog(CmsLink.class); + + private String label; + private String custom; + private String target; + private String image; + private MouseListener mouseListener; + + private int verticalAlignment = SWT.CENTER; + + // internal + //private Boolean isUrl = false; + private Integer imageWidth, imageHeight; + + private BundleContext bundleContext; + + public CmsLink() { + super(); + } + + public CmsLink(String label, String target) { + this(label, target, null); + } + + public CmsLink(String label, String target, String custom) { + super(); + this.label = label; + this.target = target; + this.custom = custom; + afterPropertiesSet(); + } + + @Override + public void afterPropertiesSet() { +// if (target != null) { +// if (target.startsWith("/")) { +// isUrl = true; +// } else { +// try { +// new URL(target); +// isUrl = true; +// } catch (MalformedURLException e1) { +// isUrl = false; +// } +// } +// } + + if (image != null) { + ImageData image = loadImage(); + imageWidth = image.width; + imageHeight = image.height; + } + } + + @Override + public Control createUi(final Composite parent, Node context) { + Composite comp = new Composite(parent, SWT.BOTTOM); + comp.setLayout(CmsUtils.noSpaceGridLayout()); + + Label link = new Label(comp, SWT.NONE); + link.setData(RWT.MARKUP_ENABLED, Boolean.TRUE); + GridData layoutData = new GridData(SWT.CENTER, verticalAlignment, true, + true); + if (image != null) { + layoutData.heightHint = imageHeight; + if (label == null) + layoutData.widthHint = imageWidth; + } + + link.setLayoutData(layoutData); + if (custom != null) { + comp.setData(RWT.CUSTOM_VARIANT, custom); + link.setData(RWT.CUSTOM_VARIANT, custom); + } else { + comp.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK); + link.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_LINK); + } + + // label + StringBuilder labelText = new StringBuilder(); + if (target != null) { + labelText + .append(""); + } + if (image != null) { + registerImageIfNeeded(); + String imageLocation = RWT.getResourceManager().getLocation(image); + labelText.append(""); + + // final Image img = loadImage(parent.getDisplay()); + // link.setImage(img); + // link.addDisposeListener(new DListener(img)); + } + + if (label != null) { + // link.setText(label); + labelText.append(' ').append(label); + } + + if (target != null) + labelText.append(""); + + link.setText(labelText.toString()); + + // link.setCursor(link.getDisplay().getSystemCursor(SWT.CURSOR_HAND)); + // CmsSession cmsSession = (CmsSession) parent.getDisplay().getData( + // CmsSession.KEY); + if (mouseListener != null) + link.addMouseListener(mouseListener); + + return comp; + } + + private void registerImageIfNeeded() { + ResourceManager resourceManager = RWT.getResourceManager(); + if (!resourceManager.isRegistered(image)) { + URL res = getImageUrl(); + InputStream inputStream = null; + try { + IOUtils.closeQuietly(inputStream); + inputStream = res.openStream(); + resourceManager.register(image, inputStream); + if (log.isTraceEnabled()) + log.trace("Registered image " + image); + } catch (Exception e) { + throw new CmsException("Cannot load image " + image, e); + } finally { + IOUtils.closeQuietly(inputStream); + } + } + } + + private ImageData loadImage() { + URL url = getImageUrl(); + ImageData result = null; + InputStream inputStream = null; + try { + inputStream = url.openStream(); + result = new ImageData(inputStream); + if (log.isTraceEnabled()) + log.trace("Loaded image " + image); + } catch (Exception e) { + throw new CmsException("Cannot load image " + image, e); + } finally { + IOUtils.closeQuietly(inputStream); + } + return result; + } + + private URL getImageUrl() { + URL url; + try { + // pure URL + url = new URL(image); + } catch (MalformedURLException e1) { + // in OSGi bundle + if (bundleContext == null) + throw new CmsException("No bundle context available"); + url = bundleContext.getBundle().getResource(image); + } + + if (url == null) + throw new CmsException("No image " + image + " available."); + + return url; + } + + public void setLabel(String label) { + this.label = label; + } + + public void setCustom(String custom) { + this.custom = custom; + } + + public void setTarget(String target) { + this.target = target; + // try { + // new URL(target); + // isUrl = true; + // } catch (MalformedURLException e1) { + // isUrl = false; + // } + } + + public void setImage(String image) { + this.image = image; + } + + @Override + public void setBundleContext(BundleContext bundleContext) { + this.bundleContext = bundleContext; + } + + public void setMouseListener(MouseListener mouseListener) { + this.mouseListener = mouseListener; + } + + public void setvAlign(String vAlign) { + if ("bottom".equals(vAlign)) { + verticalAlignment = SWT.BOTTOM; + } else if ("top".equals(vAlign)) { + verticalAlignment = SWT.TOP; + } else if ("center".equals(vAlign)) { + verticalAlignment = SWT.CENTER; + } else { + throw new CmsException("Unsupported vertical allignment " + vAlign + + " (must be: top, bottom or center)"); + } + } + + // private class MListener extends MouseAdapter { + // private static final long serialVersionUID = 3634864186295639792L; + // + // @Override + // public void mouseDown(MouseEvent e) { + // if (e.button == 1) { + // } + // } + // } + // + // private class DListener implements DisposeListener { + // private static final long serialVersionUID = -3808587499269394812L; + // private final Image img; + // + // public DListener(Image img) { + // super(); + // this.img = img; + // } + // + // @Override + // public void widgetDisposed(DisposeEvent event) { + // img.dispose(); + // } + // + // } +} diff --git a/org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java b/org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java new file mode 100644 index 000000000..c1b319fbe --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/util/CmsUtils.java @@ -0,0 +1,178 @@ +package org.argeo.cms.util; + +import java.io.InputStream; + +import javax.jcr.Item; +import javax.jcr.Node; +import javax.jcr.Property; +import javax.jcr.RepositoryException; + +import org.apache.commons.io.IOUtils; +import org.argeo.cms.CmsConstants; +import org.argeo.cms.CmsException; +import org.argeo.jcr.JcrUtils; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.rap.rwt.service.ResourceManager; +import org.eclipse.swt.SWT; +import org.eclipse.swt.graphics.Image; +import org.eclipse.swt.graphics.ImageData; +import org.eclipse.swt.graphics.Point; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.layout.RowData; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Display; +import org.eclipse.swt.widgets.Widget; + +/** Static utilities for the CMS framework. */ +public class CmsUtils implements CmsConstants { + /** @deprecated Use rowData16px() instead. GridData should not be reused. */ + @Deprecated + public static RowData ROW_DATA_16px = new RowData(16, 16); + + public static GridLayout noSpaceGridLayout() { + return noSpaceGridLayout(new GridLayout()); + } + + public static GridLayout noSpaceGridLayout(GridLayout layout) { + layout.horizontalSpacing = 0; + layout.verticalSpacing = 0; + layout.marginWidth = 0; + layout.marginHeight = 0; + return layout; + } + + // + // GRID DATA + // + public static GridData fillWidth() { + return grabWidth(SWT.FILL, SWT.FILL); + } + + public static GridData fillAll() { + return new GridData(SWT.FILL, SWT.FILL, true, true); + } + + public static GridData grabWidth(int horizontalAlignment, + int verticalAlignment) { + return new GridData(horizontalAlignment, horizontalAlignment, true, + false); + } + + public static RowData rowData16px() { + return new RowData(16, 16); + } + + public static void style(Widget widget, String style) { + widget.setData(CmsConstants.STYLE, style); + } + + public static void markup(Widget widget) { + widget.setData(CmsConstants.MARKUP, true); + } + + /** @return the path or null if not instrumented */ + public static String getDataPath(Widget widget) { + // JCR item + Object data = widget.getData(); + if (data != null && data instanceof Item) { + try { + return ((Item) data).getPath(); + } catch (RepositoryException e) { + throw new CmsException("Cannot find data path of " + data + + " for " + widget); + } + } + + // JCR path + data = widget.getData(Property.JCR_PATH); + if (data != null) + return data.toString(); + + return null; + } + + /** Dispose all children of a Composite */ + public static void clear(Composite composite) { + for (Control child : composite.getChildren()) + child.dispose(); + } + + // + // JCR + // + public static Node getOrAddEmptyFile(Node parent, Enum child) + throws RepositoryException { + if (has(parent, child)) + return child(parent, child); + return JcrUtils.copyBytesAsFile(parent, child.name(), new byte[0]); + } + + public static Node child(Node parent, Enum en) + throws RepositoryException { + return parent.getNode(en.name()); + } + + public static Boolean has(Node parent, Enum en) + throws RepositoryException { + return parent.hasNode(en.name()); + } + + public static Node getOrAdd(Node parent, Enum en) + throws RepositoryException { + return getOrAdd(parent, en, null); + } + + public static Node getOrAdd(Node parent, Enum en, String primaryType) + throws RepositoryException { + if (has(parent, en)) + return child(parent, en); + else if (primaryType == null) + return parent.addNode(en.name()); + else + return parent.addNode(en.name(), primaryType); + } + + // IMAGES + public static String img(String src, String width, String height) { + return imgBuilder(src, width, height).append("/>").toString(); + } + + public static String img(String src, Point size) { + return img(src, Integer.toString(size.x), Integer.toString(size.y)); + } + + public static StringBuilder imgBuilder(String src, String width, + String height) { + return new StringBuilder(64).append(" lead = new ArrayList(); + private List center = new ArrayList(); + private List end = new ArrayList(); + + private Boolean subPartsSameWidth = false; + + @Override + public Control createUi(Composite parent, Node context) + throws RepositoryException { + Composite header = new Composite(parent, SWT.NONE); + header.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_HEADER); + header.setBackgroundMode(SWT.INHERIT_DEFAULT); + header.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(3, false))); + + configurePart(context, header, lead); + configurePart(context, header, center); + configurePart(context, header, end); + return header; + } + + protected void configurePart(Node context, Composite parent, + List partProviders) throws RepositoryException { + final int style; + final String custom; + if (lead == partProviders) { + style = SWT.LEAD; + custom = CmsStyles.CMS_HEADER_LEAD; + } else if (center == partProviders) { + style = SWT.CENTER; + custom = CmsStyles.CMS_HEADER_CENTER; + } else if (end == partProviders) { + style = SWT.END; + custom = CmsStyles.CMS_HEADER_END; + } else { + throw new CmsException("Unsupported part providers " + + partProviders); + } + + Composite part = new Composite(parent, SWT.NONE); + part.setData(RWT.CUSTOM_VARIANT, custom); + GridData gridData = new GridData(style, SWT.FILL, true, true); + part.setLayoutData(gridData); + part.setLayout(CmsUtils.noSpaceGridLayout(new GridLayout(partProviders + .size(), subPartsSameWidth))); + for (CmsUiProvider uiProvider : partProviders) { + Control subPart = uiProvider.createUi(part, context); + subPart.setLayoutData(new GridData(SWT.FILL, SWT.FILL, true, + true)); + } + } + + public void setLead(List lead) { + this.lead = lead; + } + + public void setCenter(List center) { + this.center = center; + } + + public void setEnd(List end) { + this.end = end; + } + + public void setSubPartsSameWidth(Boolean subPartsSameWidth) { + this.subPartsSameWidth = subPartsSameWidth; + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java b/org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java new file mode 100644 index 000000000..b6155cf31 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/util/SimpleDynamicPages.java @@ -0,0 +1,118 @@ +package org.argeo.cms.util; + +import java.text.DateFormat; +import java.text.SimpleDateFormat; + +import javax.jcr.Node; +import javax.jcr.NodeIterator; +import javax.jcr.Property; +import javax.jcr.PropertyIterator; +import javax.jcr.PropertyType; +import javax.jcr.RepositoryException; +import javax.jcr.Value; + +import org.argeo.cms.CmsException; +import org.argeo.cms.CmsUiProvider; +import org.argeo.jcr.JcrUtils; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.swt.SWT; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +public class SimpleDynamicPages implements CmsUiProvider { + + @Override + public Control createUi(Composite parent, Node context) + throws RepositoryException { + if (context == null) + throw new CmsException("Context cannot be null"); + parent.setLayout(new GridLayout(2, false)); + + // parent + if (!context.getPath().equals("/")) { + new CmsLink("..", context.getParent().getPath()).createUi(parent, + context); + new Label(parent, SWT.NONE).setText(context.getParent() + .getPrimaryNodeType().getName()); + } + + // context + Label contextL = new Label(parent, SWT.NONE); + contextL.setData(RWT.MARKUP_ENABLED, true); + contextL.setText("" + context.getName() + ""); + new Label(parent, SWT.NONE).setText(context.getPrimaryNodeType() + .getName()); + + // children + // Label childrenL = new Label(parent, SWT.NONE); + // childrenL.setData(RWT.MARKUP_ENABLED, true); + // childrenL.setText("Children:"); + // childrenL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, + // false, 2, 1)); + + for (NodeIterator nIt = context.getNodes(); nIt.hasNext();) { + Node child = nIt.nextNode(); + new CmsLink(child.getName(), child.getPath()).createUi(parent, + context); + + new Label(parent, SWT.NONE).setText(child.getPrimaryNodeType() + .getName()); + } + + // properties + // Label propsL = new Label(parent, SWT.NONE); + // propsL.setData(RWT.MARKUP_ENABLED, true); + // propsL.setText("Properties:"); + // propsL.setLayoutData(new GridData(SWT.LEAD, SWT.CENTER, false, false, + // 2, 1)); + for (PropertyIterator pIt = context.getProperties(); pIt.hasNext();) { + Property property = pIt.nextProperty(); + + Label label = new Label(parent, SWT.NONE); + label.setText(property.getName()); + label.setToolTipText(JcrUtils + .getPropertyDefinitionAsString(property)); + + new Label(parent, SWT.NONE).setText(getPropAsString(property)); + } + + return null; + } + + private String getPropAsString(Property property) + throws RepositoryException { + String result = ""; + DateFormat timeFormatter = new SimpleDateFormat(""); + if (property.isMultiple()) { + result = getMultiAsString(property, ", "); + } else { + Value value = property.getValue(); + if (value.getType() == PropertyType.BINARY) + result = ""; + else if (value.getType() == PropertyType.DATE) + result = timeFormatter.format(value.getDate().getTime()); + else + result = value.getString(); + } + return result; + } + + private String getMultiAsString(Property property, String separator) + throws RepositoryException { + if (separator == null) + separator = "; "; + Value[] values = property.getValues(); + StringBuilder builder = new StringBuilder(); + for (Value val : values) { + String currStr = val.getString(); + if (!"".equals(currStr.trim())) + builder.append(currStr).append(separator); + } + if (builder.lastIndexOf(separator) >= 0) + return builder.substring(0, builder.length() - separator.length()); + else + return builder.toString(); + } +} \ No newline at end of file diff --git a/org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java b/org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java new file mode 100644 index 000000000..6e09000e9 --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/util/SimpleStaticPage.java @@ -0,0 +1,32 @@ +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.eclipse.rap.rwt.RWT; +import org.eclipse.swt.SWT; +import org.eclipse.swt.widgets.Composite; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; + +public class SimpleStaticPage implements CmsUiProvider { + private String text; + + @Override + public Control createUi(Composite parent, Node context) + throws RepositoryException { + Label textC = new Label(parent, SWT.WRAP); + textC.setData(RWT.CUSTOM_VARIANT, CmsStyles.CMS_STATIC_TEXT); + textC.setData(RWT.MARKUP_ENABLED, Boolean.TRUE); + textC.setText(text); + + return textC; + } + + public void setText(String text) { + this.text = text; + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/util/UserMenu.java b/org.argeo.cms/src/org/argeo/cms/util/UserMenu.java new file mode 100644 index 000000000..98311560a --- /dev/null +++ b/org.argeo.cms/src/org/argeo/cms/util/UserMenu.java @@ -0,0 +1,143 @@ +package org.argeo.cms.util; + +import static org.argeo.cms.internal.kernel.KernelConstants.SPRING_SECURITY_CONTEXT_KEY; + +import javax.servlet.http.HttpSession; + +import org.argeo.cms.CmsLogin; +import org.argeo.cms.CmsMsg; +import org.argeo.cms.CmsSession; +import org.argeo.cms.CmsStyles; +import org.eclipse.rap.rwt.RWT; +import org.eclipse.swt.SWT; +import org.eclipse.swt.events.MouseAdapter; +import org.eclipse.swt.events.MouseEvent; +import org.eclipse.swt.events.ShellAdapter; +import org.eclipse.swt.events.ShellEvent; +import org.eclipse.swt.events.TraverseEvent; +import org.eclipse.swt.events.TraverseListener; +import org.eclipse.swt.layout.GridData; +import org.eclipse.swt.layout.GridLayout; +import org.eclipse.swt.widgets.Control; +import org.eclipse.swt.widgets.Label; +import org.eclipse.swt.widgets.Shell; +import org.eclipse.swt.widgets.Text; +import org.springframework.security.core.context.SecurityContextHolder; + +/** The site-related user menu */ +public class UserMenu extends Shell implements CmsStyles { + private static final long serialVersionUID = -5788157651532106301L; + + private CmsLogin cmsLogin; + private String username = null; + + public UserMenu(CmsLogin cmsLogin, Control source) { + super(source.getDisplay(), SWT.NO_TRIM | SWT.BORDER | SWT.ON_TOP); + this.cmsLogin = cmsLogin; + + setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU); + + username = SecurityContextHolder.getContext().getAuthentication() + .getName(); + if (username.equals("anonymous")) { + username = null; + anonymousUi(); + } else { + userUi(); + } + + pack(); + layout(); + setLocation(source.toDisplay(source.getSize().x - getSize().x, + source.getSize().y)); + + addShellListener(new ShellAdapter() { + private static final long serialVersionUID = 5178980294808435833L; + + @Override + public void shellDeactivated(ShellEvent e) { + close(); + dispose(); + } + + }); + + open(); + + } + + protected void userUi() { + setLayout(new GridLayout()); + + Label l = new Label(this, SWT.NONE); + l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM); + l.setData(RWT.MARKUP_ENABLED, true); + l.setLayoutData(CmsUtils.fillWidth()); + l.setText("" + username + ""); + + final CmsSession cmsSession = (CmsSession) getDisplay().getData( + CmsSession.KEY); + l = new Label(this, SWT.NONE); + l.setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU_ITEM); + l.setText(CmsMsg.logout.lead()); + GridData lData = CmsUtils.fillWidth(); + lData.widthHint = 120; + l.setLayoutData(lData); + + l.addMouseListener(new MouseAdapter() { + private static final long serialVersionUID = 6444395812777413116L; + + public void mouseDown(MouseEvent e) { + SecurityContextHolder.getContext().setAuthentication(null); + HttpSession httpSession = RWT.getRequest().getSession(); + httpSession.removeAttribute(SPRING_SECURITY_CONTEXT_KEY); + close(); + dispose(); + cmsSession.authChange(); + } + }); + } + + protected void anonymousUi() { + Integer textWidth = 150; + setData(RWT.CUSTOM_VARIANT, CMS_USER_MENU); + setLayout(new GridLayout(2, false)); + + new Label(this, SWT.NONE).setText(CmsMsg.username.lead()); + final Text username = new Text(this, SWT.BORDER); + username.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_USERNAME); + GridData gd = CmsUtils.fillWidth(); + gd.widthHint = textWidth; + username.setLayoutData(gd); + + new Label(this, SWT.NONE).setText(CmsMsg.password.lead()); + final Text password = new Text(this, SWT.BORDER | SWT.PASSWORD); + password.setData(RWT.CUSTOM_VARIANT, CMS_LOGIN_DIALOG_PASSWORD); + gd = CmsUtils.fillWidth(); + gd.widthHint = textWidth; + password.setLayoutData(gd); + + // Listeners + TraverseListener tl = new TraverseListener() { + private static final long serialVersionUID = -1158892811534971856L; + + public void keyTraversed(TraverseEvent e) { + if (e.detail == SWT.TRAVERSE_RETURN) + login(username.getText(), password.getTextChars()); + } + }; + username.addTraverseListener(tl); + password.addTraverseListener(tl); + } + + protected void login(String username, char[] password) { + CmsSession cmsSession = (CmsSession) getDisplay().getData( + CmsSession.KEY); + cmsLogin.logInWithPassword(username, password); + close(); + dispose(); + // refreshUi(source.getParent()); + cmsSession.authChange(); + } + +} diff --git a/org.argeo.cms/src/org/argeo/cms/viewers/Section.java b/org.argeo.cms/src/org/argeo/cms/viewers/Section.java index c09b17987..af7fd877f 100644 --- a/org.argeo.cms/src/org/argeo/cms/viewers/Section.java +++ b/org.argeo.cms/src/org/argeo/cms/viewers/Section.java @@ -9,7 +9,7 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsException; import org.argeo.cms.CmsNames; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.argeo.cms.widgets.JcrComposite; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/EditableImage.java b/org.argeo.cms/src/org/argeo/cms/widgets/EditableImage.java index 00a7c2669..2e70eb89f 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/EditableImage.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/EditableImage.java @@ -5,7 +5,7 @@ import javax.jcr.RepositoryException; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.widgets.Composite; import org.eclipse.swt.widgets.Control; diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/EditableText.java b/org.argeo.cms/src/org/argeo/cms/widgets/EditableText.java index a117711fc..e7c56ea72 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/EditableText.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/EditableText.java @@ -3,7 +3,7 @@ package org.argeo.cms.widgets; import javax.jcr.Item; import javax.jcr.RepositoryException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.layout.GridData; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/JcrComposite.java b/org.argeo.cms/src/org/argeo/cms/widgets/JcrComposite.java index 7704d4092..358b45315 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/JcrComposite.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/JcrComposite.java @@ -7,7 +7,7 @@ import javax.jcr.RepositoryException; import javax.jcr.Session; import org.argeo.cms.CmsException; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.widgets.Composite; diff --git a/org.argeo.cms/src/org/argeo/cms/widgets/StyledControl.java b/org.argeo.cms/src/org/argeo/cms/widgets/StyledControl.java index 0e0fd24ae..a2c6935d2 100644 --- a/org.argeo.cms/src/org/argeo/cms/widgets/StyledControl.java +++ b/org.argeo.cms/src/org/argeo/cms/widgets/StyledControl.java @@ -5,7 +5,7 @@ import javax.jcr.RepositoryException; import org.argeo.cms.CmsConstants; import org.argeo.cms.CmsNames; -import org.argeo.cms.CmsUtils; +import org.argeo.cms.util.CmsUtils; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.widgets.Composite;