1 50 51 package org.apache.avalon.meta.info.builder; 52 53 import java.io.InputStream ; 54 import org.apache.avalon.excalibur.i18n.ResourceManager; 55 import org.apache.avalon.excalibur.i18n.Resources; 56 import org.apache.avalon.meta.info.Type; 57 import org.apache.avalon.framework.configuration.Configuration; 58 import org.apache.avalon.framework.configuration.DefaultConfiguration; 59 import org.apache.avalon.framework.configuration.ConfigurationException; 60 import org.apache.avalon.meta.ConfigurationBuilder; 61 import org.xml.sax.InputSource ; 62 63 74 public final class TypeBuilder 75 { 76 private static final Resources REZ = 77 ResourceManager.getPackageResources( TypeBuilder.class ); 78 79 private final TypeFactory m_xmlTypeFactory = createxmlTypeFactory(); 80 private final TypeCreator m_serialTypeCreator = new SerializedTypeCreator(); 81 82 89 public Type buildType( final Class clazz ) 90 throws Exception 91 { 92 97 final Type info = buildFromSerDescriptor( clazz ); 98 if( null != info ) 99 { 100 return info; 101 } 102 else 103 { 104 return buildFromXMLDescriptor( clazz ); 105 } 106 } 107 108 115 private Type buildFromSerDescriptor( final Class clazz ) 116 throws Exception 117 { 118 Type type = buildFromSerDescriptor( clazz, ".ztype" ); 119 if( type != null ) 120 { 121 return type; 122 } 123 else 124 { 125 return buildFromSerDescriptor( clazz, ".zinfo" ); 126 } 127 } 128 129 private Type buildFromSerDescriptor( final Class clazz, String form ) 130 throws Exception 131 { 132 final String classname = clazz.getName(); 133 final ClassLoader classLoader = clazz.getClassLoader(); 134 final String address = classname.replace( '.', '/' ) + form; 135 final InputStream stream = 136 classLoader.getResourceAsStream( address ); 137 if( null == stream ) 138 { 139 return null; 140 } 141 return m_serialTypeCreator.createType( classname, stream ); 142 } 143 144 157 private Type buildFromXMLDescriptor( Class clazz ) 158 throws Exception 159 { 160 final String classname = clazz.getName(); 161 final ClassLoader classLoader = clazz.getClassLoader(); 162 163 final TypeFactory xmlTypeFactory = getXMLTypeFactory(); 164 165 169 String path = 170 classname.replace( '.', '/' ) + ".xtype"; 171 InputStream inputStream = 172 classLoader.getResourceAsStream( path ); 173 174 if( null == inputStream ) 175 { 176 path = 177 classname.replace( '.', '/' ) + ".xinfo"; 178 inputStream = 179 classLoader.getResourceAsStream( path ); 180 } 181 182 if( null == inputStream ) 183 { 184 final String message = 185 REZ.getString( "builder.missing-info.error" ); 186 throw new Exception ( message ); 187 } 188 189 final InputSource inputSource = new InputSource ( inputStream ); 190 final Configuration xinfo = ConfigurationBuilder.build( inputSource ); 191 192 final String xdefaults = 193 classname.replace( '.', '/' ) + ".xconfig"; 194 final InputStream defaultsStream = 195 classLoader.getResourceAsStream( xdefaults ); 196 197 Configuration defaults; 198 if( defaultsStream != null ) 199 { 200 final InputSource defaultsSource = new InputSource ( defaultsStream ); 201 defaults = resolveConfiguration( 202 classLoader, ConfigurationBuilder.build( defaultsSource ) ); 203 } 204 else 205 { 206 defaults = new DefaultConfiguration( "configuration", (String ) null ); 207 } 208 209 213 return xmlTypeFactory.createType( classname, xinfo, defaults ); 214 } 215 216 private Configuration resolveConfiguration( ClassLoader classloader, Configuration config ) 217 throws Exception 218 { 219 if( config == null ) 220 { 221 throw new NullPointerException ("config"); 222 } 223 String src = config.getAttribute( "src", null ); 224 if( src == null ) 225 { 226 return config; 227 } 228 else 229 { 230 if( src.startsWith( "resource://" ) ) 231 { 232 final String url = src.substring( 11 ); 233 final InputStream stream = 234 classloader.getResourceAsStream( url ); 235 if( null == stream ) 236 { 237 final String error = 238 "Requested configuration source does not exist: " + src; 239 throw new ConfigurationException( error ); 240 } 241 final InputSource source = new InputSource ( stream ); 242 return resolveConfiguration( 243 classloader, ConfigurationBuilder.build( source ) ); 244 } 245 else 246 { 247 try 248 { 249 return resolveConfiguration( 250 classloader, ConfigurationBuilder.build( src ) ); 251 } 252 catch( Throwable e ) 253 { 254 final String error = 255 "Unexpected exception while attempting to resolve configuration from src : " 256 + src; 257 throw new ConfigurationException( error, e ); 258 } 259 } 260 } 261 } 262 263 269 private TypeFactory getXMLTypeFactory() 270 throws Exception 271 { 272 if( null != m_xmlTypeFactory ) 273 { 274 return m_xmlTypeFactory; 275 } 276 else 277 { 278 final String message = 279 REZ.getString( "builder.missing-xml-creator.error" ); 280 throw new Exception ( message ); 281 } 282 } 283 284 290 private static TypeFactory createxmlTypeFactory() 291 { 292 TypeFactory xmlTypeFactory = null; 293 try 294 { 295 xmlTypeFactory = new XMLTypeCreator(); 296 } 297 catch( final Exception e ) 298 { 299 } 302 return xmlTypeFactory; 303 } 304 } 305 | Popular Tags |