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.datasource.jcr;
35
36 import info.magnolia.context.Context;
37 import info.magnolia.jcr.wrapper.DelegatePropertyWrapper;
38
39 import java.util.Objects;
40
41 import javax.inject.Provider;
42 import javax.jcr.Property;
43 import javax.jcr.RepositoryException;
44 import javax.jcr.Session;
45
46 import lombok.SneakyThrows;
47 import lombok.experimental.Delegate;
48
49
50
51
52
53
54
55 @SuppressWarnings("unchecked")
56 public class SessionReattachingPropertyWrapper extends DelegatePropertyWrapper implements SupportsRenaming {
57
58 @Delegate
59 private JcrItemRenameOperationHelper renameOperationHelper = new JcrItemRenameOperationHelper();
60
61 private String workspace;
62 private String path;
63 private final Provider<Context> contextProvider;
64
65 public SessionReattachingPropertyWrapper(Property property, Provider<Context> contextProvider) throws RepositoryException {
66 super(property);
67 this.workspace = property.getSession().getWorkspace().getName();
68 this.path = property.getPath();
69 this.contextProvider = contextProvider;
70 }
71
72 @Override
73 @SneakyThrows(RepositoryException.class)
74 public Property getWrappedProperty() {
75 if (super.getWrappedProperty() == null || !super.getWrappedProperty().getSession().isLive()) {
76 Session session = getSessionForWrappedNode(this.workspace);
77 setWrappedProperty(session.getProperty(this.path));
78 }
79 return super.getWrappedProperty();
80 }
81
82 @Override
83 public String getPath() {
84 return this.path;
85 }
86
87 private Session getSessionForWrappedNode(String workspace) throws RepositoryException {
88 return contextProvider.get().getJCRSession(workspace);
89 }
90
91 @Override
92 public boolean equals(Object o) {
93 if (this == o) return true;
94 if (!(o instanceof SessionReattachingPropertyWrapper)) return false;
95 SessionReattachingPropertyWrapper that = (SessionReattachingPropertyWrapper) o;
96 return Objects.equals(workspace, that.workspace) &&
97 Objects.equals(getPath(), that.getPath());
98 }
99
100 @Override
101 public int hashCode() {
102 return Objects.hash(workspace, getPath());
103 }
104 }
105