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