Search in sources :

Example 21 with FileInfo

use of org.alfresco.service.cmr.model.FileInfo in project alfresco-remote-api by Alfresco.

the class NodesImpl method moveOrCopyNode.

@Override
public Node moveOrCopyNode(String sourceNodeId, String targetParentId, String name, Parameters parameters, boolean isCopy) {
    if ((sourceNodeId == null) || (sourceNodeId.isEmpty())) {
        throw new InvalidArgumentException("Missing sourceNodeId");
    }
    if ((targetParentId == null) || (targetParentId.isEmpty())) {
        throw new InvalidArgumentException("Missing targetParentId");
    }
    final NodeRef parentNodeRef = validateOrLookupNode(targetParentId, null);
    final NodeRef sourceNodeRef = validateOrLookupNode(sourceNodeId, null);
    FileInfo fi = moveOrCopyImpl(sourceNodeRef, parentNodeRef, name, isCopy);
    return getFolderOrDocument(fi.getNodeRef().getId(), parameters);
}
Also used : NodeRef(org.alfresco.service.cmr.repository.NodeRef) InvalidArgumentException(org.alfresco.rest.framework.core.exceptions.InvalidArgumentException) FileInfo(org.alfresco.service.cmr.model.FileInfo)

Example 22 with FileInfo

use of org.alfresco.service.cmr.model.FileInfo in project alfresco-remote-api by Alfresco.

the class NodesImpl method listChildren.

@Override
public CollectionWithPagingInfo<Node> listChildren(String parentFolderNodeId, Parameters parameters) {
    String path = parameters.getParameter(PARAM_RELATIVE_PATH);
    final NodeRef parentNodeRef = validateOrLookupNode(parentFolderNodeId, path);
    final List<String> includeParam = parameters.getInclude();
    QName assocTypeQNameParam = null;
    Query q = parameters.getQuery();
    if (q != null) {
        // filtering via "where" clause
        MapBasedQueryWalker propertyWalker = createListChildrenQueryWalker();
        QueryHelper.walk(q, propertyWalker);
        String assocTypeQNameStr = propertyWalker.getProperty(PARAM_ASSOC_TYPE, WhereClauseParser.EQUALS, String.class);
        if (assocTypeQNameStr != null) {
            assocTypeQNameParam = getAssocType(assocTypeQNameStr);
        }
    }
    List<Pair<QName, Boolean>> sortProps = getListChildrenSortProps(parameters);
    List<FilterProp> filterProps = getListChildrenFilterProps(parameters);
    Paging paging = parameters.getPaging();
    PagingRequest pagingRequest = Util.getPagingRequest(paging);
    final PagingResults<FileInfo> pagingResults;
    Pair<Set<QName>, Set<QName>> pair = buildSearchTypesAndIgnoreAspects(parameters);
    Set<QName> searchTypeQNames = pair.getFirst();
    Set<QName> ignoreAspectQNames = pair.getSecond();
    Set<QName> assocTypeQNames = buildAssocTypes(assocTypeQNameParam);
    // call GetChildrenCannedQuery (via FileFolderService)
    if (((filterProps == null) || (filterProps.size() == 0)) && ((assocTypeQNames == null) || (assocTypeQNames.size() == 0)) && (smartStore.isVirtual(parentNodeRef) || (smartStore.canVirtualize(parentNodeRef)))) {
        pagingResults = fileFolderService.list(parentNodeRef, searchTypeQNames, ignoreAspectQNames, sortProps, pagingRequest);
    } else {
        // TODO smart folders (see REPO-1173)
        pagingResults = fileFolderService.list(parentNodeRef, assocTypeQNames, searchTypeQNames, ignoreAspectQNames, sortProps, filterProps, pagingRequest);
    }
    final Map<String, UserInfo> mapUserInfo = new HashMap<>(10);
    final List<FileInfo> page = pagingResults.getPage();
    List<Node> nodes = new AbstractList<Node>() {

        @Override
        public Node get(int index) {
            FileInfo fInfo = page.get(index);
            // minimal info by default (unless "include"d otherwise)
            // (pass in null as parentNodeRef to force loading of primary
            // parent node as parentId)
            Node node = getFolderOrDocument(fInfo.getNodeRef(), null, fInfo.getType(), includeParam, mapUserInfo);
            if (node.getPath() != null) {
                calculateRelativePath(parentFolderNodeId, node);
            }
            return node;
        }

        private void calculateRelativePath(String parentFolderNodeId, Node node) {
            NodeRef rootNodeRef = validateOrLookupNode(parentFolderNodeId, null);
            try {
                // get the path elements
                List<String> pathInfos = fileFolderService.getNameOnlyPath(rootNodeRef, node.getNodeRef());
                int sizePathInfos = pathInfos.size();
                if (sizePathInfos > 1) {
                    // remove the current child
                    pathInfos.remove(sizePathInfos - 1);
                    // build the path string
                    StringBuilder sb = new StringBuilder(pathInfos.size() * 20);
                    for (String fileInfo : pathInfos) {
                        sb.append("/");
                        sb.append(fileInfo);
                    }
                    node.getPath().setRelativePath(sb.toString());
                }
            } catch (FileNotFoundException e) {
            // NOTE: return null as relativePath
            }
        }

        @Override
        public int size() {
            return page.size();
        }
    };
    Node sourceEntity = null;
    if (parameters.includeSource()) {
        sourceEntity = getFolderOrDocumentFullInfo(parentNodeRef, null, null, null, mapUserInfo);
    }
    return CollectionWithPagingInfo.asPaged(paging, nodes, pagingResults.hasMoreItems(), pagingResults.getTotalResultCount().getFirst(), sourceEntity);
}
Also used : Set(java.util.Set) LinkedHashSet(java.util.LinkedHashSet) HashSet(java.util.HashSet) Query(org.alfresco.rest.framework.resource.parameters.where.Query) GetChildrenCannedQuery(org.alfresco.repo.node.getchildren.GetChildrenCannedQuery) ConcurrentHashMap(java.util.concurrent.ConcurrentHashMap) HashMap(java.util.HashMap) Node(org.alfresco.rest.api.model.Node) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException) UserInfo(org.alfresco.rest.api.model.UserInfo) NodeRef(org.alfresco.service.cmr.repository.NodeRef) FileInfo(org.alfresco.service.cmr.model.FileInfo) MapBasedQueryWalker(org.alfresco.rest.workflow.api.impl.MapBasedQueryWalker) Pair(org.alfresco.util.Pair) AbstractList(java.util.AbstractList) FilterProp(org.alfresco.repo.node.getchildren.FilterProp) QName(org.alfresco.service.namespace.QName) Paging(org.alfresco.rest.framework.resource.parameters.Paging) PagingRequest(org.alfresco.query.PagingRequest)

Example 23 with FileInfo

use of org.alfresco.service.cmr.model.FileInfo in project alfresco-remote-api by Alfresco.

the class DeleteMethod method executeImpl.

/**
 * Execute the request
 *
 * @exception WebDAVServerException
 */
protected void executeImpl() throws WebDAVServerException, Exception {
    if (logger.isDebugEnabled()) {
        logger.debug("WebDAV DELETE: " + getPath());
    }
    final FileFolderService fileFolderService = getFileFolderService();
    final PermissionService permissionService = getPermissionService();
    NodeRef rootNodeRef = getRootNodeRef();
    String path = getPath();
    FileInfo fileInfo = null;
    try {
        // get the node to delete
        fileInfo = getNodeForPath(rootNodeRef, path);
    } catch (FileNotFoundException e) {
        if (logger.isDebugEnabled()) {
            logger.debug("Node not found: " + getPath());
        }
        throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND);
    }
    checkNode(fileInfo);
    final NodeService nodeService = getNodeService();
    final NodeRef nodeRef = fileInfo.getNodeRef();
    if (permissionService.hasPermission(nodeRef, PermissionService.DELETE) == AccessStatus.ALLOWED) {
        // As this content will be deleted, we need to extract some info before it's no longer available.
        String siteId = getSiteId();
        NodeRef deletedNodeRef = fileInfo.getNodeRef();
        FileInfo parentFile = getDAVHelper().getParentNodeForPath(getRootNodeRef(), path);
        // Don't post activity data for hidden files, resource forks etc.
        if (!getDAVHelper().isRenameShuffle(path)) {
            postActivity(parentFile, fileInfo, siteId);
        }
        // MNT-181: working copies and versioned nodes are hidden rather than deleted
        if (nodeService.hasAspect(nodeRef, ContentModel.ASPECT_WORKING_COPY) || nodeService.hasAspect(nodeRef, ContentModel.ASPECT_VERSIONABLE)) {
            // Mark content as hidden.  This breaks many contracts and will be fixed for "ALF-18619 WebDAV/SPP file shuffles"
            fileFolderService.setHidden(nodeRef, true);
            {
                // Workaround for MNT-8704: WebDAV:Content does not disappear after being deleted
                // Get the current user
                final String deleteDelayUser = AuthenticationUtil.getFullyAuthenticatedUser();
                // Add a timed task to really delete the file
                TimerTask deleteDelayTask = new TimerTask() {

                    @Override
                    public void run() {
                        RunAsWork<Void> deleteDelayRunAs = new RunAsWork<Void>() {

                            @Override
                            public Void doWork() throws Exception {
                                // Ignore if it is NOT hidden: the shuffle may have finished; the operation may have failed
                                if (!nodeService.exists(nodeRef) || !fileFolderService.isHidden(nodeRef)) {
                                    return null;
                                }
                                // Since this will run in a different thread, the client thread-local must be set
                                // or else unhiding the node will not unhide it for WebDAV.
                                FileFilterMode.setClient(FileFilterMode.Client.webdav);
                                // Unhide the node, e.g. for archiving
                                fileFolderService.setHidden(nodeRef, false);
                                // This is the transaction-aware service
                                fileFolderService.delete(nodeRef);
                                return null;
                            }
                        };
                        try {
                            AuthenticationUtil.runAs(deleteDelayRunAs, deleteDelayUser);
                        } catch (Throwable e) {
                            // consume exception to avoid it leaking from the TimerTask and causing the Timer to
                            // no longer accept tasks to be scheduled.
                            logger.info("Exception thrown during WebDAV delete timer task.", e);
                        }
                    }
                };
                // Schedule a real delete 5 seconds after the current time
                deleteDelayTimer.schedule(deleteDelayTask, 5000L);
            }
            // node is is actually locked before unlocking to avoid access denied
            if (getDAVLockService().getLockInfo(nodeRef).isLocked()) {
                getDAVLockService().unlock(nodeRef);
            }
        } else // We just ensure already-hidden nodes are left unlocked
        if (fileFolderService.isHidden(nodeRef)) {
            getDAVLockService().unlock(nodeRef);
        } else // A 'real' delete
        {
            // Delete it
            fileFolderService.delete(deletedNodeRef);
        }
    } else {
        // access denied
        throw new WebDAVServerException(HttpServletResponse.SC_FORBIDDEN);
    }
}
Also used : RunAsWork(org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork) NodeService(org.alfresco.service.cmr.repository.NodeService) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException) FileFolderService(org.alfresco.service.cmr.model.FileFolderService) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException) PermissionService(org.alfresco.service.cmr.security.PermissionService) NodeRef(org.alfresco.service.cmr.repository.NodeRef) FileInfo(org.alfresco.service.cmr.model.FileInfo) TimerTask(java.util.TimerTask)

Example 24 with FileInfo

use of org.alfresco.service.cmr.model.FileInfo in project alfresco-remote-api by Alfresco.

the class GetMethod method executeImpl.

/**
 * Exceute the WebDAV request
 *
 * @exception WebDAVServerException
 */
protected void executeImpl() throws WebDAVServerException, Exception {
    FileFolderService fileFolderService = getFileFolderService();
    NodeRef rootNodeRef = getRootNodeRef();
    String path = getPath();
    if (!m_returnContent) {
        // There are multiple cases where no content is sent (due to a HEAD request).
        // All of them require that the content length is set appropriately.
        m_response.setContentLength(0);
    }
    FileInfo nodeInfo = null;
    try {
        nodeInfo = getDAVHelper().getNodeForPath(rootNodeRef, path);
    } catch (FileNotFoundException e) {
        throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND);
    }
    FileInfo realNodeInfo = nodeInfo;
    // This is at least consistent with the way the CIFS server handles links. See org.alfresco.filesys.repo.ContentDiskDriver.openFile().
    if (realNodeInfo.isLink()) {
        Path pathToNode = getNodeService().getPath(nodeInfo.getLinkNodeRef());
        if (pathToNode.size() > 2) {
            pathToNode = pathToNode.subPath(2, pathToNode.size() - 1);
        }
        String rootURL = getDAVHelper().getURLForPath(m_request, pathToNode.toDisplayPath(getNodeService(), getPermissionService()), true);
        if (rootURL.endsWith(WebDAVHelper.PathSeperator) == false) {
            rootURL = rootURL + WebDAVHelper.PathSeperator;
        }
        String fname = (String) getNodeService().getProperty(nodeInfo.getLinkNodeRef(), ContentModel.PROP_NAME);
        StringBuilder urlStr = new StringBuilder(200);
        urlStr.append("[InternetShortcut]\r\n");
        urlStr.append("URL=file://");
        urlStr.append(m_request.getServerName());
        // Only append the port if it is non-default for compatibility with XP
        int port = m_request.getServerPort();
        if (port != 80) {
            urlStr.append(":").append(port);
        }
        urlStr.append(rootURL).append(WebDAVHelper.encodeURL(fname, m_userAgent));
        urlStr.append("\r\n");
        m_response.setHeader(WebDAV.HEADER_CONTENT_TYPE, "text/plain; charset=ISO-8859-1");
        m_response.setHeader(WebDAV.HEADER_CONTENT_LENGTH, String.valueOf(urlStr.length()));
        m_response.getWriter().write(urlStr.toString());
    } else // Check if the node is a folder
    if (realNodeInfo.isFolder()) {
        // is content required
        if (!m_returnContent) {
            // ALF-7883 fix, HEAD for collection (see http://www.webdav.org/specs/rfc2518.html#rfc.section.8.4)
            return;
        }
        // Generate a folder listing
        m_response.setContentType("text/html;charset=UTF-8");
        generateDirectoryListing(nodeInfo);
    } else {
        // Return the node details, and content if requested, check that the node passes the pre-conditions
        checkPreConditions(realNodeInfo);
        // Build the response header
        m_response.setHeader(WebDAV.HEADER_ETAG, getDAVHelper().makeQuotedETag(nodeInfo));
        Date modifiedDate = realNodeInfo.getModifiedDate();
        if (modifiedDate != null) {
            long modDate = DefaultTypeConverter.INSTANCE.longValue(modifiedDate);
            m_response.setHeader(WebDAV.HEADER_LAST_MODIFIED, WebDAV.formatHeaderDate(modDate));
        }
        m_response.setHeader("Content-Disposition", getContentDispositionHeader(nodeInfo));
        ContentReader reader = fileFolderService.getReader(realNodeInfo.getNodeRef());
        // ensure that we generate something, even if the content is missing
        reader = FileContentReader.getSafeContentReader((ContentReader) reader, I18NUtil.getMessage(FileContentReader.MSG_MISSING_CONTENT), realNodeInfo.getNodeRef(), reader);
        readContent(realNodeInfo, reader);
    }
}
Also used : Path(org.alfresco.service.cmr.repository.Path) NodeRef(org.alfresco.service.cmr.repository.NodeRef) FileInfo(org.alfresco.service.cmr.model.FileInfo) FileContentReader(org.alfresco.repo.content.filestore.FileContentReader) ContentReader(org.alfresco.service.cmr.repository.ContentReader) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException) FileFolderService(org.alfresco.service.cmr.model.FileFolderService) Date(java.util.Date)

Example 25 with FileInfo

use of org.alfresco.service.cmr.model.FileInfo in project alfresco-remote-api by Alfresco.

the class MoveMethod method executeImpl.

/**
 * Exceute the request
 *
 * @exception WebDAVServerException
 */
protected final void executeImpl() throws WebDAVServerException, Exception {
    NodeRef rootNodeRef = getRootNodeRef();
    // Debug
    if (logger.isDebugEnabled()) {
        logger.debug((isMove() ? "Move" : "Copy") + " from " + getPath() + " to " + getDestinationPath());
    }
    // the source must exist
    String sourcePath = getPath();
    FileInfo sourceInfo = null;
    try {
        sourceInfo = getNodeForPath(rootNodeRef, sourcePath);
    } catch (FileNotFoundException e) {
        throw new WebDAVServerException(HttpServletResponse.SC_NOT_FOUND);
    }
    FileInfo sourceParentInfo = getDAVHelper().getParentNodeForPath(rootNodeRef, sourcePath);
    // the destination parent must exist
    String destPath = getDestinationPath();
    FileInfo destParentInfo = null;
    try {
        if (destPath.endsWith(WebDAVHelper.PathSeperator)) {
            destPath = destPath.substring(0, destPath.length() - 1);
        }
        destParentInfo = getDAVHelper().getParentNodeForPath(rootNodeRef, destPath);
    } catch (FileNotFoundException e) {
        if (logger.isDebugEnabled()) {
            logger.debug("Destination parent folder doesn't exist: " + destPath);
        }
        throw new WebDAVServerException(HttpServletResponse.SC_CONFLICT);
    }
    // check for the existence of the destination node
    FileInfo destInfo = null;
    boolean destNotHidden = false;
    try {
        destInfo = getDAVHelper().getNodeForPath(rootNodeRef, destPath);
        if (!destInfo.getNodeRef().equals(sourceInfo.getNodeRef())) {
            // ALF-7079 (MNT-1601) fix, if destInfo is a hidden shuffle target then pretend it's not there
            destNotHidden = !getFileFolderService().isHidden(destInfo.getNodeRef());
            if (!hasOverWrite() && destNotHidden) {
                if (logger.isDebugEnabled()) {
                    logger.debug("Destination exists but overwrite is not allowed");
                }
                // it exists and we may not overwrite
                throw new WebDAVServerException(HttpServletResponse.SC_PRECONDITION_FAILED);
            }
            checkNode(destInfo);
        }
    } catch (FileNotFoundException e) {
    // destination doesn't exist
    }
    NodeRef sourceNodeRef = sourceInfo.getNodeRef();
    NodeRef sourceParentNodeRef = sourceParentInfo.getNodeRef();
    NodeRef destParentNodeRef = destParentInfo.getNodeRef();
    String name = getDAVHelper().splitPath(destPath)[1];
    moveOrCopy(sourceNodeRef, sourceParentNodeRef, destParentNodeRef, name);
    // Set the response status
    if (!destNotHidden) {
        m_response.setStatus(HttpServletResponse.SC_CREATED);
    } else {
        m_response.setStatus(HttpServletResponse.SC_NO_CONTENT);
    }
}
Also used : NodeRef(org.alfresco.service.cmr.repository.NodeRef) FileInfo(org.alfresco.service.cmr.model.FileInfo) FileNotFoundException(org.alfresco.service.cmr.model.FileNotFoundException)

Aggregations

FileInfo (org.alfresco.service.cmr.model.FileInfo)101 NodeRef (org.alfresco.service.cmr.repository.NodeRef)82 WebApiDescription (org.alfresco.rest.framework.WebApiDescription)34 FileNotFoundException (org.alfresco.service.cmr.model.FileNotFoundException)26 HashMap (java.util.HashMap)20 RetryingTransactionCallback (org.alfresco.repo.transaction.RetryingTransactionHelper.RetryingTransactionCallback)20 QName (org.alfresco.service.namespace.QName)20 AbstractList (java.util.AbstractList)13 UserInfo (org.alfresco.rest.api.model.UserInfo)13 WebApiParam (org.alfresco.rest.framework.WebApiParam)11 Test (org.junit.Test)11 ArrayList (java.util.ArrayList)10 AccessDeniedException (org.alfresco.repo.security.permissions.AccessDeniedException)10 FileFolderService (org.alfresco.service.cmr.model.FileFolderService)9 IOException (java.io.IOException)8 EntityNotFoundException (org.alfresco.rest.framework.core.exceptions.EntityNotFoundException)8 Serializable (java.io.Serializable)7 List (java.util.List)7 ContentWriter (org.alfresco.service.cmr.repository.ContentWriter)7 FacesContext (javax.faces.context.FacesContext)6