From 7798f38c1f2916d5f29d54b0c55a720d79f2c1c3 Mon Sep 17 00:00:00 2001 From: jensp Date: Wed, 19 Apr 2017 06:18:41 +0000 Subject: [PATCH] CCM NG/ccm-core: Bugfixes for handeling or wrapped ServletRequests and Multipart requests CCM NG/ccm-cms: Base form for binary assets now works git-svn-id: https://svn.libreccm.org/ccm/ccm_ng@4682 8810af33-2d31-482b-a856-94f89814c4df --- .../cms/ui/assets/forms/BinaryAssetForm.java | 7 +++-- .../main/java/org/librecms/CmsConstants.java | 2 ++ .../main/java/com/arsdigita/bebop/Page.java | 28 ++++++++++++++++--- .../java/com/arsdigita/web/BaseServlet.java | 7 +++-- .../arsdigita/web/CCMDispatcherServlet.java | 5 ++-- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BinaryAssetForm.java b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BinaryAssetForm.java index f813fd5ba..5163a3cff 100644 --- a/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BinaryAssetForm.java +++ b/ccm-cms/src/main/java/com/arsdigita/cms/ui/assets/forms/BinaryAssetForm.java @@ -20,7 +20,6 @@ package com.arsdigita.cms.ui.assets.forms; import com.arsdigita.bebop.BoxPanel; import com.arsdigita.bebop.FormProcessException; -import com.arsdigita.bebop.FormSection; import com.arsdigita.bebop.Label; import com.arsdigita.bebop.PageState; import com.arsdigita.bebop.Text; @@ -30,13 +29,14 @@ import com.arsdigita.cms.ui.FileUploadSection; import com.arsdigita.cms.ui.assets.AssetForm; import com.arsdigita.cms.ui.assets.AssetPane; import com.arsdigita.globalization.GlobalizedMessage; + import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.util.Objects; import java.util.Optional; -import javax.activation.MimeType; + import org.librecms.CmsConstants; import org.librecms.assets.BinaryAsset; import org.librecms.contentsection.Asset; @@ -95,6 +95,8 @@ public abstract class BinaryAssetForm extends AssetForm { panel.add(fileUpload); add(panel); + + setEncType(CmsConstants.FORM_ENCTYPE_MULTIPART); } @Override @@ -217,6 +219,7 @@ public abstract class BinaryAssetForm extends AssetForm { throw new FormProcessException(ex); } binaryAsset.setData(data); + binaryAsset.setFileName(fileUpload.getFileName(event)); binaryAsset.setSize(data.length); binaryAsset.setMimeType(fileUpload.getMimeType(event)); diff --git a/ccm-cms/src/main/java/org/librecms/CmsConstants.java b/ccm-cms/src/main/java/org/librecms/CmsConstants.java index 662f9a92d..2446b7c15 100644 --- a/ccm-cms/src/main/java/org/librecms/CmsConstants.java +++ b/ccm-cms/src/main/java/org/librecms/CmsConstants.java @@ -58,6 +58,8 @@ public class CmsConstants { public static final String FOLDER_BROWSER_KEY_PREFIX_ASSET = "asset-"; public static final String FOLDER_BROWSER_KEY_PREFIX_ITEM = "item-"; + public static final String FORM_ENCTYPE_MULTIPART = "multipart/form-data"; + /** * Constant string used as key for creating service package as a legacy * application. diff --git a/ccm-core/src/main/java/com/arsdigita/bebop/Page.java b/ccm-core/src/main/java/com/arsdigita/bebop/Page.java index f6f2ea14e..068fce566 100755 --- a/ccm-core/src/main/java/com/arsdigita/bebop/Page.java +++ b/ccm-core/src/main/java/com/arsdigita/bebop/Page.java @@ -49,7 +49,10 @@ import java.util.SortedMap; import java.util.TreeMap; import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletRequestWrapper; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; import javax.servlet.http.HttpServletResponse; import javax.xml.parsers.ParserConfigurationException; @@ -712,17 +715,24 @@ public class Page extends SimpleComponent implements Container { * calling generateXML on each. Does NOT do the rendering. If the HTTP * response has already been committed, does not build the XML document. * + * @param req + * @param res * @return a DOM ready for rendering, or null if the response has already * been committed. + * @throws javax.servlet.ServletException * - * @post res.isCommitted() == (return == null) */ - public Document buildDocument(HttpServletRequest req, - HttpServletResponse res) + public Document buildDocument(final HttpServletRequest req, + final HttpServletResponse res) throws ServletException { try { Document doc = new Document(); - PageState state = process(req, res); + + final ServletRequest request = unwrapRequest(req); + if (!(request instanceof HttpServletRequest)) { + throw new ServletException("Request is not a HttpServletRequest."); + } + final PageState state = process((HttpServletRequest) request, res); // only generate XML document if the response is not already // committed @@ -740,6 +750,16 @@ public class Page extends SimpleComponent implements Container { } } + private ServletRequest unwrapRequest(final HttpServletRequest request) { + + ServletRequest current = request; + while (current instanceof ServletRequestWrapper) { + current = ((ServletRequestWrapper) current).getRequest(); + } + + return current; + } + /** * Finishes building the page. The tree of components is traversed and each * component is told to add its state parameters to the page's state model. diff --git a/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java b/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java index 563cc77a6..aa27a0b17 100644 --- a/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/web/BaseServlet.java @@ -100,7 +100,7 @@ public abstract class BaseServlet extends HttpServlet { redirect(response, signal); } catch (ServletException ex) { final RedirectSignal signal = findRedirectSignal(ex); - + if (signal == null) { throw ex; } else { @@ -172,7 +172,10 @@ public abstract class BaseServlet extends HttpServlet { getServletConfig().getServletName(), getClass().getName()); - internalService(request, response); + final HttpServletRequest wrappedRequest = DispatcherHelper + .maybeWrapRequest(request); + + internalService(wrappedRequest, response); } private URL getRequestURL(final HttpServletRequest request) { diff --git a/ccm-core/src/main/java/com/arsdigita/web/CCMDispatcherServlet.java b/ccm-core/src/main/java/com/arsdigita/web/CCMDispatcherServlet.java index 2dc7ed979..643635d3f 100644 --- a/ccm-core/src/main/java/com/arsdigita/web/CCMDispatcherServlet.java +++ b/ccm-core/src/main/java/com/arsdigita/web/CCMDispatcherServlet.java @@ -19,6 +19,7 @@ package com.arsdigita.web; import com.arsdigita.dispatcher.DispatcherHelper; +import com.arsdigita.dispatcher.MultipartHttpServletRequest; import com.arsdigita.ui.UI; import com.arsdigita.util.Assert; @@ -270,9 +271,9 @@ public class CCMDispatcherServlet extends BaseServlet { LOGGER.debug("forwarding from context \"{}\" to context \"{}\"...", getServletContext(), context); - + forward(getServletContext().getRequestDispatcher(target), - request, + DispatcherHelper.restoreOriginalRequest(request), response); }