001/* 002 * Copyright (C) Christian Schulte, 2005-206 003 * All rights reserved. 004 * 005 * Redistribution and use in source and binary forms, with or without 006 * modification, are permitted provided that the following conditions 007 * are met: 008 * 009 * o Redistributions of source code must retain the above copyright 010 * notice, this list of conditions and the following disclaimer. 011 * 012 * o Redistributions in binary form must reproduce the above copyright 013 * notice, this list of conditions and the following disclaimer in 014 * the documentation and/or other materials provided with the 015 * distribution. 016 * 017 * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 018 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY 019 * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 020 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY DIRECT, INDIRECT, 021 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 022 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 023 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 024 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 025 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 026 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 027 * 028 * $JOMC: JomcToolTask.java 4613 2012-09-22 10:07:08Z schulte $ 029 * 030 */ 031package org.jomc.ant; 032 033import java.io.IOException; 034import java.net.URL; 035import java.util.ArrayList; 036import java.util.Iterator; 037import java.util.LinkedList; 038import java.util.List; 039import java.util.Locale; 040import java.util.Map; 041import java.util.logging.Level; 042import org.apache.commons.lang.StringEscapeUtils; 043import org.apache.commons.lang.StringUtils; 044import org.apache.tools.ant.BuildException; 045import org.apache.tools.ant.Project; 046import org.jomc.ant.types.KeyValueType; 047import org.jomc.ant.types.LocaleType; 048import org.jomc.ant.types.PropertiesResourceType; 049import org.jomc.model.Implementation; 050import org.jomc.model.Module; 051import org.jomc.model.Modules; 052import org.jomc.model.Specification; 053import org.jomc.model.modlet.ModelHelper; 054import org.jomc.modlet.Model; 055import org.jomc.tools.JomcTool; 056 057/** 058 * Base class for executing tool based tasks. 059 * 060 * @author <a href="mailto:cs@schulte.it">Christian Schulte</a> 061 * @version $JOMC: JomcToolTask.java 4613 2012-09-22 10:07:08Z schulte $ 062 */ 063public class JomcToolTask extends JomcModelTask 064{ 065 066 /** The default encoding to use for reading templates. */ 067 private String defaultTemplateEncoding; 068 069 /** The default template profile to use when accessing templates. */ 070 private String defaultTemplateProfile; 071 072 /** The encoding to use for reading files. */ 073 private String inputEncoding; 074 075 /** The encoding to use for writing files. */ 076 private String outputEncoding; 077 078 /** The encoding to use for reading templates. */ 079 private String templateEncoding; 080 081 /** Additional location to search for templates. */ 082 private String templateLocation; 083 084 /** The template profile to use when accessing templates. */ 085 private String templateProfile; 086 087 /** The indentation string ('\t' for tab). */ 088 private String indentation; 089 090 /** The line separator ('\r\n' for DOS, '\r' for Mac, '\n' for Unix). */ 091 private String lineSeparator; 092 093 /** The locale. */ 094 private LocaleType locale; 095 096 /** The identifier of a specification to process. */ 097 private String specification; 098 099 /** The identifier of an implementation to process. */ 100 private String implementation; 101 102 /** The name of a module to process. */ 103 private String module; 104 105 /** The Velocity runtime properties. */ 106 private List<KeyValueType> velocityProperties; 107 108 /** The Velocity runtime property resources. */ 109 private List<PropertiesResourceType> velocityPropertyResources; 110 111 /** The template parameters. */ 112 private List<KeyValueType> templateParameters; 113 114 /** The template parameter resources. */ 115 private List<PropertiesResourceType> templateParameterResources; 116 117 /** Creates a new {@code JomcToolTask} instance. */ 118 public JomcToolTask() 119 { 120 super(); 121 } 122 123 /** 124 * Gets the encoding to use for reading files. 125 * 126 * @return The encoding to use for reading files or {@code null}. 127 * 128 * @see #setInputEncoding(java.lang.String) 129 */ 130 public final String getInputEncoding() 131 { 132 return this.inputEncoding; 133 } 134 135 /** 136 * Sets the encoding to use for reading files. 137 * 138 * @param value The new encoding to use for reading files or {@code null}. 139 * 140 * @see #getInputEncoding() 141 */ 142 public final void setInputEncoding( final String value ) 143 { 144 this.inputEncoding = value; 145 } 146 147 /** 148 * Gets the encoding to use for writing files. 149 * 150 * @return The encoding to use for writing files or {@code null}. 151 * 152 * @see #setOutputEncoding(java.lang.String) 153 */ 154 public final String getOutputEncoding() 155 { 156 return this.outputEncoding; 157 } 158 159 /** 160 * Sets the encoding to use for writing files. 161 * 162 * @param value The new encoding to use for writing files or {@code null}. 163 * 164 * @see #getOutputEncoding() 165 */ 166 public final void setOutputEncoding( final String value ) 167 { 168 this.outputEncoding = value; 169 } 170 171 /** 172 * Gets the encoding to use for reading templates. 173 * 174 * @return The encoding to use for reading templates or {@code null}. 175 * 176 * @see #setTemplateEncoding(java.lang.String) 177 * 178 * @deprecated As of JOMC 1.3, replaced by method {@link #getDefaultTemplateEncoding()}. This method will be removed 179 * in JOMC 2.0. 180 */ 181 @Deprecated 182 public final String getTemplateEncoding() 183 { 184 return this.templateEncoding; 185 } 186 187 /** 188 * Sets the encoding to use for reading templates. 189 * 190 * @param value The new encoding to use for reading templates or {@code null}. 191 * 192 * @see #getTemplateEncoding() 193 * 194 * @deprecated As of JOMC 1.3, replaced by method {@link #setDefaultTemplateEncoding(java.lang.String)}. This method 195 * will be removed in JOMC 2.0. 196 */ 197 @Deprecated 198 public final void setTemplateEncoding( final String value ) 199 { 200 this.templateEncoding = value; 201 } 202 203 /** 204 * Gets the encoding to use for reading templates. 205 * 206 * @return The encoding to use for reading templates or {@code null}. 207 * 208 * @see #setDefaultTemplateEncoding(java.lang.String) 209 * 210 * @since 1.3 211 */ 212 public final String getDefaultTemplateEncoding() 213 { 214 return this.defaultTemplateEncoding; 215 } 216 217 /** 218 * Sets the encoding to use for reading templates. 219 * 220 * @param value The new encoding to use for reading templates or {@code null}. 221 * 222 * @see #getDefaultTemplateEncoding() 223 * 224 * @since 1.3 225 */ 226 public final void setDefaultTemplateEncoding( final String value ) 227 { 228 this.defaultTemplateEncoding = value; 229 } 230 231 /** 232 * Gets the location to search for templates in addition to searching the class path of the task. 233 * 234 * @return The location to search for templates in addition to searching the class path of the task or {@code null}. 235 * 236 * @see #setTemplateLocation(java.lang.String) 237 */ 238 public final String getTemplateLocation() 239 { 240 return this.templateLocation; 241 } 242 243 /** 244 * Sets the location to search for templates in addition to searching the class path of the task. 245 * 246 * @param value The new location to search for templates in addition to searching the class path of the task or 247 * {@code null}. 248 * 249 * @see #getTemplateLocation() 250 */ 251 public final void setTemplateLocation( final String value ) 252 { 253 this.templateLocation = value; 254 } 255 256 /** 257 * Gets the default template profile to use when accessing templates. 258 * 259 * @return The default template profile to use when accessing templates or {@code null}. 260 * 261 * @see #setDefaultTemplateProfile(java.lang.String) 262 */ 263 public final String getDefaultTemplateProfile() 264 { 265 return this.defaultTemplateProfile; 266 } 267 268 /** 269 * Sets the default template profile to use when accessing templates. 270 * 271 * @param value The new default template profile to use when accessing templates or {@code null}. 272 * 273 * @see #getDefaultTemplateProfile() 274 */ 275 public final void setDefaultTemplateProfile( final String value ) 276 { 277 this.defaultTemplateProfile = value; 278 } 279 280 /** 281 * Gets the template profile to use when accessing templates. 282 * 283 * @return The template profile to use when accessing templates or {@code null}. 284 * 285 * @see #setTemplateProfile(java.lang.String) 286 */ 287 public final String getTemplateProfile() 288 { 289 return this.templateProfile; 290 } 291 292 /** 293 * Sets the template profile to use when accessing templates. 294 * 295 * @param value The new template profile to use when accessing templates or {@code null}. 296 * 297 * @see #getTemplateProfile() 298 */ 299 public final void setTemplateProfile( final String value ) 300 { 301 this.templateProfile = value; 302 } 303 304 /** 305 * Gets the indentation string ('\t' for tab). 306 * 307 * @return The indentation string ('\t' for tab) or {@code null}. 308 * 309 * @see #setIndentation(java.lang.String) 310 */ 311 public final String getIndentation() 312 { 313 return this.indentation; 314 } 315 316 /** 317 * Sets the indentation string ('\t' for tab). 318 * 319 * @param value The new indentation string ('\t' for tab) or {@code null}. 320 * 321 * @see #getIndentation() 322 */ 323 public final void setIndentation( final String value ) 324 { 325 this.indentation = value; 326 } 327 328 /** 329 * Gets the line separator ('\r\n' for DOS, '\r' for Mac, '\n' for Unix). 330 * 331 * @return The line separator ('\r\n' for DOS, '\r' for Mac, '\n' for Unix) or {@code null}. 332 * 333 * @see #setLineSeparator(java.lang.String) 334 */ 335 public final String getLineSeparator() 336 { 337 return this.lineSeparator; 338 } 339 340 /** 341 * Sets the line separator ('\r\n' for DOS, '\r' for Mac, '\n' for Unix). 342 * 343 * @param value The new line separator ('\r\n' for DOS, '\r' for Mac, '\n' for Unix) or {@code null}. 344 * 345 * @see #getLineSeparator() 346 */ 347 public final void setLineSeparator( final String value ) 348 { 349 this.lineSeparator = value; 350 } 351 352 /** 353 * Gets the locale. 354 * 355 * @return The locale or {@code null}. 356 * 357 * @see #createLocale() 358 */ 359 public final LocaleType getLocale() 360 { 361 return this.locale; 362 } 363 364 /** 365 * Creates a new {@code locale} element instance. 366 * 367 * @return A new {@code locale} element instance. 368 * 369 * @throws BuildException if a value already has been created. 370 * 371 * @see #getLocale() 372 */ 373 public LocaleType createLocale() 374 { 375 if ( this.locale != null ) 376 { 377 throw new BuildException( Messages.getMessage( "multipleElements", "locale" ), this.getLocation() ); 378 } 379 380 this.locale = new LocaleType(); 381 return this.locale; 382 } 383 384 /** 385 * Gets the identifier of a specification to process. 386 * 387 * @return The identifier of a specification to process or {@code null}. 388 * 389 * @see #setSpecification(java.lang.String) 390 */ 391 public final String getSpecification() 392 { 393 return this.specification; 394 } 395 396 /** 397 * Sets the identifier of a specification to process. 398 * 399 * @param value The new identifier of a specification to process or {@code null}. 400 * 401 * @see #getSpecification() 402 */ 403 public final void setSpecification( final String value ) 404 { 405 this.specification = value; 406 } 407 408 /** 409 * Gets the specification to process from a given model. 410 * 411 * @param model The model to get the specification to process from. 412 * 413 * @return The specification to process or {@code null}. 414 * 415 * @throws NullPointerException if {@code model} is {@code null}. 416 * 417 * @see #getSpecification() 418 */ 419 public final Specification getSpecification( final Model model ) 420 { 421 if ( model == null ) 422 { 423 throw new NullPointerException( "model" ); 424 } 425 426 Specification s = null; 427 428 if ( this.getSpecification() != null ) 429 { 430 final Modules modules = ModelHelper.getModules( model ); 431 432 if ( modules != null ) 433 { 434 s = modules.getSpecification( this.getSpecification() ); 435 } 436 437 if ( s == null ) 438 { 439 this.log( Messages.getMessage( "specificationNotFound", this.getSpecification() ), Project.MSG_WARN ); 440 } 441 } 442 443 return s; 444 } 445 446 /** 447 * Gets the identifier of an implementation to process. 448 * 449 * @return The identifier of an implementation to process or {@code null}. 450 * 451 * @see #setImplementation(java.lang.String) 452 */ 453 public final String getImplementation() 454 { 455 return this.implementation; 456 } 457 458 /** 459 * Sets the identifier of an implementation to process. 460 * 461 * @param value The new identifier of an implementation to process or {@code null}. 462 * 463 * @see #getImplementation() 464 */ 465 public final void setImplementation( final String value ) 466 { 467 this.implementation = value; 468 } 469 470 /** 471 * Gets the implementation to process from a given model. 472 * 473 * @param model The model to get the implementation to process from. 474 * 475 * @return The implementation to process or {@code null}. 476 * 477 * @throws NullPointerException if {@code model} is {@code null}. 478 * 479 * @see #getImplementation() 480 */ 481 public final Implementation getImplementation( final Model model ) 482 { 483 if ( model == null ) 484 { 485 throw new NullPointerException( "model" ); 486 } 487 488 Implementation i = null; 489 490 if ( this.getImplementation() != null ) 491 { 492 final Modules modules = ModelHelper.getModules( model ); 493 494 if ( modules != null ) 495 { 496 i = modules.getImplementation( this.getImplementation() ); 497 } 498 499 if ( i == null ) 500 { 501 this.log( Messages.getMessage( "implementationNotFound", this.getImplementation() ), Project.MSG_WARN ); 502 } 503 } 504 505 return i; 506 } 507 508 /** 509 * Gets the identifier of a module to process. 510 * 511 * @return The identifier of a module to process or {@code null}. 512 * 513 * @see #setModule(java.lang.String) 514 */ 515 public final String getModule() 516 { 517 return this.module; 518 } 519 520 /** 521 * Sets the identifier of a module to process. 522 * 523 * @param value The new identifier of a module to process or {@code null}. 524 * 525 * @see #getModule() 526 */ 527 public final void setModule( final String value ) 528 { 529 this.module = value; 530 } 531 532 /** 533 * Gets the module to process from a given model. 534 * 535 * @param model The model to get the module to process from. 536 * 537 * @return The module to process or {@code null}. 538 * 539 * @throws NullPointerException if {@code model} is {@code null}. 540 * 541 * @see #getModule() 542 */ 543 public final Module getModule( final Model model ) 544 { 545 if ( model == null ) 546 { 547 throw new NullPointerException( "model" ); 548 } 549 550 Module m = null; 551 552 if ( this.getModule() != null ) 553 { 554 final Modules modules = ModelHelper.getModules( model ); 555 556 if ( modules != null ) 557 { 558 m = modules.getModule( this.getModule() ); 559 } 560 561 if ( m == null ) 562 { 563 this.log( Messages.getMessage( "moduleNotFound", this.getModule() ), Project.MSG_WARN ); 564 } 565 } 566 567 return m; 568 } 569 570 /** 571 * Gets a flag indicating all modules are requested to be processed. 572 * 573 * @return {@code true}, if processing of all modules is requested; {@code false}, else. 574 * 575 * @see #getSpecification() 576 * @see #getImplementation() 577 * @see #getModule() 578 */ 579 public boolean isModulesProcessingRequested() 580 { 581 return this.getSpecification() == null && this.getImplementation() == null && this.getModule() == null; 582 } 583 584 /** 585 * Gets the Velocity runtime properties to apply. 586 * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make 587 * to the returned list will be present inside the object. This is why there is no {@code set} method for the 588 * velocity properties property.</p> 589 * 590 * @return The Velocity runtime properties to apply. 591 * 592 * @see #createVelocityProperty() 593 */ 594 public final List<KeyValueType> getVelocityProperties() 595 { 596 if ( this.velocityProperties == null ) 597 { 598 this.velocityProperties = new LinkedList<KeyValueType>(); 599 } 600 601 return this.velocityProperties; 602 } 603 604 /** 605 * Creates a new {@code velocityProperty} element instance. 606 * 607 * @return A new {@code velocityProperty} element instance. 608 * 609 * @see #getVelocityProperties() 610 */ 611 public KeyValueType createVelocityProperty() 612 { 613 final KeyValueType velocityProperty = new KeyValueType(); 614 this.getVelocityProperties().add( velocityProperty ); 615 return velocityProperty; 616 } 617 618 /** 619 * Gets the Velocity runtime property resources to apply. 620 * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make 621 * to the returned list will be present inside the object. This is why there is no {@code set} method for the 622 * velocity property resources property.</p> 623 * 624 * @return The Velocity runtime property resources to apply. 625 * 626 * @see #createVelocityPropertyResource() 627 */ 628 public final List<PropertiesResourceType> getVelocityPropertyResources() 629 { 630 if ( this.velocityPropertyResources == null ) 631 { 632 this.velocityPropertyResources = new LinkedList<PropertiesResourceType>(); 633 } 634 635 return this.velocityPropertyResources; 636 } 637 638 /** 639 * Creates a new {@code velocityPropertyResource} element instance. 640 * 641 * @return A new {@code velocityPropertyResource} element instance. 642 * 643 * @see #getVelocityPropertyResources() 644 */ 645 public PropertiesResourceType createVelocityPropertyResource() 646 { 647 final PropertiesResourceType velocityPropertyResource = new PropertiesResourceType(); 648 this.getVelocityPropertyResources().add( velocityPropertyResource ); 649 return velocityPropertyResource; 650 } 651 652 /** 653 * Gets the template parameters to apply. 654 * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make 655 * to the returned list will be present inside the object. This is why there is no {@code set} method for the 656 * template parameters property.</p> 657 * 658 * @return The template parameters to apply. 659 * 660 * @see #createTemplateParameter() 661 */ 662 public final List<KeyValueType> getTemplateParameters() 663 { 664 if ( this.templateParameters == null ) 665 { 666 this.templateParameters = new LinkedList<KeyValueType>(); 667 } 668 669 return this.templateParameters; 670 } 671 672 /** 673 * Creates a new {@code templateParameter} element instance. 674 * 675 * @return A new {@code templateParameter} element instance. 676 * 677 * @see #getTemplateParameters() 678 */ 679 public KeyValueType createTemplateParameter() 680 { 681 final KeyValueType templateParameter = new KeyValueType(); 682 this.getTemplateParameters().add( templateParameter ); 683 return templateParameter; 684 } 685 686 /** 687 * Gets the template parameter resources to apply. 688 * <p>This accessor method returns a reference to the live list, not a snapshot. Therefore any modification you make 689 * to the returned list will be present inside the object. This is why there is no {@code set} method for the 690 * template parameter resources property.</p> 691 * 692 * @return The template parameter resources to apply. 693 * 694 * @see #createTemplateParameterResource() 695 */ 696 public final List<PropertiesResourceType> getTemplateParameterResources() 697 { 698 if ( this.templateParameterResources == null ) 699 { 700 this.templateParameterResources = new LinkedList<PropertiesResourceType>(); 701 } 702 703 return this.templateParameterResources; 704 } 705 706 /** 707 * Creates a new {@code templateParameterResource} element instance. 708 * 709 * @return A new {@code templateParameterResource} element instance. 710 * 711 * @see #getTemplateParameterResources() 712 */ 713 public PropertiesResourceType createTemplateParameterResource() 714 { 715 final PropertiesResourceType templateParameterResource = new PropertiesResourceType(); 716 this.getTemplateParameterResources().add( templateParameterResource ); 717 return templateParameterResource; 718 } 719 720 /** {@inheritDoc} */ 721 @Override 722 public void preExecuteTask() throws BuildException 723 { 724 super.preExecuteTask(); 725 726 this.assertKeysNotNull( this.getVelocityProperties() ); 727 this.assertKeysNotNull( this.getTemplateParameters() ); 728 this.assertLocationsNotNull( this.getTemplateParameterResources() ); 729 this.assertLocationsNotNull( this.getVelocityPropertyResources() ); 730 } 731 732 /** {@inheritDoc} */ 733 @Override 734 public void postExecuteTask() throws BuildException 735 { 736 JomcTool.setDefaultTemplateProfile( null ); 737 738 super.postExecuteTask(); 739 } 740 741 /** 742 * Configures a given {@code JomcTool} instance using the properties of the instance. 743 * 744 * @param tool The tool to configure. 745 * 746 * @throws NullPointerException if {@code tool} is {@code null}. 747 * @throws BuildException if configuring {@code tool} fails. 748 */ 749 public void configureJomcTool( final JomcTool tool ) throws BuildException 750 { 751 if ( tool == null ) 752 { 753 throw new NullPointerException( "tool" ); 754 } 755 756 try 757 { 758 tool.setLogLevel( Level.ALL ); 759 tool.setIndentation( StringEscapeUtils.unescapeJava( this.getIndentation() ) ); 760 tool.setInputEncoding( this.getInputEncoding() ); 761 tool.setLineSeparator( StringEscapeUtils.unescapeJava( this.getLineSeparator() ) ); 762 tool.setOutputEncoding( this.getOutputEncoding() ); 763 tool.setDefaultTemplateProfile( this.getDefaultTemplateProfile() ); 764 tool.setTemplateProfile( this.getTemplateProfile() ); 765 tool.getListeners().add( new JomcTool.Listener() 766 { 767 768 @Override 769 public void onLog( final Level level, final String message, final Throwable throwable ) 770 { 771 super.onLog( level, message, throwable ); 772 773 if ( level.intValue() >= Level.SEVERE.intValue() ) 774 { 775 log( message, throwable, Project.MSG_ERR ); 776 } 777 else if ( level.intValue() >= Level.WARNING.intValue() ) 778 { 779 log( message, throwable, Project.MSG_WARN ); 780 } 781 else if ( level.intValue() >= Level.INFO.intValue() ) 782 { 783 log( message, throwable, Project.MSG_INFO ); 784 } 785 else 786 { 787 log( message, throwable, Project.MSG_DEBUG ); 788 } 789 } 790 791 } ); 792 793 if ( this.getTemplateEncoding() != null ) 794 { 795 this.log( Messages.getMessage( "deprecationWarning", "templateEncoding", "defaultTemplateEncoding" ), 796 null, Project.MSG_WARN ); 797 798 tool.setDefaultTemplateEncoding( this.getTemplateEncoding() ); 799 } 800 else 801 { 802 tool.setDefaultTemplateEncoding( this.getDefaultTemplateEncoding() ); 803 } 804 805 for ( int i = 0, s0 = this.getVelocityPropertyResources().size(); i < s0; i++ ) 806 { 807 for ( Map.Entry<Object, Object> e : 808 this.getProperties( this.getVelocityPropertyResources().get( i ) ).entrySet() ) 809 { 810 if ( e.getValue() != null ) 811 { 812 tool.getVelocityEngine().setProperty( e.getKey().toString(), e.getValue() ); 813 } 814 else 815 { 816 tool.getVelocityEngine().clearProperty( e.getKey().toString() ); 817 } 818 } 819 } 820 821 for ( int i = 0, s0 = this.getVelocityProperties().size(); i < s0; i++ ) 822 { 823 final KeyValueType p = this.getVelocityProperties().get( i ); 824 final Object object = p.getObject( this.getLocation() ); 825 826 if ( object != null ) 827 { 828 tool.getVelocityEngine().setProperty( p.getKey(), object ); 829 } 830 else 831 { 832 tool.getVelocityEngine().clearProperty( p.getKey() ); 833 } 834 } 835 836 for ( Map.Entry<Object, Object> e : System.getProperties().entrySet() ) 837 { 838 tool.getTemplateParameters().put( e.getKey().toString(), e.getValue() ); 839 } 840 841 for ( final Iterator<Map.Entry<?, ?>> it = this.getProject().getProperties().entrySet().iterator(); 842 it.hasNext(); ) 843 { 844 final Map.Entry<?, ?> e = it.next(); 845 tool.getTemplateParameters().put( e.getKey().toString(), e.getValue() ); 846 } 847 848 for ( int i = 0, s0 = this.getTemplateParameterResources().size(); i < s0; i++ ) 849 { 850 for ( Map.Entry<Object, Object> e : 851 this.getProperties( this.getTemplateParameterResources().get( i ) ).entrySet() ) 852 { 853 if ( e.getValue() != null ) 854 { 855 tool.getTemplateParameters().put( e.getKey().toString(), e.getValue() ); 856 } 857 else 858 { 859 tool.getTemplateParameters().remove( e.getKey().toString() ); 860 } 861 } 862 } 863 864 for ( int i = 0, s0 = this.getTemplateParameters().size(); i < s0; i++ ) 865 { 866 final KeyValueType p = this.getTemplateParameters().get( i ); 867 final Object object = p.getObject( this.getLocation() ); 868 869 if ( object != null ) 870 { 871 tool.getTemplateParameters().put( p.getKey(), object ); 872 } 873 else 874 { 875 tool.getTemplateParameters().remove( p.getKey() ); 876 } 877 } 878 879 if ( this.getTemplateLocation() != null ) 880 { 881 final URL url = this.getDirectory( this.getTemplateLocation() ); 882 tool.setTemplateLocation( url ); 883 884 if ( url == null ) 885 { 886 this.log( Messages.getMessage( "templateLocationNotFound", this.getTemplateLocation() ), 887 Project.MSG_WARN ); 888 889 } 890 } 891 892 if ( this.getLocale() != null ) 893 { 894 tool.setLocale( new Locale( StringUtils.defaultString( this.getLocale().getLanguage() ), 895 StringUtils.defaultString( this.getLocale().getCountry() ), 896 StringUtils.defaultString( this.getLocale().getVariant() ) ) ); 897 898 } 899 } 900 catch ( final IOException e ) 901 { 902 throw new BuildException( Messages.getMessage( e ), e, this.getLocation() ); 903 } 904 } 905 906 /** {@inheritDoc} */ 907 @Override 908 public JomcToolTask clone() 909 { 910 final JomcToolTask clone = (JomcToolTask) super.clone(); 911 912 if ( this.locale != null ) 913 { 914 clone.locale = this.locale.clone(); 915 } 916 917 if ( this.velocityPropertyResources != null ) 918 { 919 clone.velocityPropertyResources = 920 new ArrayList<PropertiesResourceType>( this.velocityPropertyResources.size() ); 921 922 for ( PropertiesResourceType e : this.velocityPropertyResources ) 923 { 924 clone.velocityPropertyResources.add( e.clone() ); 925 } 926 } 927 928 if ( this.velocityProperties != null ) 929 { 930 clone.velocityProperties = new ArrayList<KeyValueType>( this.velocityProperties.size() ); 931 932 for ( KeyValueType e : this.velocityProperties ) 933 { 934 clone.velocityProperties.add( e.clone() ); 935 } 936 } 937 938 if ( this.velocityPropertyResources != null ) 939 { 940 clone.velocityPropertyResources = 941 new ArrayList<PropertiesResourceType>( this.velocityPropertyResources.size() ); 942 943 for ( PropertiesResourceType e : this.velocityPropertyResources ) 944 { 945 clone.velocityPropertyResources.add( e.clone() ); 946 } 947 } 948 949 if ( this.templateParameters != null ) 950 { 951 clone.templateParameters = new ArrayList<KeyValueType>( this.templateParameters.size() ); 952 953 for ( KeyValueType e : this.templateParameters ) 954 { 955 clone.templateParameters.add( e.clone() ); 956 } 957 } 958 959 if ( this.templateParameterResources != null ) 960 { 961 clone.templateParameterResources = 962 new ArrayList<PropertiesResourceType>( this.templateParameterResources.size() ); 963 964 for ( PropertiesResourceType e : this.templateParameterResources ) 965 { 966 clone.templateParameterResources.add( e.clone() ); 967 } 968 } 969 970 return clone; 971 } 972 973}