mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-08-07 17:49:17 +00:00
Fix to unclosed search ResultSet objects in webscript RepoStore when retrieving webscript artifacts from a repo store. Also added required ISO9075 encoding to generated Lucene PATH statements.
git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@10927 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -34,6 +34,7 @@ import java.util.Arrays;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
@@ -57,6 +58,7 @@ import org.alfresco.service.cmr.search.ResultSet;
|
|||||||
import org.alfresco.service.cmr.search.SearchService;
|
import org.alfresco.service.cmr.search.SearchService;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.service.namespace.NamespaceService;
|
import org.alfresco.service.namespace.NamespaceService;
|
||||||
|
import org.alfresco.util.ISO9075;
|
||||||
import org.alfresco.web.scripts.ScriptContent;
|
import org.alfresco.web.scripts.ScriptContent;
|
||||||
import org.alfresco.web.scripts.ScriptLoader;
|
import org.alfresco.web.scripts.ScriptLoader;
|
||||||
import org.alfresco.web.scripts.Store;
|
import org.alfresco.web.scripts.Store;
|
||||||
@@ -219,13 +221,20 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
{
|
{
|
||||||
String query = "PATH:\"" + repoPath + "\"";
|
String query = "PATH:\"" + repoPath + "\"";
|
||||||
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
||||||
if (resultSet.length() == 1)
|
try
|
||||||
{
|
{
|
||||||
return resultSet.getNodeRef(0);
|
if (resultSet.length() == 1)
|
||||||
|
{
|
||||||
|
return resultSet.getNodeRef(0);
|
||||||
|
}
|
||||||
|
else if (mustExist)
|
||||||
|
{
|
||||||
|
throw new WebScriptException("Web Script Store " + repoStore.toString() + repoPath + " must exist; it was not found");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else if (mustExist)
|
finally
|
||||||
{
|
{
|
||||||
throw new WebScriptException("Web Script Store " + repoStore.toString() + repoPath + " must exist; it was not found");
|
resultSet.close();
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -316,20 +325,28 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
{
|
{
|
||||||
org.alfresco.service.cmr.repository.Path repoScriptPath = nodeService.getPath(scriptNodeRef);
|
org.alfresco.service.cmr.repository.Path repoScriptPath = nodeService.getPath(scriptNodeRef);
|
||||||
String id = script.getDescription().getId().substring(scriptPath.length() + (scriptPath.length() > 0 ? 1 : 0));
|
String id = script.getDescription().getId().substring(scriptPath.length() + (scriptPath.length() > 0 ? 1 : 0));
|
||||||
String query = "+PATH:\"" + repoScriptPath.toPrefixString(namespaceService) + "//*\" +QNAME:" + id + "*";
|
String query = "+PATH:\"" + repoScriptPath.toPrefixString(namespaceService) +
|
||||||
|
"//*\" +QNAME:" + id + "*";
|
||||||
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
||||||
documentPaths = new ArrayList<String>(resultSet.length());
|
try
|
||||||
List<NodeRef> nodes = resultSet.getNodeRefs();
|
|
||||||
for (NodeRef nodeRef : nodes)
|
|
||||||
{
|
{
|
||||||
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
|
documentPaths = new ArrayList<String>(resultSet.length());
|
||||||
if (name.startsWith(id))
|
List<NodeRef> nodes = resultSet.getNodeRefs();
|
||||||
|
for (NodeRef nodeRef : nodes)
|
||||||
{
|
{
|
||||||
String nodeDir = getPath(nodeRef);
|
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
|
||||||
String documentPath = nodeDir.substring(baseDirLength);
|
if (name.startsWith(id))
|
||||||
documentPaths.add(documentPath);
|
{
|
||||||
|
String nodeDir = getPath(nodeRef);
|
||||||
|
String documentPath = nodeDir.substring(baseDirLength);
|
||||||
|
documentPaths.add(documentPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
resultSet.close();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return documentPaths != null ? documentPaths.toArray(new String[documentPaths.size()]) : new String[0];
|
return documentPaths != null ? documentPaths.toArray(new String[documentPaths.size()]) : new String[0];
|
||||||
@@ -344,34 +361,21 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
*/
|
*/
|
||||||
public String[] getDocumentPaths(String path, boolean includeSubPaths, String documentPattern)
|
public String[] getDocumentPaths(String path, boolean includeSubPaths, String documentPattern)
|
||||||
{
|
{
|
||||||
if ((path == null) || (path.length() == 0))
|
|
||||||
{
|
|
||||||
path = "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! path.startsWith("/"))
|
|
||||||
{
|
|
||||||
path = "/" + path;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (! path.endsWith("/"))
|
|
||||||
{
|
|
||||||
path = path + "/";
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((documentPattern == null) || (documentPattern.length() == 0))
|
if ((documentPattern == null) || (documentPattern.length() == 0))
|
||||||
{
|
{
|
||||||
documentPattern = "*";
|
documentPattern = "*";
|
||||||
}
|
}
|
||||||
|
|
||||||
final String matcher = documentPattern.replace(".","\\.").replace("*",".*");
|
String matcher = documentPattern.replace(".","\\.").replace("*",".*");
|
||||||
|
final Pattern pattern = Pattern.compile(matcher);
|
||||||
|
|
||||||
final StringBuffer query = new StringBuffer();
|
String encPath = encodePathISO9075(path);
|
||||||
|
final StringBuilder query = new StringBuilder(128);
|
||||||
query.append("+PATH:\"").append(repoPath)
|
query.append("+PATH:\"").append(repoPath)
|
||||||
.append(path)
|
.append(encPath.length() != 0 ? ('/' + encPath) : "")
|
||||||
.append((includeSubPaths ? "/*\"" : ""))
|
.append((includeSubPaths ? '/' : ""))
|
||||||
.append(" +QNAME:")
|
.append("/*\" +QNAME:")
|
||||||
.append(documentPattern);
|
.append(documentPattern);
|
||||||
|
|
||||||
return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<String[]>()
|
return AuthenticationUtil.runAs(new AuthenticationUtil.RunAsWork<String[]>()
|
||||||
{
|
{
|
||||||
@@ -383,20 +387,27 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
{
|
{
|
||||||
int baseDirLength = getBaseDir().length() +1;
|
int baseDirLength = getBaseDir().length() +1;
|
||||||
|
|
||||||
|
List<String> documentPaths;
|
||||||
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query.toString());
|
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query.toString());
|
||||||
List<String> documentPaths = new ArrayList<String>(resultSet.length());
|
try
|
||||||
List<NodeRef> nodes = resultSet.getNodeRefs();
|
|
||||||
for (NodeRef nodeRef : nodes)
|
|
||||||
{
|
{
|
||||||
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
|
documentPaths = new ArrayList<String>(resultSet.length());
|
||||||
if (Pattern.matches(matcher, name))
|
List<NodeRef> nodes = resultSet.getNodeRefs();
|
||||||
|
for (NodeRef nodeRef : nodes)
|
||||||
{
|
{
|
||||||
String nodeDir = getPath(nodeRef);
|
String name = (String)nodeService.getProperty(nodeRef, ContentModel.PROP_NAME);
|
||||||
String documentPath = nodeDir.substring(baseDirLength);
|
if (pattern.matcher(name).matches())
|
||||||
documentPaths.add(documentPath);
|
{
|
||||||
|
String nodeDir = getPath(nodeRef);
|
||||||
|
String documentPath = nodeDir.substring(baseDirLength);
|
||||||
|
documentPaths.add(documentPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
resultSet.close();
|
||||||
|
}
|
||||||
return documentPaths.toArray(new String[documentPaths.size()]);
|
return documentPaths.toArray(new String[documentPaths.size()]);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -404,6 +415,33 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
}, AuthenticationUtil.getSystemUserName());
|
}, AuthenticationUtil.getSystemUserName());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helper to encode the elements of a path to be used as a Lucene PATH statement
|
||||||
|
* using the ISO9075 encoding. Note that leading and trailing '/' elements will NOT
|
||||||
|
* be preserved.
|
||||||
|
*
|
||||||
|
* @param path Path to encode, elements separated by '/'
|
||||||
|
*
|
||||||
|
* @return the encoded path, a minimum of the empty string will be returned
|
||||||
|
*/
|
||||||
|
public static String encodePathISO9075(String path)
|
||||||
|
{
|
||||||
|
if (path == null || path.length() == 0)
|
||||||
|
{
|
||||||
|
return "";
|
||||||
|
}
|
||||||
|
StringBuilder result = new StringBuilder(path.length() + 16);
|
||||||
|
for (StringTokenizer t = new StringTokenizer(path, "/"); t.hasMoreTokens(); /**/)
|
||||||
|
{
|
||||||
|
result.append(ISO9075.encode(t.nextToken()));
|
||||||
|
if (t.hasMoreTokens())
|
||||||
|
{
|
||||||
|
result.append('/');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result.toString();
|
||||||
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see org.alfresco.web.scripts.Store#getDescriptionDocumentPaths()
|
* @see org.alfresco.web.scripts.Store#getDescriptionDocumentPaths()
|
||||||
*/
|
*/
|
||||||
@@ -427,14 +465,23 @@ public class RepoStore implements Store, TenantDeployer
|
|||||||
{
|
{
|
||||||
int baseDirLength = getBaseDir().length() +1;
|
int baseDirLength = getBaseDir().length() +1;
|
||||||
|
|
||||||
String query = "+PATH:\"" + repoPath + "//*\" +TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"";
|
List<String> documentPaths;
|
||||||
|
String query = "+PATH:\"" + repoPath +
|
||||||
|
"//*\" +TYPE:\"{http://www.alfresco.org/model/content/1.0}content\"";
|
||||||
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
ResultSet resultSet = searchService.query(repoStore, SearchService.LANGUAGE_LUCENE, query);
|
||||||
List<String> documentPaths = new ArrayList<String>(resultSet.length());
|
try
|
||||||
List<NodeRef> nodes = resultSet.getNodeRefs();
|
|
||||||
for (NodeRef nodeRef : nodes)
|
|
||||||
{
|
{
|
||||||
String nodeDir = getPath(nodeRef);
|
documentPaths = new ArrayList<String>(resultSet.length());
|
||||||
documentPaths.add(nodeDir.substring(baseDirLength));
|
List<NodeRef> nodes = resultSet.getNodeRefs();
|
||||||
|
for (NodeRef nodeRef : nodes)
|
||||||
|
{
|
||||||
|
String nodeDir = getPath(nodeRef);
|
||||||
|
documentPaths.add(nodeDir.substring(baseDirLength));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
resultSet.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
return documentPaths.toArray(new String[documentPaths.size()]);
|
return documentPaths.toArray(new String[documentPaths.size()]);
|
||||||
|
Reference in New Issue
Block a user