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