1 21 22 package org.jacorb.notification.filter; 23 24 import java.util.ArrayList ; 25 import java.util.Collections ; 26 import java.util.Iterator ; 27 import java.util.List ; 28 29 import org.apache.avalon.framework.configuration.Configuration; 30 import org.apache.avalon.framework.configuration.ConfigurationException; 31 import org.apache.avalon.framework.logger.Logger; 32 import org.jacorb.notification.IContainer; 33 import org.jacorb.notification.conf.Attributes; 34 import org.jacorb.notification.filter.etcl.ETCLFilter; 35 import org.jacorb.notification.interfaces.Disposable; 36 import org.jacorb.notification.util.LogUtil; 37 import org.jacorb.util.ObjectUtil; 38 import org.omg.CORBA.Any ; 39 import org.omg.CORBA.ORB ; 40 import org.omg.CosNotifyFilter.InvalidGrammar; 41 import org.picocontainer.MutablePicoContainer; 42 import org.picocontainer.PicoContainer; 43 import org.picocontainer.defaults.ConstructorInjectionComponentAdapter; 44 import org.picocontainer.defaults.DefaultPicoContainer; 45 46 50 public class DefaultFilterFactoryDelegate implements IFilterFactoryDelegate, Disposable 51 { 52 private final List availableFilters_ = new ArrayList (); 53 54 private final MutablePicoContainer filterPico_; 55 56 private final ORB orb_; 57 58 private final Logger logger_; 59 60 62 public DefaultFilterFactoryDelegate(IContainer container, Configuration config) 63 { 64 PicoContainer parent = container.getContainer(); 65 66 if (parent != null) 67 { 68 filterPico_ = new DefaultPicoContainer(parent); 69 } 70 else 71 { 72 filterPico_ = new DefaultPicoContainer(); 73 } 74 75 orb_ = (ORB ) parent.getComponentInstanceOfType(ORB .class); 76 77 logger_ = LogUtil.getLogger(config, getClass().getName()); 78 79 loadFilterPlugins(config); 80 } 81 82 public void dispose() 83 { 84 filterPico_.dispose(); 85 } 86 87 private void loadFilterPlugins(Configuration conf) 88 { 89 filterPico_.registerComponent(new ConstructorInjectionComponentAdapter( 91 ETCLFilter.CONSTRAINT_GRAMMAR, ETCLFilter.class)); 92 93 availableFilters_.add(ETCLFilter.CONSTRAINT_GRAMMAR); 94 95 Iterator i = getAttributeNamesWithPrefix(conf, Attributes.FILTER_PLUGIN_PREFIX).iterator(); 96 97 while (i.hasNext()) 98 { 99 String key = (String ) i.next(); 100 String _clazzName = null; 101 try 102 { 103 String _grammar = key.substring(Attributes.FILTER_PLUGIN_PREFIX.length() + 1); 104 105 logger_.info("Loading Filterplugin for Grammar: " + _grammar); 106 107 _clazzName = conf.getAttribute(key); 108 109 Class _clazz = ObjectUtil.classForName(_clazzName); 110 111 filterPico_.registerComponent(new ConstructorInjectionComponentAdapter(_clazzName, 112 _clazz)); 113 114 availableFilters_.add(_grammar); 115 } catch (ConfigurationException e) 116 { 117 logger_.error("Unable to access attribute: " + key, e); 118 } catch (ClassNotFoundException e) 119 { 120 logger_.error("Property " + key + ": class " + _clazzName + " is unknown", e); 121 } 122 } 123 } 124 125 private String getAvailableConstraintLanguages() 126 { 127 Iterator i = availableFilters_.iterator(); 128 129 StringBuffer b = new StringBuffer ((String ) i.next()); 130 131 while (i.hasNext()) 132 { 133 b.append(", "); 134 b.append(i.next()); 135 } 136 137 return b.toString(); 138 } 139 140 public AbstractFilter create_filter_servant(String grammar) throws InvalidGrammar 141 { 142 AbstractFilter _filterServant = (AbstractFilter) filterPico_.getComponentInstance(grammar); 143 144 if (_filterServant == null) 145 { 146 logger_.error("unable to create FilterServant as grammar " + grammar + " is unknown"); 147 148 throw new InvalidGrammar("Constraint Language '" + grammar 149 + "' is not supported. Try one of the following: " 150 + getAvailableConstraintLanguages()); 151 152 } 153 154 return _filterServant; 155 } 156 157 public MappingFilterImpl create_mapping_filter_servant(Configuration config, 158 String grammar, Any any) throws InvalidGrammar 159 { 160 AbstractFilter _filter = create_filter_servant(grammar); 161 162 return new MappingFilterImpl(orb_, config, _filter, any); 163 } 164 165 static List getAttributeNamesWithPrefix(Configuration configuration, String prefix) 166 { 167 final List _attributesWithPrefix = new ArrayList (); 168 169 final String [] _allAttributes = configuration.getAttributeNames(); 170 171 for (int x = 0; x < _allAttributes.length; ++x) 172 { 173 if (_allAttributes[x].startsWith(prefix)) 174 { 175 _attributesWithPrefix.add(_allAttributes[x]); 176 } 177 } 178 179 return Collections.unmodifiableList(_attributesWithPrefix); 180 } 181 } 182 | Popular Tags |