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.link.Link;
37 import info.magnolia.link.LinkException;
38 import info.magnolia.link.LinkUtil;
39 import info.magnolia.objectfactory.Components;
40 import info.magnolia.repository.RepositoryConstants;
41
42 import java.util.Collection;
43 import java.util.Comparator;
44 import java.util.TreeSet;
45
46 import org.apache.commons.lang3.StringUtils;
47 import org.slf4j.Logger;
48 import org.slf4j.LoggerFactory;
49
50
51
52
53 public class URI2RepositoryManager {
54
55 protected static final URI2RepositoryMapping DEFAULT_MAPPING = new URI2RepositoryMapping("", RepositoryConstants.WEBSITE, "");
56
57 private static final Logger log = LoggerFactory.getLogger(URI2RepositoryManager.class);
58
59
60
61
62 private final Collection<URI2RepositoryMapping> mappings;
63
64 public URI2RepositoryManager() {
65 mappings = new TreeSet<>(getMappingComparator());
66 }
67
68 protected Comparator<URI2RepositoryMapping> getMappingComparator() {
69 return (m0, m1) -> m1.getURIPrefix().compareTo(m0.getURIPrefix());
70 }
71
72
73
74
75 public URI2RepositoryMapping getMapping(String uri) {
76 for (URI2RepositoryMapping mapping : mappings) {
77 if (mapping.matches(uri)) {
78 return mapping;
79 }
80 }
81 return this.getDefaultMapping();
82 }
83
84 public URI2RepositoryMapping getDefaultMapping() {
85 return DEFAULT_MAPPING;
86 }
87
88
89
90
91 public String getHandle(String uri) {
92 return this.getMapping(uri).getHandle(uri);
93 }
94
95
96
97
98 public String getRepository(String uri) {
99 return this.getMapping(uri).getRepository();
100 }
101
102
103
104
105 public String getURI(String repository, String handle) {
106 try {
107 return getURI(LinkUtil.createLinkInstance(repository, handle, null, null, null));
108 } catch (LinkException e) {
109 log.error("can't map [{}] to a uri", handle, e);
110 }
111 return handle;
112 }
113
114 public String getURI(Link uuidLink) {
115 for (URI2RepositoryMapping mapping : mappings) {
116 if (StringUtils.equals(mapping.getRepository(), uuidLink.getWorkspace()) && (uuidLink.getPath().startsWith(mapping.getHandlePrefix()) || uuidLink.isEditorBinaryLink())) {
117 return mapping.getURI(uuidLink);
118 }
119 }
120 return this.getDefaultMapping().getURI(uuidLink);
121 }
122
123 public void setMappings(Collection<URI2RepositoryMapping> mappings) {
124 this.mappings.addAll(mappings);
125 }
126
127 public void addMapping(URI2RepositoryMapping mapping) {
128 mappings.add(mapping);
129 }
130
131
132
133
134 @Deprecated
135 public static URI2RepositoryManager getInstance() {
136 return Components.getSingleton(URI2RepositoryManager.class);
137 }
138
139
140
141
142 public Collection<URI2RepositoryMapping> getMappings() {
143 return this.mappings;
144 }
145 }