KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > org > apache > avalon > phoenix > components > configuration > validator > DelegatingConfigurationValidator


1 /*
2  * Copyright (C) The Apache Software Foundation. All rights reserved.
3  *
4  * This software is published under the terms of the Apache Software License
5  * version 1.1, a copy of which has been included with this distribution in
6  * the LICENSE.txt file.
7  */

8 package org.apache.avalon.phoenix.components.configuration.validator;
9
10 import java.util.Collections JavaDoc;
11 import java.util.HashMap JavaDoc;
12 import java.util.Iterator JavaDoc;
13 import java.util.Map JavaDoc;
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 /**
27  * Default ConfigurationValidator implementation that allows schemas to be plugged-in
28  *
29  * @author <a HREF="mailto:proyal@apache.org">Peter Royal</a>
30  */

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 JavaDoc m_blockTypeMap = Collections.synchronizedMap( new HashMap JavaDoc() );
39
40     private Map JavaDoc m_delegates = new HashMap JavaDoc();
41
42     private String JavaDoc m_supportedTypes;
43
44     public void configure( Configuration configuration )
45         throws ConfigurationException
46     {
47         final Configuration[] delegates = configuration.getChildren( "delegate" );
48         final StringBuffer JavaDoc types = new StringBuffer JavaDoc();
49
50         for( int i = 0; i < delegates.length; i++ )
51         {
52             final String JavaDoc 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 JavaDoc
73     {
74         for( Iterator JavaDoc i = m_delegates.values().iterator(); i.hasNext(); )
75         {
76             final DelegateEntry entry = (DelegateEntry)i.next();
77             final Class JavaDoc 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 JavaDoc i = m_delegates.values().iterator(); i.hasNext(); )
91         {
92             ContainerUtil.dispose( ((DelegateEntry)i.next()).getValidator() );
93         }
94     }
95
96     public void addSchema( String JavaDoc application, String JavaDoc block, String JavaDoc schemaType, String JavaDoc url )
97         throws ConfigurationException
98     {
99         final DelegateEntry entry = (DelegateEntry)this.m_delegates.get( schemaType );
100
101         if( entry == null )
102         {
103             final String JavaDoc 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 JavaDoc application, String JavaDoc 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 JavaDoc application, String JavaDoc 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 JavaDoc application, String JavaDoc block )
131     {
132         final String JavaDoc type = (String JavaDoc)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 JavaDoc application, String JavaDoc block )
143         throws ConfigurationException
144     {
145         final String JavaDoc type = (String JavaDoc)this.m_blockTypeMap.get( createKey( application, block ) );
146
147         if( null == type )
148         {
149             final String JavaDoc 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 JavaDoc createKey( String JavaDoc application, String JavaDoc block )
158     {
159         return application + "." + block;
160     }
161
162     public String JavaDoc getSchema( String JavaDoc application, String JavaDoc block )
163     {
164         final String JavaDoc type = (String JavaDoc)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 JavaDoc getSchemaType( String JavaDoc application, String JavaDoc block )
183     {
184         return (String JavaDoc)this.m_blockTypeMap.get( createKey( application, block ) );
185     }
186 }
187
Popular Tags