1 /* 2 * Copyright (c) 2011-2024 Qulice.com 3 * 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 1) Redistributions of source code must retain the above 9 * copyright notice, this list of conditions and the following 10 * disclaimer. 2) Redistributions in binary form must reproduce the above 11 * copyright notice, this list of conditions and the following 12 * disclaimer in the documentation and/or other materials provided 13 * with the distribution. 3) Neither the name of the Qulice.com nor 14 * the names of its contributors may be used to endorse or promote 15 * products derived from this software without specific prior written 16 * permission. 17 * 18 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT 20 * NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND 21 * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL 22 * THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 23 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 25 * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 27 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 29 * OF THE POSSIBILITY OF SUCH DAMAGE. 30 */ 31 package com.qulice.ant; 32 33 import java.io.File; 34 import java.util.function.Function; 35 import java.util.function.Supplier; 36 import org.apache.tools.ant.Project; 37 38 /** 39 * Represents subset of org.apache.tools.ant.Project API which is relevant to Qulice. 40 * 41 * @since 1.0 42 */ 43 interface AntProject { 44 /** 45 * Returns Ant project property. 46 * 47 * @param property Name of the property to get. 48 * @return Property value or null. 49 */ 50 String getProperty(String property); 51 52 /** 53 * Returns Ant project base directory. 54 * 55 * @return Base directory. 56 */ 57 File getBaseDir(); 58 59 /** 60 * Default implementation which wraps Ant Project. 61 * @since 1.0 62 */ 63 class Default implements AntProject { 64 /** 65 * Wrapped project. 66 */ 67 private final Project project; 68 69 /** 70 * Creates a new AntProject equivalent to the given Project. 71 * @param project Project to wrap. 72 */ 73 Default(final Project project) { 74 this.project = project; 75 } 76 77 @Override 78 public String getProperty(final String property) { 79 return this.project.getProperty(property); 80 } 81 82 @Override 83 public File getBaseDir() { 84 return this.project.getBaseDir(); 85 } 86 } 87 88 /** 89 * Fake implementation of AntProject which allows caller to 90 * customize both methods with lambdas. 91 * 92 * @since 1.0 93 */ 94 class Fake implements AntProject { 95 /** 96 * Implementation of the getProperty() method. 97 */ 98 private final Function<String, String> prop; 99 100 /** 101 * Implementation of the getBaseDir() method. 102 */ 103 private final Supplier<File> basedir; 104 105 /** 106 * Creates a new FakeAntProject which will use provided 107 * functions. 108 * 109 * @param prop Implementation of the getProperty(String). 110 * @param basedir Implementation of the getBaseDir(). 111 */ 112 Fake( 113 final Function<String, String> prop, 114 final Supplier<File> basedir 115 ) { 116 this.prop = prop; 117 this.basedir = basedir; 118 } 119 120 @Override 121 public String getProperty(final String property) { 122 return this.prop.apply(property); 123 } 124 125 @Override 126 public File getBaseDir() { 127 return this.basedir.get(); 128 } 129 } 130 }