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