use of org.alfresco.service.cmr.repository.Path.ChildAssocElement in project alfresco-repository by Alfresco.
the class SOLRTrackingComponentImpl method getNodesMetadata.
/**
* {@inheritDoc}
*/
public void getNodesMetadata(NodeMetaDataParameters nodeMetaDataParameters, MetaDataResultsFilter resultFilter, NodeMetaDataQueryCallback callback) {
if (false == enabled) {
return;
}
NodeMetaDataQueryRowHandler rowHandler = new NodeMetaDataQueryRowHandler(callback);
boolean includeType = (resultFilter == null ? true : resultFilter.getIncludeType());
boolean includeProperties = (resultFilter == null ? true : resultFilter.getIncludeProperties());
boolean includeAspects = (resultFilter == null ? true : resultFilter.getIncludeAspects());
boolean includePaths = (resultFilter == null ? true : resultFilter.getIncludePaths());
boolean includeNodeRef = (resultFilter == null ? true : resultFilter.getIncludeNodeRef());
boolean includeParentAssociations = (resultFilter == null ? true : resultFilter.getIncludeParentAssociations());
boolean includeChildAssociations = (resultFilter == null ? true : resultFilter.getIncludeChildAssociations());
boolean includeOwner = (resultFilter == null ? true : resultFilter.getIncludeOwner());
boolean includeChildIds = (resultFilter == null ? true : resultFilter.getIncludeChildIds());
boolean includeTxnId = (resultFilter == null ? true : resultFilter.getIncludeTxnId());
List<Long> nodeIds = preCacheNodes(nodeMetaDataParameters);
for (Long nodeId : nodeIds) {
Status status = nodeDAO.getNodeIdStatus(nodeId);
if (status == null) {
// See org.alfresco.solr.tracker.CoreTracker.updateDescendantAuxDocs(NodeMetaData, boolean, SolrIndexSearcher)
continue;
}
NodeRef nodeRef = status.getNodeRef();
NodeRef unversionedNodeRef = null;
if (isVersionNodeRef(nodeRef)) {
unversionedNodeRef = convertVersionNodeRefToVersionedNodeRef(VersionUtil.convertNodeRef(nodeRef));
}
NodeMetaData nodeMetaData = new NodeMetaData();
nodeMetaData.setNodeId(nodeId);
if (includeNodeRef) {
nodeMetaData.setNodeRef(tenantService.getBaseName(nodeRef, true));
}
if (includeTxnId) {
nodeMetaData.setTxnId(status.getDbTxnId());
}
if (status.isDeleted()) {
rowHandler.processResult(nodeMetaData);
continue;
}
Map<QName, Serializable> props = null;
Set<QName> aspects = null;
Status unversionedStatus = null;
if (unversionedNodeRef != null) {
unversionedStatus = nodeDAO.getNodeRefStatus(unversionedNodeRef);
}
if (unversionedStatus != null) {
nodeMetaData.setAclId(nodeDAO.getNodeAclId(unversionedStatus.getDbId()));
} else {
nodeMetaData.setAclId(nodeDAO.getNodeAclId(nodeId));
}
if (includeType) {
QName nodeType = getNodeType(nodeId);
if (nodeType != null) {
nodeMetaData.setNodeType(nodeType);
} else {
QName typeQName = null;
TypeDefinition typeDefinition = null;
String errorMessage = "NodeId " + nodeId + " with nodeRef " + nodeRef;
typeQName = nodeDAO.getNodeType(nodeId);
if (typeQName != null) {
errorMessage += " has type " + typeQName + ", but this type is not registered in DictionaryService.";
} else {
errorMessage += " has no type.";
}
throw new AlfrescoRuntimeException(errorMessage + " It will be ignored by SOLR.");
}
}
if (includeProperties) {
if (props == null) {
props = getProperties(nodeId);
}
nodeMetaData.setProperties(props);
} else {
nodeMetaData.setProperties(Collections.<QName, Serializable>emptyMap());
}
if (includeAspects || includePaths || includeParentAssociations) {
aspects = getNodeAspects(nodeId);
}
nodeMetaData.setAspects(aspects);
boolean ignoreLargeMetadata = (typeIndexFilter.shouldBeIgnored(getNodeType(nodeId)) || aspectIndexFilter.shouldBeIgnored(getNodeAspects(nodeId)));
CategoryPaths categoryPaths = new CategoryPaths(new ArrayList<Pair<Path, QName>>(), new ArrayList<ChildAssociationRef>());
if (!ignoreLargeMetadata && (includePaths || includeParentAssociations)) {
if (props == null) {
props = getProperties(nodeId);
}
categoryPaths = getCategoryPaths(status.getNodeRef(), aspects, props);
}
if (!ignoreLargeMetadata && (typeIndexFilter.isIgnorePathsForSpecificTypes() || aspectIndexFilter.isIgnorePathsForSpecificAspects() || includeParentAssociations)) {
// check if parent should be ignored
final List<Long> parentIds = new LinkedList<Long>();
final List<ChildAssociationRef> parentAssocs = new ArrayList<ChildAssociationRef>(100);
nodeDAO.getParentAssocs(nodeId, null, null, true, new ChildAssocRefQueryCallback() {
@Override
public boolean preLoadNodes() {
return false;
}
@Override
public boolean orderResults() {
return false;
}
@Override
public boolean handle(Pair<Long, ChildAssociationRef> childAssocPair, Pair<Long, NodeRef> parentNodePair, Pair<Long, NodeRef> childNodePair) {
parentIds.add(parentNodePair.getFirst());
parentAssocs.add(tenantService.getBaseName(childAssocPair.getSecond(), true));
return false;
}
@Override
public void done() {
}
});
if (!parentIds.isEmpty()) {
Long parentId = parentIds.iterator().next();
if (typeIndexFilter.isIgnorePathsForSpecificTypes()) {
QName parentType = getNodeType(parentId);
ignoreLargeMetadata = typeIndexFilter.shouldBeIgnored(parentType);
}
if (!ignoreLargeMetadata && aspectIndexFilter.isIgnorePathsForSpecificAspects()) {
ignoreLargeMetadata = aspectIndexFilter.shouldBeIgnored(getNodeAspects(parentId));
}
}
if (includeParentAssociations) {
for (ChildAssociationRef ref : categoryPaths.getCategoryParents()) {
parentAssocs.add(tenantService.getBaseName(ref, true));
}
CRC32 crc = new CRC32();
for (ChildAssociationRef car : parentAssocs) {
try {
crc.update(car.toString().getBytes("UTF-8"));
} catch (UnsupportedEncodingException e) {
throw new RuntimeException("UTF-8 encoding is not supported");
}
}
nodeMetaData.setParentAssocs(parentAssocs, crc.getValue());
}
}
nodeMetaData.setTenantDomain(tenantService.getDomain(nodeRef.getStoreRef().getIdentifier()));
if (includeChildAssociations || includeChildIds) {
final List<ChildAssociationRef> childAssocs = new ArrayList<ChildAssociationRef>(100);
final List<Long> childIds = new ArrayList<Long>(100);
nodeDAO.getChildAssocs(nodeId, null, null, null, null, null, new ChildAssocRefQueryCallback() {
@Override
public boolean preLoadNodes() {
return false;
}
@Override
public boolean orderResults() {
return false;
}
@Override
public boolean handle(Pair<Long, ChildAssociationRef> childAssocPair, Pair<Long, NodeRef> parentNodePair, Pair<Long, NodeRef> childNodePair) {
QName nodeType = nodeDAO.getNodeType(childNodePair.getFirst());
if (includeChildAssociations) {
boolean addCurrentChildAssoc = true;
if (typeIndexFilter.isIgnorePathsForSpecificTypes()) {
addCurrentChildAssoc = !typeIndexFilter.shouldBeIgnored(nodeType);
}
if (!addCurrentChildAssoc && aspectIndexFilter.isIgnorePathsForSpecificAspects()) {
addCurrentChildAssoc = !aspectIndexFilter.shouldBeIgnored(getNodeAspects(childNodePair.getFirst()));
}
if (addCurrentChildAssoc) {
childAssocs.add(tenantService.getBaseName(childAssocPair.getSecond(), true));
}
}
if (includeChildIds) {
boolean addCurrentId = true;
if (typeIndexFilter.isIgnorePathsForSpecificTypes()) {
addCurrentId = !typeIndexFilter.shouldBeIgnored(nodeType);
}
if (!addCurrentId) {
addCurrentId = !aspectIndexFilter.shouldBeIgnored(getNodeAspects(childNodePair.getFirst()));
}
if (addCurrentId) {
childIds.add(childNodePair.getFirst());
}
}
return true;
}
@Override
public void done() {
}
});
nodeMetaData.setChildAssocs(childAssocs);
nodeMetaData.setChildIds(childIds);
}
if (includePaths && !ignoreLargeMetadata) {
List<Path> directPaths = nodeDAO.getPaths(new Pair<Long, NodeRef>(nodeId, status.getNodeRef()), false);
Collection<Pair<Path, QName>> paths = new ArrayList<Pair<Path, QName>>(directPaths.size() + categoryPaths.getPaths().size());
for (Path path : directPaths) {
paths.add(new Pair<Path, QName>(path.getBaseNamePath(tenantService), null));
}
for (Pair<Path, QName> catPair : categoryPaths.getPaths()) {
paths.add(new Pair<Path, QName>(catPair.getFirst().getBaseNamePath(tenantService), catPair.getSecond()));
}
if (unversionedStatus != null) {
List<Path> unversionedPaths = nodeDAO.getPaths(new Pair<Long, NodeRef>(unversionedStatus.getDbId(), unversionedStatus.getNodeRef()), false);
for (Path path : unversionedPaths) {
paths.add(new Pair<Path, QName>(path.getBaseNamePath(tenantService), null));
}
}
nodeMetaData.setPaths(paths);
// Calculate name path
Collection<Collection<String>> namePaths = new ArrayList<Collection<String>>(2);
nodeMetaData.setNamePaths(namePaths);
for (Pair<Path, QName> catPair : paths) {
Path path = catPair.getFirst();
boolean added = false;
List<String> namePath = new ArrayList<String>(path.size());
NEXT_ELEMENT: for (Path.Element pathElement : path) {
if (!(pathElement instanceof ChildAssocElement)) {
// This is some path element that is terminal to a cm:name path
break;
}
ChildAssocElement pathChildAssocElement = (ChildAssocElement) pathElement;
NodeRef childNodeRef = pathChildAssocElement.getRef().getChildRef();
Pair<Long, NodeRef> childNodePair = nodeDAO.getNodePair(childNodeRef);
if (childNodePair == null) {
// Gone
break;
}
Long childNodeId = childNodePair.getFirst();
String childNodeName = (String) nodeDAO.getNodeProperty(childNodeId, ContentModel.PROP_NAME);
if (childNodeName == null) {
// We have hit a non-name node, which acts as a root for cm:name
// DH: There is no particular constraint here. This is just a decision made.
namePath.clear();
// We have to continue down the path as there could be a name path lower down
continue NEXT_ELEMENT;
}
// We can finally add the name to the path
namePath.add(childNodeName);
// Add the path if this is the first entry in the name path
if (!added) {
namePaths.add(namePath);
added = true;
}
}
}
}
if (includeOwner) {
// cached in OwnableService
nodeMetaData.setOwner(ownableService.getOwner(status.getNodeRef()));
}
rowHandler.processResult(nodeMetaData);
}
}
use of org.alfresco.service.cmr.repository.Path.ChildAssocElement in project alfresco-repository by Alfresco.
the class ACPExportPackageHandler method toDisplayPath.
/**
* @param path Path
* @return display path
*/
private String toDisplayPath(Path path) {
StringBuffer displayPath = new StringBuffer();
if (path.size() == 1) {
displayPath.append("/");
} else {
for (int i = 1; i < path.size(); i++) {
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement) {
ChildAssociationRef assocRef = ((ChildAssocElement) element).getRef();
NodeRef node = assocRef.getChildRef();
displayPath.append("/");
displayPath.append(nodeService.getProperty(node, ContentModel.PROP_NAME));
}
}
}
return displayPath.toString();
}
use of org.alfresco.service.cmr.repository.Path.ChildAssocElement in project alfresco-repository by Alfresco.
the class AbstractEventsService method getNodeIdsFromParent.
/**
* For each path, construct a list of ancestor node ids starting with the parent node id first.
*
* @param nodePaths
* @return
*/
protected List<List<String>> getNodeIdsFromParent(List<Path> nodePaths) {
// TODO use fileFolderService.getNamePath instead?
List<List<String>> pathNodeIds = new ArrayList<List<String>>(nodePaths.size());
for (Path path : nodePaths) {
List<String> nodeIds = new ArrayList<String>(path.size());
// add in reverse order (so the first element is the immediate parent)
for (int i = path.size() - 2; i >= 0; i--) {
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement) {
ChildAssocElement childAssocElem = (ChildAssocElement) element;
NodeRef childNodeRef = childAssocElem.getRef().getChildRef();
nodeIds.add(childNodeRef.getId());
}
}
pathNodeIds.add(nodeIds);
}
return pathNodeIds;
}
use of org.alfresco.service.cmr.repository.Path.ChildAssocElement in project alfresco-repository by Alfresco.
the class CMISConnector method getPath.
public String getPath(NodeRef nodeRef) {
try {
Path path = nodeService.getPath(nodeRef);
// skip to CMIS root path
NodeRef rootNode = getRootNodeRef();
int i = 0;
while (i < path.size()) {
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement) {
ChildAssociationRef assocRef = ((ChildAssocElement) element).getRef();
NodeRef node = assocRef.getChildRef();
if (node.equals(rootNode)) {
break;
}
}
i++;
}
StringBuilder displayPath = new StringBuilder(64);
if (path.size() - i == 1) {
// render root path
displayPath.append("/");
} else {
// render CMIS scoped path
i++;
while (i < path.size()) {
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement) {
ChildAssociationRef assocRef = ((ChildAssocElement) element).getRef();
NodeRef node = assocRef.getChildRef();
displayPath.append("/");
displayPath.append(nodeService.getProperty(node, ContentModel.PROP_NAME));
}
i++;
}
}
return displayPath.toString();
} catch (InvalidNodeRefException inre) {
return null;
}
}
use of org.alfresco.service.cmr.repository.Path.ChildAssocElement in project alfresco-repository by Alfresco.
the class AbstractEventsService method getNodeIds.
/**
* For each path, construct a list of ancestor node ids starting with the leaf path element node id first.
*
* @param nodePaths
* @return
*/
protected List<List<String>> getNodeIds(List<Path> nodePaths) {
// TODO use fileFolderService.getNamePath instead?
List<List<String>> pathNodeIds = new ArrayList<List<String>>(nodePaths.size());
for (Path path : nodePaths) {
List<String> nodeIds = new ArrayList<String>(path.size());
// add in reverse order (so the first element is the immediate parent)
for (int i = path.size() - 1; i >= 0; i--) {
Path.Element element = path.get(i);
if (element instanceof ChildAssocElement) {
ChildAssocElement childAssocElem = (ChildAssocElement) element;
NodeRef childNodeRef = childAssocElem.getRef().getChildRef();
nodeIds.add(childNodeRef.getId());
}
}
pathNodeIds.add(nodeIds);
}
return pathNodeIds;
}
Aggregations