mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-14 17:58:59 +00:00
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
This commit is contained in:
@@ -591,8 +591,7 @@
|
||||
<!-- -->
|
||||
|
||||
<bean id="webscript.org.alfresco.repository.person.user-csv-upload.get"
|
||||
class="org.alfresco.repo.web.scripts.person.UserCSVUploadGet"
|
||||
parent="webscript">
|
||||
class="org.alfresco.repo.web.scripts.person.UserCSVUploadGet" parent="declarativeSpreadsheetWebScript">
|
||||
<property name="dictionaryService" ref="DictionaryService"/>
|
||||
</bean>
|
||||
|
||||
@@ -1242,7 +1241,7 @@
|
||||
<!-- Download a datalist as Excel XLS / XLSX -->
|
||||
<bean id="webscript.org.alfresco.slingshot.datalists.list.get"
|
||||
class="org.alfresco.repo.web.scripts.datalist.DataListDownloadWebScript"
|
||||
parent="webscript">
|
||||
parent="declarativeSpreadsheetWebScript">
|
||||
<property name="nodeService" ref="NodeService"/>
|
||||
<property name="siteService" ref="SiteService"/>
|
||||
<property name="namespaceService" ref="namespaceService"/>
|
||||
@@ -1827,6 +1826,9 @@
|
||||
</property>
|
||||
</bean>
|
||||
|
||||
<bean id="declarativeSpreadsheetWebScript" class="org.alfresco.repo.web.scripts.DeclarativeSpreadsheetWebScript" abstract="true" parent="webscript">
|
||||
</bean>
|
||||
|
||||
<!-- Get/Post/Put/Delete Solr FacetConfig -->
|
||||
<bean id="baseSolrFacetConfigAdminWebscript" abstract="true" parent="webscript">
|
||||
<property name="facetService" ref="solrFacetService"/>
|
||||
|
@@ -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<QName> 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<String, Object> 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<Pair<QName, Boolean>> 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);
|
||||
|
@@ -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 <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
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());
|
||||
}
|
||||
}
|
@@ -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<Pair<QName, Boolean>> buildPropertiesForHeader(Object resource, String format, WebScriptRequest req)
|
||||
{
|
||||
List<Pair<QName,Boolean>> properties =
|
||||
new ArrayList<Pair<QName,Boolean>>(DeclarativeSpreadsheetWebScriptTest.COLUMNS.length);
|
||||
boolean required = true;
|
||||
for(QName qname : DeclarativeSpreadsheetWebScriptTest.COLUMNS)
|
||||
{
|
||||
Pair<QName,Boolean> p = null;
|
||||
if(qname != null)
|
||||
{
|
||||
p = new Pair<QName, Boolean>(qname, required);
|
||||
}
|
||||
else
|
||||
{
|
||||
required = false;
|
||||
}
|
||||
properties.add(p);
|
||||
}
|
||||
return properties;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void populateBody(Object resource, Workbook workbook, Sheet sheet, List<QName> properties) throws IOException
|
||||
{
|
||||
// Set the sheet name
|
||||
workbook.setSheetName(0, "test");
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void populateBody(Object resource, CSVPrinter csv, List<QName> properties) throws IOException
|
||||
{
|
||||
}
|
||||
}
|
@@ -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,
|
||||
|
@@ -0,0 +1,14 @@
|
||||
<?xml version='1.0' encoding='UTF-8'?>
|
||||
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'>
|
||||
|
||||
<beans>
|
||||
<import resource="classpath:alfresco/application-context.xml"/>
|
||||
<import resource="classpath:alfresco/web-scripts-application-context.xml"/>
|
||||
|
||||
<bean id="webscript.org.alfresco.repository.test.declarativeSpreadsheetWebScript.get"
|
||||
class="org.alfresco.repo.web.scripts.TestDeclarativeSpreadsheetWebScriptGet"
|
||||
parent="declarativeSpreadsheetWebScript">
|
||||
<property name="dictionaryService" ref="DictionaryService"/>
|
||||
</bean>
|
||||
|
||||
</beans>
|
@@ -0,0 +1 @@
|
||||
${csv}
|
@@ -0,0 +1,8 @@
|
||||
<webscript>
|
||||
<shortname>Declarative Spreadsheet Webscript Test</shortname>
|
||||
<description>Declarative Spreadsheet Webscript Test</description>
|
||||
<url>/api/test/getcsv</url>
|
||||
<format default="csv">argument</format>
|
||||
<authentication>admin</authentication>
|
||||
<transaction allow="readonly">required</transaction>
|
||||
</webscript>
|
Reference in New Issue
Block a user