From fc1a9c75ad89ac144df0696cfb83bffbbb9b114d Mon Sep 17 00:00:00 2001 From: Alan Davis Date: Sat, 31 Jan 2015 11:08:31 +0000 Subject: [PATCH] Merged HEAD-BUG-FIX (5.1/Cloud) to HEAD (5.1/Cloud) 90946: Merged V4.2-BUG-FIX (4.2.5) to HEAD-BUG-FIX (5.0/Cloud) 90874: Merged DEV (4.2.4) to V4.2-BUG-FIX (4.2.5) 90590: MNT-12281 : Cannot set CSV delimiter in DeclarativeSpreadsheetWebScript Added CSV delimiter as a request parameter to the DeclarativeSpreadsheetWebScript implementations Added JUnit test. git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@94749 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261 --- .../web-scripts-application-context.xml | 10 ++- .../DeclarativeSpreadsheetWebScript.java | 41 ++++++++- .../DeclarativeSpreadsheetWebScriptTest.java | 86 +++++++++++++++++++ ...estDeclarativeSpreadsheetWebScriptGet.java | 66 ++++++++++++++ .../repo/web/scripts/WebScriptTestSuite.java | 1 + ...eadsheet-webscript-application-context.xml | 14 +++ ...eclarativeSpreadsheetWebScript.get.csv.ftl | 1 + ...clarativeSpreadsheetWebScript.get.desc.xml | 8 ++ 8 files changed, 220 insertions(+), 7 deletions(-) create mode 100644 source/test-java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScriptTest.java create mode 100644 source/test-java/org/alfresco/repo/web/scripts/TestDeclarativeSpreadsheetWebScriptGet.java create mode 100644 source/test-resources/alfresco/declarative-spreadsheet-webscript-application-context.xml create mode 100644 source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.csv.ftl create mode 100644 source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.desc.xml diff --git a/config/alfresco/web-scripts-application-context.xml b/config/alfresco/web-scripts-application-context.xml index 2a0d2e296f..702c668db6 100644 --- a/config/alfresco/web-scripts-application-context.xml +++ b/config/alfresco/web-scripts-application-context.xml @@ -591,8 +591,7 @@ + class="org.alfresco.repo.web.scripts.person.UserCSVUploadGet" parent="declarativeSpreadsheetWebScript"> @@ -1242,7 +1241,7 @@ + parent="declarativeSpreadsheetWebScript"> @@ -1826,7 +1825,10 @@ - + + + + diff --git a/source/java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScript.java b/source/java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScript.java index af43d3a78b..181a73179f 100644 --- a/source/java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScript.java +++ b/source/java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScript.java @@ -1,5 +1,5 @@ /* - * Copyright (C) 2005-2010 Alfresco Software Limited. + * Copyright (C) 2005-2014 Alfresco Software Limited. * * This file is part of Alfresco * @@ -63,6 +63,9 @@ public abstract class DeclarativeSpreadsheetWebScript extends DeclarativeWebScri { public static final String MODEL_CSV = "csv"; public static final String MODEL_EXCEL = "excel"; + public static final String PARAM_REQ_DELIMITER = "delimiter"; + + private CSVStrategy csvStrategy; protected DictionaryService dictionaryService; protected String filenameBase; @@ -108,6 +111,33 @@ public abstract class DeclarativeSpreadsheetWebScript extends DeclarativeWebScri protected abstract void populateBody(Object resource, CSVPrinter csv, List properties) throws IOException; + /** + * Set the CSVStrategy + * + * @param strategy + */ + public void setCsvStrategy(CSVStrategy csvStrategy) + { + this.csvStrategy = csvStrategy; + } + + /** + * Get the CSVStrategy. Returns {@link CSVStrategy#EXCEL_STRATEGY} if none was set. + * + * @return CSVStrategy + */ + public CSVStrategy getCsvStrategy() + { + if (csvStrategy == null) + { + return CSVStrategy.EXCEL_STRATEGY; + } + else + { + return csvStrategy; + } + } + /** * @see org.alfresco.web.scripts.DeclarativeWebScript#executeImpl(org.alfresco.web.scripts.WebScriptRequest, org.alfresco.web.scripts.Status) */ @@ -158,7 +188,12 @@ public abstract class DeclarativeSpreadsheetWebScript extends DeclarativeWebScri Status status, Map model) throws IOException { Pattern qnameMunger = Pattern.compile("([A-Z][a-z]+)([A-Z].*)"); - + String delimiterParam = req.getParameter(PARAM_REQ_DELIMITER); + CSVStrategy reqCSVstrategy = null; + if (delimiterParam != null && !delimiterParam.isEmpty()) + { + reqCSVstrategy = new CSVStrategy(delimiterParam.charAt(0), '"', CSVStrategy.COMMENTS_DISABLED); + } // Build up the details of the header List> propertyDetails = buildPropertiesForHeader(resource, format, req); String[] headings = new String[propertyDetails.size()]; @@ -222,7 +257,7 @@ public abstract class DeclarativeSpreadsheetWebScript extends DeclarativeWebScri if("csv".equals(format)) { StringWriter sw = new StringWriter(); - CSVPrinter csv = new CSVPrinter(sw, CSVStrategy.EXCEL_STRATEGY); + CSVPrinter csv = new CSVPrinter(sw, reqCSVstrategy != null ? reqCSVstrategy : getCsvStrategy()); csv.println(headings); populateBody(resource, csv, properties); diff --git a/source/test-java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScriptTest.java b/source/test-java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScriptTest.java new file mode 100644 index 0000000000..f03d1c16a9 --- /dev/null +++ b/source/test-java/org/alfresco/repo/web/scripts/DeclarativeSpreadsheetWebScriptTest.java @@ -0,0 +1,86 @@ +/* + * Copyright (C) 2005-2014 Alfresco Software Limited. + * + * This file is part of Alfresco + * + * Alfresco is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * Alfresco is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with Alfresco. If not, see . + */ +package org.alfresco.repo.web.scripts; + +import org.alfresco.model.ContentModel; +import org.alfresco.repo.security.authentication.AuthenticationUtil; +import org.alfresco.service.namespace.QName; +import org.springframework.extensions.webscripts.Status; +import org.springframework.extensions.webscripts.TestWebScriptServer; +import org.springframework.extensions.webscripts.TestWebScriptServer.Response; + +/** + * Test for DeclarativeSpreadsheetWebScript class + * + * @author alex.mukha + * @since 4.2.4 + */ +public class DeclarativeSpreadsheetWebScriptTest extends BaseWebScriptTest +{ + private String admin; + private static String URL = "/api/test/getcsv"; + protected static final QName[] COLUMNS = new QName[] + { + ContentModel.PROP_USERNAME, + ContentModel.PROP_FIRSTNAME, + ContentModel.PROP_LASTNAME + }; + + /** The context locations, in reverse priority order. */ + private static final String CONFIG_LOCATION = "classpath:alfresco/declarative-spreadsheet-webscript-application-context.xml"; + + @Override + protected void setUp() throws Exception + { + super.setCustomContext(CONFIG_LOCATION); + super.setUp(); + getServer().getApplicationContext(); + admin = AuthenticationUtil.getAdminUserName(); + AuthenticationUtil.setFullyAuthenticatedUser(admin); + } + + @Override + protected void tearDown() throws Exception + { + AuthenticationUtil.clearCurrentSecurityContext(); + }; + + public void testCSVStrategy() throws Exception + { + TestWebScriptServer.GetRequest req = new TestWebScriptServer.GetRequest(URL); + Response response = sendRequest(req, Status.STATUS_OK, admin); + // default excel, delimiter is a comma "," + assertEquals("The response CSV body was not correct.", "User Name,First Name,Last Name\n", response.getContentAsString()); + + req = new TestWebScriptServer.GetRequest(URL + "?" + DeclarativeSpreadsheetWebScript.PARAM_REQ_DELIMITER + "=%2C"); + response = sendRequest(req, Status.STATUS_OK, admin); + // delimiter is a comma "," + assertEquals("The response CSV body was not correct.", "User Name,First Name,Last Name\n", response.getContentAsString()); + + req = new TestWebScriptServer.GetRequest(URL + "?" + DeclarativeSpreadsheetWebScript.PARAM_REQ_DELIMITER + "=%09"); + response = sendRequest(req, Status.STATUS_OK, admin); + // delimiter is a tab space "\t" + assertEquals("The response CSV body was not correct.", "User Name\tFirst Name\tLast Name\n", response.getContentAsString()); + + req = new TestWebScriptServer.GetRequest(URL + "?" + DeclarativeSpreadsheetWebScript.PARAM_REQ_DELIMITER + "=%3B"); + response = sendRequest(req, Status.STATUS_OK, admin); + // delimiter is a semicolon ";" + assertEquals("The response CSV body was not correct.", "User Name;First Name;Last Name\n", response.getContentAsString()); + } +} diff --git a/source/test-java/org/alfresco/repo/web/scripts/TestDeclarativeSpreadsheetWebScriptGet.java b/source/test-java/org/alfresco/repo/web/scripts/TestDeclarativeSpreadsheetWebScriptGet.java new file mode 100644 index 0000000000..fd4ca4cc5e --- /dev/null +++ b/source/test-java/org/alfresco/repo/web/scripts/TestDeclarativeSpreadsheetWebScriptGet.java @@ -0,0 +1,66 @@ +package org.alfresco.repo.web.scripts; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import org.alfresco.service.namespace.QName; +import org.alfresco.util.Pair; +import org.apache.commons.csv.CSVPrinter; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.springframework.extensions.webscripts.WebScriptRequest; + +/** + * Test class for DeclarativeSpreadsheetWebScriptTest class + * @author alex.mukha + * @since 4.2.4 + */ +public class TestDeclarativeSpreadsheetWebScriptGet extends DeclarativeSpreadsheetWebScript +{ + @Override + protected Object identifyResource(String format, WebScriptRequest req) + { + return null; + } + + @Override + protected boolean allowHtmlFallback() + { + return false; + } + + @Override + protected List> buildPropertiesForHeader(Object resource, String format, WebScriptRequest req) + { + List> properties = + new ArrayList>(DeclarativeSpreadsheetWebScriptTest.COLUMNS.length); + boolean required = true; + for(QName qname : DeclarativeSpreadsheetWebScriptTest.COLUMNS) + { + Pair p = null; + if(qname != null) + { + p = new Pair(qname, required); + } + else + { + required = false; + } + properties.add(p); + } + return properties; + } + + @Override + protected void populateBody(Object resource, Workbook workbook, Sheet sheet, List properties) throws IOException + { + // Set the sheet name + workbook.setSheetName(0, "test"); + } + + @Override + protected void populateBody(Object resource, CSVPrinter csv, List properties) throws IOException + { + } +} \ No newline at end of file diff --git a/source/test-java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java b/source/test-java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java index 3da0e0b94b..6121c1f28f 100644 --- a/source/test-java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java +++ b/source/test-java/org/alfresco/repo/web/scripts/WebScriptTestSuite.java @@ -101,6 +101,7 @@ public class WebScriptTestSuite extends TestSuite suite.addTestSuite( FacetRestApiTest.class ); suite.addTestSuite( CommentsApiTest.class ); suite.addTestSuite( FolderTemplateTest.class ); + suite.addTestSuite( DeclarativeSpreadsheetWebScriptTest.class ); // This uses a slightly different context // As such, we can't run it in the same suite as the others, diff --git a/source/test-resources/alfresco/declarative-spreadsheet-webscript-application-context.xml b/source/test-resources/alfresco/declarative-spreadsheet-webscript-application-context.xml new file mode 100644 index 0000000000..6a29c07b85 --- /dev/null +++ b/source/test-resources/alfresco/declarative-spreadsheet-webscript-application-context.xml @@ -0,0 +1,14 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.csv.ftl b/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.csv.ftl new file mode 100644 index 0000000000..e823644fbf --- /dev/null +++ b/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.csv.ftl @@ -0,0 +1 @@ +${csv} \ No newline at end of file diff --git a/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.desc.xml b/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.desc.xml new file mode 100644 index 0000000000..e92ef6e3d4 --- /dev/null +++ b/source/test-resources/alfresco/templates/webscripts/org/alfresco/repository/test/declarativeSpreadsheetWebScript.get.desc.xml @@ -0,0 +1,8 @@ + + Declarative Spreadsheet Webscript Test + Declarative Spreadsheet Webscript Test + /api/test/getcsv + argument + admin + required +