1
18 package org.torweg.pulse.site.content;
19
20 import java.util.Collections;
21 import java.util.HashMap;
22 import java.util.Locale;
23 import java.util.Map;
24
25 import org.jdom.Element;
26 import org.slf4j.Logger;
27 import org.slf4j.LoggerFactory;
28 import org.torweg.pulse.configuration.AbstractConfigBean;
29 import org.torweg.pulse.site.content.suffices.SuffixConverter;
30 import org.torweg.pulse.util.LocaleUtils;
31
32
38 public class AbstractBasicContentConfig extends AbstractConfigBean {
39
40
43 private static final long serialVersionUID = 234949128996236986L;
44
45
48 private static final String URL_SAFE_CHARACTERS = "abcdefghijklmnopqrstuvwxyz"
49 + "ABCDEFGHIJKLMNOPQRSTUWVXYZ" + "1234567890-_.";
50
51
54 private static final String SUBSTITUTION_CHARCTER = "_";
55
56
59 private static final String OMIT_CHARACTERS = "!\",;?()[]";
60
61
64 private static final Logger LOGGER = LoggerFactory
65 .getLogger(AbstractBasicContentConfig.class);
66
67
70 private final Map<Locale, SuffixConverter> converters = new HashMap<Locale, SuffixConverter>();
71
72
79 public void init(final Element conf) {
80 if (conf.getChild("suffix-converters") != null) {
81 for (Object o : conf.getChild("suffix-converters").getChildren(
82 "locale")) {
83 Element localeConfig = (Element) o;
84 try {
85 Locale locale = LocaleUtils.localeFromString(localeConfig
86 .getAttributeValue("name"));
87 String converter = localeConfig.getAttributeValue("class");
88 converters.put(locale, (SuffixConverter) Class.forName(
89 converter).newInstance());
90 LOGGER.debug("added converter '{}' for locale '{}'.",
91 converter, locale);
92 } catch (Exception e) {
93 LOGGER
94 .error(
95 "Could not instantiate SuffixConverter '{}' for Locale '{}':{}",
96 new Object[] {
97 localeConfig
98 .getAttributeValue("class"),
99 localeConfig
100 .getAttributeValue("name"),
101 e.getLocalizedMessage() });
102 }
103 }
104 } else {
105 LOGGER.warn("no converter configurations found.");
106 }
107 }
108
109
119 public final String convert(final String suffix, final Locale contentLocale) {
120 for (Locale converterLocale : this.converters.keySet()) {
121 LOGGER.trace("checking '{}' against '{}': {}", new Object[] {
122 converterLocale, contentLocale,
123 LocaleUtils.matches(converterLocale, contentLocale) });
124 if (LocaleUtils.matches(converterLocale, contentLocale)) {
125 return postConvert(this.converters.get(converterLocale)
126 .convert(
127 suffix.toLowerCase(new Locale(contentLocale
128 .getLanguage()))));
129 }
130 }
131 return postConvert(suffix.toLowerCase(contentLocale));
132 }
133
134
143 private String postConvert(final String suffix) {
144 StringBuilder converted = new StringBuilder();
145 for (int i = 0; i < suffix.length(); i++) {
146 String c = suffix.substring(i, i + 1);
147 if (URL_SAFE_CHARACTERS.indexOf(c) > -1) {
148 converted.append(c);
149 } else if (c.equals(" ")) {
150 converted.append("-");
151 } else if (OMIT_CHARACTERS.indexOf(c) > -1) {
152 continue;
153 } else {
154 converted.append(SUBSTITUTION_CHARCTER);
155 }
156 }
157 return converted.toString();
158 }
159
160
166 protected final Map<Locale, SuffixConverter> getConverters() {
167 return Collections.unmodifiableMap(this.converters);
168 }
169
170 }
171