1 50 51 package org.apache.avalon.meta.info.verifier; 52 53 import java.lang.reflect.Constructor ; 54 import java.lang.reflect.Modifier ; 55 import org.apache.avalon.excalibur.i18n.ResourceManager; 56 import org.apache.avalon.excalibur.i18n.Resources; 57 import org.apache.avalon.framework.activity.Disposable; 58 import org.apache.avalon.framework.activity.Initializable; 59 import org.apache.avalon.framework.activity.Startable; 60 import org.apache.avalon.framework.activity.Suspendable; 61 import org.apache.avalon.framework.component.Composable; 62 import org.apache.avalon.framework.component.Recomposable; 63 import org.apache.avalon.framework.configuration.Configurable; 64 import org.apache.avalon.framework.configuration.Reconfigurable; 65 import org.apache.avalon.framework.context.Contextualizable; 66 import org.apache.avalon.framework.context.Recontextualizable; 67 import org.apache.avalon.framework.logger.LogEnabled; 68 import org.apache.avalon.framework.parameters.Parameterizable; 69 import org.apache.avalon.framework.parameters.Reparameterizable; 70 import org.apache.avalon.framework.service.Serviceable; 71 72 79 public class TypeVerifier 80 { 81 private static final Resources REZ = 82 ResourceManager.getPackageResources( TypeVerifier.class ); 83 84 private static final Class [] EMPTY_TYPES = new Class [ 0 ]; 85 86 89 private static final Class [] FRAMEWORK_CLASSES = new Class [] 90 { 91 LogEnabled.class, 92 Contextualizable.class, 93 Recontextualizable.class, 94 Composable.class, 95 Recomposable.class, 96 Serviceable.class, 97 Configurable.class, 98 Reconfigurable.class, 99 Parameterizable.class, 100 Reparameterizable.class, 101 Initializable.class, 102 Startable.class, 103 Suspendable.class, 104 Disposable.class 105 }; 106 107 117 public void verifyType( final String name, 118 final Class implementation, 119 final Class [] services ) 120 throws VerifyException 121 { 122 verifyClass( name, implementation ); 123 verifyLifecycles( name, implementation ); 124 verifyServices( name, services ); 125 verifyImplementsServices( name, implementation, services ); 126 } 127 128 129 139 public void verifyImplementsServices( final String name, 140 final Class implementation, 141 final Class [] services ) 142 throws VerifyException 143 { 144 for( int i = 0; i < services.length; i++ ) 145 { 146 if( !services[ i ].isAssignableFrom( implementation ) ) 147 { 148 final String message = 149 REZ.getString( "verifier.noimpl-service.error", 150 name, 151 implementation.getName(), 152 services[ i ].getName() ); 153 throw new VerifyException( message ); 154 } 155 } 156 } 157 158 167 public void verifyClass( final String name, 168 final Class clazz ) 169 throws VerifyException 170 { 171 verifyNoArgConstructor( name, clazz ); 172 verifyNonAbstract( name, clazz ); 173 verifyNonArray( name, clazz ); 174 verifyNonInterface( name, clazz ); 175 verifyNonPrimitive( name, clazz ); 176 verifyPublic( name, clazz ); 177 } 178 179 188 public void verifyServices( final String name, 189 final Class [] classes ) 190 throws VerifyException 191 { 192 for( int i = 0; i < classes.length; i++ ) 193 { 194 verifyService( name, classes[ i ] ); 195 } 196 } 197 198 207 public void verifyService( final String name, 208 final Class clazz ) 209 throws VerifyException 210 { 211 verifyServiceIsPublic( name, clazz ); 212 213 220 } 223 224 233 public void verifyLifecycles( final String name, 234 final Class implementation ) 235 throws VerifyException 236 { 237 final boolean composable = 238 Composable.class.isAssignableFrom( implementation ) 239 || Recomposable.class.isAssignableFrom( implementation ); 240 final boolean serviceable = Serviceable.class.isAssignableFrom( implementation ); 241 if( serviceable && composable ) 242 { 243 final String message = 244 REZ.getString( "verifier.incompat-serviceable.error", 245 name, 246 implementation.getName() ); 247 throw new VerifyException( message ); 248 } 249 } 250 251 260 public void verifyServiceIsaInterface( final String name, 261 final Class clazz ) 262 throws VerifyException 263 { 264 if( !clazz.isInterface() ) 265 { 266 final String message = 267 REZ.getString( "verifier.non-interface-service.error", 268 name, 269 clazz.getName() ); 270 throw new VerifyException( message ); 271 } 272 } 273 274 283 public void verifyServiceIsPublic( final String name, 284 final Class clazz ) 285 throws VerifyException 286 { 287 final boolean isPublic = 288 Modifier.isPublic( clazz.getModifiers() ); 289 if( !isPublic ) 290 { 291 final String message = 292 REZ.getString( "verifier.non-public-service.error", 293 name, 294 clazz.getName() ); 295 throw new VerifyException( message ); 296 } 297 } 298 299 308 public void verifyServiceNotALifecycle( final String name, 309 final Class clazz ) 310 throws VerifyException 311 { 312 for( int i = 0; i < FRAMEWORK_CLASSES.length; i++ ) 313 { 314 final Class lifecycle = FRAMEWORK_CLASSES[ i ]; 315 if( lifecycle.isAssignableFrom( clazz ) ) 316 { 317 final String message = 318 REZ.getString( "verifier.service-isa-lifecycle.error", 319 name, 320 clazz.getName(), 321 lifecycle.getName() ); 322 throw new VerifyException( message ); 323 } 324 } 325 } 326 327 336 public void verifyNoArgConstructor( final String name, 337 final Class clazz ) 338 throws VerifyException 339 { 340 try 341 { 342 final Constructor ctor = clazz.getConstructor( EMPTY_TYPES ); 343 if( !Modifier.isPublic( ctor.getModifiers() ) ) 344 { 345 final String message = 346 REZ.getString( "verifier.non-public-ctor.error", 347 name, 348 clazz.getName() ); 349 throw new VerifyException( message ); 350 } 351 } 352 catch( final NoSuchMethodException nsme ) 353 { 354 final String message = 355 REZ.getString( "verifier.missing-noargs-ctor.error", 356 name, 357 clazz.getName() ); 358 throw new VerifyException( message ); 359 } 360 } 361 362 371 public void verifyNonAbstract( final String name, 372 final Class clazz ) 373 throws VerifyException 374 { 375 final boolean isAbstract = 376 Modifier.isAbstract( clazz.getModifiers() ); 377 if( isAbstract ) 378 { 379 final String message = 380 REZ.getString( "verifier.abstract-class.error", 381 name, 382 clazz.getName() ); 383 throw new VerifyException( message ); 384 } 385 } 386 387 396 public void verifyPublic( final String name, 397 final Class clazz ) 398 throws VerifyException 399 { 400 final boolean isPublic = 401 Modifier.isPublic( clazz.getModifiers() ); 402 if( !isPublic ) 403 { 404 final String message = 405 REZ.getString( "verifier.nonpublic-class.error", 406 name, 407 clazz.getName() ); 408 throw new VerifyException( message ); 409 } 410 } 411 412 421 public void verifyNonPrimitive( final String name, 422 final Class clazz ) 423 throws VerifyException 424 { 425 if( clazz.isPrimitive() ) 426 { 427 final String message = 428 REZ.getString( "verifier.primitive-class.error", 429 name, 430 clazz.getName() ); 431 throw new VerifyException( message ); 432 } 433 } 434 435 444 public void verifyNonInterface( final String name, 445 final Class clazz ) 446 throws VerifyException 447 { 448 if( clazz.isInterface() ) 449 { 450 final String message = 451 REZ.getString( "verifier.interface-class.error", 452 name, 453 clazz.getName() ); 454 throw new VerifyException( message ); 455 } 456 } 457 458 467 public void verifyNonArray( final String name, 468 final Class clazz ) 469 throws VerifyException 470 { 471 if( clazz.isArray() ) 472 { 473 final String message = 474 REZ.getString( "verifier.array-class.error", 475 name, 476 clazz.getName() ); 477 throw new VerifyException( message ); 478 } 479 } 480 } 481 | Popular Tags |