1 87 package org.codehaus.loom.components.assembler; 88 89 import java.util.ArrayList ; 90 import java.util.List ; 91 import java.util.Map ; 92 93 import org.codehaus.loom.components.util.metadata.ComponentTemplate; 94 import org.codehaus.loom.components.util.metadata.DependencyDirective; 95 import org.codehaus.loom.components.util.metadata.MetaDataBuilder; 96 import org.codehaus.loom.components.util.metadata.PartitionTemplate; 97 import org.codehaus.loom.interfaces.ContainerConstants; 98 import org.codehaus.loom.interfaces.LoomException; 99 import org.codehaus.spice.salt.i18n.ResourceManager; 100 import org.codehaus.spice.salt.i18n.Resources; 101 import org.codehaus.dna.Configuration; 102 import org.codehaus.dna.ConfigurationException; 103 104 112 public class Assembler 113 implements MetaDataBuilder 114 { 115 private static final Resources REZ = 116 ResourceManager.getPackageResources( Assembler.class ); 117 118 129 public PartitionTemplate buildAssembly( final Map parameters ) 130 throws Exception 131 { 132 final String name = 133 (String )parameters.get( ContainerConstants.ASSEMBLY_NAME ); 134 final Configuration assembly = 135 (Configuration)parameters.get( 136 ContainerConstants.ASSEMBLY_DESCRIPTOR ); 137 final Configuration config = 138 (Configuration)parameters.get( 139 ContainerConstants.CONFIG_DESCRIPTOR ); 140 return assembleSar( name, config, assembly ); 141 } 142 143 152 private PartitionTemplate assembleSar( final String name, 153 final Configuration config, 154 final Configuration assembly ) 155 throws LoomException 156 { 157 final Configuration[] blockConfig = assembly.getChildren( "block" ); 158 final ComponentTemplate[] blocks = buildBlocks( blockConfig, config ); 159 final PartitionTemplate blockPartition = 160 new PartitionTemplate( ContainerConstants.BLOCK_PARTITION, 161 new String []{ 162 ContainerConstants.LISTENER_PARTITION}, 163 PartitionTemplate.EMPTY_SET, 164 blocks ); 165 166 final Configuration[] listenerConfig = assembly.getChildren( 167 "listener" ); 168 final ComponentTemplate[] listeners = buildBlockListeners( 169 listenerConfig, config ); 170 final PartitionTemplate listenerPartition = 171 new PartitionTemplate( ContainerConstants.LISTENER_PARTITION, 172 new String [ 0 ], 173 PartitionTemplate.EMPTY_SET, 174 listeners ); 175 176 final PartitionTemplate[] partitions = 177 new PartitionTemplate[]{blockPartition, listenerPartition}; 178 179 return new PartitionTemplate( name, 180 new String [ 0 ], 181 partitions, 182 ComponentTemplate.EMPTY_SET ); 183 } 184 185 193 private ComponentTemplate[] buildBlocks( final Configuration[] blocks, 194 final Configuration config ) 195 throws LoomException 196 { 197 final ArrayList blockSet = new ArrayList (); 198 for( int i = 0; i < blocks.length; i++ ) 199 { 200 blockSet.add( buildBlock( blocks[ i ], config ) ); 201 } 202 203 return (ComponentTemplate[])blockSet.toArray( 204 new ComponentTemplate[ blockSet.size() ] ); 205 } 206 207 215 private ComponentTemplate buildBlock( final Configuration block, 216 final Configuration config ) 217 throws LoomException 218 { 219 try 220 { 221 final String name = block.getAttribute( "name" ); 222 final String classname = block.getAttribute( "class" ); 223 final Configuration proxy = block.getChild( "proxy" ); 224 225 final boolean disableProxy = 226 proxy.getAttributeAsBoolean( "disable", false ); 227 228 final Configuration[] provides = block.getChildren( "provide" ); 229 final DependencyDirective[] dependencys = buildDependencies( 230 provides ); 231 232 final Configuration configuration = config.getChild( name ); 233 234 return new ComponentTemplate( name, classname, 235 dependencys, null, 236 configuration, 237 disableProxy ); 238 } 239 catch( final ConfigurationException ce ) 240 { 241 final String message = 242 REZ.format( "block-entry-malformed", 243 block.getLocation(), 244 ce.getMessage() ); 245 throw new LoomException( message, ce ); 246 } 247 } 248 249 258 private ComponentTemplate[] buildBlockListeners( 259 final Configuration[] listenerConfigs, 260 final Configuration config ) 261 throws LoomException 262 { 263 final List listeners = new ArrayList (); 264 for( int i = 0; i < listenerConfigs.length; i++ ) 265 { 266 final ComponentTemplate listener = buildBlockListener( 267 listenerConfigs[ i ], config ); 268 listeners.add( listener ); 269 } 270 return (ComponentTemplate[])listeners. 271 toArray( new ComponentTemplate[ listeners.size() ] ); 272 } 273 274 282 ComponentTemplate buildBlockListener( final Configuration listener, 283 final Configuration config ) 284 throws LoomException 285 { 286 try 287 { 288 final String name = listener.getAttribute( "name" ); 289 final String classname = listener.getAttribute( "class" ); 290 final Configuration configuration = config.getChild( name ); 291 return new ComponentTemplate( name, classname, 292 DependencyDirective.EMPTY_SET, 293 null, 294 configuration, 295 false ); 296 } 297 catch( final ConfigurationException ce ) 298 { 299 final String message = 300 REZ.format( "listener-entry-malformed", 301 listener.getLocation(), 302 ce.getMessage() ); 303 throw new LoomException( message, ce ); 304 } 305 } 306 307 315 DependencyDirective[] buildDependencies( final Configuration[] provides ) 316 throws ConfigurationException 317 { 318 final ArrayList dependencies = new ArrayList (); 319 for( int j = 0; j < provides.length; j++ ) 320 { 321 final DependencyDirective directive = buildDependency( 322 provides[ j ] ); 323 dependencies.add( directive ); 324 } 325 326 return (DependencyDirective[])dependencies.toArray( 327 new DependencyDirective[ dependencies.size() ] ); 328 } 329 330 337 DependencyDirective buildDependency( final Configuration provide ) 338 throws ConfigurationException 339 { 340 final String requiredName = provide.getAttribute( "name" ); 341 final String alias = provide.getAttribute( "alias", requiredName ); 342 final String key = provide.getAttribute( "role" ); 343 return new DependencyDirective( key, requiredName, alias ); 344 } 345 } 346 | Popular Tags |