1 10 11 package org.mmbase.applications.media.filters; 12 13 import org.mmbase.util.logging.Logger; 14 import org.mmbase.util.logging.Logging; 15 import org.mmbase.util.xml.DocumentReader; 16 import org.mmbase.util.*; 17 18 import org.w3c.dom.Element ; 19 20 import java.util.*; 21 import java.io.File ; 22 23 39 public class MainFilter { 40 private static Logger log = Logging.getLoggerInstance(MainFilter.class); 41 42 public static final String MAIN_TAG = "mainFilter"; 43 public static final String FILTERCONFIGS_TAG = "filterConfigs"; 44 public static final String FILTERCONFIG_TAG = "config"; 45 public static final String CHAIN_TAG = "chain"; 46 public static final String FILTER_TAG = "filter"; 47 public static final String FILTER_ATT = "filter"; 48 public static final String ID_ATT = "id"; 49 public static final String CONFIG_FILE = "media" + File.separator + "filters.xml"; 50 51 private FileWatcher configWatcher = new FileWatcher(true) { 52 public void onChange(File file) { 53 readConfiguration(file); 54 } 55 }; 56 57 private List filters = new ArrayList(); 58 59 62 private MainFilter() { 63 File configFile = new File (org.mmbase.module.core.MMBaseContext.getConfigPath(), CONFIG_FILE); 64 if (! configFile.exists()) { 65 log.error("Configuration file for mediasourcefilter " + configFile + " does not exist"); 66 return; 67 } 68 readConfiguration(configFile); 69 configWatcher.add(configFile); 70 configWatcher.setDelay(10 * 1000); configWatcher.start(); 72 } 73 74 75 private static MainFilter filter = null; 76 77 public static MainFilter getInstance() { 78 if (filter == null) filter = new MainFilter(); 79 return filter; 80 } 81 82 83 86 private synchronized void readConfiguration(File configFile) { 87 if (log.isServiceEnabled()) { 88 log.service("Reading " + configFile); 89 } 90 filters.clear(); 91 92 DocumentReader reader = new XMLBasicReader(configFile.toString(), getClass()); 93 Element filterConfigs = reader.getElementByPath(MAIN_TAG + "." + FILTERCONFIGS_TAG); 94 95 ChainSorter chainComp = new ChainSorter(); 96 99 for(Iterator e = reader.getChildElements(MAIN_TAG + "." + CHAIN_TAG, FILTER_TAG); e.hasNext();) { 100 Element chainElement =(Element )e.next(); 101 String clazz = reader.getElementValue(chainElement); 102 String elementId = chainElement.getAttribute(ID_ATT); 103 try { 104 Class newclass = Class.forName(clazz); 105 Filter filter = (Filter) newclass.newInstance(); 106 if (filter instanceof Sorter) { 107 chainComp.add((Sorter) filter); 108 } else { 109 if (chainComp.size() > 0) { 110 filters.add(chainComp); 111 chainComp = new ChainSorter(); 112 } 113 filters.add(filter); 114 } 115 log.service("Added filter " + clazz + "(id=" + elementId + ")"); 116 if (elementId != null && ! "".equals(elementId)) { 117 boolean found = false; 120 121 for (Iterator configIter = reader.getChildElements(filterConfigs, FILTERCONFIG_TAG); configIter.hasNext();) { 122 Element config = (Element ) configIter.next(); 123 String filterAtt = reader.getElementAttributeValue(config, FILTER_ATT); 124 if (filterAtt.equals(elementId)) { 125 log.service("Configuring " + elementId); 126 filter.configure(reader, config); 127 found = true; 128 break; 129 } 130 } 131 if (! found) log.debug("No configuration found for filter " + elementId); 132 } 133 } catch (ClassNotFoundException ex) { 134 log.error("Cannot load filter " + clazz + "\n" + ex); 135 } catch (InstantiationException ex1) { 136 log.error("Cannot load filter " + clazz + "\n" + ex1); 137 } catch (IllegalAccessException ex2) { 138 log.error("Cannot load filter " + clazz + "\n" + ex2); 139 } 140 } 141 if (chainComp.size() > 0) filters.add(chainComp); } 143 144 147 148 public List filter(List urls) { 149 Iterator i = filters.iterator(); 150 while (i.hasNext()) { 151 Filter filter = (Filter) i.next(); 152 if (log.isDebugEnabled()) { 153 log.debug("Using filter " + filter); 154 log.debug("before: " + urls); 155 } 156 157 try { 158 urls = filter.filter(urls); 159 } catch (Exception filterException) { 160 log.error("Check filter "+filter+" "+filterException); 161 } 162 if (log.isDebugEnabled()) { 163 log.debug("after: " + urls); 164 } 165 } 166 return urls; 167 } 168 169 170 173 private static void addTestData(Collection c) { 174 c.add("hoi"); 175 c.add("hallo"); 176 c.add("heeej"); 177 c.add("hello"); 178 c.add("daag"); 179 c.add("ajuus"); 180 c.add("saluton"); 181 c.add("cao"); 182 c.add("arriverderci"); 183 c.add("gxis"); 184 c.add("hej"); 185 c.add("komop"); 186 c.add("1234"); 187 } 188 private static class TestComparator implements Comparator { 189 private int i; 190 TestComparator(int i) { 191 this.i = i; 192 } 193 public int compare(Object o1, Object o2) { 194 return o1.hashCode() - o2.hashCode(); 195 } 196 197 } 198 199 public static void main(String [] args) { 200 final int ITERATIONS = 200000; 202 203 List list = new ArrayList(); 204 addTestData(list); 205 long start = System.currentTimeMillis(); 206 for (int i = 0; i < ITERATIONS; i++) { 207 Comparator c = new TestComparator(i); 208 Collections.sort(list, c); 209 } 210 log.debug("list duration: " + (System.currentTimeMillis() - start)); 211 log.debug(list); 212 SortedSet sortedSet = new TreeSet(); 213 addTestData(sortedSet); 214 start = System.currentTimeMillis(); 215 for (int i = 0; i < ITERATIONS; i++) { 216 SortedSet s = new TreeSet(new TestComparator(i)); 217 s.addAll(sortedSet); 218 sortedSet = s; 219 } 220 log.debug("sortedset duration: " + (System.currentTimeMillis() - start)); 221 log.debug(sortedSet); 222 } 223 224 225 } 226 | Popular Tags |