From b89434674c0637eeaa87c983824b26f7cd328f22 Mon Sep 17 00:00:00 2001 From: Ariel Backenroth Date: Tue, 12 Dec 2006 09:51:27 +0000 Subject: [PATCH] using iframe to manage upload of schemas - allows for calling an action listener once the upload is complete to validate the schema and present an error message inside the form in a pretty way. added a small helper library for managing uploads without using a page reload. modified uploadfileservlet to return a javascript snippet in the response body if the return-page parameter starts with javascript: git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@4578 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../web/app/servlet/UploadFileServlet.java | 50 ++++++++++++------- .../web/bean/wcm/CreateFormWizard.java | 22 +++++++- .../common/renderer/ActionLinkRenderer.java | 42 +++++++++------- .../jsp/wcm/create-form-wizard/details.jsp | 46 +++++++++++------ source/web/scripts/upload_helper.js | 50 +++++++++++++++++++ 5 files changed, 159 insertions(+), 51 deletions(-) create mode 100644 source/web/scripts/upload_helper.js diff --git a/source/java/org/alfresco/web/app/servlet/UploadFileServlet.java b/source/java/org/alfresco/web/app/servlet/UploadFileServlet.java index 51cc5487ac..0e78caa932 100644 --- a/source/java/org/alfresco/web/app/servlet/UploadFileServlet.java +++ b/source/java/org/alfresco/web/app/servlet/UploadFileServlet.java @@ -18,6 +18,7 @@ package org.alfresco.web.app.servlet; import java.io.File; import java.io.IOException; +import java.io.PrintWriter; import java.util.Iterator; import java.util.List; @@ -47,7 +48,7 @@ import org.apache.commons.logging.LogFactory; public class UploadFileServlet extends BaseServlet { private static final long serialVersionUID = -5482538466491052873L; - private static Log logger = LogFactory.getLog(UploadFileServlet.class); + private static final Log logger = LogFactory.getLog(UploadFileServlet.class); /** * @see javax.servlet.http.HttpServlet#service(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) @@ -68,7 +69,7 @@ public class UploadFileServlet extends BaseServlet return; } - if (isMultipart == false) + if (!isMultipart) { throw new AlfrescoRuntimeException("This servlet can only be used to handle file upload requests, make" + "sure you have set the enctype attribute on your form to multipart/form-data"); @@ -85,11 +86,9 @@ public class UploadFileServlet extends BaseServlet List fileItems = upload.parseRequest(request); - Iterator iter = fileItems.iterator(); FileUploadBean bean = new FileUploadBean(); - while(iter.hasNext()) + for (FileItem item : fileItems) { - FileItem item = iter.next(); if(item.isFormField()) { if (item.getFieldName().equalsIgnoreCase("return-page")) @@ -106,15 +105,13 @@ public class UploadFileServlet extends BaseServlet String filename = item.getName(); if (filename != null && filename.length() != 0) { - if (logger.isDebugEnabled() == true) + if (logger.isDebugEnabled()) { logger.debug("Processing uploaded file: " + filename); } - // workaround a bug in IE where the full path is returned // IE is only available for Windows so only check for the Windows path separator int idx = filename.lastIndexOf('\\'); - if (idx == -1) { // if there is no windows path separator check for *nix @@ -131,8 +128,7 @@ public class UploadFileServlet extends BaseServlet bean.setFile(tempFile); bean.setFileName(filename); bean.setFilePath(tempFile.getAbsolutePath()); - session.setAttribute(FileUploadBean.getKey(uploadId), bean); - if (logger.isDebugEnabled() == true) + if (logger.isDebugEnabled()) { logger.debug("Temp file: " + tempFile.getAbsolutePath() + " created from upload filename: " + filename); @@ -140,19 +136,39 @@ public class UploadFileServlet extends BaseServlet } } } - + + session.setAttribute(FileUploadBean.getKey(uploadId), bean); + if (returnPage == null || returnPage.length() == 0) { throw new AlfrescoRuntimeException("return-page parameter has not been supplied"); } - - // finally redirect - if (logger.isDebugEnabled() == true) + + if (returnPage.startsWith("javascript:")) { - logger.debug("Upload servicing complete, redirecting to: " + returnPage); - } + returnPage = returnPage.substring("javascript:".length()); + // finally redirect + if (logger.isDebugEnabled()) + { + logger.debug("Sending back javascript response " + returnPage); + } - response.sendRedirect(returnPage); + final PrintWriter out = response.getWriter(); + out.println(""); + out.close(); + } + else + { + // finally redirect + if (logger.isDebugEnabled()) + { + logger.debug("Upload servicing complete, redirecting to: " + returnPage); + } + + response.sendRedirect(returnPage); + } } catch (Throwable error) { diff --git a/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java b/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java index c832297c94..65bf2b9568 100644 --- a/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java +++ b/source/java/org/alfresco/web/bean/wcm/CreateFormWizard.java @@ -465,7 +465,7 @@ public class CreateFormWizard // refresh the current page return null; } - + /** * Action handler called when the user wishes to remove an uploaded file */ @@ -488,6 +488,25 @@ public class CreateFormWizard return null; } + public String validateSchema() + { + if (this.getSchemaFile() != null) + { + final FormsService ts = FormsService.getInstance(); + try + { + final Document d = ts.parseXML(this.getSchemaFile()); + final XSModel xsm = SchemaUtil.loadSchema(d); + } + catch (Exception e) + { + final String msg = "unable to parse " + this.getSchemaFileName(); + this.removeUploadedSchemaFile(); + Utils.addErrorMessage(msg, e); + } + } + return null; + } // ------------------------------------------------------------------------------ // Bean Getters and Setters @@ -693,7 +712,6 @@ public class CreateFormWizard final String msg = "unable to parse " + this.getSchemaFileName(); this.removeUploadedSchemaFile(); Utils.addErrorMessage(msg, e); - throw new AlfrescoRuntimeException(msg, e); } } return result; diff --git a/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java b/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java index 78b0f0b863..432222a9a3 100644 --- a/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java +++ b/source/java/org/alfresco/web/ui/common/renderer/ActionLinkRenderer.java @@ -75,29 +75,29 @@ public class ActionLinkRenderer extends BaseRenderer public void encodeEnd(FacesContext context, UIComponent component) throws IOException { // always check for this flag - as per the spec - if (component.isRendered() == true) + if (!component.isRendered()) { - Writer out = context.getResponseWriter(); + return; + } + Writer out = context.getResponseWriter(); + UIActionLink link = (UIActionLink)component; - UIActionLink link = (UIActionLink)component; - - UIComponent verticalContiner = getVerticalContainer(link); - if (verticalContiner != null) - { - int padding = link.getPadding(); + UIComponent verticalContiner = getVerticalContainer(link); + if (verticalContiner != null) + { + int padding = link.getPadding(); - if (verticalContiner instanceof UIActions) - { - padding = ((UIActions)verticalContiner).getVerticalSpacing(); - } - // render as menu item style action link - out.write( renderMenuAction(context, link, padding) ); - } - else + if (verticalContiner instanceof UIActions) { - // render as action link - out.write( renderActionLink(context, link) ); + padding = ((UIActions)verticalContiner).getVerticalSpacing(); } + // render as menu item style action link + out.write( renderMenuAction(context, link, padding) ); + } + else + { + // render as action link + out.write( renderActionLink(context, link) ); } } @@ -190,6 +190,12 @@ public class ActionLinkRenderer extends BaseRenderer } } + if (attrs.get("id") != null) + { + linkBuf.append(" id=\"") + .append(attrs.get("id")) + .append("\""); + } if (attrs.get("style") != null) { linkBuf.append(" style=\"") diff --git a/source/web/jsp/wcm/create-form-wizard/details.jsp b/source/web/jsp/wcm/create-form-wizard/details.jsp index f48ab2472e..cc1e5f1e2e 100644 --- a/source/web/jsp/wcm/create-form-wizard/details.jsp +++ b/source/web/jsp/wcm/create-form-wizard/details.jsp @@ -19,8 +19,13 @@ <%@ taglib uri="/WEB-INF/alfresco.tld" prefix="a" %> <%@ taglib uri="/WEB-INF/repo.tld" prefix="r" %> <%@ page import="org.alfresco.web.bean.FileUploadBean" %> +<%@ page import="org.alfresco.web.bean.wcm.CreateFormWizard" %> - + @@ -75,15 +85,23 @@ <% FileUploadBean upload = (FileUploadBean) - session.getAttribute(FileUploadBean.getKey("schema")); + session.getAttribute(FileUploadBean.getKey(CreateFormWizard.FILE_SCHEMA)); if (upload == null || upload.getFile() == null) { %> - - - + +