mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
Merged BRANCHES/DEV/V4.1-BUG-FIX to HEAD
45144: Fix for ALF-16790 - upload ignores additional aspects for updateNodes 45174: Merged V4.1-BUG-FIX-2012_11_22 to V4.1-BUG-FIX 43940: ALF-15209: Add Dashlet to User or Site Dashboard not working when IE8 is operating in Compatibility Mode. Fix check p_el.attributes["id"] to avoid errors for "IE8 compatibility mode 45175: Fix for ALF-17260 - Tags list not updated after moving/copying an high number of nodes with taggable aspect but no tags 45188: ALF-16254 ("Leave Site" behaviour for group based site membership) 45204: Fix for ALF-17335 - OnCreateNodePolicy not fired when custom type is used in the Share flash upload 45218: ALF-17248 BaseAssociationEditor.java does not return any results when the query filter consists of "firstname + lastname" 45221: Merged V4.1.3 (4.1.3) to V4.1-BUG-FIX (4.1.4) RECORD ONLY 45220: Merged: V4.1-BUG-FIX (4.1.4) to V4.1.3 (4.1.3) 44054: Fix for ALF-16337. Datalist assignee not searchable by full name. 45218: ALF-17248 BaseAssociationEditor.java does not return any results when the query filter consists of "firstname + lastname" 45245: ALF-17089 (Displaying Url Name instead of site Name in Select form) 45257: ALF-17318 Unnecessary Canned Query in .getPeople(String,...) on startup. - Just one extra query on each run of the FeedNotifier was being made at the end. The sequence of queries are necessary. 45336: Merged DEV to V4.1-BUG-FIX (4.1.4) 45318: ALF-14086: CLONE - Sort order of folders including hyphens ( - ) are different in folder-tree and view on folders (in Share) Sort groups and users on the Java server side using collators. - Deprecated a few methods not deprecated in DEV and removed one which had just been added to 4.1.4 45362: Merged V3.4-BUG-FIX (3.4.13) to V4.1-BUG-FIX <<RECORD ONLY>> 45361: Merged V3.4 (3.4.12) to V3.4-BUG-FIX (3.4.13) 45360: ALF-17431: Merged V4.1 (4.1.2) to V3.4 (3.4.12) 43622: ALF-16757: Sharepoint doesn't work correct with SSO - Fix by Pavel 45385: Merged V4.1.3 (4.1.3) to V4.1-BUG-FIX (4.1.4) 45384: ALF-17097 60k Site Performance: Admin Console | Groups | Browse Groups (include sys groups): Results isn't appeared. - Error in authorities comparator causing test failure of ALF 14086 in 4.1.4 only. 4.1.3 was okay as ALF 14086 now uses the change made for ALF-17097 but only in 4.1.4 45452: Corrected config check for ALF-16413 - Share asks for Basic-Auth while not needed trying to access RSS feeds (thus breaking SSO). 45467: Fix for ALF-17509 - patches the FreeMarker built-in ?js_string to correctly encode the "/" character. 45468: ALF-17492 - WebScript errors must contain useful information - SpringSurf libs 1217 provide additional INFO log information on the HTTP method, URL+params that caused the exception. 45475: Fix for ALF-17510 - Upgrade of htmlparser from 1.6 to 2.1 45566: Fixed ALF-17530 - Refactored "successCallback" & "successScope" parameters for multipart uploads to be simply "success" (same for failure) 45574: Fixed ALF-17528 - Asserting that request is made using application/json 45662: Merged HEAD to BRANCHES/DEV/V4.1-BUG-FIX: 45660: Fixes: ALF-17539 - The server was failing to parse the date. It shouldn't have been trying to parse it at all. 45849: Merged HEAD to BRANCHES/DEV/V4.1-BUG-FIX: 45824: Fixes: ALF-13676: Event edit times are now presented using the date-format.shortTime setting & may be entered in either 24h or 12hr formats. 45876: ALF-17642: Fix broken HtmlParserContentTransformerTest after upgrade of htmlparser to 2.1 - Since the upgrade slightly changed the behaviour of the transformer, I added some explanatory comments to the test and to the transformer class. 45927: Fix for ALF-17302 DocLib sort is determined by server locale rather than browser locale - GetChildrenCannedQuery was not using locale based collation 46014: Fix for ALF-17732 - SWF files are considered insecure content and should not be displayed directly in the browser. 46160: Fix for ALF-17759 - HTML files are stripped from metadata and style information after they are uploaded. 46186: Fix for ALF-17786 - Site dashboard page issues too many requests (Site Members dashlet issues avatar requests when it doesn't need too) git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@46287 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -1,6 +1,7 @@
|
|||||||
package org.alfresco.repo.activities.feed;
|
package org.alfresco.repo.activities.feed;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
@@ -335,6 +336,7 @@ public class FeedNotifierImpl implements FeedNotifier, ApplicationContextAware
|
|||||||
{
|
{
|
||||||
private int skip = 0;
|
private int skip = 0;
|
||||||
private int maxItems = batchSize;
|
private int maxItems = batchSize;
|
||||||
|
private boolean hasMore = true;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getTotalEstimatedWorkSize()
|
public int getTotalEstimatedWorkSize()
|
||||||
@@ -345,8 +347,13 @@ public class FeedNotifierImpl implements FeedNotifier, ApplicationContextAware
|
|||||||
@Override
|
@Override
|
||||||
public Collection<PersonInfo> getNextWork()
|
public Collection<PersonInfo> getNextWork()
|
||||||
{
|
{
|
||||||
|
if (!hasMore)
|
||||||
|
{
|
||||||
|
return Collections.emptyList();
|
||||||
|
}
|
||||||
PagingResults<PersonInfo> people = personService.getPeople(null, true, null, new PagingRequest(skip, maxItems));
|
PagingResults<PersonInfo> people = personService.getPeople(null, true, null, new PagingRequest(skip, maxItems));
|
||||||
skip += maxItems;
|
skip += maxItems;
|
||||||
|
hasMore = people.hasMoreItems();
|
||||||
return people.getPage();
|
return people.getPage();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@@ -33,12 +33,25 @@ import org.htmlparser.beans.StringBean;
|
|||||||
import org.htmlparser.util.ParserException;
|
import org.htmlparser.util.ParserException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see http://htmlparser.sourceforge.net/
|
* Content transformer which wraps the HTML Parser library for
|
||||||
* @see org.htmlparser.beans.StringBean
|
* parsing HTML content.
|
||||||
*
|
*
|
||||||
* Tika Note - could be convered to use the Tika HTML parser,
|
* <p>
|
||||||
|
* Since HTML Parser was updated from v1.6 to v2.1, META tags
|
||||||
|
* defining an encoding for the content via http-equiv=Content-Type
|
||||||
|
* will ONLY be respected if the encoding of the content item
|
||||||
|
* itself is set to ISO-8859-1.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* <p>
|
||||||
|
* Tika Note - could be converted to use the Tika HTML parser,
|
||||||
* but we'd potentially need a custom text handler to replicate
|
* but we'd potentially need a custom text handler to replicate
|
||||||
* the current settings around links and non-breaking spaces.
|
* the current settings around links and non-breaking spaces.
|
||||||
|
* </p>
|
||||||
|
*
|
||||||
|
* @see http://htmlparser.sourceforge.net/
|
||||||
|
* @see org.htmlparser.beans.StringBean
|
||||||
|
* @see http://sourceforge.net/tracker/?func=detail&aid=1644504&group_id=24399&atid=381401
|
||||||
*
|
*
|
||||||
* @author Derek Hulley
|
* @author Derek Hulley
|
||||||
*/
|
*/
|
||||||
@@ -72,7 +85,8 @@ public class HtmlParserContentTransformer extends AbstractContentTransformer2
|
|||||||
File htmlFile = TempFileProvider.createTempFile("HtmlParserContentTransformer_", ".html");
|
File htmlFile = TempFileProvider.createTempFile("HtmlParserContentTransformer_", ".html");
|
||||||
reader.getContent(htmlFile);
|
reader.getContent(htmlFile);
|
||||||
|
|
||||||
// Fetch the encoding of the HTML, if it's set in Alfresco
|
// Fetch the encoding of the HTML, as set in the ContentReader
|
||||||
|
// This will default to 'UTF-8' if not specifically set
|
||||||
String encoding = reader.getEncoding();
|
String encoding = reader.getEncoding();
|
||||||
|
|
||||||
// Create the extractor
|
// Create the extractor
|
||||||
|
@@ -147,37 +147,23 @@ public class HtmlParserContentTransformerTest extends AbstractContentTransformer
|
|||||||
tmpS.delete();
|
tmpS.delete();
|
||||||
tmpD.delete();
|
tmpD.delete();
|
||||||
|
|
||||||
|
// Note - since HTML Parser 2.0 META tags specifying the
|
||||||
|
// document encoding will ONLY be respected if the original
|
||||||
|
// content type was set to ISO-8859-1.
|
||||||
|
//
|
||||||
|
// This means there is now only one test which we can perform
|
||||||
|
// to ensure that this now-limited overriding of the encoding
|
||||||
|
// takes effect.
|
||||||
|
|
||||||
// Nothing on the content, meta set to ISO 8865-1
|
// Content set to ISO 8859-1, meta set to UTF-8
|
||||||
tmpS = File.createTempFile("test", ".html");
|
tmpS = File.createTempFile("test", ".html");
|
||||||
content = new FileContentWriter(tmpS);
|
content = new FileContentWriter(tmpS);
|
||||||
content.setMimetype(MimetypeMap.MIMETYPE_HTML);
|
content.setMimetype(MimetypeMap.MIMETYPE_HTML);
|
||||||
String str = partA+
|
String str = partA+
|
||||||
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=ISO-8859-1\">" +
|
|
||||||
partB+partC;
|
|
||||||
content.putContent(new ByteArrayInputStream(str.getBytes("ISO-8859-1")));
|
|
||||||
|
|
||||||
tmpD = File.createTempFile("test", ".txt");
|
|
||||||
dest = new FileContentWriter(tmpD);
|
|
||||||
dest.setMimetype(MimetypeMap.MIMETYPE_TEXT_PLAIN);
|
|
||||||
|
|
||||||
transformer.transform(content.getReader(), dest);
|
|
||||||
assertEquals(
|
|
||||||
TITLE + "\n" + TEXT_P1 + "\n" + TEXT_P2 + "\n" + TEXT_P3 + "\n",
|
|
||||||
dest.getReader().getContentString()
|
|
||||||
);
|
|
||||||
tmpS.delete();
|
|
||||||
tmpD.delete();
|
|
||||||
|
|
||||||
|
|
||||||
// Nothing on the content, meta set to UTF-8
|
|
||||||
tmpS = File.createTempFile("test", ".html");
|
|
||||||
content = new FileContentWriter(tmpS);
|
|
||||||
content.setMimetype(MimetypeMap.MIMETYPE_HTML);
|
|
||||||
str = partA+
|
|
||||||
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" +
|
"<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">" +
|
||||||
partB+partC;
|
partB+partC;
|
||||||
content.putContent(new ByteArrayInputStream(str.getBytes("UTF-8")));
|
content.putContent(new ByteArrayInputStream(str.getBytes("UTF-8")));
|
||||||
|
content.setEncoding("ISO-8859-1");
|
||||||
|
|
||||||
tmpD = File.createTempFile("test", ".txt");
|
tmpD = File.createTempFile("test", ".txt");
|
||||||
dest = new FileContentWriter(tmpD);
|
dest = new FileContentWriter(tmpD);
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2012 Alfresco Software Limited.
|
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This file is part of Alfresco
|
* This file is part of Alfresco
|
||||||
*
|
*
|
||||||
@@ -18,7 +18,11 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.jscript;
|
package org.alfresco.repo.jscript;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.text.Collator;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
@@ -37,6 +41,7 @@ import org.alfresco.repo.tenant.TenantDomainMismatchException;
|
|||||||
import org.alfresco.repo.tenant.TenantService;
|
import org.alfresco.repo.tenant.TenantService;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
|
import org.alfresco.service.cmr.repository.NodeService;
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
import org.alfresco.service.cmr.repository.StoreRef;
|
||||||
import org.alfresco.service.cmr.search.LimitBy;
|
import org.alfresco.service.cmr.search.LimitBy;
|
||||||
import org.alfresco.service.cmr.search.ResultSet;
|
import org.alfresco.service.cmr.search.ResultSet;
|
||||||
@@ -58,6 +63,7 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
import org.mozilla.javascript.Context;
|
import org.mozilla.javascript.Context;
|
||||||
import org.mozilla.javascript.Scriptable;
|
import org.mozilla.javascript.Scriptable;
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
import org.springframework.beans.factory.InitializingBean;
|
||||||
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
import org.springframework.extensions.surf.util.ParameterCheck;
|
import org.springframework.extensions.surf.util.ParameterCheck;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -508,6 +514,26 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
* @return people collection as a JavaScript array
|
* @return people collection as a JavaScript array
|
||||||
*/
|
*/
|
||||||
public Scriptable getPeople(String filter, int maxResults)
|
public Scriptable getPeople(String filter, int maxResults)
|
||||||
|
{
|
||||||
|
return getPeople(filter, maxResults, null, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the collection of people stored in the repository.
|
||||||
|
* An optional filter query may be provided by which to filter the people collection.
|
||||||
|
* Space separate the query terms i.e. "john bob" will find all users who's first or
|
||||||
|
* second names contain the strings "john" or "bob".
|
||||||
|
* Method supports sorting by specifying sortBy and sortAsc params.
|
||||||
|
*
|
||||||
|
* @param filter filter query string by which to filter the collection of people.
|
||||||
|
* If <pre>null</pre> then all people stored in the repository are returned
|
||||||
|
* @param maxResults maximum results to return or all if <= 0
|
||||||
|
* @param sortBy field for sorting
|
||||||
|
* @param sortAsc sort ascending or not
|
||||||
|
*
|
||||||
|
* @return people collection as a JavaScript array
|
||||||
|
*/
|
||||||
|
public Scriptable getPeople(String filter, int maxResults, String sortBy, boolean sortAsc)
|
||||||
{
|
{
|
||||||
boolean useCQ = false;
|
boolean useCQ = false;
|
||||||
if (filter != null)
|
if (filter != null)
|
||||||
@@ -529,7 +555,7 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
|
|
||||||
if ((filter == null || filter.length() == 0) || useCQ)
|
if ((filter == null || filter.length() == 0) || useCQ)
|
||||||
{
|
{
|
||||||
people = getPeopleImplDB(filter, maxResults);
|
people = getPeopleImplDB(filter, maxResults, sortBy, sortAsc);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -546,14 +572,14 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
people = getPeopleImplSearch(term, t, propIndex, maxResults);
|
people = getPeopleImplSearch(term, t, propIndex, maxResults, sortBy, sortAsc);
|
||||||
}
|
}
|
||||||
catch (Throwable err)
|
catch (Throwable err)
|
||||||
{
|
{
|
||||||
if (useCQ)
|
if (useCQ)
|
||||||
{
|
{
|
||||||
// search unavailable and/or parser exception - try CQ instead
|
// search unavailable and/or parser exception - try CQ instead
|
||||||
people = getPeopleImplDB(term, maxResults);
|
people = getPeopleImplDB(term, maxResults, sortBy, sortAsc);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -568,10 +594,11 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
}
|
}
|
||||||
|
|
||||||
// canned query
|
// canned query
|
||||||
private Object[] getPeopleImplDB(String term, int maxResults)
|
private Object[] getPeopleImplDB(String term, int maxResults, final String sortBy, boolean sortAsc)
|
||||||
{
|
{
|
||||||
Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
|
Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
|
||||||
Object[] people = null;
|
|
||||||
|
List<NodeRef> peopleRefs = new ArrayList<NodeRef>();
|
||||||
|
|
||||||
// simple non-FTS filter: firstname or lastname or username starting with term (ignoring case)
|
// simple non-FTS filter: firstname or lastname or username starting with term (ignoring case)
|
||||||
|
|
||||||
@@ -585,24 +612,27 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
|
|
||||||
PagingRequest pagingRequest = new PagingRequest(maxResults, null);
|
PagingRequest pagingRequest = new PagingRequest(maxResults, null);
|
||||||
List<PersonInfo> persons = personService.getPeople(term, filterProps, sortProps, pagingRequest).getPage();
|
List<PersonInfo> persons = personService.getPeople(term, filterProps, sortProps, pagingRequest).getPage();
|
||||||
people = new Object[persons.size()];
|
for (int i=0; i<persons.size(); i++)
|
||||||
for (int i=0; i<people.length; i++)
|
|
||||||
{
|
{
|
||||||
people[i] = persons.get(i).getNodeRef();
|
peopleRefs.add(persons.get(i).getNodeRef());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Object[] people = getSortedPeopleObjects(peopleRefs, sortBy, sortAsc);
|
||||||
|
|
||||||
if (start != null)
|
if (start != null)
|
||||||
{
|
{
|
||||||
logger.debug("getPeople: cq - "+people.length+" items (in "+(System.currentTimeMillis()-start)+" msecs)");
|
logger.debug("getPeople: cq - "+people.length+" items (in "+(System.currentTimeMillis()-start)+" msecs)");
|
||||||
}
|
}
|
||||||
|
|
||||||
return people;
|
return people;
|
||||||
}
|
}
|
||||||
|
|
||||||
// search query
|
// search query
|
||||||
private Object[] getPeopleImplSearch(String term, StringTokenizer t, int propIndex, int maxResults) throws Throwable
|
private Object[] getPeopleImplSearch(String term, StringTokenizer t, int propIndex, int maxResults, final String sortBy, boolean sortAsc) throws Throwable
|
||||||
{
|
{
|
||||||
Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
|
Long start = (logger.isDebugEnabled() ? System.currentTimeMillis() : null);
|
||||||
|
|
||||||
|
List<NodeRef> peopleRefs = new ArrayList<NodeRef>();
|
||||||
Object[] people = null;
|
Object[] people = null;
|
||||||
|
|
||||||
SearchParameters params = new SearchParameters();
|
SearchParameters params = new SearchParameters();
|
||||||
@@ -712,7 +742,7 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
try
|
try
|
||||||
{
|
{
|
||||||
results = services.getSearchService().query(params);
|
results = services.getSearchService().query(params);
|
||||||
people = results.getNodeRefs().toArray();
|
people = getSortedPeopleObjects(results.getNodeRefs(), sortBy, sortAsc);
|
||||||
|
|
||||||
if (start != null)
|
if (start != null)
|
||||||
{
|
{
|
||||||
@@ -739,6 +769,75 @@ public final class People extends BaseScopableProcessorExtension implements Init
|
|||||||
return people;
|
return people;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private Object[] getSortedPeopleObjects(List<NodeRef> peopleRefs, final String sortBy, boolean sortAsc)
|
||||||
|
{
|
||||||
|
final Collator col = Collator.getInstance(I18NUtil.getLocale());
|
||||||
|
final NodeService nodeService = services.getNodeService();
|
||||||
|
final int orderMultiplicator = sortAsc ? 1 : -1;
|
||||||
|
Collections.sort(peopleRefs, new Comparator<NodeRef>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public int compare(NodeRef n1, NodeRef n2)
|
||||||
|
{
|
||||||
|
String p1 = getProperty(n1);
|
||||||
|
String p2 = getProperty(n2);
|
||||||
|
|
||||||
|
return col.compare(p1, p2) * orderMultiplicator;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getProperty(NodeRef nodeRef)
|
||||||
|
{
|
||||||
|
Serializable result;
|
||||||
|
|
||||||
|
if ("fullName".equalsIgnoreCase(sortBy))
|
||||||
|
{
|
||||||
|
String firstName = nodeService.getProperty(nodeRef, ContentModel.PROP_FIRSTNAME).toString();
|
||||||
|
String lastName = nodeService.getProperty(nodeRef, ContentModel.PROP_LASTNAME).toString();
|
||||||
|
String fullName = firstName;
|
||||||
|
if (lastName != null && lastName.length() > 0)
|
||||||
|
{
|
||||||
|
fullName = fullName + " " + lastName;
|
||||||
|
}
|
||||||
|
|
||||||
|
result = fullName;
|
||||||
|
}
|
||||||
|
else if ("jobtitle".equalsIgnoreCase(sortBy))
|
||||||
|
{
|
||||||
|
result = nodeService.getProperty(nodeRef, ContentModel.PROP_JOBTITLE);
|
||||||
|
}
|
||||||
|
else if ("email".equalsIgnoreCase(sortBy))
|
||||||
|
{
|
||||||
|
result = nodeService.getProperty(nodeRef, ContentModel.PROP_EMAIL);
|
||||||
|
}
|
||||||
|
else if ("usage".equalsIgnoreCase(sortBy))
|
||||||
|
{
|
||||||
|
result = nodeService.getProperty(nodeRef, ContentModel.PROP_SIZE_CURRENT);
|
||||||
|
}
|
||||||
|
else if ("quota".equalsIgnoreCase(sortBy))
|
||||||
|
{
|
||||||
|
result = nodeService.getProperty(nodeRef, ContentModel.PROP_SIZE_QUOTA);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// Default
|
||||||
|
result = nodeService.getProperty(nodeRef, ContentModel.PROP_USERNAME);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result == null)
|
||||||
|
{
|
||||||
|
result = "";
|
||||||
|
}
|
||||||
|
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
|
||||||
|
Object[] people = new Object[peopleRefs.size()];
|
||||||
|
peopleRefs.toArray(people);
|
||||||
|
|
||||||
|
return people;
|
||||||
|
}
|
||||||
/**
|
/**
|
||||||
* Gets the Person given the username
|
* Gets the Person given the username
|
||||||
*
|
*
|
||||||
|
@@ -61,6 +61,7 @@ import org.alfresco.util.Pair;
|
|||||||
import org.alfresco.util.ParameterCheck;
|
import org.alfresco.util.ParameterCheck;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* GetChidren canned query
|
* GetChidren canned query
|
||||||
@@ -362,7 +363,7 @@ public class GetChildrenCannedQuery extends AbstractCannedQueryPermissions<NodeR
|
|||||||
public PropComparatorAsc(List<Pair<QName, SortOrder>> sortProps)
|
public PropComparatorAsc(List<Pair<QName, SortOrder>> sortProps)
|
||||||
{
|
{
|
||||||
this.sortProps = sortProps;
|
this.sortProps = sortProps;
|
||||||
this.collator = Collator.getInstance(); // note: currently default locale
|
this.collator = Collator.getInstance(I18NUtil.getContentLocale());
|
||||||
}
|
}
|
||||||
|
|
||||||
public int compare(FilterSortNode n1, FilterSortNode n2)
|
public int compare(FilterSortNode n1, FilterSortNode n2)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2012 Alfresco Software Limited.
|
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This file is part of Alfresco
|
* This file is part of Alfresco
|
||||||
*
|
*
|
||||||
@@ -190,7 +190,7 @@ public class GetAuthoritiesCannedQuery extends AbstractCannedQueryPermissions<Au
|
|||||||
|
|
||||||
if (s2 == null)
|
if (s2 == null)
|
||||||
{
|
{
|
||||||
s2 = auth1.getAuthorityName();
|
s2 = auth2.getAuthorityName();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (s1 == null)
|
if (s1 == null)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2010 Alfresco Software Limited.
|
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This file is part of Alfresco
|
* This file is part of Alfresco
|
||||||
*
|
*
|
||||||
@@ -18,11 +18,14 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.repo.security.authority.script;
|
package org.alfresco.repo.security.authority.script;
|
||||||
|
|
||||||
|
import java.text.Collator;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
|
import org.springframework.extensions.surf.util.I18NUtil;
|
||||||
|
|
||||||
public interface Authority
|
public interface Authority
|
||||||
{
|
{
|
||||||
public enum ScriptAuthorityType { GROUP, USER };
|
public enum ScriptAuthorityType { GROUP, USER };
|
||||||
@@ -40,17 +43,31 @@ public interface Authority
|
|||||||
{
|
{
|
||||||
private Map<Authority,String> nameCache;
|
private Map<Authority,String> nameCache;
|
||||||
private String sortBy;
|
private String sortBy;
|
||||||
|
private Collator col;
|
||||||
|
private int orderMultiplicator = 1;
|
||||||
|
|
||||||
public AuthorityComparator(String sortBy)
|
public AuthorityComparator(String sortBy)
|
||||||
{
|
{
|
||||||
|
this.col = Collator.getInstance(I18NUtil.getLocale());
|
||||||
this.sortBy = sortBy;
|
this.sortBy = sortBy;
|
||||||
this.nameCache = new HashMap<Authority, String>();
|
this.nameCache = new HashMap<Authority, String>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public AuthorityComparator(String sortBy, boolean sortAsc)
|
||||||
|
{
|
||||||
|
col = Collator.getInstance(I18NUtil.getLocale());
|
||||||
|
this.sortBy = sortBy;
|
||||||
|
this.nameCache = new HashMap<Authority, String>();
|
||||||
|
if (!sortAsc)
|
||||||
|
{
|
||||||
|
orderMultiplicator = -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(Authority g1, Authority g2)
|
public int compare(Authority g1, Authority g2)
|
||||||
{
|
{
|
||||||
return get(g1).compareTo( get(g2) );
|
return col.compare(get(g1), get(g2)) * orderMultiplicator;
|
||||||
}
|
}
|
||||||
|
|
||||||
private String get(Authority g)
|
private String get(Authority g)
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2011 Alfresco Software Limited.
|
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This file is part of Alfresco
|
* This file is part of Alfresco
|
||||||
*
|
*
|
||||||
@@ -43,7 +43,6 @@ import org.alfresco.util.Pair;
|
|||||||
import org.alfresco.util.ScriptPagingDetails;
|
import org.alfresco.util.ScriptPagingDetails;
|
||||||
import org.apache.commons.logging.Log;
|
import org.apache.commons.logging.Log;
|
||||||
import org.apache.commons.logging.LogFactory;
|
import org.apache.commons.logging.LogFactory;
|
||||||
import org.mozilla.javascript.Scriptable;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Script object representing the authority service.
|
* Script object representing the authority service.
|
||||||
@@ -267,6 +266,15 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
|
|||||||
return getGroupsInZone(filter, null, paging, sortBy);
|
return getGroupsInZone(filter, null, paging, sortBy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public ScriptGroup[] getGroupsInZone(String filter, String zone, ScriptPagingDetails paging, String sortBy)
|
||||||
|
{
|
||||||
|
return getGroupsInZone(filter, zone, paging, sortBy, true);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieves groups matching the given filter from the given zone.
|
* Retrieves groups matching the given filter from the given zone.
|
||||||
*
|
*
|
||||||
@@ -277,10 +285,11 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
|
|||||||
* @param paging Paging details
|
* @param paging Paging details
|
||||||
* @param sortBy Field to sort by, can be <code>shortName</code>, <code>displayName</code> or
|
* @param sortBy Field to sort by, can be <code>shortName</code>, <code>displayName</code> or
|
||||||
* <code>authorityName</code>, the default is displayName
|
* <code>authorityName</code>, the default is displayName
|
||||||
|
* @param sortAsc sort ascending or not
|
||||||
* @return Array of matching groups
|
* @return Array of matching groups
|
||||||
* @since 4.0
|
* @since 4.1.4
|
||||||
*/
|
*/
|
||||||
public ScriptGroup[] getGroupsInZone(String filter, String zone, ScriptPagingDetails paging, String sortBy)
|
public ScriptGroup[] getGroupsInZone(String filter, String zone, ScriptPagingDetails paging, String sortBy, boolean sortAsc)
|
||||||
{
|
{
|
||||||
if (sortBy == null)
|
if (sortBy == null)
|
||||||
{
|
{
|
||||||
@@ -306,10 +315,10 @@ public class ScriptAuthorityService extends BaseScopableProcessorExtension
|
|||||||
paging.setRequestTotalCountMax(10000);
|
paging.setRequestTotalCountMax(10000);
|
||||||
|
|
||||||
// get the paged results (NOTE: we can only sort by display name currently)
|
// get the paged results (NOTE: we can only sort by display name currently)
|
||||||
PagingResults<AuthorityInfo> groups = authorityService.getAuthoritiesInfo(AuthorityType.GROUP, zone, filter, sortBy, true, paging);
|
PagingResults<AuthorityInfo> groups = authorityService.getAuthoritiesInfo(AuthorityType.GROUP, zone, filter, sortBy, sortAsc, paging);
|
||||||
|
|
||||||
// create ScriptGroup array from paged results
|
// create ScriptGroup array from paged results
|
||||||
scriptGroups = makeScriptGroupsInfo(groups, paging, serviceRegistry, this.getScope());
|
scriptGroups = makeScriptGroupsInfo(groups, paging, sortBy, sortAsc, serviceRegistry, this.getScope());
|
||||||
}
|
}
|
||||||
catch (UnknownAuthorityException e)
|
catch (UnknownAuthorityException e)
|
||||||
{
|
{
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* Copyright (C) 2005-2012 Alfresco Software Limited.
|
* Copyright (C) 2005-2013 Alfresco Software Limited.
|
||||||
*
|
*
|
||||||
* This file is part of Alfresco
|
* This file is part of Alfresco
|
||||||
*
|
*
|
||||||
@@ -539,6 +539,9 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
childAuthorityNames = null;
|
childAuthorityNames = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
public static ScriptGroup[] makeScriptGroups(Collection<String> authorities,
|
public static ScriptGroup[] makeScriptGroups(Collection<String> authorities,
|
||||||
ScriptPagingDetails paging, ServiceRegistry serviceRegistry,
|
ScriptPagingDetails paging, ServiceRegistry serviceRegistry,
|
||||||
Scriptable scope)
|
Scriptable scope)
|
||||||
@@ -546,11 +549,20 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
return makeScriptGroups(authorities, paging, null, serviceRegistry, scope);
|
return makeScriptGroups(authorities, paging, null, serviceRegistry, scope);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
*/
|
||||||
public static ScriptGroup[] makeScriptGroups(Collection<String> authorities,
|
public static ScriptGroup[] makeScriptGroups(Collection<String> authorities,
|
||||||
ScriptPagingDetails paging, String sortBy, ServiceRegistry serviceRegistry,
|
ScriptPagingDetails paging, String sortBy, ServiceRegistry serviceRegistry,
|
||||||
Scriptable scope)
|
Scriptable scope)
|
||||||
{
|
{
|
||||||
|
return makeScriptGroups(authorities, paging, sortBy, true, serviceRegistry, scope);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static ScriptGroup[] makeScriptGroups(Collection<String> authorities,
|
||||||
|
ScriptPagingDetails paging, final String sortBy, boolean sortAsc, ServiceRegistry serviceRegistry,
|
||||||
|
Scriptable scope)
|
||||||
|
{
|
||||||
final ArrayList<String> authList = new ArrayList<String>(authorities);
|
final ArrayList<String> authList = new ArrayList<String>(authorities);
|
||||||
final Map<String,ScriptGroup> scriptGroupCache = new HashMap<String, ScriptGroup>();
|
final Map<String,ScriptGroup> scriptGroupCache = new HashMap<String, ScriptGroup>();
|
||||||
|
|
||||||
@@ -562,7 +574,7 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
{
|
{
|
||||||
scriptGroupCache.put(authority, new ScriptGroup(authority, serviceRegistry, scope));
|
scriptGroupCache.put(authority, new ScriptGroup(authority, serviceRegistry, scope));
|
||||||
}
|
}
|
||||||
final AuthorityComparator c2 = new AuthorityComparator(sortBy);
|
final AuthorityComparator c2 = new AuthorityComparator(sortBy, sortAsc);
|
||||||
Collections.sort(authList, new Comparator<String>() {
|
Collections.sort(authList, new Comparator<String>() {
|
||||||
@Override
|
@Override
|
||||||
public int compare(String g1, String g2)
|
public int compare(String g1, String g2)
|
||||||
@@ -606,18 +618,31 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @deprecated
|
||||||
|
* @since 4.0
|
||||||
|
*/
|
||||||
|
public static ScriptGroup[] makeScriptGroups(PagingResults<String> pagedGroups, ScriptPagingDetails paging,
|
||||||
|
ServiceRegistry serviceRegistry, Scriptable scope)
|
||||||
|
{
|
||||||
|
return makeScriptGroups(pagedGroups, paging, null, true, serviceRegistry, scope);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns an array of ScriptGroup objects representing the given paged results.
|
* Returns an array of ScriptGroup objects representing the given paged results.
|
||||||
*
|
*
|
||||||
* @param groups The paged results
|
* @param groups The paged results
|
||||||
* @param paging Object representing the paging details
|
* @param paging Object representing the paging details
|
||||||
|
* @param sortBy field for sorting
|
||||||
|
* @param sortAsc sort ascending or not
|
||||||
* @param serviceRegistry
|
* @param serviceRegistry
|
||||||
* @param scope
|
* @param scope
|
||||||
* @return Array of ScriptGroup objects
|
* @return Array of ScriptGroup objects
|
||||||
*
|
*
|
||||||
* @since 4.0
|
* @since 4.1.4
|
||||||
*/
|
*/
|
||||||
public static ScriptGroup[] makeScriptGroups(PagingResults<String> pagedGroups, ScriptPagingDetails paging,
|
public static ScriptGroup[] makeScriptGroups(PagingResults<String> pagedGroups, ScriptPagingDetails paging,
|
||||||
|
String sortBy, boolean sortAsc,
|
||||||
ServiceRegistry serviceRegistry, Scriptable scope)
|
ServiceRegistry serviceRegistry, Scriptable scope)
|
||||||
{
|
{
|
||||||
// set the total on the paging object
|
// set the total on the paging object
|
||||||
@@ -625,11 +650,15 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
|
|
||||||
// retrive the page of results and create a ScriptGroup for each one
|
// retrive the page of results and create a ScriptGroup for each one
|
||||||
List<String> groupNames = pagedGroups.getPage();
|
List<String> groupNames = pagedGroups.getPage();
|
||||||
ScriptGroup[] groups = new ScriptGroup[groupNames.size()];
|
AuthorityComparator authComp = new AuthorityComparator(sortBy, sortAsc);
|
||||||
for (int i=0; i<groups.length; i++)
|
List<ScriptGroup> groupList= new ArrayList<ScriptGroup>();
|
||||||
|
for (int i=0; i<groupNames.size(); i++)
|
||||||
{
|
{
|
||||||
groups[i] = new ScriptGroup(groupNames.get(i), serviceRegistry, scope);
|
groupList.add(new ScriptGroup(groupNames.get(i), serviceRegistry, scope));
|
||||||
}
|
}
|
||||||
|
Collections.sort(groupList, authComp);
|
||||||
|
ScriptGroup[] groups = new ScriptGroup[groupNames.size()];
|
||||||
|
groupList.toArray(groups);
|
||||||
|
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
@@ -637,15 +666,16 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
/**
|
/**
|
||||||
* Returns an array of ScriptGroup objects representing the given paged results.
|
* Returns an array of ScriptGroup objects representing the given paged results.
|
||||||
*
|
*
|
||||||
* @param groups The paged results
|
* @param groups sorted paged results (the page of results get sorted again taking I18n into account)
|
||||||
* @param paging Object representing the paging details
|
* @param paging Object representing the paging details
|
||||||
* @param serviceRegistry
|
* @param serviceRegistry
|
||||||
* @param scope
|
* @param scope
|
||||||
* @return Array of ScriptGroup objects
|
* @return Array of ScriptGroup objects
|
||||||
*
|
*
|
||||||
* @since 4.1.3
|
* @since 4.1.4
|
||||||
*/
|
*/
|
||||||
public static ScriptGroup[] makeScriptGroupsInfo(PagingResults<AuthorityInfo> pagedGroups, ScriptPagingDetails paging,
|
public static ScriptGroup[] makeScriptGroupsInfo(PagingResults<AuthorityInfo> pagedGroups, ScriptPagingDetails paging,
|
||||||
|
String sortBy, boolean sortAsc,
|
||||||
ServiceRegistry serviceRegistry, Scriptable scope)
|
ServiceRegistry serviceRegistry, Scriptable scope)
|
||||||
{
|
{
|
||||||
// set the total on the paging object
|
// set the total on the paging object
|
||||||
@@ -653,12 +683,17 @@ public class ScriptGroup implements Authority, Serializable
|
|||||||
|
|
||||||
// retrive the page of results and create a ScriptGroup for each one
|
// retrive the page of results and create a ScriptGroup for each one
|
||||||
List<AuthorityInfo> groupInfo = pagedGroups.getPage();
|
List<AuthorityInfo> groupInfo = pagedGroups.getPage();
|
||||||
ScriptGroup[] groups = new ScriptGroup[groupInfo.size()];
|
AuthorityComparator authComp = new AuthorityComparator(sortBy, sortAsc);
|
||||||
for (int i=0; i<groups.length; i++)
|
List<ScriptGroup> groupList= new ArrayList<ScriptGroup>();
|
||||||
|
|
||||||
|
for (int i=0; i<groupInfo.size(); i++)
|
||||||
{
|
{
|
||||||
AuthorityInfo authorityInfo = groupInfo.get(i);
|
AuthorityInfo authorityInfo = groupInfo.get(i);
|
||||||
groups[i] = new ScriptGroup(authorityInfo.getAuthorityName(), authorityInfo.getAuthorityDisplayName(), serviceRegistry, scope);
|
groupList.add(new ScriptGroup(authorityInfo.getAuthorityName(), authorityInfo.getAuthorityDisplayName(), serviceRegistry, scope));
|
||||||
}
|
}
|
||||||
|
Collections.sort(groupList, authComp);
|
||||||
|
ScriptGroup[] groups = new ScriptGroup[groupInfo.size()];
|
||||||
|
groupList.toArray(groups);
|
||||||
|
|
||||||
return groups;
|
return groups;
|
||||||
}
|
}
|
||||||
|
@@ -386,7 +386,27 @@ public class Site implements Serializable
|
|||||||
{
|
{
|
||||||
return this.siteService.getMembersRoleInfo(getShortName(), authorityName);
|
return this.siteService.getMembersRoleInfo(getShortName(), authorityName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Indicates whether a user belongs to a group with access rights to the site or not
|
||||||
|
*
|
||||||
|
* @param authorityName user name
|
||||||
|
* @return boolean true if the user belongs to a group with access rights, false otherwise
|
||||||
|
*/
|
||||||
|
public boolean isMemberOfGroup(String authorityName)
|
||||||
|
{
|
||||||
|
boolean isMemberOfGroup = false;
|
||||||
|
if (this.siteService.listSites(authorityName).contains(this.siteInfo))
|
||||||
|
{
|
||||||
|
SiteMemberInfo membersRoleInfo = getMembersRoleInfo(authorityName);
|
||||||
|
if (membersRoleInfo != null)
|
||||||
|
{
|
||||||
|
isMemberOfGroup = membersRoleInfo.isMemberOfGroup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return isMemberOfGroup;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether a user is a member of the site.
|
* Indicates whether a user is a member of the site.
|
||||||
*
|
*
|
||||||
|
@@ -2037,4 +2037,88 @@ public class TaggingServiceImplTest extends TestCase
|
|||||||
return returnVal;
|
return returnVal;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test for https://https://issues.alfresco.com/jira/browse/ALF-17260.
|
||||||
|
*
|
||||||
|
* When the audit queue for the tagging service contains more than 100 entries which aren't update,
|
||||||
|
* {@link UpdateTagScopesActionExecuter} was failing to update the tag scope of containers correctly.
|
||||||
|
*
|
||||||
|
* @throws Exception
|
||||||
|
*/
|
||||||
|
public void testALF_17260() throws Exception
|
||||||
|
{
|
||||||
|
// Add tag scope to our container
|
||||||
|
this.transactionService.getRetryingTransactionHelper().doInTransaction(new RetryingTransactionCallback<Void>(){
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
// Add some tag scopes
|
||||||
|
taggingService.addTagScope(folder);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Generate ~1800 audit entries, none of which are updates, as determined by UpdateTagScopesActionExecuter
|
||||||
|
asyncOccurs.awaitExecution(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
Map<String, Object> model = new HashMap<String, Object>(0);
|
||||||
|
model.put("folder", folder);
|
||||||
|
|
||||||
|
ScriptLocation location = new ClasspathScriptLocation("org/alfresco/repo/tagging/script/test_alf_17260.js");
|
||||||
|
scriptService.executeScript(location, model);
|
||||||
|
|
||||||
|
// Let the script run
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// The tag scope of our container should be empty at this stage.
|
||||||
|
asyncOccurs.awaitExecution(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
// re get the tag scopes
|
||||||
|
TagScope ts1 = taggingService.findTagScope(folder);
|
||||||
|
|
||||||
|
// Check that the tag scopes got populated
|
||||||
|
assertEquals("Wrong tags on sub folder: " + ts1.getTags(), 0, ts1.getTags().size());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add some tags which should update the tag scope.
|
||||||
|
asyncOccurs.awaitExecution(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
taggingService.addTag(subDocument, TAG_1); // folder+subfolder
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// Prior to fixing ALF-17260, the tag scope of our container wasn't being updated correctly. These
|
||||||
|
// assertions were failing.
|
||||||
|
asyncOccurs.awaitExecution(new RetryingTransactionCallback<Void>()
|
||||||
|
{
|
||||||
|
@Override
|
||||||
|
public Void execute() throws Throwable
|
||||||
|
{
|
||||||
|
// re get the tag scopes
|
||||||
|
TagScope ts1 = taggingService.findTagScope(folder);
|
||||||
|
|
||||||
|
// Check that the tag scopes got populated
|
||||||
|
assertEquals("Wrong tags on folder: " + ts1.getTags(), 1, ts1.getTags().size());
|
||||||
|
assertEquals("Wrong tag name", TAG_1, ts1.getTags().get(0).getName());
|
||||||
|
assertEquals("Wrong number of documents", 1, ts1.getTags().get(0).getCount());
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -244,7 +244,7 @@ public class UpdateTagScopesActionExecuter extends ActionExecuterAbstractBase
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Does any work remain?
|
// Does any work remain?
|
||||||
if(updates.size() == 0)
|
if(entryIds.size() == 0)
|
||||||
{
|
{
|
||||||
updatesRemain.setValue(0);
|
updatesRemain.setValue(0);
|
||||||
return null;
|
return null;
|
||||||
|
@@ -0,0 +1,21 @@
|
|||||||
|
for (var j = 0; j < 10 ; j ++)
|
||||||
|
{
|
||||||
|
var test1 = folder.createFolder("Test1");
|
||||||
|
var test2 = folder.createFolder("Test2");
|
||||||
|
|
||||||
|
for(var i=0;i<102;i++)
|
||||||
|
{
|
||||||
|
var node = test1.createNode(j + "_test_"+i+".text","cm:content");
|
||||||
|
node.addTag(j + "testTag" + i);
|
||||||
|
}
|
||||||
|
|
||||||
|
for each (child in test1.children){
|
||||||
|
child.clearTags();
|
||||||
|
}
|
||||||
|
|
||||||
|
test1.move(test2);
|
||||||
|
if (j < 9)
|
||||||
|
{
|
||||||
|
test2.remove();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user