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.cms.beans.config;
35
36 import info.magnolia.cms.core.Content;
37 import info.magnolia.jcr.node2bean.Node2BeanProcessor;
38 import info.magnolia.jcr.node2bean.TransformationState;
39 import info.magnolia.jcr.node2bean.TypeDescriptor;
40 import info.magnolia.jcr.node2bean.TypeMapping;
41 import info.magnolia.jcr.node2bean.impl.Node2BeanTransformerImpl;
42 import info.magnolia.objectfactory.ComponentProvider;
43 import info.magnolia.objectfactory.Components;
44
45 import java.util.ArrayList;
46 import java.util.Collection;
47 import java.util.Iterator;
48 import java.util.List;
49
50 import javax.inject.Inject;
51 import javax.inject.Singleton;
52
53 import org.apache.commons.lang.StringUtils;
54 import org.slf4j.Logger;
55 import org.slf4j.LoggerFactory;
56
57
58
59
60
61
62
63 @Singleton
64 public final class VirtualURIManager extends ObservedManager {
65
66 private static final Logger log = LoggerFactory.getLogger(VirtualURIManager.class);
67
68 public static final String FROM_URI_NODEDATANAME = "fromURI";
69
70 public static final String TO_URI_NODEDATANAME = "toURI";
71
72 private final Node2BeanProcessor nodeToBean;
73
74
75
76
77 @Inject
78 public VirtualURIManager(Node2BeanProcessor nodeToBean) {
79 this.nodeToBean = nodeToBean;
80 }
81
82
83
84
85 private final List<VirtualURIMapping> cachedURImapping = new ArrayList<VirtualURIMapping>();
86
87
88
89
90
91
92
93
94 public String getURIMapping(String uri) {
95 return getURIMapping(uri, null);
96 }
97
98
99
100
101
102
103
104
105
106 public String getURIMapping(String uri, String queryString) {
107 Iterator<VirtualURIMapping> e = cachedURImapping.iterator();
108 String mappedURI = StringUtils.EMPTY;
109 int lastMatchedLevel = 0;
110 while (e.hasNext()) {
111 try{
112 VirtualURIMapping vm = e.next();
113 final VirtualURIMapping.MappingResult result;
114 if (queryString != null && vm instanceof QueryAwareVirtualURIMapping){
115 result = ((QueryAwareVirtualURIMapping)vm).mapURI(uri, queryString);
116 } else {
117 result = vm.mapURI(uri);
118 }
119 if (result != null && lastMatchedLevel < result.getLevel()) {
120 lastMatchedLevel = result.getLevel();
121 mappedURI = result.getToURI();
122 }
123 }catch(ClassCastException ex){
124 log.error("Virtual URI configuration error, mapping rule is skipped: " + ex.getMessage(), ex);
125 }
126 }
127 return mappedURI;
128 }
129
130 @Override
131 protected void onRegister(Content node) {
132 try {
133 log.info("Loading VirtualURIMapping from {}", node.getHandle());
134 nodeToBean.setProperties(this.cachedURImapping, node.getJCRNode(), true, new Node2BeanTransformerImpl() {
135 @Override
136 protected TypeDescriptor onResolveType(TypeMapping typeMapping, TransformationState state, TypeDescriptor resolvedType, ComponentProvider componentProvider) {
137 if (state.getLevel() == 2 && resolvedType == null) {
138 return typeMapping.getTypeDescriptor(DefaultVirtualURIMapping.class);
139 }
140 return resolvedType;
141 }
142 }, Components.getComponentProvider());
143 log.debug("VirtualURIMapping loaded from {}", node.getHandle());
144 }
145 catch (Exception e) {
146 log.error("Failed to load VirtualURIMapping from " + node.getHandle() + " - " + e.getMessage(), e);
147 }
148 }
149
150 @Override
151 protected void onClear() {
152 this.cachedURImapping.clear();
153 }
154
155
156 public Collection<VirtualURIMapping> getURIMappings() {
157 return cachedURImapping;
158 }
159
160
161
162
163
164 @Deprecated
165 public static VirtualURIManager getInstance() {
166 return Components.getSingleton(VirtualURIManager.class);
167 }
168 }