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:
Kevin Roast
2008-09-19 10:58:04 +00:00
parent da06b44a41
commit ddd8290d8d

View File

@@ -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()]);