From 623a35d1a39522cf8b6a1d6c860ac60a2646f03d Mon Sep 17 00:00:00 2001 From: Mathieu Baudier Date: Sat, 23 Jan 2021 10:43:00 +0100 Subject: [PATCH] Make CMS image framework more extensible. --- .../src/org/argeo/cms/ui/CmsImageManager.java | 2 +- .../argeo/cms/ui/forms/FormPageViewer.java | 2 +- .../ui/internal/JcrFileUploadReceiver.java | 16 +++++----- .../cms/ui/util/DefaultImageManager.java | 30 +++++-------------- .../src/org/argeo/cms/ui/widgets/Img.java | 19 ++++++++++-- org.argeo.jcr/src/org/argeo/jcr/Jcr.java | 12 ++++++++ 6 files changed, 44 insertions(+), 37 deletions(-) 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 index b0995c74c..9ac58fac2 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsImageManager.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/CmsImageManager.java @@ -44,5 +44,5 @@ public interface CmsImageManager { public Image getSwtImage(Node node) throws RepositoryException; /** @return URL */ - public String uploadImage(Node parentNode, String fileName, InputStream in, String contentType) throws RepositoryException; + public String uploadImage(Node context,Node uploadFolder, String fileName, InputStream in, String contentType) throws RepositoryException; } diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java index 1ae4bb004..981f6efc5 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/forms/FormPageViewer.java @@ -449,7 +449,7 @@ public class FormPageViewer extends AbstractPageViewer { cleanedName = System.currentTimeMillis() % 100000 + "_" + cleanedName; try { - imageManager().uploadImage(context, cleanedName, stream, details.getContentType()); + imageManager().uploadImage(context, context, cleanedName, stream, details.getContentType()); // TODO clean refresh strategy section.getDisplay().asyncExec(new Runnable() { @Override diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java index 8edfb3e00..c2399968b 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/internal/JcrFileUploadReceiver.java @@ -11,20 +11,23 @@ import javax.jcr.RepositoryException; import javax.jcr.nodetype.NodeType; import org.apache.commons.io.FilenameUtils; -import org.argeo.cms.CmsException; import org.argeo.cms.ui.CmsImageManager; +import org.argeo.cms.ui.widgets.Img; +import org.argeo.jcr.JcrException; import org.argeo.jcr.JcrUtils; import org.eclipse.rap.fileupload.FileDetails; import org.eclipse.rap.fileupload.FileUploadReceiver; public class JcrFileUploadReceiver extends FileUploadReceiver { + private Img img; private final Node parentNode; private final String nodeName; private final CmsImageManager imageManager; /** If nodeName is null, use the uploaded file name */ - public JcrFileUploadReceiver(Node parentNode, String nodeName, CmsImageManager imageManager) { + public JcrFileUploadReceiver(Img img, Node parentNode, String nodeName, CmsImageManager imageManager) { super(); + this.img = img; this.parentNode = parentNode; this.nodeName = nodeName; this.imageManager = imageManager; @@ -36,13 +39,8 @@ public class JcrFileUploadReceiver extends FileUploadReceiver { String fileName = nodeName != null ? nodeName : details.getFileName(); String contentType = details.getContentType(); if (isImage(details.getFileName(), contentType)) { - imageManager.uploadImage(parentNode, fileName, stream, contentType); + imageManager.uploadImage(img.getNode(),parentNode, fileName, stream, contentType); return; - // InputStream inputStream = new ByteArrayInputStream(arr); - // ImageData id = new ImageData(inputStream); - // fileNode.addMixin(CmsTypes.CMS_IMAGE); - // fileNode.setProperty(CMS_IMAGE_WIDTH, id.width); - // fileNode.setProperty(CMS_IMAGE_HEIGHT, id.height); } Node fileNode; @@ -60,7 +58,7 @@ public class JcrFileUploadReceiver extends FileUploadReceiver { processNewFile(fileNode); fileNode.getSession().save(); } catch (RepositoryException e) { - throw new CmsException("cannot receive " + details, e); + throw new JcrException("Cannot receive " + details, e); } } diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java index 4c1a73108..477d65be7 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/util/DefaultImageManager.java @@ -152,24 +152,6 @@ public class DefaultImageManager implements CmsImageManager { @Override public String getImageUrl(Node node) throws RepositoryException { return CmsUiUtils.getDataPath(node); - // String name = getResourceName(node); - // ResourceManager resourceManager = RWT.getResourceManager(); - // if (!resourceManager.isRegistered(name)) { - // InputStream inputStream = null; - // Binary binary = getImageBinary(node); - // if (binary == null) - // return null; - // try { - // inputStream = binary.getStream(); - // resourceManager.register(name, inputStream); - // } finally { - // IOUtils.closeQuietly(inputStream); - // JcrUtils.closeQuietly(binary); - // } - // if (log.isTraceEnabled()) - // log.trace("Registered image " + name); - // } - // return resourceManager.getLocation(name); } protected String getResourceName(Node node) throws RepositoryException { @@ -203,7 +185,7 @@ public class DefaultImageManager implements CmsImageManager { } @Override - public String uploadImage(Node parentNode, String fileName, InputStream in, String contentType) + public String uploadImage(Node context, Node parentNode, String fileName, InputStream in, String contentType) throws RepositoryException { InputStream inputStream = null; try { @@ -221,11 +203,12 @@ public class DefaultImageManager implements CmsImageManager { Node fileNode = JcrUtils.copyBytesAsFile(parentNode, fileName, arr); inputStream = new ByteArrayInputStream(arr); ImageData id = new ImageData(inputStream); - processNewImageFile(fileNode, id); + processNewImageFile(context, fileNode, id); String mime = contentType != null ? contentType : Files.probeContentType(Paths.get(fileName)); - if (mime != null) - fileNode.setProperty(Property.JCR_MIMETYPE, mime); + if (mime != null) { + fileNode.getNode(JCR_CONTENT).setProperty(Property.JCR_MIMETYPE, mime); + } fileNode.getSession().save(); // reset resource manager @@ -244,6 +227,7 @@ public class DefaultImageManager implements CmsImageManager { } /** Does nothing by default. */ - protected void processNewImageFile(Node fileNode, ImageData id) throws RepositoryException, IOException { + protected void processNewImageFile(Node context, Node fileNode, ImageData id) + throws RepositoryException, IOException { } } diff --git a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java index 258aa9f49..fb1091a02 100644 --- a/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java +++ b/org.argeo.cms.ui/src/org/argeo/cms/ui/widgets/Img.java @@ -10,6 +10,7 @@ import org.argeo.cms.ui.util.CmsUiUtils; import org.argeo.cms.ui.viewers.NodePart; import org.argeo.cms.ui.viewers.Section; import org.argeo.cms.ui.viewers.SectionPart; +import org.argeo.jcr.Jcr; import org.argeo.jcr.JcrException; import org.eclipse.rap.fileupload.FileUploadHandler; import org.eclipse.rap.fileupload.FileUploadListener; @@ -87,10 +88,22 @@ public class Img extends EditableImage implements SectionPart, NodePart { } } - protected Control createImageChooser(Composite box, String style) throws RepositoryException { + protected Node getUploadFolder() { + return Jcr.getParent(getNode()); + } + + protected String getUploadName() { Node node = getNode(); - JcrFileUploadReceiver receiver = new JcrFileUploadReceiver(node.getParent(), - node.getName() + '[' + node.getIndex() + ']', imageManager); + return Jcr.getName(node) + '[' + Jcr.getIndex(node) + ']'; + } + + protected CmsImageManager getImageManager() { + return imageManager; + } + + protected Control createImageChooser(Composite box, String style) throws RepositoryException { + JcrFileUploadReceiver receiver = new JcrFileUploadReceiver(this, getUploadFolder(), getUploadName(), + imageManager); if (currentUploadHandler != null) currentUploadHandler.dispose(); currentUploadHandler = prepareUpload(receiver); diff --git a/org.argeo.jcr/src/org/argeo/jcr/Jcr.java b/org.argeo.jcr/src/org/argeo/jcr/Jcr.java index c447a1732..974ee02df 100644 --- a/org.argeo.jcr/src/org/argeo/jcr/Jcr.java +++ b/org.argeo.jcr/src/org/argeo/jcr/Jcr.java @@ -203,6 +203,18 @@ public class Jcr { } } + /** + * @see Node#getIndex() + * @throws JcrException caused by {@link RepositoryException} + */ + public static int getIndex(Node node) { + try { + return node.getIndex(); + } catch (RepositoryException e) { + throw new JcrException("Cannot get index of " + node, e); + } + } + /** * If node has mixin {@link NodeType#MIX_TITLE}, return * {@link Property#JCR_TITLE}, otherwise return {@link #getName(Node)}. -- 2.30.2