1 package org.codehaus.xfire.plexus.type;
2
3 import javax.xml.namespace.QName;
4
5 import org.codehaus.plexus.configuration.PlexusConfiguration;
6 import org.codehaus.plexus.configuration.PlexusConfigurationException;
7 import org.codehaus.plexus.logging.LogEnabled;
8 import org.codehaus.plexus.logging.Logger;
9 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Configurable;
10 import org.codehaus.plexus.personality.plexus.lifecycle.phase.Initializable;
11 import org.codehaus.xfire.aegis.type.Type;
12 import org.codehaus.xfire.aegis.type.TypeMapping;
13 import org.codehaus.xfire.util.ClassLoaderUtils;
14
15 /***
16 * Extends and configures the TypeMappingRegistry.
17 *
18 * @author <a href="mailto:dan@envoisolutions.com">Dan Diephouse</a>
19 * @since Oct 31, 2004
20 */
21 public class TypeMappingRegistry
22 extends org.codehaus.xfire.aegis.type.DefaultTypeMappingRegistry
23 implements LogEnabled, Configurable, Initializable
24 {
25 private Logger logger;
26
27 public void configure(PlexusConfiguration config)
28 throws PlexusConfigurationException
29 {
30 PlexusConfiguration tmConfig[] = config.getChildren("typeMapping");
31
32 for ( int i = 0; i < tmConfig.length; i++ )
33 {
34 configureTypeMapping( tmConfig[i] );
35 }
36 }
37
38 private void configureTypeMapping(PlexusConfiguration configuration)
39 throws PlexusConfigurationException
40 {
41 TypeMapping tm = createTypeMapping(false);
42
43 register( configuration.getAttribute( "namespace" ), tm );
44
45 if ( Boolean.valueOf( configuration.getAttribute("default", "false") ).booleanValue() )
46 registerDefault( tm );
47
48 PlexusConfiguration[] types = configuration.getChildren( "type" );
49
50 for ( int i = 0; i < types.length; i++ )
51 {
52 configureType( types[i], tm );
53 }
54 }
55
56 private void configureType( PlexusConfiguration configuration, TypeMapping tm )
57 throws PlexusConfigurationException
58 {
59 try
60 {
61 String ns = configuration.getAttribute("namespace");
62 String name = configuration.getAttribute("name");
63 QName qname = new QName(ns, name);
64
65 Class clazz = ClassLoaderUtils.loadClass( configuration.getAttribute("class"), getClass() );
66 Class typeClass = ClassLoaderUtils.loadClass( configuration.getAttribute("type"), getClass() );
67
68 Type type = (Type) typeClass.newInstance();
69
70 tm.register(clazz, qname, type);
71
72 logger.debug( "Registered " + typeClass.getName() +
73 " for " + qname + " with class " + clazz.getName() );
74 }
75 catch (Exception e)
76 {
77 if ( e instanceof PlexusConfigurationException )
78 throw (PlexusConfigurationException) e;
79
80 throw new PlexusConfigurationException( "Could not configure type.", e );
81 }
82 }
83
84 public void enableLogging(Logger logger)
85 {
86 this.logger = logger;
87 }
88
89 public void initialize()
90 {
91 createDefaultMappings();
92 }
93 }