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.templating.imaging.parameters;
35
36 import info.magnolia.context.MgnlContext;
37 import info.magnolia.imaging.ParameterProvider;
38 import info.magnolia.imaging.util.PathSplitter;
39 import info.magnolia.jcr.util.VersionUtil;
40
41 import javax.jcr.Node;
42 import javax.jcr.RepositoryException;
43 import javax.jcr.Session;
44
45 import org.apache.commons.lang3.StringUtils;
46
47
48
49
50
51
52
53
54
55 public class ThemeAwareParameterProvider implements ParameterProvider<ThemeAwareParameter> {
56
57 private final ThemeAwareParameter parameter;
58
59 public ThemeAwareParameterProvider(String uri) throws RepositoryException {
60
61 PathSplitter splitter = new PathSplitter(uri);
62 final String siteName = splitter.next();
63 final String variationName = splitter.next();
64 final String workspaceName = splitter.next();
65
66 String path = StringUtils.substringBeforeLast(splitter.remaining(), "/");
67
68 if (StringUtils.isBlank(path)) {
69 throw new RuntimeException("Can't create a info.magnolia.templating.imaging.parameters.ThemeAwareParameterProvider object for empty path");
70 }
71
72 final Node node;
73 if (path.startsWith("jcr:system/jcr:versionStorage")) {
74 path = StringUtils.substringBeforeLast(path.substring(0, path.indexOf("/jcr:frozenNode")), "/");
75 String identifier = StringUtils.substringAfterLast(path, "/");
76 String version = StringUtils.substringBefore(StringUtils.substringAfter(uri, identifier + "/"), "/");
77 path = StringUtils.substringBeforeLast(StringUtils.substringAfter(uri, "jcr:frozenNode/"), "/");
78 splitter = new PathSplitter(path);
79
80
81 Session session = MgnlContext.getJCRSession(workspaceName);
82 Node versionedNode = VersionUtil.getVersion(session.getNodeByIdentifier(identifier), version);
83
84 for (int i = 1; i < splitter.count(); i++) {
85 versionedNode = versionedNode.getNode(splitter.next());
86 }
87 node = versionedNode.getNode(splitter.remaining());
88 } else {
89
90 if (!path.startsWith("/")) {
91 path = "/" + path;
92 }
93 node = MgnlContext.getJCRSession(workspaceName).getNode(path);
94 }
95
96 parameter = new ThemeAwareParameter(siteName, variationName, node);
97 }
98
99 @Override
100 public ThemeAwareParameter getParameter() {
101 return parameter;
102 }
103
104 }