1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 package info.magnolia.pages.app;
35
36 import info.magnolia.jcr.util.NodeNameHelper;
37 import info.magnolia.jcr.util.NodeTypes;
38 import info.magnolia.jcr.util.NodeUtil;
39 import info.magnolia.registry.RegistrationException;
40 import info.magnolia.rendering.template.TemplateDefinition;
41 import info.magnolia.rendering.template.assignment.TemplateDefinitionAssignment;
42 import info.magnolia.ui.contentapp.action.clipboard.JcrClipboard;
43 import info.magnolia.ui.contentapp.browser.ItemInteractionAvailability;
44 import info.magnolia.ui.datasource.jcr.JcrDatasource;
45
46 import java.util.Collection;
47 import java.util.stream.Collectors;
48
49 import javax.inject.Inject;
50 import javax.jcr.Item;
51 import javax.jcr.Node;
52
53 import com.machinezoo.noexception.Exceptions;
54
55
56
57
58
59 public class PageContentClipboard extends JcrClipboard {
60
61 private TemplateDefinitionAssignment templateAssignment;
62
63 @Inject
64 public PageContentClipboard(ItemInteractionAvailability<Item> itemInteractionAvailability,
65 NodeNameHelper nodeNameHelper,
66 TemplateDefinitionAssignment templateAssignment, JcrDatasource jcrDatasource) {
67 super(itemInteractionAvailability, nodeNameHelper, jcrDatasource);
68 this.templateAssignment = templateAssignment;
69 }
70
71 @Override
72 protected boolean canPasteInto(final Item source, final Item destination) {
73
74 Boolean isSourceMarkedAsDeleted = Exceptions.wrap().get(() -> NodeUtil.hasMixin((Node) source, NodeTypes.Deleted.NAME));
75 if (isSourceMarkedAsDeleted || !super.canPasteInto(source, destination)) {
76 return false;
77 }
78
79
80 Node sourcePage = (Node) source;
81 Node destinationPage = (Node) destination;
82
83
84 Collection<String> availableTemplates = templateAssignment.getAvailableTemplates(destinationPage).stream()
85 .map(TemplateDefinition::getId)
86 .collect(Collectors.toList());
87
88
89
90 try {
91 String sourcePageTemplateDefinitionId = templateAssignment.getAssignedTemplateDefinition(sourcePage).getId();
92 return availableTemplates.stream().anyMatch(availableTemplate -> availableTemplate.equals(sourcePageTemplateDefinitionId));
93 } catch (RegistrationException e) {
94 throw new RuntimeException(e);
95 }
96 }
97
98 }