To copy a node, such as a file or folder, use the moveNode method of the NodesApi.
For more information about this ReST API endpoint, see Move Folders and Files.
For a description of the common parameters, such as include, see Common Parameters.
import org.alfresco.core.handler.NodesApi; import org.alfresco.core.model.Node; import org.alfresco.core.model.NodeBodyCopy; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import java.io.IOException; import java.util.ArrayList; import java.util.List; @Component public class CopyNodeCmd { static final Logger LOGGER = LoggerFactory.getLogger(CopyNodeCmd.class); @Autowired NodesApi nodesApi; public void execute(String nodeId, String parentFolderNodeId) throws IOException { List<String> include = new ArrayList<>(); List<String> fields = null; include.add("path"); // add extra path property in response so we can see location of node Node node = nodesApi.getNode(nodeId, include, null, fields).getBody().getEntry(); LOGGER.info("Got node we want to copy ID: {} Parent: {} Location: {}", node.getId(), node.getParentId(), node.getPath().getName()); NodeBodyCopy nodeBodyCopy = new NodeBodyCopy(); nodeBodyCopy.setTargetParentId(parentFolderNodeId); Node copiedNode = nodesApi.copyNode(nodeId, nodeBodyCopy, include, fields).getBody().getEntry(); LOGGER.info("Copied node ID: {} Parent: {} Location: {}", copiedNode.getId(), copiedNode.getParentId(), copiedNode.getPath().getName()); } }
Executing this code would give the following result, passing in node to copy and target folder node:
% java -jar target/rest-api-0.0.1-SNAPSHOT.jar copy-node 0492460b-6269-4ca1-9668-0d934d2f3370 7f041db0-fdb6-4185-b921-2fb9ed381480 2021-05-04 10:52:16.741 INFO 28353 --- [ main] o.a.tutorial.restapi.RestApiApplication : Started RestApiApplication in 3.667 seconds (JVM running for 4.218) 2021-05-04 10:52:16.743 INFO 28353 --- [ main] o.a.tutorial.restapi.RestApiApplication : args[0]: copy-node 2021-05-04 10:52:16.745 INFO 28353 --- [ main] o.a.tutorial.restapi.RestApiApplication : args[1]: 0492460b-6269-4ca1-9668-0d934d2f3370 2021-05-04 10:52:16.745 INFO 28353 --- [ main] o.a.tutorial.restapi.RestApiApplication : args[2]: 7f041db0-fdb6-4185-b921-2fb9ed381480 2021-05-04 10:52:16.974 INFO 28353 --- [ main] o.alfresco.tutorial.restapi.CopyNodeCmd : Got node we want to copy ID: 0492460b-6269-4ca1-9668-0d934d2f3370 Parent: 8fa4e27d-35aa-411d-8bbe-831b6ed0c445 Location: /Company Home/Guest Home 2021-05-04 10:52:17.366 INFO 28353 --- [ main] o.alfresco.tutorial.restapi.CopyNodeCmd : Copied node ID: fe955da0-c4e5-42d3-972f-697424b546b1 Parent: 7f041db0-fdb6-4185-b921-2fb9ed381480 Location: /Company Home/Imap Attachments
Note the new node ID for the copy in the response.
Note that we set the include parameter to path so the location of the node is returned. The following extra information is returned:
Location: class PathInfo { elements: [class PathElement { id: e439190c-3fe0-48a1-8a9a-374fbc54b570 name: Company Home nodeType: cm:folder aspectNames: [cm:titled, cm:auditable, app:uifacets] }, class PathElement { id: 7f041db0-fdb6-4185-b921-2fb9ed381480 name: Imap Attachments nodeType: cm:folder aspectNames: [cm:titled, cm:auditable, app:uifacets] }] name: /Company Home/Imap Attachments isComplete: true }