1
20 package org.crosswire.jsword.book.filter;
21
22 import java.util.HashMap;
23 import java.util.Locale;
24 import java.util.Map;
25
26 import org.crosswire.common.util.PluginUtil;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
36 public final class SourceFilterFactory {
37
40 private SourceFilterFactory() {
41 }
42
43
50 public static SourceFilter getFilter(String lookup) {
51 SourceFilter reply = filters.get(lookup.toLowerCase(Locale.ENGLISH));
52
53 if (reply == null) {
54 reply = deft;
55 }
56
57 return reply.clone();
58 }
59
60
65 public static SourceFilter getDefaultFilter() {
66 return deft.clone();
67 }
68
69
75 public static void addFilter(String name, SourceFilter instance) {
76 filters.put(name.toLowerCase(Locale.ENGLISH), instance);
77 }
78
79
82 private static Map<String, SourceFilter> filters = new HashMap<String, SourceFilter>();
83
84
87 private static final Logger log = LoggerFactory.getLogger(SourceFilterFactory.class);
88
89
92 private static volatile SourceFilter deft;
93
94
98 static {
99 Map<String, Class<SourceFilter>> map = PluginUtil.getImplementorsMap(SourceFilter.class);
100
101 try {
103 Class<SourceFilter> cdeft = map.remove("default");
104 deft = cdeft.newInstance();
105 } catch (InstantiationException e) {
106 log.error("Failed to get default filter, will attempt to use first", e);
107 } catch (IllegalAccessException e) {
108 log.error("Failed to get default filter, will attempt to use first", e);
109 }
110
111 SourceFilter instance = null;
113 for (Map.Entry<String, Class<SourceFilter>> entry : map.entrySet()) {
114 try {
115 Class<SourceFilter> clazz = entry.getValue();
116 instance = clazz.newInstance();
117 addFilter(entry.getKey(), instance);
118 } catch (InstantiationException ex) {
119 log.error("Failed to add filter", ex);
120 } catch (IllegalAccessException ex) {
121 log.error("Failed to add filter", ex);
122 }
123 }
124
125 if (deft == null) {
127 deft = instance;
128 }
129 }
130 }
131