Merged V3.2 to HEAD

15182: Much improved ScriptNode childByNamePath() implementation, ScriptNode API for getParents() and getParentAssocs() and test script for the new APIs.


git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@15184 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
Kevin Roast
2009-07-14 16:35:27 +00:00
parent 1adffd1e4e
commit 7f0e03e131
2 changed files with 38 additions and 27 deletions

View File

@@ -172,9 +172,8 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
protected TemplateImageResolver imageResolver = null;
protected ScriptNode parent = null;
private ChildAssociationRef primaryParentAssoc = null;
private ScriptableQNameMap<String, Object> parentAssocs = null;
private ScriptableQNameMap<String, Object> parentAssocs = null;
// NOTE: see the reset() method when adding new cached members!
// ------------------------------------------------------------------------------
@@ -401,34 +400,20 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
*/
public ScriptNode childByNamePath(String path)
{
NodeRef result = null;
// convert the name based path to a valid XPath query
StringBuilder xpath = new StringBuilder(path.length() << 1);
StringTokenizer t = new StringTokenizer(path, "/");
int count = 0;
QueryParameterDefinition[] params = new QueryParameterDefinition[t.countTokens()];
DataTypeDefinition ddText =
this.services.getDictionaryService().getDataType(DataTypeDefinition.TEXT);
NamespaceService ns = this.services.getNamespaceService();
while (t.hasMoreTokens())
if (t.hasMoreTokens())
{
if (xpath.length() != 0)
result = this.nodeRef;
while (t.hasMoreTokens() && result != null)
{
xpath.append('/');
result = this.nodeService.getChildByName(result, ContentModel.ASSOC_CONTAINS, t.nextToken());
}
String strCount = Integer.toString(count);
xpath.append("*[@cm:name=$cm:name")
.append(strCount)
.append(']');
params[count++] = new QueryParameterDefImpl(
QName.createQName(NamespaceService.CONTENT_MODEL_PREFIX, "name" + strCount, ns),
ddText,
true,
t.nextToken());
}
Object[] nodes = getChildrenByXPath(xpath.toString(), params, true);
return (nodes.length != 0) ? (ScriptNode)nodes[0] : null;
return (result != null ? newInstance(result, this.services, this.scope) : null);
}
/**
@@ -583,7 +568,7 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
{
return getChildAssocs();
}
/**
* Return the parent associations to this Node. As a Map of assoc name to a JavaScript array of Nodes.
* The Map returned implements the Scriptable interface to allow access to the assoc arrays via JavaScript
@@ -631,7 +616,7 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
{
return getParentAssocs();
}
/**
* Return all the properties known about this node. The Map returned implements the Scriptable interface to
* allow access to the properties via JavaScript associative array access. This means properties of a node can
@@ -836,7 +821,7 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
}
/**
* @return the parent node
* @return the primary parent node
*/
public ScriptNode getParent()
{
@@ -853,6 +838,21 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
return parent;
}
/**
* @return all parent nodes
*/
public Scriptable getParents()
{
List<ChildAssociationRef> parentRefs = this.nodeService.getParentAssocs(this.nodeRef);
Object[] parents = new Object[parentRefs.size()];
for (int i = 0; i < parentRefs.size(); i++)
{
NodeRef ref = parentRefs.get(i).getParentRef();
parents[i] = newInstance(ref, this.services, this.scope);
}
return Context.getCurrentContext().newArray(this.scope, parents);
}
/**
* @return the primary parent association so we can get at the association QName and the association type QName.
*/
@@ -2574,13 +2574,13 @@ public class ScriptNode implements Serializable, Scopeable, NamespacePrefixResol
this.sourceAssocs = null;
this.childAssocs = null;
this.children = null;
this.parentAssocs = null;
this.displayPath = null;
this.isDocument = null;
this.isContainer = null;
this.parent = null;
this.primaryParentAssoc = null;
this.activeWorkflows = null;
this.parentAssocs = null;
}
/**

View File

@@ -0,0 +1,11 @@
var child1 = companyhome.childByNamePath("/Data Dictionary");
var child2 = companyhome.childByNamePath("/Data Dictionary/Scripts");
var child3 = companyhome.childByNamePath("/Data Dictionary/Scripts/backup and log.js");
logger.getSystem().out(child1 != null && child2 != null && child3 != null);
var parentCount = child1.parentAssocs["contains"].length;
var parents = child2.parents;
var result = (child1 != null && child2 != null && child3 != null && parentCount == 1 && parents.length == 1);
result;