1 8 package org.apache.avalon.phoenix.components.configuration.validator; 9 10 import java.util.Collections ; 11 import java.util.HashMap ; 12 import java.util.Iterator ; 13 import java.util.Map ; 14 import org.apache.avalon.excalibur.i18n.ResourceManager; 15 import org.apache.avalon.excalibur.i18n.Resources; 16 import org.apache.avalon.framework.activity.Disposable; 17 import org.apache.avalon.framework.activity.Initializable; 18 import org.apache.avalon.framework.configuration.Configurable; 19 import org.apache.avalon.framework.configuration.Configuration; 20 import org.apache.avalon.framework.configuration.ConfigurationException; 21 import org.apache.avalon.framework.container.ContainerUtil; 22 import org.apache.avalon.framework.logger.AbstractLogEnabled; 23 import org.apache.avalon.phoenix.interfaces.ConfigurationValidator; 24 import org.apache.avalon.phoenix.interfaces.ConfigurationValidatorMBean; 25 26 31 public class DelegatingConfigurationValidator extends AbstractLogEnabled 32 implements Configurable, Initializable, Disposable, 33 ConfigurationValidator, ConfigurationValidatorMBean 34 { 35 private static final Resources REZ = 36 ResourceManager.getPackageResources( DelegatingConfigurationValidator.class ); 37 38 private Map m_blockTypeMap = Collections.synchronizedMap( new HashMap () ); 39 40 private Map m_delegates = new HashMap (); 41 42 private String m_supportedTypes; 43 44 public void configure( Configuration configuration ) 45 throws ConfigurationException 46 { 47 final Configuration[] delegates = configuration.getChildren( "delegate" ); 48 final StringBuffer types = new StringBuffer (); 49 50 for( int i = 0; i < delegates.length; i++ ) 51 { 52 final String type = delegates[ i ].getAttribute( "schema-type" ); 53 54 this.m_delegates.put( type, 55 new DelegateEntry( type, 56 delegates[ i ].getAttribute( "class" ), 57 delegates[ i ] ) 58 ); 59 60 if( i > 0 ) 61 { 62 types.append( "," ); 63 } 64 65 types.append( type ); 66 } 67 68 this.m_supportedTypes = types.toString(); 69 } 70 71 public void initialize() 72 throws Exception 73 { 74 for( Iterator i = m_delegates.values().iterator(); i.hasNext(); ) 75 { 76 final DelegateEntry entry = (DelegateEntry)i.next(); 77 final Class clazz = Class.forName( entry.getClassName() ); 78 final ConfigurationValidator validator = (ConfigurationValidator)clazz.newInstance(); 79 80 ContainerUtil.enableLogging( validator, getLogger() ); 81 ContainerUtil.configure( validator, entry.getConfiguration() ); 82 ContainerUtil.initialize( validator ); 83 84 entry.setValidator( validator ); 85 } 86 } 87 88 public void dispose() 89 { 90 for( Iterator i = m_delegates.values().iterator(); i.hasNext(); ) 91 { 92 ContainerUtil.dispose( ((DelegateEntry)i.next()).getValidator() ); 93 } 94 } 95 96 public void addSchema( String application, String block, String schemaType, String url ) 97 throws ConfigurationException 98 { 99 final DelegateEntry entry = (DelegateEntry)this.m_delegates.get( schemaType ); 100 101 if( entry == null ) 102 { 103 final String msg = REZ.getString( "jarv.error.badtype", 104 schemaType, 105 this.m_supportedTypes ); 106 107 throw new ConfigurationException( msg ); 108 } 109 110 entry.getValidator().addSchema( application, block, schemaType, url ); 111 this.m_blockTypeMap.put( createKey( application, block ), schemaType ); 112 } 113 114 public boolean isFeasiblyValid( String application, String block, Configuration configuration ) 115 throws ConfigurationException 116 { 117 final ConfigurationValidator delegate = getDelegate( application, block ); 118 119 return delegate.isFeasiblyValid( application, block, configuration ); 120 } 121 122 public boolean isValid( String application, String block, Configuration configuration ) 123 throws ConfigurationException 124 { 125 final ConfigurationValidator delegate = getDelegate( application, block ); 126 127 return delegate.isValid( application, block, configuration ); 128 } 129 130 public void removeSchema( String application, String block ) 131 { 132 final String type = (String )m_blockTypeMap.get( createKey( application, block ) ); 133 134 if( null != type ) 135 { 136 final DelegateEntry entry = (DelegateEntry)m_delegates.get( type ); 137 138 entry.getValidator().removeSchema( application, block ); 139 } 140 } 141 142 private ConfigurationValidator getDelegate( String application, String block ) 143 throws ConfigurationException 144 { 145 final String type = (String )this.m_blockTypeMap.get( createKey( application, block ) ); 146 147 if( null == type ) 148 { 149 final String msg = REZ.getString( "jarv.error.noschema", application, block ); 150 151 throw new ConfigurationException( msg ); 152 } 153 154 return ((DelegateEntry)this.m_delegates.get( type )).getValidator(); 155 } 156 157 private String createKey( String application, String block ) 158 { 159 return application + "." + block; 160 } 161 162 public String getSchema( String application, String block ) 163 { 164 final String type = (String )m_blockTypeMap.get( createKey( application, block ) ); 165 166 if( null != type ) 167 { 168 final DelegateEntry entry = (DelegateEntry)m_delegates.get( type ); 169 final ConfigurationValidator validator = entry.getValidator(); 170 171 if( validator instanceof ConfigurationValidatorMBean ) 172 { 173 return ((ConfigurationValidatorMBean)validator).getSchema( application, 174 block ); 175 176 } 177 } 178 179 return null; 180 } 181 182 public String getSchemaType( String application, String block ) 183 { 184 return (String )this.m_blockTypeMap.get( createKey( application, block ) ); 185 } 186 } 187 | Popular Tags |