001 /* 002 * Copyright (c) 2009 The JOMC Project 003 * Copyright (c) 2005 Christian Schulte <cs@jomc.org> 004 * All rights reserved. 005 * 006 * Redistribution and use in source and binary forms, with or without 007 * modification, are permitted provided that the following conditions 008 * are met: 009 * 010 * o Redistributions of source code must retain the above copyright 011 * notice, this list of conditions and the following disclaimer. 012 * 013 * o Redistributions in binary form must reproduce the above copyright 014 * notice, this list of conditions and the following disclaimer in 015 * the documentation and/or other materials provided with the 016 * distribution. 017 * 018 * THIS SOFTWARE IS PROVIDED BY THE JOMC PROJECT AND CONTRIBUTORS "AS IS" 019 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 020 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 021 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE JOMC PROJECT OR 022 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 023 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 024 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 025 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 026 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 027 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 028 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 029 * 030 * $Id: DefaultModelObjectValidator.java 1093 2009-12-06 17:24:40Z schulte2005 $ 031 * 032 */ 033 package org.jomc.model; 034 035 import java.io.StringWriter; 036 import java.text.MessageFormat; 037 import java.util.HashMap; 038 import java.util.LinkedList; 039 import java.util.List; 040 import java.util.Locale; 041 import java.util.Map; 042 import java.util.ResourceBundle; 043 import java.util.logging.Level; 044 import javax.xml.bind.JAXBContext; 045 import javax.xml.bind.JAXBElement; 046 import javax.xml.bind.JAXBException; 047 import javax.xml.bind.Marshaller; 048 import javax.xml.bind.ValidationEvent; 049 import javax.xml.bind.ValidationEventHandler; 050 import javax.xml.validation.Schema; 051 import org.jomc.util.ParseException; 052 import org.jomc.util.TokenMgrError; 053 import org.jomc.util.VersionParser; 054 055 /** 056 * Default {@code ModelObjectValidator} implementation. 057 * 058 * @author <a href="mailto:cs@jomc.org">Christian Schulte</a> 059 * @version $Id: DefaultModelObjectValidator.java 1093 2009-12-06 17:24:40Z schulte2005 $ 060 */ 061 public class DefaultModelObjectValidator implements ModelObjectValidator 062 { 063 064 /** Creates a new {@code DefaultModelObjectValidator} instance. */ 065 public DefaultModelObjectValidator() 066 { 067 super(); 068 } 069 070 public ModelObjectValidationReport validateModelObject( 071 final JAXBElement modelObject, final JAXBContext context, final Schema schema ) throws JAXBException 072 { 073 if ( modelObject == null ) 074 { 075 throw new NullPointerException( "modelObject" ); 076 } 077 if ( modelObject.getValue() == null ) 078 { 079 throw new NullPointerException( "modelObject" ); 080 } 081 if ( context == null ) 082 { 083 throw new NullPointerException( "context" ); 084 } 085 if ( schema == null ) 086 { 087 throw new NullPointerException( "schema" ); 088 } 089 090 final Marshaller marshaller = context.createMarshaller(); 091 final ModelObjectValidationReport report = new ModelObjectValidationReport( modelObject ); 092 marshaller.setSchema( schema ); 093 marshaller.setEventHandler( new ModelObjectValidationEventHandler( report ) ); 094 095 try 096 { 097 marshaller.marshal( modelObject, new StringWriter() ); 098 } 099 catch ( final JAXBException e ) 100 { 101 if ( report.getDetails().isEmpty() ) 102 { 103 throw e; 104 } 105 } 106 107 return report; 108 } 109 110 public ModelObjectValidationReport validateModules( 111 final JAXBElement<Modules> modules, final JAXBContext context, final Schema schema ) throws JAXBException 112 { 113 if ( modules == null ) 114 { 115 throw new NullPointerException( "modules" ); 116 } 117 if ( modules.getValue() == null ) 118 { 119 throw new NullPointerException( "modules" ); 120 } 121 if ( context == null ) 122 { 123 throw new NullPointerException( "context" ); 124 } 125 if ( schema == null ) 126 { 127 throw new NullPointerException( "schema" ); 128 } 129 130 final ModelObjectValidationReport report = this.validateModelObject( modules, context, schema ); 131 132 for ( Module m : modules.getValue().getModule() ) 133 { 134 this.assertNoSpecificationReferenceDeclarations( m, report ); 135 this.assertNoImplementationReferenceDeclarations( m, report ); 136 this.assertNoMessageReferenceDeclarations( m, report ); 137 this.assertNoFinalMessageDeclarations( m, report ); 138 this.assertNoOverrideMessageDeclarations( m, report ); 139 this.assertNoPropertyReferenceDeclarations( m, report ); 140 this.assertNoFinalPropertyDeclarations( m, report ); 141 this.assertNoOverridePropertyDeclarations( m, report ); 142 143 if ( m.getImplementations() != null ) 144 { 145 for ( Implementation i : m.getImplementations().getImplementation() ) 146 { 147 this.assertNoDependencyPropertyReferenceDeclarations( i, report ); 148 this.assertNoImplementationDeclarations( i, report ); 149 this.assertNoLocationWhenAbstract( i, report ); 150 this.assertNoSpecificationDeclarations( i, report ); 151 this.assertImplementationMessagesUniqueness( i, report ); 152 this.assertImplementationPropertiesUniqueness( i, report ); 153 this.assertImplementationDependencyCompatibility( modules.getValue(), i, report ); 154 this.assertImplementationInheritanceCompatibility( modules.getValue(), i, report ); 155 this.assertImplementationSpecificationCompatibility( modules.getValue(), i, report ); 156 this.assertNoMissingMandatoryDependencies( modules.getValue(), i, report ); 157 this.assertNoDependenciesWithoutSpecificationClass( modules.getValue(), i, report ); 158 this.assertNoInheritanceCycle( modules.getValue(), i, report ); 159 this.assertNoInheritanceClashes( modules.getValue(), i, report ); 160 this.assertNoOverridenDependencyPropertiesWhenNotMultiton( modules.getValue(), i, report ); 161 this.assertImplementationOverrideConstraints( modules.getValue(), i, report ); 162 this.assertSpecificationOverrideConstraints( modules.getValue(), i, report ); 163 this.assertDependencyOverrideConstraints( modules.getValue(), i, report ); 164 this.assertMessageOverrideConstraints( modules.getValue(), i, report ); 165 this.assertPropertyOverrideConstraints( modules.getValue(), i, report ); 166 this.assertDependencyPropertiesOverrideConstraints( modules.getValue(), i, report ); 167 } 168 } 169 170 if ( m.getSpecifications() != null ) 171 { 172 for ( Specification s : m.getSpecifications().getSpecification() ) 173 { 174 this.assertNoSpecificationPropertyReferenceDeclarations( s, report ); 175 this.assertSpecificationImplementationNameUniqueness( modules.getValue(), s, report ); 176 this.assertSpecificationMultiplicityConstraint( modules.getValue(), s, report ); 177 } 178 } 179 } 180 181 return report; 182 } 183 184 private void assertNoSpecificationReferenceDeclarations( final Module module, 185 final ModelObjectValidationReport report ) 186 { 187 if ( module.getSpecifications() != null ) 188 { 189 for ( SpecificationReference r : module.getSpecifications().getReference() ) 190 { 191 report.getDetails().add( this.createDetail( 192 "MODULE_SPECIFICATION_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 193 "moduleSpecificationReferenceDeclarationConstraint", new Object[] 194 { 195 module.getName(), r.getIdentifier() 196 }, new ObjectFactory().createModule( module ) ) ); 197 198 } 199 } 200 } 201 202 private void assertNoImplementationReferenceDeclarations( final Module module, 203 final ModelObjectValidationReport report ) 204 { 205 if ( module.getImplementations() != null ) 206 { 207 for ( ImplementationReference r : module.getImplementations().getReference() ) 208 { 209 report.getDetails().add( this.createDetail( 210 "MODULE_IMPLEMENTATION_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 211 "moduleImplementationReferenceDeclarationConstraint", new Object[] 212 { 213 module.getName(), r.getIdentifier() 214 }, new ObjectFactory().createModule( module ) ) ); 215 216 } 217 } 218 } 219 220 private void assertNoMessageReferenceDeclarations( final Module module, 221 final ModelObjectValidationReport report ) 222 { 223 if ( module.getMessages() != null ) 224 { 225 for ( MessageReference r : module.getMessages().getReference() ) 226 { 227 report.getDetails().add( this.createDetail( 228 "MODULE_MESSAGE_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 229 "moduleMessageReferenceDeclarationConstraint", new Object[] 230 { 231 module.getName(), r.getName() 232 }, new ObjectFactory().createModule( module ) ) ); 233 234 } 235 } 236 } 237 238 private void assertNoFinalMessageDeclarations( final Module module, 239 final ModelObjectValidationReport report ) 240 { 241 if ( module.getMessages() != null ) 242 { 243 for ( Message m : module.getMessages().getMessage() ) 244 { 245 if ( m.isFinal() ) 246 { 247 report.getDetails().add( this.createDetail( 248 "MODULE_FINAL_MESSAGE_DECLARATION_CONSTRAINT", Level.SEVERE, 249 "moduleFinalMessageConstraint", new Object[] 250 { 251 module.getName(), m.getName() 252 }, new ObjectFactory().createModule( module ) ) ); 253 254 } 255 } 256 } 257 } 258 259 private void assertNoOverrideMessageDeclarations( final Module module, 260 final ModelObjectValidationReport report ) 261 { 262 if ( module.getMessages() != null ) 263 { 264 for ( Message m : module.getMessages().getMessage() ) 265 { 266 if ( m.isOverride() ) 267 { 268 report.getDetails().add( this.createDetail( 269 "MODULE_OVERRIDE_MESSAGE_DECLARATION_CONSTRAINT", Level.SEVERE, 270 "moduleOverrideMessageConstraint", new Object[] 271 { 272 module.getName(), m.getName() 273 }, new ObjectFactory().createModule( module ) ) ); 274 275 } 276 } 277 } 278 } 279 280 private void assertNoPropertyReferenceDeclarations( final Module module, 281 final ModelObjectValidationReport report ) 282 { 283 if ( module.getProperties() != null ) 284 { 285 for ( PropertyReference r : module.getProperties().getReference() ) 286 { 287 report.getDetails().add( this.createDetail( 288 "MODULE_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 289 "modulePropertyReferenceDeclarationConstraint", new Object[] 290 { 291 module.getName(), r.getName() 292 }, new ObjectFactory().createModule( module ) ) ); 293 294 } 295 } 296 } 297 298 private void assertNoFinalPropertyDeclarations( final Module module, 299 final ModelObjectValidationReport report ) 300 { 301 if ( module.getProperties() != null ) 302 { 303 for ( Property p : module.getProperties().getProperty() ) 304 { 305 if ( p.isFinal() ) 306 { 307 report.getDetails().add( this.createDetail( 308 "MODULE_FINAL_PROPERTY_DECLARATION_CONSTRAINT", Level.SEVERE, 309 "moduleFinalPropertyConstraint", new Object[] 310 { 311 module.getName(), p.getName() 312 }, new ObjectFactory().createModule( module ) ) ); 313 314 } 315 } 316 } 317 } 318 319 private void assertNoOverridePropertyDeclarations( final Module module, 320 final ModelObjectValidationReport report ) 321 { 322 if ( module.getProperties() != null ) 323 { 324 for ( Property p : module.getProperties().getProperty() ) 325 { 326 if ( p.isOverride() ) 327 { 328 report.getDetails().add( this.createDetail( 329 "MODULE_OVERRIDE_PROPERTY_DECLARATION_CONSTRAINT", Level.SEVERE, 330 "moduleOverridePropertyConstraint", new Object[] 331 { 332 module.getName(), p.getName() 333 }, new ObjectFactory().createModule( module ) ) ); 334 335 } 336 } 337 } 338 } 339 340 private void assertNoSpecificationDeclarations( final Implementation implementation, 341 final ModelObjectValidationReport report ) 342 { 343 if ( implementation.getSpecifications() != null ) 344 { 345 for ( Specification s : implementation.getSpecifications().getSpecification() ) 346 { 347 report.getDetails().add( this.createDetail( 348 "IMPLEMENTATION_SPECIFICATION_DECLARATION_CONSTRAINT", Level.SEVERE, 349 "implementationSpecificationDeclarationConstraint", new Object[] 350 { 351 implementation.getIdentifier(), s.getIdentifier() 352 }, new ObjectFactory().createImplementation( implementation ) ) ); 353 354 } 355 } 356 } 357 358 private void assertNoImplementationDeclarations( final Implementation implementation, 359 final ModelObjectValidationReport report ) 360 { 361 if ( implementation.getImplementations() != null ) 362 { 363 for ( Implementation i : implementation.getImplementations().getImplementation() ) 364 { 365 report.getDetails().add( this.createDetail( 366 "IMPLEMENTATION_IMPLEMENTATION_DECLARATION_CONSTRAINT", Level.SEVERE, 367 "implementationImplementationDeclarationConstraint", new Object[] 368 { 369 implementation.getIdentifier(), i.getIdentifier() 370 }, new ObjectFactory().createImplementation( implementation ) ) ); 371 372 } 373 } 374 } 375 376 private void assertNoLocationWhenAbstract( final Implementation implementation, 377 final ModelObjectValidationReport report ) 378 { 379 if ( implementation.isAbstract() && implementation.getLocation() != null ) 380 { 381 report.getDetails().add( this.createDetail( 382 "IMPLEMENTATION_ABSTRACT_LOCATION_DECLARATION_CONSTRAINT", Level.SEVERE, 383 "implementationAbstractLocationDeclarationConstraint", new Object[] 384 { 385 implementation.getIdentifier(), implementation.getLocation() 386 }, new ObjectFactory().createImplementation( implementation ) ) ); 387 388 } 389 } 390 391 private void assertNoInheritanceCycle( final Modules modules, 392 final Implementation implementation, 393 final ModelObjectValidationReport report ) 394 { 395 final Implementation cycle = 396 this.findInheritanceCycle( modules, implementation, implementation, new Implementations() ); 397 398 if ( cycle != null ) 399 { 400 report.getDetails().add( this.createDetail( 401 "IMPLEMENTATION_INHERITANCE_CYCLE_CONSTRAINT", Level.SEVERE, 402 "implementationInheritanceCycleConstraint", new Object[] 403 { 404 implementation.getIdentifier(), cycle.getIdentifier() 405 }, new ObjectFactory().createImplementation( implementation ) ) ); 406 407 } 408 } 409 410 private void assertImplementationSpecificationCompatibility( final Modules modules, 411 final Implementation implementation, 412 final ModelObjectValidationReport report ) 413 { 414 final Specifications specs = modules.getSpecifications( implementation.getIdentifier() ); 415 416 if ( specs != null ) 417 { 418 for ( SpecificationReference r : specs.getReference() ) 419 { 420 final Specification s = specs.getSpecification( r.getIdentifier() ); 421 422 if ( s != null && r.getVersion() != null ) 423 { 424 if ( s.getVersion() == null ) 425 { 426 report.getDetails().add( this.createDetail( 427 "IMPLEMENTATION_SPECIFICATION_VERSIONING_CONSTRAINT", Level.SEVERE, 428 "implementationSpecificationVersioningConstraint", new Object[] 429 { 430 implementation.getIdentifier(), s.getIdentifier() 431 }, new ObjectFactory().createImplementation( implementation ) ) ); 432 433 } 434 else 435 { 436 try 437 { 438 if ( VersionParser.compare( r.getVersion(), s.getVersion() ) != 0 ) 439 { 440 final Module moduleOfImplementation = 441 modules.getModuleOfImplementation( implementation.getIdentifier() ); 442 443 final Module moduleOfSpecification = 444 modules.getModuleOfSpecification( s.getIdentifier() ); 445 446 report.getDetails().add( this.createDetail( 447 "IMPLEMENTATION_SPECIFICATION_COMPATIBILITY_CONSTRAINT", Level.SEVERE, 448 "implementationSpecificationCompatibilityConstraint", new Object[] 449 { 450 implementation.getIdentifier(), 451 moduleOfImplementation != null ? moduleOfImplementation.getName() : "<>", 452 s.getIdentifier(), 453 moduleOfSpecification != null ? moduleOfSpecification.getName() : "<>", 454 r.getVersion(), s.getVersion() 455 }, new ObjectFactory().createImplementation( implementation ) ) ); 456 457 } 458 } 459 catch ( final ParseException e ) 460 { 461 final ModelObjectValidationReport.Detail d = new ModelObjectValidationReport.Detail( 462 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 463 464 d.setElement( new ObjectFactory().createImplementation( implementation ) ); 465 report.getDetails().add( d ); 466 } 467 catch ( final TokenMgrError e ) 468 { 469 final ModelObjectValidationReport.Detail d = new ModelObjectValidationReport.Detail( 470 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 471 472 d.setElement( new ObjectFactory().createImplementation( implementation ) ); 473 report.getDetails().add( d ); 474 } 475 } 476 } 477 } 478 } 479 } 480 481 private void assertImplementationDependencyCompatibility( final Modules modules, 482 final Implementation implementation, 483 final ModelObjectValidationReport report ) 484 { 485 final Dependencies dependencies = modules.getDependencies( implementation.getIdentifier() ); 486 if ( dependencies != null ) 487 { 488 for ( Dependency d : dependencies.getDependency() ) 489 { 490 final Specification s = modules.getSpecification( d.getIdentifier() ); 491 if ( s != null && d.getVersion() != null ) 492 { 493 if ( s.getVersion() == null ) 494 { 495 report.getDetails().add( this.createDetail( 496 "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_VERSIONING_CONSTRAINT", Level.SEVERE, 497 "implementationDependencySpecificationVersioningConstraint", new Object[] 498 { 499 implementation.getIdentifier(), d.getName(), s.getIdentifier() 500 }, new ObjectFactory().createImplementation( implementation ) ) ); 501 502 } 503 else 504 { 505 try 506 { 507 if ( VersionParser.compare( d.getVersion(), s.getVersion() ) > 0 ) 508 { 509 final Module moduleOfImplementation = 510 modules.getModuleOfImplementation( implementation.getIdentifier() ); 511 512 final Module moduleOfSpecification = 513 modules.getModuleOfSpecification( s.getIdentifier() ); 514 515 report.getDetails().add( this.createDetail( 516 "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_COMPATIBILITY_CONSTRAINT", Level.SEVERE, 517 "implementationDependencySpecificationCompatibilityConstraint", new Object[] 518 { 519 implementation.getIdentifier(), 520 moduleOfImplementation != null ? moduleOfImplementation.getName() : "<>", 521 s.getIdentifier(), 522 moduleOfSpecification != null ? moduleOfSpecification.getName() : "<>", 523 d.getVersion(), s.getVersion() 524 }, new ObjectFactory().createImplementation( implementation ) ) ); 525 526 } 527 } 528 catch ( final ParseException e ) 529 { 530 final ModelObjectValidationReport.Detail detail = new ModelObjectValidationReport.Detail( 531 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 532 533 detail.setElement( new ObjectFactory().createImplementation( implementation ) ); 534 report.getDetails().add( detail ); 535 } 536 catch ( final TokenMgrError e ) 537 { 538 final ModelObjectValidationReport.Detail detail = new ModelObjectValidationReport.Detail( 539 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 540 541 detail.setElement( new ObjectFactory().createImplementation( implementation ) ); 542 report.getDetails().add( detail ); 543 } 544 } 545 } 546 } 547 } 548 } 549 550 private void assertNoDependencyPropertyReferenceDeclarations( final Implementation implementation, 551 final ModelObjectValidationReport report ) 552 { 553 if ( implementation.getDependencies() != null ) 554 { 555 for ( Dependency d : implementation.getDependencies().getDependency() ) 556 { 557 if ( d.getProperties() != null ) 558 { 559 for ( PropertyReference r : d.getProperties().getReference() ) 560 { 561 report.getDetails().add( this.createDetail( 562 "IMPLEMENTATION_DEPENDENCY_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 563 "implementationDependencyPropertyReferenceDeclarationConstraint", new Object[] 564 { 565 implementation.getIdentifier(), d.getName(), r.getName() 566 }, new ObjectFactory().createImplementation( implementation ) ) ); 567 568 } 569 } 570 } 571 } 572 } 573 574 private void assertNoOverridenDependencyPropertiesWhenNotMultiton( final Modules modules, 575 final Implementation implementation, 576 final ModelObjectValidationReport report ) 577 { 578 if ( implementation.getDependencies() != null ) 579 { 580 for ( Dependency d : implementation.getDependencies().getDependency() ) 581 { 582 final Specification s = modules.getSpecification( d.getIdentifier() ); 583 584 if ( s != null && s.getScope() != null && d.getProperties() != null ) 585 { 586 for ( Property p : d.getProperties().getProperty() ) 587 { 588 report.getDetails().add( this.createDetail( 589 "IMPLEMENTATION_DEPENDENCY_PROPERTIES_OVERRIDE_CONSTRAINT", Level.SEVERE, 590 "implementationDependencyPropertiesOverrideConstraint", new Object[] 591 { 592 implementation.getIdentifier(), d.getName(), s.getIdentifier(), s.getScope(), 593 p.getName() 594 }, new ObjectFactory().createImplementation( implementation ) ) ); 595 596 } 597 } 598 } 599 } 600 } 601 602 private void assertDependencyPropertiesOverrideConstraints( final Modules modules, 603 final Implementation implementation, 604 final ModelObjectValidationReport report ) 605 { 606 if ( implementation.getDependencies() != null ) 607 { 608 for ( Dependency d : implementation.getDependencies().getDependency() ) 609 { 610 final Implementations available = modules.getImplementations( d.getIdentifier() ); 611 if ( available != null ) 612 { 613 if ( d.getImplementationName() != null ) 614 { 615 final Implementation i = available.getImplementationByName( d.getImplementationName() ); 616 if ( i != null ) 617 { 618 this.assertDependencyDoesNotOverrideFinalPropertyAndDoesNotFlagNonOverridenPropertyOverride( 619 modules, implementation, d, i, report ); 620 621 } 622 } 623 else 624 { 625 for ( Implementation i : available.getImplementation() ) 626 { 627 this.assertDependencyDoesNotOverrideFinalPropertyAndDoesNotFlagNonOverridenPropertyOverride( 628 modules, implementation, d, i, report ); 629 630 } 631 } 632 } 633 } 634 } 635 } 636 637 private void assertDependencyDoesNotOverrideFinalPropertyAndDoesNotFlagNonOverridenPropertyOverride( 638 final Modules modules, final Implementation implementation, final Dependency dependency, 639 final Implementation dependencyImplementation, final ModelObjectValidationReport report ) 640 { 641 if ( dependency.getProperties() != null ) 642 { 643 final Properties properties = modules.getProperties( dependencyImplementation.getIdentifier() ); 644 645 if ( properties != null ) 646 { 647 for ( Property override : dependency.getProperties().getProperty() ) 648 { 649 final Property overriden = properties.getProperty( override.getName() ); 650 if ( overriden != null && overriden.isFinal() ) 651 { 652 report.getDetails().add( this.createDetail( 653 "IMPLEMENTATION_DEPENDENCY_FINAL_PROPERTY_CONSTRAINT", Level.SEVERE, 654 "implementationDependencyFinalPropertyConstraint", new Object[] 655 { 656 implementation.getIdentifier(), dependency.getName(), 657 dependencyImplementation.getIdentifier(), override.getName() 658 }, new ObjectFactory().createImplementation( implementation ) ) ); 659 660 } 661 if ( overriden == null && override.isOverride() ) 662 { 663 report.getDetails().add( this.createDetail( 664 "IMPLEMENTATION_DEPENDENCY_OVERRIDE_PROPERTY_CONSTRAINT", Level.SEVERE, 665 "implementationDependencyOverridePropertyConstraint", new Object[] 666 { 667 implementation.getIdentifier(), dependency.getName(), 668 dependencyImplementation.getIdentifier(), override.getName() 669 }, new ObjectFactory().createImplementation( implementation ) ) ); 670 671 } 672 } 673 } 674 } 675 } 676 677 private void assertNoMissingMandatoryDependencies( final Modules modules, final Implementation implementation, 678 final ModelObjectValidationReport report ) 679 { 680 if ( implementation.getDependencies() != null ) 681 { 682 for ( Dependency d : implementation.getDependencies().getDependency() ) 683 { 684 final Implementations available = modules.getImplementations( d.getIdentifier() ); 685 686 if ( !d.isOptional() ) 687 { 688 boolean missing = false; 689 690 if ( available == null ) 691 { 692 missing = true; 693 } 694 else if ( available.getImplementation().isEmpty() ) 695 { 696 missing = true; 697 } 698 else if ( d.getImplementationName() != null && 699 available.getImplementationByName( d.getImplementationName() ) == null ) 700 { 701 missing = true; 702 } 703 704 if ( missing ) 705 { 706 report.getDetails().add( this.createDetail( 707 "IMPLEMENTATION_MANDATORY_DEPENDENCY_CONSTRAINT", Level.SEVERE, 708 "implementationMandatoryDependencyConstraint", new Object[] 709 { 710 implementation.getIdentifier(), d.getName() 711 }, new ObjectFactory().createImplementation( implementation ) ) ); 712 713 } 714 } 715 } 716 } 717 } 718 719 private void assertNoDependenciesWithoutSpecificationClass( final Modules modules, 720 final Implementation implementation, 721 final ModelObjectValidationReport report ) 722 { 723 if ( implementation.getDependencies() != null ) 724 { 725 for ( Dependency d : implementation.getDependencies().getDependency() ) 726 { 727 final Specification s = modules.getSpecification( d.getIdentifier() ); 728 729 if ( s != null && s.getClazz() == null ) 730 { 731 report.getDetails().add( this.createDetail( 732 "IMPLEMENTATION_DEPENDENCY_SPECIFICATION_CLASS_CONSTRAINT", Level.SEVERE, 733 "implementationDependencySpecificationClassConstraint", new Object[] 734 { 735 implementation.getIdentifier(), d.getName(), d.getIdentifier() 736 }, new ObjectFactory().createImplementation( implementation ) ) ); 737 738 } 739 } 740 } 741 } 742 743 private void assertImplementationInheritanceCompatibility( final Modules modules, 744 final Implementation implementation, 745 final ModelObjectValidationReport report ) 746 { 747 if ( implementation.getImplementations() != null ) 748 { 749 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 750 { 751 final Implementation referenced = modules.getImplementation( r.getIdentifier() ); 752 if ( referenced != null && r.getVersion() != null ) 753 { 754 if ( referenced.getVersion() == null ) 755 { 756 report.getDetails().add( this.createDetail( 757 "IMPLEMENTATION_IMPLEMENTATION_VERSIONING_CONSTRAINT", Level.SEVERE, 758 "implementationImplementationVersioningConstraint", new Object[] 759 { 760 implementation.getIdentifier(), referenced.getIdentifier() 761 }, new ObjectFactory().createImplementation( implementation ) ) ); 762 763 } 764 else 765 { 766 try 767 { 768 if ( VersionParser.compare( r.getVersion(), referenced.getVersion() ) > 0 ) 769 { 770 report.getDetails().add( this.createDetail( 771 "IMPLEMENTATION_INHERITANCE_COMPATIBILITY_CONSTRAINT", Level.SEVERE, 772 "implementationInheritanceCompatibilityConstraint", new Object[] 773 { 774 implementation.getIdentifier(), referenced.getIdentifier(), 775 r.getVersion(), referenced.getVersion() 776 }, new ObjectFactory().createImplementation( implementation ) ) ); 777 778 } 779 } 780 catch ( final ParseException e ) 781 { 782 final ModelObjectValidationReport.Detail detail = new ModelObjectValidationReport.Detail( 783 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 784 785 detail.setElement( new ObjectFactory().createImplementation( implementation ) ); 786 report.getDetails().add( detail ); 787 } 788 catch ( final TokenMgrError e ) 789 { 790 final ModelObjectValidationReport.Detail detail = new ModelObjectValidationReport.Detail( 791 e.getClass().getSimpleName(), Level.SEVERE, e.getMessage() ); 792 793 detail.setElement( new ObjectFactory().createImplementation( implementation ) ); 794 report.getDetails().add( detail ); 795 } 796 } 797 } 798 } 799 } 800 } 801 802 private void assertImplementationOverrideConstraints( final Modules modules, 803 final Implementation implementation, 804 final ModelObjectValidationReport report ) 805 { 806 final Implementations parentImplementations = new Implementations(); 807 this.collectParentImplementations( 808 modules, implementation, parentImplementations, new Implementations(), false ); 809 810 if ( implementation.getImplementations() != null ) 811 { 812 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 813 { 814 final Implementation referenced = modules.getImplementation( r.getIdentifier() ); 815 final ImplementationReference parentReference = parentImplementations.getReference( r.getIdentifier() ); 816 817 if ( referenced.isFinal() ) 818 { 819 report.getDetails().add( this.createDetail( 820 "IMPLEMENTATION_IMPLEMENTATION_INHERITANCE_CONSTRAINT", Level.SEVERE, 821 "implementationFinalImplementationConstraint", new Object[] 822 { 823 implementation.getIdentifier(), referenced.getIdentifier(), 824 }, new ObjectFactory().createImplementation( implementation ) ) ); 825 826 } 827 if ( parentReference != null && parentReference.isFinal() ) 828 { 829 report.getDetails().add( this.createDetail( 830 "IMPLEMENTATION_IMPLEMENTATION_REFERENCE_INHERITANCE_CONSTRAINT", Level.SEVERE, 831 "implementationFinalImplementatioReferenceConstraint", new Object[] 832 { 833 implementation.getIdentifier(), parentReference.getIdentifier(), 834 }, new ObjectFactory().createImplementation( implementation ) ) ); 835 836 } 837 if ( r.isOverride() && parentReference == null ) 838 { 839 report.getDetails().add( this.createDetail( 840 "IMPLEMENTATION_IMPLEMENTATION_OVERRIDE_CONSTRAINT", Level.SEVERE, 841 "implementationImplementationOverrideConstraint", new Object[] 842 { 843 implementation.getIdentifier(), r.getIdentifier(), 844 }, new ObjectFactory().createImplementation( implementation ) ) ); 845 846 } 847 } 848 } 849 } 850 851 private void assertSpecificationOverrideConstraints( final Modules modules, 852 final Implementation implementation, 853 final ModelObjectValidationReport report ) 854 { 855 final Specifications parentSpecifications = new Specifications(); 856 this.collectParentSpecifications( modules, implementation, parentSpecifications, new Implementations(), false ); 857 858 if ( implementation.getSpecifications() != null ) 859 { 860 for ( SpecificationReference r : implementation.getSpecifications().getReference() ) 861 { 862 final SpecificationReference parent = parentSpecifications.getReference( r.getIdentifier() ); 863 864 if ( r.isOverride() && parent == null ) 865 { 866 report.getDetails().add( this.createDetail( 867 "IMPLEMENTATION_SPECIFICATION_OVERRIDE_CONSTRAINT", Level.SEVERE, 868 "implementationSpecificationOverrideConstraint", new Object[] 869 { 870 implementation.getIdentifier(), r.getIdentifier(), 871 }, new ObjectFactory().createImplementation( implementation ) ) ); 872 873 } 874 if ( parent != null && parent.isFinal() ) 875 { 876 report.getDetails().add( this.createDetail( 877 "IMPLEMENTATION_SPECIFICATION_INHERITANCE_CONSTRAINT", Level.SEVERE, 878 "implementationSpecificationFinalConstraint", new Object[] 879 { 880 implementation.getIdentifier(), r.getIdentifier(), 881 }, new ObjectFactory().createImplementation( implementation ) ) ); 882 883 } 884 } 885 } 886 } 887 888 private void assertDependencyOverrideConstraints( final Modules modules, 889 final Implementation implementation, 890 final ModelObjectValidationReport report ) 891 { 892 final Dependencies parentDependencies = new Dependencies(); 893 this.collectParentDependencies( modules, implementation, parentDependencies, new Implementations(), false ); 894 895 if ( implementation.getDependencies() != null ) 896 { 897 for ( Dependency d : implementation.getDependencies().getDependency() ) 898 { 899 final Dependency parent = parentDependencies.getDependency( d.getName() ); 900 if ( d.isOverride() && parent == null ) 901 { 902 report.getDetails().add( this.createDetail( 903 "IMPLEMENTATION_DEPENDENCY_OVERRIDE_CONSTRAINT", Level.SEVERE, 904 "implementationDependencyOverrideConstraint", new Object[] 905 { 906 implementation.getIdentifier(), d.getName(), 907 }, new ObjectFactory().createImplementation( implementation ) ) ); 908 909 } 910 if ( parent != null && parent.isFinal() ) 911 { 912 report.getDetails().add( this.createDetail( 913 "IMPLEMENTATION_DEPENDENCY_INHERITANCE_CONSTRAINT", Level.SEVERE, 914 "implementationDependencyFinalConstraint", new Object[] 915 { 916 implementation.getIdentifier(), d.getName(), 917 }, new ObjectFactory().createImplementation( implementation ) ) ); 918 919 } 920 } 921 } 922 } 923 924 private void assertMessageOverrideConstraints( final Modules modules, 925 final Implementation implementation, 926 final ModelObjectValidationReport report ) 927 { 928 final Messages parentMessages = new Messages(); 929 this.collectParentMessages( modules, implementation, parentMessages, new Implementations(), false ); 930 931 if ( implementation.getMessages() != null ) 932 { 933 for ( Message m : implementation.getMessages().getMessage() ) 934 { 935 final Message parentMessage = parentMessages.getMessage( m.getName() ); 936 final MessageReference parentReference = parentMessages.getReference( m.getName() ); 937 938 if ( m.isOverride() && parentMessage == null && parentReference == null ) 939 { 940 report.getDetails().add( this.createDetail( 941 "IMPLEMENTATION_MESSAGE_OVERRIDE_CONSTRAINT", Level.SEVERE, 942 "implementationMessageOverrideConstraint", new Object[] 943 { 944 implementation.getIdentifier(), m.getName(), 945 }, new ObjectFactory().createImplementation( implementation ) ) ); 946 947 } 948 if ( ( parentMessage != null && parentMessage.isFinal() ) || 949 ( parentReference != null && parentReference.isFinal() ) ) 950 { 951 report.getDetails().add( this.createDetail( 952 "IMPLEMENTATION_MESSAGE_INHERITANCE_CONSTRAINT", Level.SEVERE, 953 "implementationMessageFinalConstraint", new Object[] 954 { 955 implementation.getIdentifier(), m.getName(), 956 }, new ObjectFactory().createImplementation( implementation ) ) ); 957 958 } 959 } 960 for ( MessageReference r : implementation.getMessages().getReference() ) 961 { 962 final Message parentMessage = parentMessages.getMessage( r.getName() ); 963 final MessageReference parentReference = parentMessages.getReference( r.getName() ); 964 965 if ( r.isOverride() && parentMessage == null && parentReference == null ) 966 { 967 report.getDetails().add( this.createDetail( 968 "IMPLEMENTATION_MESSAGE_OVERRIDE_CONSTRAINT", Level.SEVERE, 969 "implementationMessageOverrideConstraint", new Object[] 970 { 971 implementation.getIdentifier(), r.getName(), 972 }, new ObjectFactory().createImplementation( implementation ) ) ); 973 974 } 975 if ( ( parentMessage != null && parentMessage.isFinal() ) || 976 ( parentReference != null && parentReference.isFinal() ) ) 977 { 978 report.getDetails().add( this.createDetail( 979 "IMPLEMENTATION_MESSAGE_INHERITANCE_CONSTRAINT", Level.SEVERE, 980 "implementationMessageFinalConstraint", new Object[] 981 { 982 implementation.getIdentifier(), r.getName(), 983 }, new ObjectFactory().createImplementation( implementation ) ) ); 984 985 } 986 } 987 } 988 } 989 990 private void assertPropertyOverrideConstraints( final Modules modules, 991 final Implementation implementation, 992 final ModelObjectValidationReport report ) 993 { 994 final Properties parentProperties = new Properties(); 995 this.collectParentProperties( modules, implementation, parentProperties, new Implementations(), false ); 996 997 if ( implementation.getProperties() != null ) 998 { 999 for ( Property p : implementation.getProperties().getProperty() ) 1000 { 1001 final Property parentProperty = parentProperties.getProperty( p.getName() ); 1002 final PropertyReference parentReference = parentProperties.getReference( p.getName() ); 1003 1004 if ( p.isOverride() && parentProperty == null && parentReference == null ) 1005 { 1006 report.getDetails().add( this.createDetail( 1007 "IMPLEMENTATION_PROPERTY_OVERRIDE_CONSTRAINT", Level.SEVERE, 1008 "implementationPropertyOverrideConstraint", new Object[] 1009 { 1010 implementation.getIdentifier(), p.getName(), 1011 }, new ObjectFactory().createImplementation( implementation ) ) ); 1012 1013 } 1014 if ( ( parentProperty != null && parentProperty.isFinal() ) || 1015 ( parentReference != null && parentReference.isFinal() ) ) 1016 { 1017 report.getDetails().add( this.createDetail( 1018 "IMPLEMENTATION_PROPERTY_INHERITANCE_CONSTRAINT", Level.SEVERE, 1019 "implementationPropertyFinalConstraint", new Object[] 1020 { 1021 implementation.getIdentifier(), p.getName(), 1022 }, new ObjectFactory().createImplementation( implementation ) ) ); 1023 1024 } 1025 } 1026 for ( PropertyReference r : implementation.getProperties().getReference() ) 1027 { 1028 final Property parentProperty = parentProperties.getProperty( r.getName() ); 1029 final PropertyReference parentReference = parentProperties.getReference( r.getName() ); 1030 1031 if ( r.isOverride() && parentProperty == null && parentReference == null ) 1032 { 1033 report.getDetails().add( this.createDetail( 1034 "IMPLEMENTATION_PROPERTY_OVERRIDE_CONSTRAINT", Level.SEVERE, 1035 "implementationPropertyOverrideConstraint", new Object[] 1036 { 1037 implementation.getIdentifier(), r.getName(), 1038 }, new ObjectFactory().createImplementation( implementation ) ) ); 1039 1040 } 1041 if ( ( parentProperty != null && parentProperty.isFinal() ) || 1042 ( parentReference != null && parentReference.isFinal() ) ) 1043 { 1044 report.getDetails().add( this.createDetail( 1045 "IMPLEMENTATION_PROPERTY_INHERITANCE_CONSTRAINT", Level.SEVERE, 1046 "implementationPropertyFinalConstraint", new Object[] 1047 { 1048 implementation.getIdentifier(), r.getName(), 1049 }, new ObjectFactory().createImplementation( implementation ) ) ); 1050 1051 } 1052 } 1053 } 1054 } 1055 1056 private void assertImplementationMessagesUniqueness( 1057 final Implementation implementation, final ModelObjectValidationReport report ) 1058 { 1059 if ( implementation.getMessages() != null ) 1060 { 1061 for ( Message m : implementation.getMessages().getMessage() ) 1062 { 1063 if ( implementation.getMessages().getReference( m.getName() ) != null ) 1064 { 1065 report.getDetails().add( this.createDetail( 1066 "IMPLEMENTATION_MESSAGES_UNIQUENESS_CONSTRAINT", Level.SEVERE, 1067 "implementationMessagesUniquenessConstraint", new Object[] 1068 { 1069 implementation.getIdentifier(), m.getName(), 1070 }, new ObjectFactory().createImplementation( implementation ) ) ); 1071 1072 } 1073 } 1074 } 1075 } 1076 1077 private void assertImplementationPropertiesUniqueness( 1078 final Implementation implementation, final ModelObjectValidationReport report ) 1079 { 1080 if ( implementation.getProperties() != null ) 1081 { 1082 for ( Property p : implementation.getProperties().getProperty() ) 1083 { 1084 if ( implementation.getProperties().getReference( p.getName() ) != null ) 1085 { 1086 report.getDetails().add( this.createDetail( 1087 "IMPLEMENTATION_PROPERTIES_UNIQUENESS_CONSTRAINT", Level.SEVERE, 1088 "implementationPropertiesUniquenessConstraint", new Object[] 1089 { 1090 implementation.getIdentifier(), p.getName(), 1091 }, new ObjectFactory().createImplementation( implementation ) ) ); 1092 1093 } 1094 } 1095 } 1096 } 1097 1098 private void assertNoInheritanceClashes( final Modules modules, 1099 final Implementation implementation, 1100 final ModelObjectValidationReport report ) 1101 { 1102 if ( implementation.getImplementations() != null ) 1103 { 1104 final Map<String, List<Dependency>> dependencyMap = new HashMap<String, List<Dependency>>(); 1105 final Map<String, List<Message>> messageMap = new HashMap<String, List<Message>>(); 1106 final Map<String, List<Property>> propertyMap = new HashMap<String, List<Property>>(); 1107 final Map<String, List<SpecificationReference>> specMap = 1108 new HashMap<String, List<SpecificationReference>>(); 1109 1110 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1111 { 1112 final Specifications currentSpecs = new Specifications(); 1113 final Dependencies currentDependencies = new Dependencies(); 1114 final Properties currentProperties = new Properties(); 1115 final Messages currentMessages = new Messages(); 1116 final Implementation current = modules.getImplementation( r.getIdentifier() ); 1117 1118 modules.collectSpecifications( current, currentSpecs, new Implementations(), true ); 1119 modules.collectDependencies( current, currentDependencies, new Implementations(), true ); 1120 modules.collectMessages( current, currentMessages, new Implementations(), true ); 1121 modules.collectProperties( current, currentProperties, new Implementations(), true ); 1122 1123 for ( SpecificationReference ref : currentSpecs.getReference() ) 1124 { 1125 List<SpecificationReference> list = specMap.get( ref.getIdentifier() ); 1126 if ( list == null ) 1127 { 1128 list = new LinkedList<SpecificationReference>(); 1129 specMap.put( ref.getIdentifier(), list ); 1130 } 1131 1132 list.add( ref ); 1133 } 1134 1135 for ( Dependency d : currentDependencies.getDependency() ) 1136 { 1137 List<Dependency> list = dependencyMap.get( d.getName() ); 1138 if ( list == null ) 1139 { 1140 list = new LinkedList<Dependency>(); 1141 dependencyMap.put( d.getName(), list ); 1142 } 1143 1144 list.add( d ); 1145 } 1146 1147 for ( Message msg : currentMessages.getMessage() ) 1148 { 1149 List<Message> list = messageMap.get( msg.getName() ); 1150 if ( list == null ) 1151 { 1152 list = new LinkedList<Message>(); 1153 messageMap.put( msg.getName(), list ); 1154 } 1155 1156 list.add( msg ); 1157 } 1158 1159 for ( Property p : currentProperties.getProperty() ) 1160 { 1161 List<Property> list = propertyMap.get( p.getName() ); 1162 if ( list == null ) 1163 { 1164 list = new LinkedList<Property>(); 1165 propertyMap.put( p.getName(), list ); 1166 } 1167 1168 list.add( p ); 1169 } 1170 } 1171 1172 for ( Map.Entry<String, List<SpecificationReference>> e : specMap.entrySet() ) 1173 { 1174 if ( e.getValue().size() > 1 && 1175 ( implementation.getSpecifications() == null || 1176 implementation.getSpecifications().getReference( e.getKey() ) == null ) ) 1177 { 1178 report.getDetails().add( this.createDetail( 1179 "IMPLEMENTATION_SPECIFICATION_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE, 1180 "implementationMultipleInheritanceSpecificationConstraint", new Object[] 1181 { 1182 implementation.getIdentifier(), e.getKey() 1183 }, new ObjectFactory().createImplementation( implementation ) ) ); 1184 1185 } 1186 } 1187 1188 for ( Map.Entry<String, List<Dependency>> e : dependencyMap.entrySet() ) 1189 { 1190 if ( e.getValue().size() > 1 && 1191 ( implementation.getDependencies() == null || 1192 implementation.getDependencies().getDependency( e.getKey() ) == null ) ) 1193 { 1194 report.getDetails().add( this.createDetail( 1195 "IMPLEMENTATION_DEPENDENCY_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE, 1196 "implementationMultipleInheritanceDependencyConstraint", new Object[] 1197 { 1198 implementation.getIdentifier(), e.getKey() 1199 }, new ObjectFactory().createImplementation( implementation ) ) ); 1200 1201 } 1202 } 1203 1204 for ( Map.Entry<String, List<Message>> e : messageMap.entrySet() ) 1205 { 1206 if ( e.getValue().size() > 1 && 1207 ( implementation.getMessages() == null || 1208 ( implementation.getMessages().getMessage( e.getKey() ) == null && 1209 implementation.getMessages().getReference( e.getKey() ) == null ) ) ) 1210 { 1211 report.getDetails().add( this.createDetail( 1212 "IMPLEMENTATION_MESSAGE_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE, 1213 "implementationMultipleInheritanceMessageConstraint", new Object[] 1214 { 1215 implementation.getIdentifier(), e.getKey() 1216 }, new ObjectFactory().createImplementation( implementation ) ) ); 1217 1218 } 1219 } 1220 1221 for ( Map.Entry<String, List<Property>> e : propertyMap.entrySet() ) 1222 { 1223 if ( e.getValue().size() > 1 && 1224 ( implementation.getProperties() == null || 1225 ( implementation.getProperties().getProperty( e.getKey() ) == null && 1226 implementation.getProperties().getReference( e.getKey() ) == null ) ) ) 1227 { 1228 report.getDetails().add( this.createDetail( 1229 "IMPLEMENTATION_PROPERTY_MULTIPLE_INHERITANCE_CONSTRAINT", Level.SEVERE, 1230 "implementationMultipleInheritancePropertyConstraint", new Object[] 1231 { 1232 implementation.getIdentifier(), e.getKey() 1233 }, new ObjectFactory().createImplementation( implementation ) ) ); 1234 1235 } 1236 } 1237 } 1238 } 1239 1240 private void assertSpecificationImplementationNameUniqueness( final Modules modules, 1241 final Specification specification, 1242 final ModelObjectValidationReport report ) 1243 { 1244 final Implementations impls = modules.getImplementations( specification.getIdentifier() ); 1245 1246 if ( impls != null ) 1247 { 1248 final Map<String, Implementations> map = new HashMap<String, Implementations>(); 1249 1250 for ( Implementation i : impls.getImplementation() ) 1251 { 1252 Implementations implementations = map.get( i.getName() ); 1253 if ( implementations == null ) 1254 { 1255 implementations = new Implementations(); 1256 map.put( i.getName(), implementations ); 1257 } 1258 1259 implementations.getImplementation().add( i ); 1260 } 1261 1262 for ( Map.Entry<String, Implementations> e : map.entrySet() ) 1263 { 1264 if ( e.getValue().getImplementation().size() > 1 ) 1265 { 1266 for ( Implementation i : e.getValue().getImplementation() ) 1267 { 1268 report.getDetails().add( this.createDetail( 1269 "SPECIFICATION_IMPLEMENTATION_NAME_UNIQUENESS_CONSTRAINT", Level.SEVERE, 1270 "specificationImplementationNameConstraint", new Object[] 1271 { 1272 i.getIdentifier(), specification.getIdentifier(), i.getName() 1273 }, new ObjectFactory().createImplementation( i ) ) ); 1274 1275 } 1276 } 1277 } 1278 } 1279 } 1280 1281 private void assertSpecificationMultiplicityConstraint( final Modules modules, final Specification specification, 1282 final ModelObjectValidationReport report ) 1283 { 1284 final Implementations impls = modules.getImplementations( specification.getIdentifier() ); 1285 1286 if ( specification.getMultiplicity() == Multiplicity.ONE && 1287 impls != null && impls.getImplementation().size() > 1 ) 1288 { 1289 for ( Implementation i : impls.getImplementation() ) 1290 { 1291 report.getDetails().add( this.createDetail( 1292 "SPECIFICATION_IMPLEMENTATION_MULTIPLICITY_CONSTRAINT", Level.SEVERE, 1293 "specificationMultiplicityConstraint", new Object[] 1294 { 1295 i.getIdentifier(), specification.getIdentifier(), specification.getMultiplicity() 1296 }, new ObjectFactory().createImplementation( i ) ) ); 1297 1298 } 1299 } 1300 } 1301 1302 private void assertNoSpecificationPropertyReferenceDeclarations( final Specification specification, 1303 final ModelObjectValidationReport report ) 1304 { 1305 if ( specification.getProperties() != null ) 1306 { 1307 for ( PropertyReference r : specification.getProperties().getReference() ) 1308 { 1309 report.getDetails().add( this.createDetail( 1310 "SPECIFICATION_PROPERTY_REFERENCE_DECLARATION_CONSTRAINT", Level.SEVERE, 1311 "specificationPropertyReferenceDeclarationConstraint", new Object[] 1312 { 1313 specification.getIdentifier(), r.getName() 1314 }, new ObjectFactory().createSpecification( specification ) ) ); 1315 1316 } 1317 } 1318 } 1319 1320 private Implementation findInheritanceCycle( final Modules modules, final Implementation current, 1321 final Implementation report, final Implementations implementations ) 1322 { 1323 if ( current != null ) 1324 { 1325 if ( implementations.getImplementation( current.getIdentifier() ) != null ) 1326 { 1327 return report; 1328 } 1329 1330 implementations.getImplementation().add( current ); 1331 1332 if ( current.getImplementations() != null ) 1333 { 1334 for ( ImplementationReference r : current.getImplementations().getReference() ) 1335 { 1336 return this.findInheritanceCycle( modules, modules.getImplementation( r.getIdentifier() ), 1337 current, implementations ); 1338 1339 } 1340 1341 } 1342 } 1343 1344 return null; 1345 } 1346 1347 private void collectParentImplementations( final Modules modules, final Implementation implementation, 1348 final Implementations implementations, final Implementations seen, 1349 final boolean includeImplementation ) 1350 { 1351 if ( implementation != null && seen.getImplementation( implementation.getIdentifier() ) == null ) 1352 { 1353 seen.getImplementation().add( implementation ); 1354 1355 if ( includeImplementation && 1356 implementations.getImplementation( implementation.getIdentifier() ) == null ) 1357 { 1358 implementations.getImplementation().add( implementation ); 1359 } 1360 1361 if ( implementation.getImplementations() != null ) 1362 { 1363 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1364 { 1365 if ( includeImplementation && implementations.getReference( r.getIdentifier() ) == null ) 1366 { 1367 implementations.getReference().add( r ); 1368 } 1369 1370 this.collectParentImplementations( modules, modules.getImplementation( r.getIdentifier() ), 1371 implementations, seen, true ); 1372 1373 } 1374 } 1375 } 1376 } 1377 1378 private void collectParentSpecifications( final Modules modules, final Implementation implementation, 1379 final Specifications specifications, final Implementations seen, 1380 final boolean includeImplementation ) 1381 { 1382 if ( implementation != null && seen.getImplementation( implementation.getIdentifier() ) == null ) 1383 { 1384 seen.getImplementation().add( implementation ); 1385 1386 if ( includeImplementation && implementation.getSpecifications() != null ) 1387 { 1388 for ( SpecificationReference r : implementation.getSpecifications().getReference() ) 1389 { 1390 if ( specifications.getReference( r.getIdentifier() ) == null ) 1391 { 1392 specifications.getReference().add( r ); 1393 } 1394 } 1395 } 1396 1397 if ( implementation.getImplementations() != null ) 1398 { 1399 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1400 { 1401 this.collectParentSpecifications( modules, modules.getImplementation( r.getIdentifier() ), 1402 specifications, seen, true ); 1403 1404 } 1405 } 1406 } 1407 } 1408 1409 private void collectParentDependencies( final Modules modules, final Implementation implementation, 1410 final Dependencies dependencies, final Implementations seen, 1411 final boolean includeImplementation ) 1412 { 1413 if ( implementation != null && seen.getImplementation( implementation.getIdentifier() ) == null ) 1414 { 1415 seen.getImplementation().add( implementation ); 1416 1417 if ( includeImplementation && implementation.getDependencies() != null ) 1418 { 1419 for ( Dependency d : implementation.getDependencies().getDependency() ) 1420 { 1421 if ( dependencies.getDependency( d.getName() ) == null ) 1422 { 1423 dependencies.getDependency().add( d ); 1424 } 1425 } 1426 } 1427 1428 if ( implementation.getImplementations() != null ) 1429 { 1430 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1431 { 1432 this.collectParentDependencies( modules, modules.getImplementation( r.getIdentifier() ), 1433 dependencies, seen, true ); 1434 1435 } 1436 } 1437 } 1438 } 1439 1440 private void collectParentMessages( final Modules modules, final Implementation implementation, 1441 final Messages messages, final Implementations seen, 1442 final boolean includeImplementation ) 1443 { 1444 if ( implementation != null && seen.getImplementation( implementation.getIdentifier() ) == null ) 1445 { 1446 seen.getImplementation().add( implementation ); 1447 1448 if ( includeImplementation && implementation.getMessages() != null ) 1449 { 1450 for ( Message m : implementation.getMessages().getMessage() ) 1451 { 1452 if ( messages.getMessage( m.getName() ) == null ) 1453 { 1454 messages.getMessage().add( m ); 1455 } 1456 } 1457 for ( MessageReference r : implementation.getMessages().getReference() ) 1458 { 1459 if ( messages.getReference( r.getName() ) == null ) 1460 { 1461 messages.getReference().add( r ); 1462 } 1463 } 1464 } 1465 1466 if ( implementation.getImplementations() != null ) 1467 { 1468 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1469 { 1470 this.collectParentMessages( modules, modules.getImplementation( r.getIdentifier() ), 1471 messages, seen, true ); 1472 1473 } 1474 } 1475 } 1476 } 1477 1478 private void collectParentProperties( final Modules modules, final Implementation implementation, 1479 final Properties properties, final Implementations seen, 1480 final boolean includeImplementation ) 1481 { 1482 if ( implementation != null && seen.getImplementation( implementation.getIdentifier() ) == null ) 1483 { 1484 seen.getImplementation().add( implementation ); 1485 1486 if ( includeImplementation && implementation.getProperties() != null ) 1487 { 1488 for ( Property p : implementation.getProperties().getProperty() ) 1489 { 1490 if ( properties.getProperty( p.getName() ) == null ) 1491 { 1492 properties.getProperty().add( p ); 1493 } 1494 } 1495 for ( PropertyReference r : implementation.getProperties().getReference() ) 1496 { 1497 if ( properties.getReference( r.getName() ) == null ) 1498 { 1499 properties.getReference().add( r ); 1500 } 1501 } 1502 } 1503 1504 if ( implementation.getImplementations() != null ) 1505 { 1506 for ( ImplementationReference r : implementation.getImplementations().getReference() ) 1507 { 1508 this.collectParentProperties( modules, modules.getImplementation( r.getIdentifier() ), 1509 properties, seen, true ); 1510 1511 } 1512 } 1513 } 1514 } 1515 1516 private ModelObjectValidationReport.Detail createDetail( final String identifier, final Level level, 1517 final String messageKey, final Object messageArguments, 1518 final JAXBElement<? extends ModelObject> element ) 1519 { 1520 final ModelObjectValidationReport.Detail detail = new ModelObjectValidationReport.Detail( 1521 identifier, level, this.getMessage( messageKey, messageArguments ) ); 1522 1523 detail.setElement( element ); 1524 return detail; 1525 } 1526 1527 private String getMessage( final String key, final Object args ) 1528 { 1529 return new MessageFormat( ResourceBundle.getBundle( 1530 DefaultModelObjectValidator.class.getName().replace( '.', '/' ), 1531 Locale.getDefault() ).getString( key ) ).format( args ); 1532 1533 } 1534 1535 } 1536 1537 /** 1538 * {@code ValidationEventHandler} collecting {@code ModelObjectValidationReport} details. 1539 * 1540 * @author <a href="mailto:cs@jomc.org">Christian Schulte</a> 1541 * @version $Id: DefaultModelObjectValidator.java 1093 2009-12-06 17:24:40Z schulte2005 $ 1542 */ 1543 class ModelObjectValidationEventHandler implements ValidationEventHandler 1544 { 1545 1546 /** The report events are collected with. */ 1547 private final ModelObjectValidationReport report; 1548 1549 /** 1550 * Creates a new {@code ModelObjectValidationEventHandler} taking a {@code ModelObjectValidationReport} instance to 1551 * collect events with. 1552 * 1553 * @param report The report to use for collecting events. 1554 */ 1555 ModelObjectValidationEventHandler( final ModelObjectValidationReport report ) 1556 { 1557 this.report = report; 1558 } 1559 1560 public boolean handleEvent( final ValidationEvent event ) 1561 { 1562 if ( event == null ) 1563 { 1564 throw new IllegalArgumentException( "event" ); 1565 } 1566 1567 switch ( event.getSeverity() ) 1568 { 1569 case ValidationEvent.WARNING: 1570 this.report.getDetails().add( new ModelObjectValidationReport.Detail( 1571 "W3C XML 1.0 Recommendation - Warning condition", Level.WARNING, event.getMessage() ) ); 1572 1573 return true; 1574 1575 case ValidationEvent.ERROR: 1576 this.report.getDetails().add( new ModelObjectValidationReport.Detail( 1577 "W3C XML 1.0 Recommendation - Section 1.2 - Error", Level.SEVERE, event.getMessage() ) ); 1578 1579 return false; 1580 1581 case ValidationEvent.FATAL_ERROR: 1582 this.report.getDetails().add( new ModelObjectValidationReport.Detail( 1583 "W3C XML 1.0 Recommendation - Section 1.2 - Fatal Error", Level.SEVERE, event.getMessage() ) ); 1584 1585 return false; 1586 1587 default: 1588 throw new AssertionError( event.getSeverity() ); 1589 1590 } 1591 } 1592 1593 }