diff --git a/source/java/org/alfresco/repo/web/scripts/bean/AVMRemoteStore.java b/source/java/org/alfresco/repo/web/scripts/bean/AVMRemoteStore.java index b2ca418cfa..a9b846924f 100644 --- a/source/java/org/alfresco/repo/web/scripts/bean/AVMRemoteStore.java +++ b/source/java/org/alfresco/repo/web/scripts/bean/AVMRemoteStore.java @@ -252,7 +252,6 @@ public class AVMRemoteStore extends BaseRemoteStore } avmService.createFile(parts[0], parts[1], content); - avmService.createSnapshot(store, "AVMRemoteStore.createDocument()", path); } catch (AccessDeniedException ae) { @@ -322,7 +321,6 @@ public class AVMRemoteStore extends BaseRemoteStore try { avmService.removeNode(avmPath); - avmService.createSnapshot(store, "AVMRemoteStore.deleteDocument()", path); } catch (AccessDeniedException ae) { @@ -349,7 +347,7 @@ public class AVMRemoteStore extends BaseRemoteStore try { - traverseNode(res.getWriter(), store, node, recurse); + traverseNode(res.getWriter(), store, node, null, recurse); } catch (AccessDeniedException ae) { @@ -361,29 +359,6 @@ public class AVMRemoteStore extends BaseRemoteStore } } - private void traverseNode(Writer out, String store, AVMNodeDescriptor node, boolean recurse) - throws IOException - { - /** - * The node path appears as such: - * project1:/www/avm_webapps/ROOT/WEB-INF/classes/alfresco/site-data/template-instances/file.xml - */ - int cropPoint = store.length() + this.rootPath.length() + 1; - SortedMap listing = this.avmService.getDirectoryListing(node); - for (AVMNodeDescriptor n : listing.values()) - { - if (n.isFile()) - { - out.write(n.getPath().substring(cropPoint)); - out.write("\n"); - } - else if (recurse && n.isDirectory()) - { - traverseNode(out, store, n, recurse); - } - } - } - /* (non-Javadoc) * @see org.alfresco.repo.web.scripts.bean.BaseRemoteStore#listDocuments(org.alfresco.web.scripts.WebScriptResponse, java.lang.String, java.lang.String) */ @@ -404,50 +379,23 @@ public class AVMRemoteStore extends BaseRemoteStore } String matcher = pattern.replace(".","\\.").replace("*",".*"); - final Pattern pat = Pattern.compile(matcher); - String encPath = RepoStore.encodePathISO9075(path); - final StringBuilder query = new StringBuilder(128); - - query.append("+PATH:\"").append(this.rootPath) - .append(encPath.length() != 0 ? ('/' + encPath) : "") - .append("//*\" +QNAME:") - .append(pattern); - - final Writer out = res.getWriter(); - final StoreRef avmStore = new StoreRef(StoreRef.PROTOCOL_AVM + StoreRef.URI_FILLER + store); - AuthenticationUtil.runAs(new RunAsWork() + try { - @SuppressWarnings("synthetic-access") - public Object doWork() throws Exception - { - int cropPoint = store.length() + rootPath.length() + 1; - ResultSet resultSet = searchService.query(avmStore, SearchService.LANGUAGE_LUCENE, query.toString()); - try - { - List nodes = resultSet.getNodeRefs(); - for (NodeRef nodeRef : nodes) - { - String path = AVMNodeConverter.ToAVMVersionPath(nodeRef).getSecond(); - String name = path.substring(path.lastIndexOf('/') + 1); - if (pat.matcher(name).matches()) - { - out.write(path.substring(cropPoint)); - out.write("\n"); - } - } - } - finally - { - resultSet.close(); - } - return null; - } - }, AuthenticationUtil.getSystemUserName()); + traverseNode(res.getWriter(), store, node, Pattern.compile(matcher), true); + } + catch (AccessDeniedException ae) + { + res.setStatus(Status.STATUS_UNAUTHORIZED); + } + finally + { + res.getWriter().close(); + } } - + /** - * @param store the store id + * @param store the AVM store id * @param path root path relative * * @return full AVM path to document including store and root path components @@ -461,6 +409,53 @@ public class AVMRemoteStore extends BaseRemoteStore return store + ":" + this.rootPath + (path != null ? encodePath(path) : ""); } + /** + * Traverse a Node and recursively output the file paths it contains. + * + * @param out Writer for output - relative paths separated by newline characters + * @param store AVM Store name + * @param node The AVM Node to traverse + * @param pattern Optional Pattern to match filenames against + * @param recurse True to recurse sub-directories + * + * @throws IOException + */ + private void traverseNode(Writer out, String store, AVMNodeDescriptor node, Pattern pattern, boolean recurse) + throws IOException + { + /** + * The node path appears as such: + * project1:/www/avm_webapps/ROOT/WEB-INF/classes/alfresco/site-data/template-instances/file.xml + */ + int cropPoint = store.length() + this.rootPath.length() + 1; + SortedMap listing = this.avmService.getDirectoryListing(node); + for (AVMNodeDescriptor n : listing.values()) + { + if (n.isFile()) + { + String path = n.getPath(); + if (pattern != null) + { + String name = path.substring(path.lastIndexOf('/') + 1); + if (pattern.matcher(name).matches()) + { + out.write(path.substring(cropPoint)); + out.write("\n"); + } + } + else + { + out.write(path.substring(cropPoint)); + out.write("\n"); + } + } + else if (recurse && n.isDirectory()) + { + traverseNode(out, store, n, pattern, recurse); + } + } + } + private static String encodePath(final String s) { diff --git a/source/java/org/alfresco/repo/web/scripts/bean/BaseRemoteStore.java b/source/java/org/alfresco/repo/web/scripts/bean/BaseRemoteStore.java index 47ea18ddca..00772b116f 100644 --- a/source/java/org/alfresco/repo/web/scripts/bean/BaseRemoteStore.java +++ b/source/java/org/alfresco/repo/web/scripts/bean/BaseRemoteStore.java @@ -91,10 +91,10 @@ public abstract class BaseRemoteStore extends AbstractWebScript { public static final String TOKEN_STORE = "s"; public static final String TOKEN_WEBAPP = "w"; - + public static final String REQUEST_PARAM_STORE = "s"; public static final String REQUEST_PARAM_WEBAPP = "w"; - + private static final Log logger = LogFactory.getLog(BaseRemoteStore.class); protected String defaultStore; @@ -160,30 +160,30 @@ public abstract class BaseRemoteStore extends AbstractWebScript if (TOKEN_STORE.equals(el)) { - // if the token is "s", then the next token is the id of the store + // if the token is TOKEN_STORE, then the next token is the id of the store store = tokenizer.nextToken(); - // reset el + // reset element el = (tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null); } if (TOKEN_WEBAPP.equals(el)) { - // if the token is "w", then the next token is a WCM webapp id + // if the token is TOKEN_WEBAPP, then the next token is a WCM webapp id webapp = tokenizer.nextToken(); - // reset el + // reset element el = (tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null); } - while(el != null) + while (el != null) { - if(pathBuilder == null) + if (pathBuilder == null) { pathBuilder = new StringBuilder(128); } - pathBuilder.append("/"); + pathBuilder.append('/'); pathBuilder.append(el); el = (tokenizer.hasMoreTokens() ? tokenizer.nextToken() : null); @@ -209,7 +209,8 @@ public abstract class BaseRemoteStore extends AbstractWebScript // this means that a store was not passed in and that we // also didn't have a configured store - throw new WebScriptException("Unable to determine which store to operate against. A store was not specified and a default was not provided."); + throw new WebScriptException("Unable to determine which store to operate against." + + " A store was not specified and a default was not provided."); } } @@ -227,7 +228,7 @@ public abstract class BaseRemoteStore extends AbstractWebScript // convert down to the path String path = pathBuilder.toString(); - + // debugger information if (logger.isDebugEnabled()) {