Search in sources :

Example 1 with ChildAssocElement

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);
    }
}
Also used : Serializable(java.io.Serializable) CRC32(java.util.zip.CRC32) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) ArrayList(java.util.ArrayList) ChildAssocRefQueryCallback(org.alfresco.repo.domain.node.NodeDAO.ChildAssocRefQueryCallback) TypeDefinition(org.alfresco.service.cmr.dictionary.TypeDefinition) DataTypeDefinition(org.alfresco.service.cmr.dictionary.DataTypeDefinition) NodeRef(org.alfresco.service.cmr.repository.NodeRef) AlfrescoRuntimeException(org.alfresco.error.AlfrescoRuntimeException) Pair(org.alfresco.util.Pair) Status(org.alfresco.service.cmr.repository.NodeRef.Status) Path(org.alfresco.service.cmr.repository.Path) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) QName(org.alfresco.service.namespace.QName) UnsupportedEncodingException(java.io.UnsupportedEncodingException) ChildAssociationRef(org.alfresco.service.cmr.repository.ChildAssociationRef) LinkedList(java.util.LinkedList) AlfrescoRuntimeException(org.alfresco.error.AlfrescoRuntimeException) Collection(java.util.Collection)

Example 2 with ChildAssocElement

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();
}
Also used : Path(org.alfresco.service.cmr.repository.Path) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) ChildAssociationRef(org.alfresco.service.cmr.repository.ChildAssociationRef)

Example 3 with ChildAssocElement

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;
}
Also used : Path(org.alfresco.service.cmr.repository.Path) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList)

Example 4 with ChildAssocElement

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;
    }
}
Also used : Path(org.alfresco.service.cmr.repository.Path) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) InvalidNodeRefException(org.alfresco.service.cmr.repository.InvalidNodeRefException) ChildAssociationRef(org.alfresco.service.cmr.repository.ChildAssociationRef)

Example 5 with ChildAssocElement

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;
}
Also used : Path(org.alfresco.service.cmr.repository.Path) NodeRef(org.alfresco.service.cmr.repository.NodeRef) ChildAssocElement(org.alfresco.service.cmr.repository.Path.ChildAssocElement) ArrayList(java.util.ArrayList) List(java.util.List) ArrayList(java.util.ArrayList) LinkedList(java.util.LinkedList)

Aggregations

NodeRef (org.alfresco.service.cmr.repository.NodeRef)8 Path (org.alfresco.service.cmr.repository.Path)8 ChildAssocElement (org.alfresco.service.cmr.repository.Path.ChildAssocElement)8 ChildAssociationRef (org.alfresco.service.cmr.repository.ChildAssociationRef)5 ArrayList (java.util.ArrayList)4 LinkedList (java.util.LinkedList)3 List (java.util.List)2 QName (org.alfresco.service.namespace.QName)2 Serializable (java.io.Serializable)1 UnsupportedEncodingException (java.io.UnsupportedEncodingException)1 Collection (java.util.Collection)1 CRC32 (java.util.zip.CRC32)1 AlfrescoRuntimeException (org.alfresco.error.AlfrescoRuntimeException)1 ChildAssocRefQueryCallback (org.alfresco.repo.domain.node.NodeDAO.ChildAssocRefQueryCallback)1 AccessDeniedException (org.alfresco.repo.security.permissions.AccessDeniedException)1 PermissionReference (org.alfresco.repo.security.permissions.PermissionReference)1 VirtualizationException (org.alfresco.repo.virtual.VirtualizationException)1 GetParentReferenceMethod (org.alfresco.repo.virtual.ref.GetParentReferenceMethod)1 GetTemplatePathMethod (org.alfresco.repo.virtual.ref.GetTemplatePathMethod)1 Reference (org.alfresco.repo.virtual.ref.Reference)1