| 1 49 50 package org.apache.avalon.meta.info.writer; 51 52 import java.io.IOException ; 53 import java.io.OutputStream ; 54 import java.io.OutputStreamWriter ; 55 import java.io.Writer ; 56 57 import org.apache.avalon.meta.info.ContextDescriptor; 58 import org.apache.avalon.meta.info.DependencyDescriptor; 59 import org.apache.avalon.meta.info.Descriptor; 60 import org.apache.avalon.meta.info.EntryDescriptor; 61 import org.apache.avalon.meta.info.InfoDescriptor; 62 import org.apache.avalon.meta.info.CategoryDescriptor; 63 import org.apache.avalon.meta.info.ServiceDescriptor; 64 import org.apache.avalon.meta.info.StageDescriptor; 65 import org.apache.avalon.meta.info.ExtensionDescriptor; 66 import org.apache.avalon.meta.info.Type; 67 68 75 public class XMLTypeWriter 76 implements TypeWriter 77 { 78 private static final String CONTEXT_CLASS = 79 "org.apache.avalon.framework.context.Context"; 80 81 88 public void writeType( final Type type, 89 final OutputStream outputStream ) 90 throws Exception  91 { 92 final Writer writer = new OutputStreamWriter ( outputStream ); 93 writeHeader( writer ); 94 writeDoctype( writer, "type" ); 95 writer.write( "\n\n<type>" ); 96 writeInfo( writer, type.getInfo() ); 97 writeLoggers( writer, type.getCategories() ); 98 writeContext( writer, type.getContext() ); 99 writeServices( writer, type.getServices() ); 100 writeDependencies( writer, type.getDependencies() ); 101 writeStages( writer, type.getStages() ); 102 writeExtensions( writer, type.getExtensions() ); 103 writer.write( "\n</type>" ); 104 writer.flush(); 105 } 106 107 112 private void writeHeader( final Writer writer ) 113 throws IOException  114 { 115 writer.write( "<?xml version=\"1.0\" encoding=\"ISO-8859-1\"?>" ); 116 } 117 118 125 private void writeDoctype( final Writer writer, 126 final String root ) 127 throws IOException  128 { 129 final String doctype = 130 "\n<!DOCTYPE " + root 131 + " PUBLIC \"-//AVALON/Type DTD Version 1.0//EN\" " 132 + "\"http://avalon.apache.org/dtds/meta/type_1_1.dtd\" >"; 133 writer.write( doctype ); 134 } 135 136 143 private void writeInfo( final Writer writer, final InfoDescriptor info ) 144 throws IOException  145 { 146 writer.write( "\n <info>" ); 147 148 writer.write( "\n <name>"); 149 writer.write( info.getName() ); 150 writer.write( "</name>" ); 151 152 writer.write( "\n <version>"); 153 writer.write( info.getVersion().toString() ); 154 writer.write( "</version>"); 155 156 if( info.getConfigurationSchema() != null ) 157 { 158 writer.write( "\n <schema>"); 159 writer.write( info.getConfigurationSchema() ); 160 writer.write( "</schema>"); 161 } 162 163 writer.write( "\n <lifestyle>"); 164 writer.write( info.getLifestyle() ); 165 writer.write( "</lifestyle>" ); 166 167 if( 0 == info.getAttributeNames().length ) 168 { 169 writer.write( "\n </info>" ); 170 } 171 else 172 { 173 writeAttributes( writer, info ); 174 writer.write( "\n </info>" ); 175 } 176 } 177 178 185 private void writeLoggers( final Writer writer, 186 final CategoryDescriptor[] loggers ) 187 throws IOException  188 { 189 if( 0 == loggers.length ) 190 { 191 return; 192 } 193 writer.write( "\n <loggers>" ); 194 for( int i = 0; i < loggers.length; i++ ) 195 { 196 writeLogger( writer, loggers[ i ] ); 197 } 198 199 writer.write( "\n </loggers>" ); 200 } 201 202 209 private void writeLogger( final Writer writer, 210 final CategoryDescriptor logger ) 211 throws IOException  212 { 213 writer.write( "\n <logger name=\"" ); 214 writer.write( logger.getName() ); 215 if( 0 == logger.getAttributeNames().length ) 216 { 217 writer.write( "\"/>" ); 218 } 219 else 220 { 221 writer.write( "\">" ); 222 writeAttributes( writer, logger ); 223 writer.write( "\n </logger>" ); 224 } 225 } 226 227 234 private void writeContext( final Writer writer, 235 final ContextDescriptor context ) 236 throws IOException  237 { 238 final String type = context.getContextInterfaceClassname(); 239 final EntryDescriptor[] entrys = context.getEntries(); 240 final int count = context.getAttributeNames().length; 241 242 if( CONTEXT_CLASS.equals( type ) 243 && 0 == count 244 && 0 == entrys.length ) 245 { 246 return; 247 } 248 249 writer.write( "\n <context" ); 250 if( !CONTEXT_CLASS.equals( type ) ) 251 { 252 writer.write( " type=\"" ); 253 writer.write( type ); 254 writer.write( "\"" ); 255 } 256 257 if( 0 == count && 0 == entrys.length ) 258 { 259 writer.write( "/>" ); 260 } 261 else 262 { 263 writer.write( ">" ); 264 for( int i = 0; i < entrys.length; i++ ) 265 { 266 writeEntry( writer, entrys[ i ] ); 267 } 268 writeAttributes( writer, context ); 269 writer.write( "\n </context>" ); 270 } 271 } 272 273 280 private void writeEntry( final Writer writer, 281 final EntryDescriptor entry ) 282 throws IOException  283 { 284 writer.write( "\n <entry key=\"" ); 285 writer.write( entry.getKey() + "\" " ); 286 287 if( !entry.getClassname().equals( "java.lang.String" ) ) 288 { 289 writer.write( "type=\"" ); 290 writer.write( entry.getClassname() ); 291 writer.write( "\" " ); 292 } 293 294 if( entry.getAlias() != null ) 295 { 296 if( !entry.getAlias().equals( entry.getKey() ) ) 297 { 298 writer.write( "alias=\"" + entry.getAlias() + "\" " ); 299 } 300 } 301 if( entry.isOptional() ) 302 { 303 writer.write( "\" optional=\"true\" " ); 304 } 305 if( entry.isVolatile() ) 306 { 307 writer.write( "\" volatile=\"true\" " ); 308 } 309 310 writer.write( "/>" ); 311 } 312 313 320 private void writeServices( final Writer writer, 321 final ServiceDescriptor[] services ) 322 throws IOException  323 { 324 if( 0 == services.length ) 325 { 326 return; 327 } 328 329 writer.write( "\n <services>" ); 330 for( int i = 0; i < services.length; i++ ) 331 { 332 final ServiceDescriptor service = services[ i ]; 333 writer.write( "\n <service type=\"" ); 334 writer.write( service.getReference().getClassname() ); 335 if( service.getReference().getVersion().getMajor() > -1 ) 336 { 337 writer.write( "\" version=\"" ); 338 writer.write( service.getReference().getVersion().toString() ); 339 } 340 final int count = service.getAttributeNames().length; 341 if( 0 == count ) 342 { 343 writer.write( "\"/>" ); 344 } 345 else 346 { 347 writer.write( "\">" ); 348 writeAttributes( writer, service ); 349 writer.write( "\n </service>" ); 350 } 351 } 352 writer.write( "\n </services>" ); 353 } 354 355 362 private void writeDependencies( final Writer writer, 363 final DependencyDescriptor[] dependencies ) 364 throws IOException  365 { 366 if( 0 == dependencies.length ) 367 { 368 return; 369 } 370 371 writer.write( "\n <dependencies>" ); 372 for( int i = 0; i < dependencies.length; i++ ) 373 { 374 final DependencyDescriptor dependency = dependencies[ i ]; 375 writer.write( "\n <dependency " ); 376 377 if( !dependency.getKey().equals( dependency.getReference().getClassname() ) ) 378 { 379 writer.write( "key=\"" ); 380 writer.write( dependency.getKey() ); 381 writer.write( "\" " ); 382 } 383 384 writer.write( "type=\"" ); 385 writer.write( dependency.getReference().getClassname() ); 386 if( dependency.getReference().getVersion().getMajor() > -1 ) 387 { 388 writer.write( "\" version=\"" ); 389 writer.write( dependency.getReference().getVersion().toString() ); 390 } 391 392 if( dependency.isOptional() ) 393 { 394 writer.write( "\" optional=\"true" ); 395 } 396 397 final int count = dependency.getAttributeNames().length; 398 if( 0 == count ) 399 { 400 writer.write( "\"/>" ); 401 } 402 else 403 { 404 writer.write( "\">" ); 405 writeAttributes( writer, dependency ); 406 writer.write( "\n </dependency>" ); 407 } 408 } 409 writer.write( "\n </dependencies>" ); 410 } 411 412 419 private void writeAttributes( final Writer writer, final Descriptor descriptor ) 420 throws IOException  421 { 422 String [] names = descriptor.getAttributeNames(); 423 if( names.length > 0 ) 424 { 425 writer.write( "\n <attributes>" ); 426 for( int i = 0; i < names.length; i++ ) 427 { 428 writeAttribute( writer, names[i], descriptor.getAttribute( names[i] ) ); 429 } 430 writer.write( "\n </attributes>" ); 431 } 432 } 433 434 442 private void writeAttribute( final Writer writer, 443 final String key, final String value ) 444 throws IOException  445 { 446 writer.write( "\n <attribute key=\"" ); 447 writer.write( key ); 448 writer.write( "\" value=\"" ); 449 writer.write( value ); 450 writer.write( "\"/>" ); 451 } 452 453 460 private void writeStages( final Writer writer, 461 final StageDescriptor[] stages ) 462 throws IOException  463 { 464 if( 0 == stages.length ) 465 { 466 return; 467 } 468 469 writer.write( "\n <stages>" ); 470 for( int i = 0; i < stages.length; i++ ) 471 { 472 final StageDescriptor stage = stages[ i ]; 473 writer.write( "\n <stage " ); 474 writer.write( "id=\"" ); 475 writer.write( stage.getKey() ); 476 477 final int count = stage.getAttributeNames().length; 478 if( 0 == count ) 479 { 480 writer.write( "\"/>" ); 481 } 482 else 483 { 484 writer.write( "\">" ); 485 writeAttributes( writer, stage ); 486 writer.write( "\n </stage>" ); 487 } 488 } 489 writer.write( "\n </stages>" ); 490 } 491 492 499 private void writeExtensions( final Writer writer, 500 final ExtensionDescriptor[] extensions ) 501 throws IOException  502 { 503 if( 0 == extensions.length ) 504 { 505 return; 506 } 507 508 writer.write( "\n <extensions>" ); 509 for( int i = 0; i < extensions.length; i++ ) 510 { 511 final ExtensionDescriptor extension = extensions[ i ]; 512 513 writer.write( "\n <extension " ); 514 writer.write( "id=\"" ); 515 writer.write( extension.getKey() ); 516 517 final int count = extension.getAttributeNames().length; 518 if( 0 == count ) 519 { 520 writer.write( "\"/>" ); 521 } 522 else 523 { 524 writer.write( "\">" ); 525 writeAttributes( writer, extension ); 526 writer.write( "\n </extension>" ); 527 } 528 } 529 writer.write( "\n </extensions>" ); 530 } 531 } 532 | Popular Tags |