summaryrefslogtreecommitdiff
path: root/buildscripts/phing/classes/phing/tasks/system/InputTask.php
blob: a5e1fdb9213c2696611cc208f29523711bcc688e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php
/*
 *  $Id: InputTask.php 59 2006-04-28 14:49:47Z mrook $
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *
 * This software consists of voluntary contributions made by many individuals
 * and is licensed under the LGPL. For more information please see
 * <http://phing.info>.
 */

require_once 'phing/Task.php';
include_once 'phing/input/InputRequest.php';
include_once 'phing/input/YesNoInputRequest.php';
include_once 'phing/input/MultipleChoiceInputRequest.php';
 
/**
 * Reads input from the InputHandler.
 * 
 * @see       Project::getInputHandler()
 * @author    Hans Lellelid <hans@xmpl.org> (Phing)
 * @author    Ulrich Schmidt <usch@usch.net> (Ant)
 * @author    Stefan Bodewig <stefan.bodewig@epost.de> (Ant)
 * @version   $Revision: 1.6 $
 * @package   phing.tasks.system
 */
class InputTask extends Task {
    
    private $validargs;
    private $message = ""; // required
    private $propertyName; // required
    private $defaultValue;
    private $promptChar;
    
    /**
     * Defines valid input parameters as comma separated strings. If set, input
     * task will reject any input not defined as accepted and requires the user
     * to reenter it. Validargs are case sensitive. If you want 'a' and 'A' to
     * be accepted you need to define both values as accepted arguments.
     *
     * @param validargs A comma separated String defining valid input args.
     */
    public function setValidargs ($validargs) {
        $this->validargs = $validargs;
    }

    /**
     * Defines the name of a property to be set from input.
     *
     * @param string $name Name for the property to be set from input
     */
    public function setPropertyName($name) {
        $this->propertyName = $name;
    }

    /**
     * Sets the Message which gets displayed to the user during the build run.
     * @param message The message to be displayed.
     */
    public function setMessage ($message) {
        $this->message = $message;
    }

    /**
     * Set a multiline message.
     */
    public function addText($msg) {
        $this->message .= $this->project->replaceProperties($msg);
    }
    
    /**
     * Add a default value.
     * @param string $v
     */
    public function setDefaultValue($v) {
        $this->defaultValue = $v;
    }
    
    /**
     * Set the character/string to use for the prompt.
     * @param string $c
     */
    public function setPromptChar($c) {
        $this->promptChar = $c;
    }
    
    /**
     * Actual method executed by phing.
     * @throws BuildException
     */
    public function main() {
    
        if ($this->propertyName === null) {
            throw new BuildException("You must specify a value for propertyName attribute.");
        }
        
        if ($this->validargs !== null) {
            $accept = preg_split('/[\s,]+/', $this->validargs);
            
            // is it a boolean (yes/no) inputrequest?
            $yesno = false;
            if (count($accept) == 2) {
                $yesno = true;
                foreach($accept as $ans) {
                    if(!StringHelper::isBoolean($ans)) {
                        $yesno = false;
                        break;
                    }
                }
            }
            if ($yesno) $request = new YesNoInputRequest($this->message, $accept);
            else $request = new MultipleChoiceInputRequest($this->message, $accept);
        } else {
            $request = new InputRequest($this->message);
        }
        
        // default default is curr prop value        
        $request->setDefaultValue($this->project->getProperty($this->propertyName));
        
        $request->setPromptChar($this->promptChar);
        
        // unless overridden...
        if ($this->defaultValue !== null) {
            $request->setDefaultValue($this->defaultValue);
        }
        
        $this->project->getInputHandler()->handleInput($request);

        $value = $request->getInput();
        
        if ($value !== null) {
            $this->project->setUserProperty($this->propertyName, $value);
        }
    }

}