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.ui.contentapp.movedialog.predicate;
35
36
37 import info.magnolia.jcr.util.NodeUtil;
38 import info.magnolia.ui.vaadin.integration.jcr.JcrItemAdapter;
39 import info.magnolia.ui.vaadin.integration.jcr.JcrNodeAdapter;
40 import info.magnolia.ui.workbench.tree.drop.DropConstraint;
41
42 import java.util.Iterator;
43 import java.util.List;
44
45 import javax.jcr.Node;
46 import javax.jcr.RepositoryException;
47
48 import org.slf4j.Logger;
49 import org.slf4j.LoggerFactory;
50
51 import com.vaadin.data.Item;
52
53
54
55
56 public class MovePossibilityPredicate {
57
58 private Logger log = LoggerFactory.getLogger(getClass());
59
60 private List<? extends Item> candidates;
61
62 protected DropConstraint constraint;
63
64 protected MovePossibilityPredicate(DropConstraint constraint, List<? extends Item> candidates) {
65 this.constraint = constraint;
66 this.candidates = candidates;
67 }
68
69 public boolean isMovePossible(Item hostCandidate) {
70 boolean isPossible = true;
71 Iterator<? extends Item> it = candidates.iterator();
72 while (it.hasNext() && isPossible) {
73 Item item = it.next();
74 isPossible &= checkItem(item, hostCandidate);
75 }
76 return isPossible;
77 }
78
79 protected boolean checkItem(Item item, Item hostCandidate) {
80 if ((item instanceof JcrItemAdapter) && (hostCandidate instanceof JcrItemAdapter)) {
81 JcrItemAdapter jcrItem = (JcrItemAdapter) item;
82 JcrItemAdapter jcrHost = (JcrItemAdapter) hostCandidate;
83 try {
84 return basicMoveCheck(jcrItem.getJcrItem(), jcrHost.getJcrItem());
85 } catch (RepositoryException e) {
86 log.warn("Error occurred during basic move check: ", e);
87 return false;
88 }
89 }
90 return true;
91 }
92
93 protected boolean hostIsRoot(Item hostCandidate) {
94 if (hostCandidate instanceof JcrNodeAdapter) {
95 JcrNodeAdapter jcrItem = (JcrNodeAdapter) hostCandidate;
96 try {
97 if (jcrItem.getJcrItem().getParent() == null) {
98 return true;
99 }
100 } catch (RepositoryException e) {
101 return true;
102 }
103 }
104 return false;
105 }
106
107 protected boolean supportsProperties() {
108
109 return false;
110 }
111
112 protected boolean basicMoveCheck(javax.jcr.Item source, javax.jcr.Item target) throws RepositoryException {
113 if (!target.isNode()) {
114 return false;
115 }
116 if (!source.isNode() && !supportsProperties()) {
117 return false;
118 }
119 if (target.getPath().equals(source.getPath())) {
120 return false;
121 }
122 if (target.getPath().startsWith(source.getPath())) {
123 return false;
124 }
125 if (target.isNode()) {
126 return !NodeUtil.isSame((Node) target, source.getParent());
127 }
128 return !target.isSame(source.getParent());
129 }
130 }