source: release-kits/lirk3/bin/ant-installer/web/java2html/antinstaller/org/tp23/antinstaller/antmod/Main.java.html@ 14982

Last change on this file since 14982 was 14982, checked in by oranfry, 16 years ago

initial import of LiRK3

File size: 108.6 KB
Line 
1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
2<HTML>
3<HEAD>
4<LINK REL=STYLESHEET TYPE="text/css" HREF="../../../../stylesheet.css" TITLE="Style">
5<META NAME="GENERATOR" CONTENT="Java2HTML Version 1.4">
6<TITLE>org.tp23.antinstaller.antmod.Main (Java2HTML)</TITLE>
7</HEAD>
8<BODY><TABLE id="Header" border="0" cellpadding="0" cellspacing="0" width="100%">
9<tr>
10<td colspan="2" width="33%">&nbsp;</td>
11<td align="center" colspan="2" width="33%">
12<font size="4" class="ClassName">Main.java</font>
13</td>
14<td align="right" colspan="2" width="33%">&nbsp;</td>
15</tr>
16</TABLE>
17<pre CLASS="Classes">
18<FONT CLASS="LN">1 </FONT><A NAME="1"></A><FONT CLASS="MultiLineComment">/*
19<FONT CLASS="LN">2 </FONT><A NAME="2"></A> * Copyright 2000-2004 The Apache Software Foundation
20<FONT CLASS="LN">3 </FONT><A NAME="3"></A> *
21<FONT CLASS="LN">4 </FONT><A NAME="4"></A> * Licensed under the Apache License, Version 2.0 (the "License");
22<FONT CLASS="LN">5 </FONT><A NAME="5"></A> * you may not use this file except in compliance with the License.
23<FONT CLASS="LN">6 </FONT><A NAME="6"></A> * You may obtain a copy of the License at
24<FONT CLASS="LN">7 </FONT><A NAME="7"></A> *
25<FONT CLASS="LN">8 </FONT><A NAME="8"></A> * http://www.apache.org/licenses/LICENSE-2.0
26<FONT CLASS="LN">9 </FONT><A NAME="9"></A> *
27<FONT CLASS="LN">10</FONT><A NAME="10"></A> * Unless required by applicable law or agreed to in writing, software
28<FONT CLASS="LN">11</FONT><A NAME="11"></A> * distributed under the License is distributed on an "AS IS" BASIS,
29<FONT CLASS="LN">12</FONT><A NAME="12"></A> * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
30<FONT CLASS="LN">13</FONT><A NAME="13"></A> * See the License for the specific language governing permissions and
31<FONT CLASS="LN">14</FONT><A NAME="14"></A> * limitations under the License.
32<FONT CLASS="LN">15</FONT><A NAME="15"></A> *
33<FONT CLASS="LN">16</FONT><A NAME="16"></A> */</FONT>
34<FONT CLASS="LN">17</FONT><A NAME="17"></A><FONT CLASS="Package">package</FONT> <A HREF="../../../../org.tp23.antinstaller.antmod.index.html" target="packageFrame">org.tp23.antinstaller.antmod</A>;
35<FONT CLASS="LN">18</FONT><A NAME="18"></A>
36<FONT CLASS="LN">19</FONT><A NAME="19"></A><FONT CLASS="Import">import</FONT> java.io.File;
37<FONT CLASS="LN">20</FONT><A NAME="20"></A><FONT CLASS="Import">import</FONT> java.io.FileInputStream;
38<FONT CLASS="LN">21</FONT><A NAME="21"></A><FONT CLASS="Import">import</FONT> java.io.FileOutputStream;
39<FONT CLASS="LN">22</FONT><A NAME="22"></A><FONT CLASS="Import">import</FONT> java.io.IOException;
40<FONT CLASS="LN">23</FONT><A NAME="23"></A><FONT CLASS="Import">import</FONT> java.io.InputStream;
41<FONT CLASS="LN">24</FONT><A NAME="24"></A><FONT CLASS="Import">import</FONT> java.io.PrintStream;
42<FONT CLASS="LN">25</FONT><A NAME="25"></A><FONT CLASS="Import">import</FONT> java.util.Enumeration;
43<FONT CLASS="LN">26</FONT><A NAME="26"></A><FONT CLASS="Import">import</FONT> java.util.Properties;
44<FONT CLASS="LN">27</FONT><A NAME="27"></A><FONT CLASS="Import">import</FONT> java.util.Vector;
45<FONT CLASS="LN">28</FONT><A NAME="28"></A>
46<FONT CLASS="LN">29</FONT><A NAME="29"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.BuildException;
47<FONT CLASS="LN">30</FONT><A NAME="30"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.BuildListener;
48<FONT CLASS="LN">31</FONT><A NAME="31"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.BuildLogger;
49<FONT CLASS="LN">32</FONT><A NAME="32"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.DefaultLogger;
50<FONT CLASS="LN">33</FONT><A NAME="33"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.Diagnostics;
51<FONT CLASS="LN">34</FONT><A NAME="34"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.ExitStatusException;
52<FONT CLASS="LN">35</FONT><A NAME="35"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.Project;
53<FONT CLASS="LN">36</FONT><A NAME="36"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.ProjectHelper;
54<FONT CLASS="LN">37</FONT><A NAME="37"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.Target;
55<FONT CLASS="LN">38</FONT><A NAME="38"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.input.DefaultInputHandler;
56<FONT CLASS="LN">39</FONT><A NAME="39"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.input.InputHandler;
57<FONT CLASS="LN">40</FONT><A NAME="40"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.launch.AntMain;
58<FONT CLASS="LN">41</FONT><A NAME="41"></A><FONT CLASS="Import">import</FONT> org.apache.tools.ant.util.JavaEnvUtils;
59<FONT CLASS="LN">42</FONT><A NAME="42"></A><FONT CLASS="Import">import</FONT> <A HREF="../../../../org/tp23/antinstaller/InstallerContext.java.html">org.tp23.antinstaller.InstallerContext</A>;
60<FONT CLASS="LN">43</FONT><A NAME="43"></A><FONT CLASS="Import">import</FONT> <A HREF="../../../../org/tp23/antinstaller/PropertiesFileRenderer.java.html">org.tp23.antinstaller.PropertiesFileRenderer</A>;
61<FONT CLASS="LN">44</FONT><A NAME="44"></A>
62<FONT CLASS="LN">45</FONT><A NAME="45"></A>
63<FONT CLASS="LN">46</FONT><A NAME="46"></A><FONT CLASS="FormalComment">/**
64<FONT CLASS="LN">47</FONT><A NAME="47"></A> * Command line entry point into Ant. This class is entered via the
65<FONT CLASS="LN">48</FONT><A NAME="48"></A> * canonical `public static void main` entry point and reads the
66<FONT CLASS="LN">49</FONT><A NAME="49"></A> * command line arguments. It then assembles and executes an Ant
67<FONT CLASS="LN">50</FONT><A NAME="50"></A> * project.
68<FONT CLASS="LN">51</FONT><A NAME="51"></A> * &lt;p&gt;
69<FONT CLASS="LN">52</FONT><A NAME="52"></A> * If you integrating Ant into some other tool, this is not the class
70<FONT CLASS="LN">53</FONT><A NAME="53"></A> * to use as an entry point. Please see the source code of this
71<FONT CLASS="LN">54</FONT><A NAME="54"></A> * class to see how it manipulates the Ant project classes.
72<FONT CLASS="LN">55</FONT><A NAME="55"></A> *
73<FONT CLASS="LN">56</FONT><A NAME="56"></A>* This file has been modified by Paul Hinds for Antinstaller and is not the same
74<FONT CLASS="LN">57</FONT><A NAME="57"></A>* as the one delivered with Ant 1.6
75<FONT CLASS="LN">58</FONT><A NAME="58"></A>* @version $Id: Main.java,v 1.5 2007/01/12 10:41:48 anothermwilson Exp $
76<FONT CLASS="LN">59</FONT><A NAME="59"></A> */</FONT>
77<FONT CLASS="LN">60</FONT><A NAME="60"></A><FONT CLASS="Public">public</FONT> <FONT CLASS="Class">class</FONT> Main <FONT CLASS="Implements">implements</FONT> AntMain {
78<FONT CLASS="LN">61</FONT><A NAME="61"></A>
79<FONT CLASS="LN">62</FONT><A NAME="62"></A> <FONT CLASS="FormalComment">/** The default build file name. */</FONT>
80<FONT CLASS="LN">63</FONT><A NAME="63"></A> <FONT CLASS="Public">public</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Final">final</FONT> String DEFAULT_BUILD_FILENAME = <FONT CLASS="StringLiteral">"build.xml"</FONT>;
81<FONT CLASS="LN">64</FONT><A NAME="64"></A>
82<FONT CLASS="LN">65</FONT><A NAME="65"></A> <FONT CLASS="FormalComment">/** Our current message output status. Follows Project.MSG_XXX. */</FONT>
83<FONT CLASS="LN">66</FONT><A NAME="66"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Int">int</FONT> msgOutputLevel = Project.MSG_INFO;
84<FONT CLASS="LN">67</FONT><A NAME="67"></A>
85<FONT CLASS="LN">68</FONT><A NAME="68"></A> <FONT CLASS="FormalComment">/** File that we are using for configuration. */</FONT>
86<FONT CLASS="LN">69</FONT><A NAME="69"></A> <FONT CLASS="Private">private</FONT> File buildFile; <FONT CLASS="MultiLineComment">/* null */</FONT>
87<FONT CLASS="LN">70</FONT><A NAME="70"></A>
88<FONT CLASS="LN">71</FONT><A NAME="71"></A> <FONT CLASS="FormalComment">/** Stream to use for logging. */</FONT>
89<FONT CLASS="LN">72</FONT><A NAME="72"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> PrintStream out = System.out;
90<FONT CLASS="LN">73</FONT><A NAME="73"></A>
91<FONT CLASS="LN">74</FONT><A NAME="74"></A> <FONT CLASS="FormalComment">/** Stream that we are using for logging error messages. */</FONT>
92<FONT CLASS="LN">75</FONT><A NAME="75"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> PrintStream err = System.err;
93<FONT CLASS="LN">76</FONT><A NAME="76"></A>
94<FONT CLASS="LN">77</FONT><A NAME="77"></A> <FONT CLASS="FormalComment">/** The build targets. */</FONT>
95<FONT CLASS="LN">78</FONT><A NAME="78"></A> <FONT CLASS="Private">private</FONT> Vector targets = <FONT CLASS="New">new</FONT> Vector();
96<FONT CLASS="LN">79</FONT><A NAME="79"></A>
97<FONT CLASS="LN">80</FONT><A NAME="80"></A> <FONT CLASS="FormalComment">/** Set of properties that can be used by tasks. */</FONT>
98<FONT CLASS="LN">81</FONT><A NAME="81"></A> <FONT CLASS="Private">private</FONT> Properties definedProps = <FONT CLASS="New">new</FONT> Properties();
99<FONT CLASS="LN">82</FONT><A NAME="82"></A>
100<FONT CLASS="LN">83</FONT><A NAME="83"></A> <FONT CLASS="FormalComment">/** Names of classes to add as listeners to project. */</FONT>
101<FONT CLASS="LN">84</FONT><A NAME="84"></A> <FONT CLASS="Private">private</FONT> Vector listeners = <FONT CLASS="New">new</FONT> Vector(<FONT CLASS="IntegerLiteral">1</FONT>);
102<FONT CLASS="LN">85</FONT><A NAME="85"></A>
103<FONT CLASS="LN">86</FONT><A NAME="86"></A> <FONT CLASS="FormalComment">/** File names of property files to load on startup. */</FONT>
104<FONT CLASS="LN">87</FONT><A NAME="87"></A> <FONT CLASS="Private">private</FONT> Vector propertyFiles = <FONT CLASS="New">new</FONT> Vector(<FONT CLASS="IntegerLiteral">1</FONT>);
105<FONT CLASS="LN">88</FONT><A NAME="88"></A>
106<FONT CLASS="LN">89</FONT><A NAME="89"></A> <FONT CLASS="FormalComment">/** Indicates whether this build is to support interactive input */</FONT>
107<FONT CLASS="LN">90</FONT><A NAME="90"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Boolean">boolean</FONT> allowInput = <FONT CLASS="True">true</FONT>;
108<FONT CLASS="LN">91</FONT><A NAME="91"></A>
109<FONT CLASS="LN">92</FONT><A NAME="92"></A> <FONT CLASS="FormalComment">/** keep going mode */</FONT>
110<FONT CLASS="LN">93</FONT><A NAME="93"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Boolean">boolean</FONT> keepGoingMode = <FONT CLASS="False">false</FONT>;
111<FONT CLASS="LN">94</FONT><A NAME="94"></A>
112<FONT CLASS="LN">95</FONT><A NAME="95"></A> <FONT CLASS="FormalComment">/**
113<FONT CLASS="LN">96</FONT><A NAME="96"></A> * The Ant logger class. There may be only one logger. It will have
114<FONT CLASS="LN">97</FONT><A NAME="97"></A> * the right to use the 'out' PrintStream. The class must implements the
115<FONT CLASS="LN">98</FONT><A NAME="98"></A> * BuildLogger interface.
116<FONT CLASS="LN">99</FONT><A NAME="99"></A> */</FONT>
117<FONT CLASS="LN">00</FONT><A NAME="100"></A> <FONT CLASS="Private">private</FONT> String loggerClassname = <FONT CLASS="Null">null</FONT>;
118<FONT CLASS="LN">01</FONT><A NAME="101"></A>
119<FONT CLASS="LN">02</FONT><A NAME="102"></A> <FONT CLASS="FormalComment">/**
120<FONT CLASS="LN">03</FONT><A NAME="103"></A> * The Ant InputHandler class. There may be only one input
121<FONT CLASS="LN">04</FONT><A NAME="104"></A> * handler.
122<FONT CLASS="LN">05</FONT><A NAME="105"></A> */</FONT>
123<FONT CLASS="LN">06</FONT><A NAME="106"></A> <FONT CLASS="Private">private</FONT> String inputHandlerClassname = <FONT CLASS="Null">null</FONT>;
124<FONT CLASS="LN">07</FONT><A NAME="107"></A>
125<FONT CLASS="LN">08</FONT><A NAME="108"></A> <FONT CLASS="FormalComment">/**
126<FONT CLASS="LN">09</FONT><A NAME="109"></A> * Whether or not output to the log is to be unadorned.
127<FONT CLASS="LN">10</FONT><A NAME="110"></A> */</FONT>
128<FONT CLASS="LN">11</FONT><A NAME="111"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Boolean">boolean</FONT> emacsMode = <FONT CLASS="False">false</FONT>;
129<FONT CLASS="LN">12</FONT><A NAME="112"></A>
130<FONT CLASS="LN">13</FONT><A NAME="113"></A> <FONT CLASS="FormalComment">/**
131<FONT CLASS="LN">14</FONT><A NAME="114"></A> * Whether or not this instance has successfully been
132<FONT CLASS="LN">15</FONT><A NAME="115"></A> * constructed and is ready to run.
133<FONT CLASS="LN">16</FONT><A NAME="116"></A> */</FONT>
134<FONT CLASS="LN">17</FONT><A NAME="117"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Boolean">boolean</FONT> readyToRun = <FONT CLASS="False">false</FONT>;
135<FONT CLASS="LN">18</FONT><A NAME="118"></A>
136<FONT CLASS="LN">19</FONT><A NAME="119"></A> <FONT CLASS="FormalComment">/**
137<FONT CLASS="LN">20</FONT><A NAME="120"></A> * Whether or not we should only parse and display the project help
138<FONT CLASS="LN">21</FONT><A NAME="121"></A> * information.
139<FONT CLASS="LN">22</FONT><A NAME="122"></A> */</FONT>
140<FONT CLASS="LN">23</FONT><A NAME="123"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Boolean">boolean</FONT> projectHelp = <FONT CLASS="False">false</FONT>;
141<FONT CLASS="LN">24</FONT><A NAME="124"></A>
142<FONT CLASS="LN">25</FONT><A NAME="125"></A> <FONT CLASS="FormalComment">/**
143<FONT CLASS="LN">26</FONT><A NAME="126"></A> * Whether or not a logfile is being used. This is used to
144<FONT CLASS="LN">27</FONT><A NAME="127"></A> * check if the output streams must be closed.
145<FONT CLASS="LN">28</FONT><A NAME="128"></A> */</FONT>
146<FONT CLASS="LN">29</FONT><A NAME="129"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Boolean">boolean</FONT> isLogFileUsed = <FONT CLASS="False">false</FONT>;
147<FONT CLASS="LN">30</FONT><A NAME="130"></A>
148<FONT CLASS="LN">31</FONT><A NAME="131"></A> <FONT CLASS="FormalComment">/**
149<FONT CLASS="LN">32</FONT><A NAME="132"></A> * optional thread priority
150<FONT CLASS="LN">33</FONT><A NAME="133"></A> */</FONT>
151<FONT CLASS="LN">34</FONT><A NAME="134"></A> <FONT CLASS="Private">private</FONT> Integer threadPriority = <FONT CLASS="Null">null</FONT>;
152<FONT CLASS="LN">35</FONT><A NAME="135"></A> <FONT CLASS="FormalComment">/**
153<FONT CLASS="LN">36</FONT><A NAME="136"></A> * Installer Context
154<FONT CLASS="LN">37</FONT><A NAME="137"></A> */</FONT>
155<FONT CLASS="LN">38</FONT><A NAME="138"></A> <FONT CLASS="Private">private</FONT> <A HREF="../../../../org/tp23/antinstaller/InstallerContext.java.html">InstallerContext</A> ctx = <FONT CLASS="Null">null</FONT>;
156<FONT CLASS="LN">39</FONT><A NAME="139"></A>
157<FONT CLASS="LN">40</FONT><A NAME="140"></A> <FONT CLASS="FormalComment">/**
158<FONT CLASS="LN">41</FONT><A NAME="141"></A> * Prints the message of the Throwable if it (the message) is not
159<FONT CLASS="LN">42</FONT><A NAME="142"></A> * &lt;code&gt;null&lt;/code&gt;.
160<FONT CLASS="LN">43</FONT><A NAME="143"></A> *
161<FONT CLASS="LN">44</FONT><A NAME="144"></A> * @param t Throwable to print the message of.
162<FONT CLASS="LN">45</FONT><A NAME="145"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
163<FONT CLASS="LN">46</FONT><A NAME="146"></A> */</FONT>
164<FONT CLASS="LN">47</FONT><A NAME="147"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printMessage(Throwable t) {
165<FONT CLASS="LN">48</FONT><A NAME="148"></A> String message = t.getMessage();
166<FONT CLASS="LN">49</FONT><A NAME="149"></A> <FONT CLASS="If">if</FONT> (message != <FONT CLASS="Null">null</FONT>) {
167<FONT CLASS="LN">50</FONT><A NAME="150"></A> System.err.println(message);
168<FONT CLASS="LN">51</FONT><A NAME="151"></A> }
169<FONT CLASS="LN">52</FONT><A NAME="152"></A> }
170<FONT CLASS="LN">53</FONT><A NAME="153"></A>
171<FONT CLASS="LN">54</FONT><A NAME="154"></A> <FONT CLASS="FormalComment">/**
172<FONT CLASS="LN">55</FONT><A NAME="155"></A> * Creates a new instance of this class using the
173<FONT CLASS="LN">56</FONT><A NAME="156"></A> * arguments specified, gives it any extra user properties which have been
174<FONT CLASS="LN">57</FONT><A NAME="157"></A> * specified, and then runs the build using the classloader provided.
175<FONT CLASS="LN">58</FONT><A NAME="158"></A> *
176<FONT CLASS="LN">59</FONT><A NAME="159"></A> * @param args Command line arguments. Must not be &lt;code&gt;null&lt;/code&gt;.
177<FONT CLASS="LN">60</FONT><A NAME="160"></A> * @param additionalUserProperties Any extra properties to use in this
178<FONT CLASS="LN">61</FONT><A NAME="161"></A> * build. May be &lt;code&gt;null&lt;/code&gt;, which is the equivalent to
179<FONT CLASS="LN">62</FONT><A NAME="162"></A> * passing in an empty set of properties.
180<FONT CLASS="LN">63</FONT><A NAME="163"></A> * @param coreLoader Classloader used for core classes. May be
181<FONT CLASS="LN">64</FONT><A NAME="164"></A> * &lt;code&gt;null&lt;/code&gt; in which case the system classloader is used.
182<FONT CLASS="LN">65</FONT><A NAME="165"></A> */</FONT>
183<FONT CLASS="LN">66</FONT><A NAME="166"></A> <FONT CLASS="Public">public</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> start(String[] args, Properties additionalUserProperties,
184<FONT CLASS="LN">67</FONT><A NAME="167"></A> ClassLoader coreLoader) {
185<FONT CLASS="LN">68</FONT><A NAME="168"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> UnsupportedOperationException(<FONT CLASS="StringLiteral">"Required by Ant interface but not used"</FONT>);
186<FONT CLASS="LN">69</FONT><A NAME="169"></A> <FONT CLASS="SingleLineComment">//Main m = new Main();
187<FONT CLASS="LN">70</FONT><A NAME="170"></A></FONT> <FONT CLASS="SingleLineComment">//m.startAnt(args, additionalUserProperties, coreLoader);
188<FONT CLASS="LN">71</FONT><A NAME="171"></A></FONT> }
189<FONT CLASS="LN">72</FONT><A NAME="172"></A>
190<FONT CLASS="LN">73</FONT><A NAME="173"></A>
191<FONT CLASS="LN">74</FONT><A NAME="174"></A> <FONT CLASS="Public">public</FONT> <FONT CLASS="Void">void</FONT> startAnt(String[] args, Properties additionalUserProperties,
192<FONT CLASS="LN">75</FONT><A NAME="175"></A> ClassLoader coreLoader) {
193<FONT CLASS="LN">76</FONT><A NAME="176"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> UnsupportedOperationException(<FONT CLASS="StringLiteral">"Required by Ant interface but not used"</FONT>);
194<FONT CLASS="LN">77</FONT><A NAME="177"></A> <FONT CLASS="SingleLineComment">//startAnt(args, additionalUserProperties, coreLoader, null); // FindBugs does not like this
195<FONT CLASS="LN">78</FONT><A NAME="178"></A></FONT> }
196<FONT CLASS="LN">79</FONT><A NAME="179"></A> <FONT CLASS="FormalComment">/**
197<FONT CLASS="LN">80</FONT><A NAME="180"></A> * Start Ant
198<FONT CLASS="LN">81</FONT><A NAME="181"></A> * @param args command line args
199<FONT CLASS="LN">82</FONT><A NAME="182"></A> * @param additionalUserProperties properties to set beyond those that
200<FONT CLASS="LN">83</FONT><A NAME="183"></A> * may be specified on the args list
201<FONT CLASS="LN">84</FONT><A NAME="184"></A> * @param coreLoader - not used
202<FONT CLASS="LN">85</FONT><A NAME="185"></A> * @return the return code that was used for System.exit() in the original Ant
203<FONT CLASS="LN">86</FONT><A NAME="186"></A> *
204<FONT CLASS="LN">87</FONT><A NAME="187"></A> * @since Ant 1.6
205<FONT CLASS="LN">88</FONT><A NAME="188"></A> */</FONT>
206<FONT CLASS="LN">89</FONT><A NAME="189"></A> <FONT CLASS="Public">public</FONT> <FONT CLASS="Int">int</FONT> startAnt(String[] args, Properties additionalUserProperties,
207<FONT CLASS="LN">90</FONT><A NAME="190"></A> ClassLoader coreLoader, <A HREF="../../../../org/tp23/antinstaller/InstallerContext.java.html">InstallerContext</A> ctx) {
208<FONT CLASS="LN">91</FONT><A NAME="191"></A> <FONT CLASS="This">this</FONT>.ctx = ctx;
209<FONT CLASS="LN">92</FONT><A NAME="192"></A> out = ctx.getAntOutputRenderer().getOut();
210<FONT CLASS="LN">93</FONT><A NAME="193"></A> err = ctx.getAntOutputRenderer().getErr();
211<FONT CLASS="LN">94</FONT><A NAME="194"></A> <FONT CLASS="Try">try</FONT> {
212<FONT CLASS="LN">95</FONT><A NAME="195"></A> Diagnostics.validateVersion();
213<FONT CLASS="LN">96</FONT><A NAME="196"></A> processArgs(args);
214<FONT CLASS="LN">97</FONT><A NAME="197"></A> } <FONT CLASS="Catch">catch</FONT> (Throwable exc) {
215<FONT CLASS="LN">98</FONT><A NAME="198"></A> handleLogfile();
216<FONT CLASS="LN">99</FONT><A NAME="199"></A> printMessage(exc);
217<FONT CLASS="LN">00</FONT><A NAME="200"></A> <FONT CLASS="Return">return</FONT> <FONT CLASS="IntegerLiteral">1</FONT>;
218<FONT CLASS="LN">01</FONT><A NAME="201"></A> }
219<FONT CLASS="LN">02</FONT><A NAME="202"></A>
220<FONT CLASS="LN">03</FONT><A NAME="203"></A> <FONT CLASS="If">if</FONT> (additionalUserProperties != <FONT CLASS="Null">null</FONT>) {
221<FONT CLASS="LN">04</FONT><A NAME="204"></A> <FONT CLASS="For">for</FONT> (Enumeration e = additionalUserProperties.keys();
222<FONT CLASS="LN">05</FONT><A NAME="205"></A> e.hasMoreElements();) {
223<FONT CLASS="LN">06</FONT><A NAME="206"></A> String key = (String) e.nextElement();
224<FONT CLASS="LN">07</FONT><A NAME="207"></A> String property = additionalUserProperties.getProperty(key);
225<FONT CLASS="LN">08</FONT><A NAME="208"></A> definedProps.put(key, property);
226<FONT CLASS="LN">09</FONT><A NAME="209"></A> }
227<FONT CLASS="LN">10</FONT><A NAME="210"></A> }
228<FONT CLASS="LN">11</FONT><A NAME="211"></A>
229<FONT CLASS="LN">12</FONT><A NAME="212"></A> <FONT CLASS="SingleLineComment">// expect the worst
230<FONT CLASS="LN">13</FONT><A NAME="213"></A></FONT> <FONT CLASS="Int">int</FONT> exitCode = <FONT CLASS="IntegerLiteral">1</FONT>;
231<FONT CLASS="LN">14</FONT><A NAME="214"></A> <FONT CLASS="Try">try</FONT> {
232<FONT CLASS="LN">15</FONT><A NAME="215"></A> <FONT CLASS="Try">try</FONT> {
233<FONT CLASS="LN">16</FONT><A NAME="216"></A> runBuild(coreLoader);
234<FONT CLASS="LN">17</FONT><A NAME="217"></A> exitCode = <FONT CLASS="IntegerLiteral">0</FONT>;
235<FONT CLASS="LN">18</FONT><A NAME="218"></A> } <FONT CLASS="Catch">catch</FONT> (ExitStatusException ese) {
236<FONT CLASS="LN">19</FONT><A NAME="219"></A> exitCode = ese.getStatus();
237<FONT CLASS="LN">20</FONT><A NAME="220"></A> <FONT CLASS="If">if</FONT> (exitCode != <FONT CLASS="IntegerLiteral">0</FONT>) {
238<FONT CLASS="LN">21</FONT><A NAME="221"></A> <FONT CLASS="Throw">throw</FONT> ese;
239<FONT CLASS="LN">22</FONT><A NAME="222"></A> }
240<FONT CLASS="LN">23</FONT><A NAME="223"></A> }
241<FONT CLASS="LN">24</FONT><A NAME="224"></A> } <FONT CLASS="Catch">catch</FONT> (BuildException be) {
242<FONT CLASS="LN">25</FONT><A NAME="225"></A> <FONT CLASS="If">if</FONT> (err != System.err) {
243<FONT CLASS="LN">26</FONT><A NAME="226"></A> printMessage(be);
244<FONT CLASS="LN">27</FONT><A NAME="227"></A> }
245<FONT CLASS="LN">28</FONT><A NAME="228"></A> } <FONT CLASS="Catch">catch</FONT> (Throwable exc) {
246<FONT CLASS="LN">29</FONT><A NAME="229"></A> exc.printStackTrace();
247<FONT CLASS="LN">30</FONT><A NAME="230"></A> printMessage(exc);
248<FONT CLASS="LN">31</FONT><A NAME="231"></A> } <FONT CLASS="Finally">finally</FONT> {
249<FONT CLASS="LN">32</FONT><A NAME="232"></A> handleLogfile();
250<FONT CLASS="LN">33</FONT><A NAME="233"></A> }
251<FONT CLASS="LN">34</FONT><A NAME="234"></A> <FONT CLASS="SingleLineComment">//mod by Paul Hinds
252<FONT CLASS="LN">35</FONT><A NAME="235"></A></FONT> <FONT CLASS="Return">return</FONT> exitCode;
253<FONT CLASS="LN">36</FONT><A NAME="236"></A> <FONT CLASS="SingleLineComment">//System.exit(exitCode);
254<FONT CLASS="LN">37</FONT><A NAME="237"></A></FONT> }
255<FONT CLASS="LN">38</FONT><A NAME="238"></A>
256<FONT CLASS="LN">39</FONT><A NAME="239"></A> <FONT CLASS="FormalComment">/**
257<FONT CLASS="LN">40</FONT><A NAME="240"></A> * Close logfiles, if we have been writing to them.
258<FONT CLASS="LN">41</FONT><A NAME="241"></A> *
259<FONT CLASS="LN">42</FONT><A NAME="242"></A> * @since Ant 1.6
260<FONT CLASS="LN">43</FONT><A NAME="243"></A> */</FONT>
261<FONT CLASS="LN">44</FONT><A NAME="244"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> handleLogfile() {
262<FONT CLASS="LN">45</FONT><A NAME="245"></A> <FONT CLASS="If">if</FONT> (isLogFileUsed) {
263<FONT CLASS="LN">46</FONT><A NAME="246"></A> <FONT CLASS="If">if</FONT> (out != <FONT CLASS="Null">null</FONT>) {
264<FONT CLASS="LN">47</FONT><A NAME="247"></A> <FONT CLASS="Try">try</FONT> {
265<FONT CLASS="LN">48</FONT><A NAME="248"></A> out.close();
266<FONT CLASS="LN">49</FONT><A NAME="249"></A> } <FONT CLASS="Catch">catch</FONT> (<FONT CLASS="Final">final</FONT> Exception e) {
267<FONT CLASS="LN">50</FONT><A NAME="250"></A> <FONT CLASS="SingleLineComment">//ignore
268<FONT CLASS="LN">51</FONT><A NAME="251"></A></FONT> }
269<FONT CLASS="LN">52</FONT><A NAME="252"></A> }
270<FONT CLASS="LN">53</FONT><A NAME="253"></A> <FONT CLASS="If">if</FONT> (err != <FONT CLASS="Null">null</FONT>) {
271<FONT CLASS="LN">54</FONT><A NAME="254"></A> <FONT CLASS="Try">try</FONT> {
272<FONT CLASS="LN">55</FONT><A NAME="255"></A> err.close();
273<FONT CLASS="LN">56</FONT><A NAME="256"></A> } <FONT CLASS="Catch">catch</FONT> (<FONT CLASS="Final">final</FONT> Exception e) {
274<FONT CLASS="LN">57</FONT><A NAME="257"></A> <FONT CLASS="SingleLineComment">//ignore
275<FONT CLASS="LN">58</FONT><A NAME="258"></A></FONT> }
276<FONT CLASS="LN">59</FONT><A NAME="259"></A> }
277<FONT CLASS="LN">60</FONT><A NAME="260"></A> }
278<FONT CLASS="LN">61</FONT><A NAME="261"></A> }
279<FONT CLASS="LN">62</FONT><A NAME="262"></A>
280<FONT CLASS="LN">63</FONT><A NAME="263"></A> <FONT CLASS="FormalComment">/**
281<FONT CLASS="LN">64</FONT><A NAME="264"></A> * Command line entry point. This method kicks off the building
282<FONT CLASS="LN">65</FONT><A NAME="265"></A> * of a project object and executes a build using either a given
283<FONT CLASS="LN">66</FONT><A NAME="266"></A> * target or the default target.
284<FONT CLASS="LN">67</FONT><A NAME="267"></A> *
285<FONT CLASS="LN">68</FONT><A NAME="268"></A> * @param args Command line arguments. Must not be &lt;code&gt;null&lt;/code&gt;.
286<FONT CLASS="LN">69</FONT><A NAME="269"></A> */</FONT>
287<FONT CLASS="LN">70</FONT><A NAME="270"></A><FONT CLASS="SingleLineComment">// public static void main(String[] args) {
288<FONT CLASS="LN">71</FONT><A NAME="271"></A></FONT><FONT CLASS="SingleLineComment">// start(args, null, null);
289<FONT CLASS="LN">72</FONT><A NAME="272"></A></FONT><FONT CLASS="SingleLineComment">// }
290<FONT CLASS="LN">73</FONT><A NAME="273"></A></FONT><FONT CLASS="SingleLineComment">//
291<FONT CLASS="LN">74</FONT><A NAME="274"></A></FONT> <FONT CLASS="FormalComment">/**
292<FONT CLASS="LN">75</FONT><A NAME="275"></A> * Constructor used when creating Main for later arg processing
293<FONT CLASS="LN">76</FONT><A NAME="276"></A> * and startup
294<FONT CLASS="LN">77</FONT><A NAME="277"></A> */</FONT>
295<FONT CLASS="LN">78</FONT><A NAME="278"></A> <FONT CLASS="Public">public</FONT> Main() {
296<FONT CLASS="LN">79</FONT><A NAME="279"></A> }
297<FONT CLASS="LN">80</FONT><A NAME="280"></A>
298<FONT CLASS="LN">81</FONT><A NAME="281"></A> <FONT CLASS="FormalComment">/**
299<FONT CLASS="LN">82</FONT><A NAME="282"></A> * Sole constructor, which parses and deals with command line
300<FONT CLASS="LN">83</FONT><A NAME="283"></A> * arguments.
301<FONT CLASS="LN">84</FONT><A NAME="284"></A> *
302<FONT CLASS="LN">85</FONT><A NAME="285"></A> * @param args Command line arguments. Must not be &lt;code&gt;null&lt;/code&gt;.
303<FONT CLASS="LN">86</FONT><A NAME="286"></A> *
304<FONT CLASS="LN">87</FONT><A NAME="287"></A> * @exception BuildException if the specified build file doesn't exist
305<FONT CLASS="LN">88</FONT><A NAME="288"></A> * or is a directory.
306<FONT CLASS="LN">89</FONT><A NAME="289"></A> *
307<FONT CLASS="LN">90</FONT><A NAME="290"></A> * @deprecated
308<FONT CLASS="LN">91</FONT><A NAME="291"></A> */</FONT>
309<FONT CLASS="LN">92</FONT><A NAME="292"></A> <FONT CLASS="Protected">protected</FONT> Main(String[] args) <FONT CLASS="Throws">throws</FONT> BuildException {
310<FONT CLASS="LN">93</FONT><A NAME="293"></A> processArgs(args);
311<FONT CLASS="LN">94</FONT><A NAME="294"></A> }
312<FONT CLASS="LN">95</FONT><A NAME="295"></A>
313<FONT CLASS="LN">96</FONT><A NAME="296"></A> <FONT CLASS="FormalComment">/**
314<FONT CLASS="LN">97</FONT><A NAME="297"></A> * Process command line arguments.
315<FONT CLASS="LN">98</FONT><A NAME="298"></A> * When ant is started from Launcher, the -lib argument does not get
316<FONT CLASS="LN">99</FONT><A NAME="299"></A> * passed through to this routine.
317<FONT CLASS="LN">00</FONT><A NAME="300"></A> *
318<FONT CLASS="LN">01</FONT><A NAME="301"></A> * @param args the command line arguments.
319<FONT CLASS="LN">02</FONT><A NAME="302"></A> *
320<FONT CLASS="LN">03</FONT><A NAME="303"></A> * @since Ant 1.6
321<FONT CLASS="LN">04</FONT><A NAME="304"></A> */</FONT>
322<FONT CLASS="LN">05</FONT><A NAME="305"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Void">void</FONT> processArgs(String[] args) {
323<FONT CLASS="LN">06</FONT><A NAME="306"></A> String searchForThis = <FONT CLASS="Null">null</FONT>;
324<FONT CLASS="LN">07</FONT><A NAME="307"></A> PrintStream logTo = <FONT CLASS="Null">null</FONT>;
325<FONT CLASS="LN">08</FONT><A NAME="308"></A>
326<FONT CLASS="LN">09</FONT><A NAME="309"></A> <FONT CLASS="SingleLineComment">// cycle through given args
327<FONT CLASS="LN">10</FONT><A NAME="310"></A></FONT>
328<FONT CLASS="LN">11</FONT><A NAME="311"></A> <FONT CLASS="For">for</FONT> (<FONT CLASS="Int">int</FONT> i = <FONT CLASS="IntegerLiteral">0</FONT>; i &lt; args.length; i++) {
329<FONT CLASS="LN">12</FONT><A NAME="312"></A> String arg = args[i];
330<FONT CLASS="LN">13</FONT><A NAME="313"></A>
331<FONT CLASS="LN">14</FONT><A NAME="314"></A> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-help"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-h"</FONT>)) {
332<FONT CLASS="LN">15</FONT><A NAME="315"></A> printUsage();
333<FONT CLASS="LN">16</FONT><A NAME="316"></A> <FONT CLASS="Return">return</FONT>;
334<FONT CLASS="LN">17</FONT><A NAME="317"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-version"</FONT>)) {
335<FONT CLASS="LN">18</FONT><A NAME="318"></A> printVersion();
336<FONT CLASS="LN">19</FONT><A NAME="319"></A> <FONT CLASS="Return">return</FONT>;
337<FONT CLASS="LN">20</FONT><A NAME="320"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-diagnostics"</FONT>)) {
338<FONT CLASS="LN">21</FONT><A NAME="321"></A> Diagnostics.doReport(System.out);
339<FONT CLASS="LN">22</FONT><A NAME="322"></A> <FONT CLASS="Return">return</FONT>;
340<FONT CLASS="LN">23</FONT><A NAME="323"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-quiet"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-q"</FONT>)) {
341<FONT CLASS="LN">24</FONT><A NAME="324"></A> msgOutputLevel = Project.MSG_WARN;
342<FONT CLASS="LN">25</FONT><A NAME="325"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-verbose"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-v"</FONT>)) {
343<FONT CLASS="LN">26</FONT><A NAME="326"></A> printVersion();
344<FONT CLASS="LN">27</FONT><A NAME="327"></A> msgOutputLevel = Project.MSG_VERBOSE;
345<FONT CLASS="LN">28</FONT><A NAME="328"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-debug"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-d"</FONT>)) {
346<FONT CLASS="LN">29</FONT><A NAME="329"></A> printVersion();
347<FONT CLASS="LN">30</FONT><A NAME="330"></A> msgOutputLevel = Project.MSG_DEBUG;
348<FONT CLASS="LN">31</FONT><A NAME="331"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-noinput"</FONT>)) {
349<FONT CLASS="LN">32</FONT><A NAME="332"></A> allowInput = <FONT CLASS="False">false</FONT>;
350<FONT CLASS="LN">33</FONT><A NAME="333"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-logfile"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-l"</FONT>)) {
351<FONT CLASS="LN">34</FONT><A NAME="334"></A> <FONT CLASS="Try">try</FONT> {
352<FONT CLASS="LN">35</FONT><A NAME="335"></A> File logFile = <FONT CLASS="New">new</FONT> File(args[i + <FONT CLASS="IntegerLiteral">1</FONT>]);
353<FONT CLASS="LN">36</FONT><A NAME="336"></A> i++;
354<FONT CLASS="LN">37</FONT><A NAME="337"></A> logTo = <FONT CLASS="New">new</FONT> PrintStream(<FONT CLASS="New">new</FONT> FileOutputStream(logFile));
355<FONT CLASS="LN">38</FONT><A NAME="338"></A> isLogFileUsed = <FONT CLASS="True">true</FONT>;
356<FONT CLASS="LN">39</FONT><A NAME="339"></A> } <FONT CLASS="Catch">catch</FONT> (IOException ioe) {
357<FONT CLASS="LN">40</FONT><A NAME="340"></A> String msg = <FONT CLASS="StringLiteral">"Cannot write on the specified log file. "</FONT>
358<FONT CLASS="LN">41</FONT><A NAME="341"></A> + <FONT CLASS="StringLiteral">"Make sure the path exists and you have write "</FONT>
359<FONT CLASS="LN">42</FONT><A NAME="342"></A> + <FONT CLASS="StringLiteral">"permissions."</FONT>;
360<FONT CLASS="LN">43</FONT><A NAME="343"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
361<FONT CLASS="LN">44</FONT><A NAME="344"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
362<FONT CLASS="LN">45</FONT><A NAME="345"></A> String msg = <FONT CLASS="StringLiteral">"You must specify a log file when "</FONT>
363<FONT CLASS="LN">46</FONT><A NAME="346"></A> + <FONT CLASS="StringLiteral">"using the -log argument"</FONT>;
364<FONT CLASS="LN">47</FONT><A NAME="347"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
365<FONT CLASS="LN">48</FONT><A NAME="348"></A> }
366<FONT CLASS="LN">49</FONT><A NAME="349"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-buildfile"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-file"</FONT>)
367<FONT CLASS="LN">50</FONT><A NAME="350"></A> || arg.equals(<FONT CLASS="StringLiteral">"-f"</FONT>)) {
368<FONT CLASS="LN">51</FONT><A NAME="351"></A> <FONT CLASS="Try">try</FONT> {
369<FONT CLASS="LN">52</FONT><A NAME="352"></A> buildFile = <FONT CLASS="New">new</FONT> File(args[i + <FONT CLASS="IntegerLiteral">1</FONT>].replace(<FONT CLASS="CharacerLiteral">'/'</FONT>, File.separatorChar));
370<FONT CLASS="LN">53</FONT><A NAME="353"></A> i++;
371<FONT CLASS="LN">54</FONT><A NAME="354"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
372<FONT CLASS="LN">55</FONT><A NAME="355"></A> String msg = <FONT CLASS="StringLiteral">"You must specify a buildfile when "</FONT>
373<FONT CLASS="LN">56</FONT><A NAME="356"></A> + <FONT CLASS="StringLiteral">"using the -buildfile argument"</FONT>;
374<FONT CLASS="LN">57</FONT><A NAME="357"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
375<FONT CLASS="LN">58</FONT><A NAME="358"></A> }
376<FONT CLASS="LN">59</FONT><A NAME="359"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-listener"</FONT>)) {
377<FONT CLASS="LN">60</FONT><A NAME="360"></A> <FONT CLASS="Try">try</FONT> {
378<FONT CLASS="LN">61</FONT><A NAME="361"></A> listeners.addElement(args[i + <FONT CLASS="IntegerLiteral">1</FONT>]);
379<FONT CLASS="LN">62</FONT><A NAME="362"></A> i++;
380<FONT CLASS="LN">63</FONT><A NAME="363"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
381<FONT CLASS="LN">64</FONT><A NAME="364"></A> String msg = <FONT CLASS="StringLiteral">"You must specify a classname when "</FONT>
382<FONT CLASS="LN">65</FONT><A NAME="365"></A> + <FONT CLASS="StringLiteral">"using the -listener argument"</FONT>;
383<FONT CLASS="LN">66</FONT><A NAME="366"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
384<FONT CLASS="LN">67</FONT><A NAME="367"></A> }
385<FONT CLASS="LN">68</FONT><A NAME="368"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.startsWith(<FONT CLASS="StringLiteral">"-D"</FONT>)) {
386<FONT CLASS="LN">69</FONT><A NAME="369"></A>
387<FONT CLASS="LN">70</FONT><A NAME="370"></A> <FONT CLASS="MultiLineComment">/* Interestingly enough, we get to here when a user
388<FONT CLASS="LN">71</FONT><A NAME="371"></A> * uses -Dname=value. However, in some cases, the OS
389<FONT CLASS="LN">72</FONT><A NAME="372"></A> * goes ahead and parses this out to args
390<FONT CLASS="LN">73</FONT><A NAME="373"></A> * {"-Dname", "value"}
391<FONT CLASS="LN">74</FONT><A NAME="374"></A> * so instead of parsing on "=", we just make the "-D"
392<FONT CLASS="LN">75</FONT><A NAME="375"></A> * characters go away and skip one argument forward.
393<FONT CLASS="LN">76</FONT><A NAME="376"></A> *
394<FONT CLASS="LN">77</FONT><A NAME="377"></A> * I don't know how to predict when the JDK is going
395<FONT CLASS="LN">78</FONT><A NAME="378"></A> * to help or not, so we simply look for the equals sign.
396<FONT CLASS="LN">79</FONT><A NAME="379"></A> */</FONT>
397<FONT CLASS="LN">80</FONT><A NAME="380"></A>
398<FONT CLASS="LN">81</FONT><A NAME="381"></A> String name = arg.substring(<FONT CLASS="IntegerLiteral">2</FONT>, arg.length());
399<FONT CLASS="LN">82</FONT><A NAME="382"></A> String value = <FONT CLASS="Null">null</FONT>;
400<FONT CLASS="LN">83</FONT><A NAME="383"></A> <FONT CLASS="Int">int</FONT> posEq = name.indexOf(<FONT CLASS="StringLiteral">"="</FONT>);
401<FONT CLASS="LN">84</FONT><A NAME="384"></A> <FONT CLASS="If">if</FONT> (posEq &gt; <FONT CLASS="IntegerLiteral">0</FONT>) {
402<FONT CLASS="LN">85</FONT><A NAME="385"></A> value = name.substring(posEq + <FONT CLASS="IntegerLiteral">1</FONT>);
403<FONT CLASS="LN">86</FONT><A NAME="386"></A> name = name.substring(<FONT CLASS="IntegerLiteral">0</FONT>, posEq);
404<FONT CLASS="LN">87</FONT><A NAME="387"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (i &lt; args.length - <FONT CLASS="IntegerLiteral">1</FONT>) {
405<FONT CLASS="LN">88</FONT><A NAME="388"></A> value = args[++i];
406<FONT CLASS="LN">89</FONT><A NAME="389"></A> } <FONT CLASS="Else">else</FONT> {
407<FONT CLASS="LN">90</FONT><A NAME="390"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Missing value for property "</FONT>
408<FONT CLASS="LN">91</FONT><A NAME="391"></A> + name);
409<FONT CLASS="LN">92</FONT><A NAME="392"></A> }
410<FONT CLASS="LN">93</FONT><A NAME="393"></A>
411<FONT CLASS="LN">94</FONT><A NAME="394"></A> definedProps.put(name, value);
412<FONT CLASS="LN">95</FONT><A NAME="395"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-logger"</FONT>)) {
413<FONT CLASS="LN">96</FONT><A NAME="396"></A> <FONT CLASS="If">if</FONT> (loggerClassname != <FONT CLASS="Null">null</FONT>) {
414<FONT CLASS="LN">97</FONT><A NAME="397"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Only one logger class may "</FONT>
415<FONT CLASS="LN">98</FONT><A NAME="398"></A> + <FONT CLASS="StringLiteral">" be specified."</FONT>);
416<FONT CLASS="LN">99</FONT><A NAME="399"></A> }
417<FONT CLASS="LN">00</FONT><A NAME="400"></A> <FONT CLASS="Try">try</FONT> {
418<FONT CLASS="LN">01</FONT><A NAME="401"></A> loggerClassname = args[++i];
419<FONT CLASS="LN">02</FONT><A NAME="402"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
420<FONT CLASS="LN">03</FONT><A NAME="403"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"You must specify a classname when"</FONT>
421<FONT CLASS="LN">04</FONT><A NAME="404"></A> + <FONT CLASS="StringLiteral">" using the -logger argument"</FONT>);
422<FONT CLASS="LN">05</FONT><A NAME="405"></A> }
423<FONT CLASS="LN">06</FONT><A NAME="406"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-inputhandler"</FONT>)) {
424<FONT CLASS="LN">07</FONT><A NAME="407"></A> <FONT CLASS="If">if</FONT> (inputHandlerClassname != <FONT CLASS="Null">null</FONT>) {
425<FONT CLASS="LN">08</FONT><A NAME="408"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Only one input handler class may "</FONT>
426<FONT CLASS="LN">09</FONT><A NAME="409"></A> + <FONT CLASS="StringLiteral">"be specified."</FONT>);
427<FONT CLASS="LN">10</FONT><A NAME="410"></A> }
428<FONT CLASS="LN">11</FONT><A NAME="411"></A> <FONT CLASS="Try">try</FONT> {
429<FONT CLASS="LN">12</FONT><A NAME="412"></A> inputHandlerClassname = args[++i];
430<FONT CLASS="LN">13</FONT><A NAME="413"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
431<FONT CLASS="LN">14</FONT><A NAME="414"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"You must specify a classname when"</FONT>
432<FONT CLASS="LN">15</FONT><A NAME="415"></A> + <FONT CLASS="StringLiteral">" using the -inputhandler"</FONT>
433<FONT CLASS="LN">16</FONT><A NAME="416"></A> + <FONT CLASS="StringLiteral">" argument"</FONT>);
434<FONT CLASS="LN">17</FONT><A NAME="417"></A> }
435<FONT CLASS="LN">18</FONT><A NAME="418"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-emacs"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-e"</FONT>)) {
436<FONT CLASS="LN">19</FONT><A NAME="419"></A> emacsMode = <FONT CLASS="True">true</FONT>;
437<FONT CLASS="LN">20</FONT><A NAME="420"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-projecthelp"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-p"</FONT>)) {
438<FONT CLASS="LN">21</FONT><A NAME="421"></A> <FONT CLASS="SingleLineComment">// set the flag to display the targets and quit
439<FONT CLASS="LN">22</FONT><A NAME="422"></A></FONT> projectHelp = <FONT CLASS="True">true</FONT>;
440<FONT CLASS="LN">23</FONT><A NAME="423"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-find"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-s"</FONT>)) {
441<FONT CLASS="LN">24</FONT><A NAME="424"></A> <FONT CLASS="SingleLineComment">// eat up next arg if present, default to build.xml
442<FONT CLASS="LN">25</FONT><A NAME="425"></A></FONT> <FONT CLASS="If">if</FONT> (i &lt; args.length - <FONT CLASS="IntegerLiteral">1</FONT>) {
443<FONT CLASS="LN">26</FONT><A NAME="426"></A> searchForThis = args[++i];
444<FONT CLASS="LN">27</FONT><A NAME="427"></A> } <FONT CLASS="Else">else</FONT> {
445<FONT CLASS="LN">28</FONT><A NAME="428"></A> searchForThis = DEFAULT_BUILD_FILENAME;
446<FONT CLASS="LN">29</FONT><A NAME="429"></A> }
447<FONT CLASS="LN">30</FONT><A NAME="430"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.startsWith(<FONT CLASS="StringLiteral">"-propertyfile"</FONT>)) {
448<FONT CLASS="LN">31</FONT><A NAME="431"></A> <FONT CLASS="Try">try</FONT> {
449<FONT CLASS="LN">32</FONT><A NAME="432"></A> propertyFiles.addElement(args[i + <FONT CLASS="IntegerLiteral">1</FONT>]);
450<FONT CLASS="LN">33</FONT><A NAME="433"></A> i++;
451<FONT CLASS="LN">34</FONT><A NAME="434"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
452<FONT CLASS="LN">35</FONT><A NAME="435"></A> String msg = <FONT CLASS="StringLiteral">"You must specify a property filename when "</FONT>
453<FONT CLASS="LN">36</FONT><A NAME="436"></A> + <FONT CLASS="StringLiteral">"using the -propertyfile argument"</FONT>;
454<FONT CLASS="LN">37</FONT><A NAME="437"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
455<FONT CLASS="LN">38</FONT><A NAME="438"></A> }
456<FONT CLASS="LN">39</FONT><A NAME="439"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-k"</FONT>) || arg.equals(<FONT CLASS="StringLiteral">"-keep-going"</FONT>)) {
457<FONT CLASS="LN">40</FONT><A NAME="440"></A> keepGoingMode = <FONT CLASS="True">true</FONT>;
458<FONT CLASS="LN">41</FONT><A NAME="441"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.equals(<FONT CLASS="StringLiteral">"-nice"</FONT>)) {
459<FONT CLASS="LN">42</FONT><A NAME="442"></A> <FONT CLASS="Try">try</FONT> {
460<FONT CLASS="LN">43</FONT><A NAME="443"></A> threadPriority=Integer.decode(args[i + <FONT CLASS="IntegerLiteral">1</FONT>]);
461<FONT CLASS="LN">44</FONT><A NAME="444"></A> } <FONT CLASS="Catch">catch</FONT> (ArrayIndexOutOfBoundsException aioobe) {
462<FONT CLASS="LN">45</FONT><A NAME="445"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(
463<FONT CLASS="LN">46</FONT><A NAME="446"></A> <FONT CLASS="StringLiteral">"You must supply a niceness value (1-10)"</FONT>+
464<FONT CLASS="LN">47</FONT><A NAME="447"></A> <FONT CLASS="StringLiteral">" after the -nice option"</FONT>);
465<FONT CLASS="LN">48</FONT><A NAME="448"></A> } <FONT CLASS="Catch">catch</FONT> (NumberFormatException e) {
466<FONT CLASS="LN">49</FONT><A NAME="449"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Unrecognized niceness value: "</FONT> +
467<FONT CLASS="LN">50</FONT><A NAME="450"></A> args[i + <FONT CLASS="IntegerLiteral">1</FONT>]);
468<FONT CLASS="LN">51</FONT><A NAME="451"></A> }
469<FONT CLASS="LN">52</FONT><A NAME="452"></A> i++;
470<FONT CLASS="LN">53</FONT><A NAME="453"></A> <FONT CLASS="If">if</FONT>(threadPriority.intValue()&lt;Thread.MIN_PRIORITY ||
471<FONT CLASS="LN">54</FONT><A NAME="454"></A> threadPriority.intValue()&gt;Thread.MAX_PRIORITY) {
472<FONT CLASS="LN">55</FONT><A NAME="455"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(
473<FONT CLASS="LN">56</FONT><A NAME="456"></A> <FONT CLASS="StringLiteral">"Niceness value is out of the range 1-10"</FONT>);
474<FONT CLASS="LN">57</FONT><A NAME="457"></A> }
475<FONT CLASS="LN">58</FONT><A NAME="458"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (arg.startsWith(<FONT CLASS="StringLiteral">"-"</FONT>)) {
476<FONT CLASS="LN">59</FONT><A NAME="459"></A> <FONT CLASS="SingleLineComment">// we don't have any more args to recognize!
477<FONT CLASS="LN">60</FONT><A NAME="460"></A></FONT> String msg = <FONT CLASS="StringLiteral">"Unknown argument: "</FONT> + arg;
478<FONT CLASS="LN">61</FONT><A NAME="461"></A> System.out.println(msg);
479<FONT CLASS="LN">62</FONT><A NAME="462"></A> printUsage();
480<FONT CLASS="LN">63</FONT><A NAME="463"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">""</FONT>);
481<FONT CLASS="LN">64</FONT><A NAME="464"></A> } <FONT CLASS="Else">else</FONT> {
482<FONT CLASS="LN">65</FONT><A NAME="465"></A> <FONT CLASS="SingleLineComment">// if it's no other arg, it may be the target
483<FONT CLASS="LN">66</FONT><A NAME="466"></A></FONT> targets.addElement(arg);
484<FONT CLASS="LN">67</FONT><A NAME="467"></A> }
485<FONT CLASS="LN">68</FONT><A NAME="468"></A> }
486<FONT CLASS="LN">69</FONT><A NAME="469"></A>
487<FONT CLASS="LN">70</FONT><A NAME="470"></A> <FONT CLASS="SingleLineComment">// if buildFile was not specified on the command line,
488<FONT CLASS="LN">71</FONT><A NAME="471"></A></FONT> <FONT CLASS="If">if</FONT> (buildFile == <FONT CLASS="Null">null</FONT>) {
489<FONT CLASS="LN">72</FONT><A NAME="472"></A> <FONT CLASS="SingleLineComment">// but -find then search for it
490<FONT CLASS="LN">73</FONT><A NAME="473"></A></FONT> <FONT CLASS="If">if</FONT> (searchForThis != <FONT CLASS="Null">null</FONT>) {
491<FONT CLASS="LN">74</FONT><A NAME="474"></A> buildFile = findBuildFile(System.getProperty(<FONT CLASS="StringLiteral">"user.dir"</FONT>),
492<FONT CLASS="LN">75</FONT><A NAME="475"></A> searchForThis);
493<FONT CLASS="LN">76</FONT><A NAME="476"></A> } <FONT CLASS="Else">else</FONT> {
494<FONT CLASS="LN">77</FONT><A NAME="477"></A> buildFile = <FONT CLASS="New">new</FONT> File(DEFAULT_BUILD_FILENAME);
495<FONT CLASS="LN">78</FONT><A NAME="478"></A> }
496<FONT CLASS="LN">79</FONT><A NAME="479"></A> }
497<FONT CLASS="LN">80</FONT><A NAME="480"></A>
498<FONT CLASS="LN">81</FONT><A NAME="481"></A> <FONT CLASS="SingleLineComment">// make sure buildfile exists
499<FONT CLASS="LN">82</FONT><A NAME="482"></A></FONT> <FONT CLASS="If">if</FONT> (!buildFile.exists()) {
500<FONT CLASS="LN">83</FONT><A NAME="483"></A> System.out.println(<FONT CLASS="StringLiteral">"Buildfile: "</FONT> + buildFile + <FONT CLASS="StringLiteral">" does not exist!"</FONT>);
501<FONT CLASS="LN">84</FONT><A NAME="484"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Build failed"</FONT>);
502<FONT CLASS="LN">85</FONT><A NAME="485"></A> }
503<FONT CLASS="LN">86</FONT><A NAME="486"></A>
504<FONT CLASS="LN">87</FONT><A NAME="487"></A> <FONT CLASS="SingleLineComment">// make sure it's not a directory (this falls into the ultra
505<FONT CLASS="LN">88</FONT><A NAME="488"></A></FONT> <FONT CLASS="SingleLineComment">// paranoid lets check everything category
506<FONT CLASS="LN">89</FONT><A NAME="489"></A></FONT>
507<FONT CLASS="LN">90</FONT><A NAME="490"></A> <FONT CLASS="If">if</FONT> (buildFile.isDirectory()) {
508<FONT CLASS="LN">91</FONT><A NAME="491"></A> System.out.println(<FONT CLASS="StringLiteral">"What? Buildfile: "</FONT> + buildFile + <FONT CLASS="StringLiteral">" is a dir!"</FONT>);
509<FONT CLASS="LN">92</FONT><A NAME="492"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Build failed"</FONT>);
510<FONT CLASS="LN">93</FONT><A NAME="493"></A> }
511<FONT CLASS="LN">94</FONT><A NAME="494"></A>
512<FONT CLASS="LN">95</FONT><A NAME="495"></A> <FONT CLASS="SingleLineComment">// Load the property files specified by -propertyfile
513<FONT CLASS="LN">96</FONT><A NAME="496"></A></FONT> <FONT CLASS="For">for</FONT> (<FONT CLASS="Int">int</FONT> propertyFileIndex = <FONT CLASS="IntegerLiteral">0</FONT>;
514<FONT CLASS="LN">97</FONT><A NAME="497"></A> propertyFileIndex &lt; propertyFiles.size();
515<FONT CLASS="LN">98</FONT><A NAME="498"></A> propertyFileIndex++) {
516<FONT CLASS="LN">99</FONT><A NAME="499"></A> String filename
517<FONT CLASS="LN">00</FONT><A NAME="500"></A> = (String) propertyFiles.elementAt(propertyFileIndex);
518<FONT CLASS="LN">01</FONT><A NAME="501"></A> Properties props = <FONT CLASS="New">new</FONT> Properties();
519<FONT CLASS="LN">02</FONT><A NAME="502"></A> FileInputStream fis = <FONT CLASS="Null">null</FONT>;
520<FONT CLASS="LN">03</FONT><A NAME="503"></A> <FONT CLASS="Try">try</FONT> {
521<FONT CLASS="LN">04</FONT><A NAME="504"></A> fis = <FONT CLASS="New">new</FONT> FileInputStream(filename);
522<FONT CLASS="LN">05</FONT><A NAME="505"></A> props.load(fis);
523<FONT CLASS="LN">06</FONT><A NAME="506"></A> } <FONT CLASS="Catch">catch</FONT> (IOException e) {
524<FONT CLASS="LN">07</FONT><A NAME="507"></A> System.out.println(<FONT CLASS="StringLiteral">"Could not load property file "</FONT>
525<FONT CLASS="LN">08</FONT><A NAME="508"></A> + filename + <FONT CLASS="StringLiteral">": "</FONT> + e.getMessage());
526<FONT CLASS="LN">09</FONT><A NAME="509"></A> } <FONT CLASS="Finally">finally</FONT> {
527<FONT CLASS="LN">10</FONT><A NAME="510"></A> <FONT CLASS="If">if</FONT> (fis != <FONT CLASS="Null">null</FONT>) {
528<FONT CLASS="LN">11</FONT><A NAME="511"></A> <FONT CLASS="Try">try</FONT> {
529<FONT CLASS="LN">12</FONT><A NAME="512"></A> fis.close();
530<FONT CLASS="LN">13</FONT><A NAME="513"></A> } <FONT CLASS="Catch">catch</FONT> (IOException e) {
531<FONT CLASS="LN">14</FONT><A NAME="514"></A> <FONT CLASS="SingleLineComment">// ignore
532<FONT CLASS="LN">15</FONT><A NAME="515"></A></FONT> }
533<FONT CLASS="LN">16</FONT><A NAME="516"></A> }
534<FONT CLASS="LN">17</FONT><A NAME="517"></A> }
535<FONT CLASS="LN">18</FONT><A NAME="518"></A>
536<FONT CLASS="LN">19</FONT><A NAME="519"></A> <FONT CLASS="SingleLineComment">// ensure that -D properties take precedence
537<FONT CLASS="LN">20</FONT><A NAME="520"></A></FONT> Enumeration propertyNames = props.propertyNames();
538<FONT CLASS="LN">21</FONT><A NAME="521"></A> <FONT CLASS="While">while</FONT> (propertyNames.hasMoreElements()) {
539<FONT CLASS="LN">22</FONT><A NAME="522"></A> String name = (String) propertyNames.nextElement();
540<FONT CLASS="LN">23</FONT><A NAME="523"></A> <FONT CLASS="If">if</FONT> (definedProps.getProperty(name) == <FONT CLASS="Null">null</FONT>) {
541<FONT CLASS="LN">24</FONT><A NAME="524"></A> definedProps.put(name, props.getProperty(name));
542<FONT CLASS="LN">25</FONT><A NAME="525"></A> }
543<FONT CLASS="LN">26</FONT><A NAME="526"></A> }
544<FONT CLASS="LN">27</FONT><A NAME="527"></A> }
545<FONT CLASS="LN">28</FONT><A NAME="528"></A>
546<FONT CLASS="LN">29</FONT><A NAME="529"></A> <FONT CLASS="If">if</FONT> (msgOutputLevel &gt;= Project.MSG_INFO) {
547<FONT CLASS="LN">30</FONT><A NAME="530"></A> System.out.println(<FONT CLASS="StringLiteral">"Buildfile: "</FONT> + buildFile);
548<FONT CLASS="LN">31</FONT><A NAME="531"></A> }
549<FONT CLASS="LN">32</FONT><A NAME="532"></A>
550<FONT CLASS="LN">33</FONT><A NAME="533"></A> <FONT CLASS="If">if</FONT> (logTo != <FONT CLASS="Null">null</FONT>) {
551<FONT CLASS="LN">34</FONT><A NAME="534"></A> out = logTo;
552<FONT CLASS="LN">35</FONT><A NAME="535"></A> err = logTo;
553<FONT CLASS="LN">36</FONT><A NAME="536"></A> System.setOut(out);
554<FONT CLASS="LN">37</FONT><A NAME="537"></A> System.setErr(err);
555<FONT CLASS="LN">38</FONT><A NAME="538"></A> }
556<FONT CLASS="LN">39</FONT><A NAME="539"></A> readyToRun = <FONT CLASS="True">true</FONT>;
557<FONT CLASS="LN">40</FONT><A NAME="540"></A> }
558<FONT CLASS="LN">41</FONT><A NAME="541"></A>
559<FONT CLASS="LN">42</FONT><A NAME="542"></A> <FONT CLASS="FormalComment">/**
560<FONT CLASS="LN">43</FONT><A NAME="543"></A> * Helper to get the parent file for a given file.
561<FONT CLASS="LN">44</FONT><A NAME="544"></A> * &lt;p&gt;
562<FONT CLASS="LN">45</FONT><A NAME="545"></A> * Added to simulate File.getParentFile() from JDK 1.2.
563<FONT CLASS="LN">46</FONT><A NAME="546"></A> * @deprecated
564<FONT CLASS="LN">47</FONT><A NAME="547"></A> *
565<FONT CLASS="LN">48</FONT><A NAME="548"></A> * @param file File to find parent of. Must not be &lt;code&gt;null&lt;/code&gt;.
566<FONT CLASS="LN">49</FONT><A NAME="549"></A> * @return Parent file or null if none
567<FONT CLASS="LN">50</FONT><A NAME="550"></A> */</FONT>
568<FONT CLASS="LN">51</FONT><A NAME="551"></A> <FONT CLASS="Private">private</FONT> File getParentFile(File file) {
569<FONT CLASS="LN">52</FONT><A NAME="552"></A> File parent = file.getParentFile();
570<FONT CLASS="LN">53</FONT><A NAME="553"></A>
571<FONT CLASS="LN">54</FONT><A NAME="554"></A> <FONT CLASS="If">if</FONT> (parent != <FONT CLASS="Null">null</FONT> &amp;&amp; msgOutputLevel &gt;= Project.MSG_VERBOSE) {
572<FONT CLASS="LN">55</FONT><A NAME="555"></A> System.out.println(<FONT CLASS="StringLiteral">"Searching in "</FONT> + parent.getAbsolutePath());
573<FONT CLASS="LN">56</FONT><A NAME="556"></A> }
574<FONT CLASS="LN">57</FONT><A NAME="557"></A>
575<FONT CLASS="LN">58</FONT><A NAME="558"></A> <FONT CLASS="Return">return</FONT> parent;
576<FONT CLASS="LN">59</FONT><A NAME="559"></A> }
577<FONT CLASS="LN">60</FONT><A NAME="560"></A>
578<FONT CLASS="LN">61</FONT><A NAME="561"></A> <FONT CLASS="FormalComment">/**
579<FONT CLASS="LN">62</FONT><A NAME="562"></A> * Search parent directories for the build file.
580<FONT CLASS="LN">63</FONT><A NAME="563"></A> * &lt;p&gt;
581<FONT CLASS="LN">64</FONT><A NAME="564"></A> * Takes the given target as a suffix to append to each
582<FONT CLASS="LN">65</FONT><A NAME="565"></A> * parent directory in search of a build file. Once the
583<FONT CLASS="LN">66</FONT><A NAME="566"></A> * root of the file-system has been reached an exception
584<FONT CLASS="LN">67</FONT><A NAME="567"></A> * is thrown.
585<FONT CLASS="LN">68</FONT><A NAME="568"></A> *
586<FONT CLASS="LN">69</FONT><A NAME="569"></A> * @param start Leaf directory of search.
587<FONT CLASS="LN">70</FONT><A NAME="570"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
588<FONT CLASS="LN">71</FONT><A NAME="571"></A> * @param suffix Suffix filename to look for in parents.
589<FONT CLASS="LN">72</FONT><A NAME="572"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
590<FONT CLASS="LN">73</FONT><A NAME="573"></A> *
591<FONT CLASS="LN">74</FONT><A NAME="574"></A> * @return A handle to the build file if one is found
592<FONT CLASS="LN">75</FONT><A NAME="575"></A> *
593<FONT CLASS="LN">76</FONT><A NAME="576"></A> * @exception BuildException if no build file is found
594<FONT CLASS="LN">77</FONT><A NAME="577"></A> */</FONT>
595<FONT CLASS="LN">78</FONT><A NAME="578"></A> <FONT CLASS="Private">private</FONT> File findBuildFile(String start, String suffix)
596<FONT CLASS="LN">79</FONT><A NAME="579"></A> <FONT CLASS="Throws">throws</FONT> BuildException {
597<FONT CLASS="LN">80</FONT><A NAME="580"></A> <FONT CLASS="If">if</FONT> (msgOutputLevel &gt;= Project.MSG_INFO) {
598<FONT CLASS="LN">81</FONT><A NAME="581"></A> System.out.println(<FONT CLASS="StringLiteral">"Searching for "</FONT> + suffix + <FONT CLASS="StringLiteral">" ..."</FONT>);
599<FONT CLASS="LN">82</FONT><A NAME="582"></A> }
600<FONT CLASS="LN">83</FONT><A NAME="583"></A>
601<FONT CLASS="LN">84</FONT><A NAME="584"></A> File parent = <FONT CLASS="New">new</FONT> File(<FONT CLASS="New">new</FONT> File(start).getAbsolutePath());
602<FONT CLASS="LN">85</FONT><A NAME="585"></A> File file = <FONT CLASS="New">new</FONT> File(parent, suffix);
603<FONT CLASS="LN">86</FONT><A NAME="586"></A>
604<FONT CLASS="LN">87</FONT><A NAME="587"></A> <FONT CLASS="SingleLineComment">// check if the target file exists in the current directory
605<FONT CLASS="LN">88</FONT><A NAME="588"></A></FONT> <FONT CLASS="While">while</FONT> (!file.exists()) {
606<FONT CLASS="LN">89</FONT><A NAME="589"></A> <FONT CLASS="SingleLineComment">// change to parent directory
607<FONT CLASS="LN">90</FONT><A NAME="590"></A></FONT> parent = getParentFile(parent);
608<FONT CLASS="LN">91</FONT><A NAME="591"></A>
609<FONT CLASS="LN">92</FONT><A NAME="592"></A> <FONT CLASS="SingleLineComment">// if parent is null, then we are at the root of the fs,
610<FONT CLASS="LN">93</FONT><A NAME="593"></A></FONT> <FONT CLASS="SingleLineComment">// complain that we can't find the build file.
611<FONT CLASS="LN">94</FONT><A NAME="594"></A></FONT> <FONT CLASS="If">if</FONT> (parent == <FONT CLASS="Null">null</FONT>) {
612<FONT CLASS="LN">95</FONT><A NAME="595"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Could not locate a build file!"</FONT>);
613<FONT CLASS="LN">96</FONT><A NAME="596"></A> }
614<FONT CLASS="LN">97</FONT><A NAME="597"></A>
615<FONT CLASS="LN">98</FONT><A NAME="598"></A> <FONT CLASS="SingleLineComment">// refresh our file handle
616<FONT CLASS="LN">99</FONT><A NAME="599"></A></FONT> file = <FONT CLASS="New">new</FONT> File(parent, suffix);
617<FONT CLASS="LN">00</FONT><A NAME="600"></A> }
618<FONT CLASS="LN">01</FONT><A NAME="601"></A>
619<FONT CLASS="LN">02</FONT><A NAME="602"></A> <FONT CLASS="Return">return</FONT> file;
620<FONT CLASS="LN">03</FONT><A NAME="603"></A> }
621<FONT CLASS="LN">04</FONT><A NAME="604"></A>
622<FONT CLASS="LN">05</FONT><A NAME="605"></A> <FONT CLASS="FormalComment">/**
623<FONT CLASS="LN">06</FONT><A NAME="606"></A> * Executes the build. If the constructor for this instance failed
624<FONT CLASS="LN">07</FONT><A NAME="607"></A> * (e.g. returned after issuing a warning), this method returns
625<FONT CLASS="LN">08</FONT><A NAME="608"></A> * immediately.
626<FONT CLASS="LN">09</FONT><A NAME="609"></A> *
627<FONT CLASS="LN">10</FONT><A NAME="610"></A> * @param coreLoader The classloader to use to find core classes.
628<FONT CLASS="LN">11</FONT><A NAME="611"></A> * May be &lt;code&gt;null&lt;/code&gt;, in which case the
629<FONT CLASS="LN">12</FONT><A NAME="612"></A> * system classloader is used.
630<FONT CLASS="LN">13</FONT><A NAME="613"></A> *
631<FONT CLASS="LN">14</FONT><A NAME="614"></A> * @exception BuildException if the build fails
632<FONT CLASS="LN">15</FONT><A NAME="615"></A> */</FONT>
633<FONT CLASS="LN">16</FONT><A NAME="616"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Void">void</FONT> runBuild(ClassLoader coreLoader) <FONT CLASS="Throws">throws</FONT> BuildException {
634<FONT CLASS="LN">17</FONT><A NAME="617"></A>
635<FONT CLASS="LN">18</FONT><A NAME="618"></A> <FONT CLASS="If">if</FONT> (!readyToRun) {
636<FONT CLASS="LN">19</FONT><A NAME="619"></A> <FONT CLASS="Return">return</FONT>;
637<FONT CLASS="LN">20</FONT><A NAME="620"></A> }
638<FONT CLASS="LN">21</FONT><A NAME="621"></A>
639<FONT CLASS="LN">22</FONT><A NAME="622"></A> <FONT CLASS="Final">final</FONT> Project project = <FONT CLASS="New">new</FONT> Project();
640<FONT CLASS="LN">23</FONT><A NAME="623"></A> project.setCoreLoader(coreLoader);
641<FONT CLASS="LN">24</FONT><A NAME="624"></A>
642<FONT CLASS="LN">25</FONT><A NAME="625"></A> Throwable error = <FONT CLASS="Null">null</FONT>;
643<FONT CLASS="LN">26</FONT><A NAME="626"></A>
644<FONT CLASS="LN">27</FONT><A NAME="627"></A> <FONT CLASS="Try">try</FONT> {
645<FONT CLASS="LN">28</FONT><A NAME="628"></A> addBuildListeners(project);
646<FONT CLASS="LN">29</FONT><A NAME="629"></A> addInputHandler(project);
647<FONT CLASS="LN">30</FONT><A NAME="630"></A>
648<FONT CLASS="LN">31</FONT><A NAME="631"></A> PrintStream err = System.err;
649<FONT CLASS="LN">32</FONT><A NAME="632"></A> PrintStream out = System.out;
650<FONT CLASS="LN">33</FONT><A NAME="633"></A> InputStream in = System.in;
651<FONT CLASS="LN">34</FONT><A NAME="634"></A>
652<FONT CLASS="LN">35</FONT><A NAME="635"></A> <FONT CLASS="SingleLineComment">// use a system manager that prevents from System.exit()
653<FONT CLASS="LN">36</FONT><A NAME="636"></A></FONT> <FONT CLASS="SingleLineComment">// only in JDK &gt; 1.1
654<FONT CLASS="LN">37</FONT><A NAME="637"></A></FONT> SecurityManager oldsm = <FONT CLASS="Null">null</FONT>;
655<FONT CLASS="LN">38</FONT><A NAME="638"></A> <FONT CLASS="If">if</FONT> (!JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_0)
656<FONT CLASS="LN">39</FONT><A NAME="639"></A> &amp;&amp; !JavaEnvUtils.isJavaVersion(JavaEnvUtils.JAVA_1_1)) {
657<FONT CLASS="LN">40</FONT><A NAME="640"></A> oldsm = System.getSecurityManager();
658<FONT CLASS="LN">41</FONT><A NAME="641"></A>
659<FONT CLASS="LN">42</FONT><A NAME="642"></A> <FONT CLASS="SingleLineComment">//SecurityManager can not be installed here for backwards
660<FONT CLASS="LN">43</FONT><A NAME="643"></A></FONT> <FONT CLASS="SingleLineComment">//compatibility reasons (PD). Needs to be loaded prior to
661<FONT CLASS="LN">44</FONT><A NAME="644"></A></FONT> <FONT CLASS="SingleLineComment">//ant class if we are going to implement it.
662<FONT CLASS="LN">45</FONT><A NAME="645"></A></FONT> <FONT CLASS="SingleLineComment">//System.setSecurityManager(new NoExitSecurityManager());
663<FONT CLASS="LN">46</FONT><A NAME="646"></A></FONT> }
664<FONT CLASS="LN">47</FONT><A NAME="647"></A> <FONT CLASS="Try">try</FONT> {
665<FONT CLASS="LN">48</FONT><A NAME="648"></A> <FONT CLASS="If">if</FONT> (allowInput) {
666<FONT CLASS="LN">49</FONT><A NAME="649"></A> project.setDefaultInputStream(System.in);
667<FONT CLASS="LN">50</FONT><A NAME="650"></A> }
668<FONT CLASS="LN">51</FONT><A NAME="651"></A> <FONT CLASS="SingleLineComment">//System.setIn(new DemuxInputStream(project));
669<FONT CLASS="LN">52</FONT><A NAME="652"></A></FONT> <FONT CLASS="SingleLineComment">//System.setOut(new PrintStream(new DemuxOutputStream(project, false)));
670<FONT CLASS="LN">53</FONT><A NAME="653"></A></FONT> <FONT CLASS="SingleLineComment">//System.setErr(new PrintStream(new DemuxOutputStream(project, true)));
671<FONT CLASS="LN">54</FONT><A NAME="654"></A></FONT>
672<FONT CLASS="LN">55</FONT><A NAME="655"></A>
673<FONT CLASS="LN">56</FONT><A NAME="656"></A> <FONT CLASS="If">if</FONT> (!projectHelp) {
674<FONT CLASS="LN">57</FONT><A NAME="657"></A> project.fireBuildStarted();
675<FONT CLASS="LN">58</FONT><A NAME="658"></A> }
676<FONT CLASS="LN">59</FONT><A NAME="659"></A>
677<FONT CLASS="LN">60</FONT><A NAME="660"></A> <FONT CLASS="SingleLineComment">// set the thread priorities
678<FONT CLASS="LN">61</FONT><A NAME="661"></A></FONT> <FONT CLASS="If">if</FONT> (threadPriority != <FONT CLASS="Null">null</FONT>) {
679<FONT CLASS="LN">62</FONT><A NAME="662"></A> <FONT CLASS="Try">try</FONT> {
680<FONT CLASS="LN">63</FONT><A NAME="663"></A> project.log(<FONT CLASS="StringLiteral">"Setting Ant's thread priority to "</FONT>
681<FONT CLASS="LN">64</FONT><A NAME="664"></A> + threadPriority,Project.MSG_VERBOSE);
682<FONT CLASS="LN">65</FONT><A NAME="665"></A> Thread.currentThread().setPriority(threadPriority.intValue());
683<FONT CLASS="LN">66</FONT><A NAME="666"></A> } <FONT CLASS="Catch">catch</FONT> (SecurityException swallowed) {
684<FONT CLASS="LN">67</FONT><A NAME="667"></A> <FONT CLASS="SingleLineComment">//we cannot set the priority here.
685<FONT CLASS="LN">68</FONT><A NAME="668"></A></FONT> project.log(<FONT CLASS="StringLiteral">"A security manager refused to set the -nice value"</FONT>);
686<FONT CLASS="LN">69</FONT><A NAME="669"></A> }
687<FONT CLASS="LN">70</FONT><A NAME="670"></A> }
688<FONT CLASS="LN">71</FONT><A NAME="671"></A>
689<FONT CLASS="LN">72</FONT><A NAME="672"></A> project.init();
690<FONT CLASS="LN">73</FONT><A NAME="673"></A> project.setUserProperty(<FONT CLASS="StringLiteral">"ant.version"</FONT>, getAntVersion());
691<FONT CLASS="LN">74</FONT><A NAME="674"></A>
692<FONT CLASS="LN">75</FONT><A NAME="675"></A> <FONT CLASS="SingleLineComment">// set user-define properties
693<FONT CLASS="LN">76</FONT><A NAME="676"></A></FONT> Enumeration e = definedProps.keys();
694<FONT CLASS="LN">77</FONT><A NAME="677"></A> <FONT CLASS="While">while</FONT> (e.hasMoreElements()) {
695<FONT CLASS="LN">78</FONT><A NAME="678"></A> String arg = (String) e.nextElement();
696<FONT CLASS="LN">79</FONT><A NAME="679"></A> String value = (String) definedProps.get(arg);
697<FONT CLASS="LN">80</FONT><A NAME="680"></A> project.setUserProperty(arg, value);
698<FONT CLASS="LN">81</FONT><A NAME="681"></A> }
699<FONT CLASS="LN">82</FONT><A NAME="682"></A>
700<FONT CLASS="LN">83</FONT><A NAME="683"></A> project.setUserProperty(<FONT CLASS="StringLiteral">"ant.file"</FONT>,
701<FONT CLASS="LN">84</FONT><A NAME="684"></A> buildFile.getAbsolutePath());
702<FONT CLASS="LN">85</FONT><A NAME="685"></A> project.setKeepGoingMode(keepGoingMode);
703<FONT CLASS="LN">86</FONT><A NAME="686"></A>
704<FONT CLASS="LN">87</FONT><A NAME="687"></A> ProjectHelper.configureProject(project, buildFile);
705<FONT CLASS="LN">88</FONT><A NAME="688"></A>
706<FONT CLASS="LN">89</FONT><A NAME="689"></A> project.setBasedir(definedProps.getProperty(PropertiesFileRenderer.FILE_ROOT_PROPERTY));
707<FONT CLASS="LN">90</FONT><A NAME="690"></A>
708<FONT CLASS="LN">91</FONT><A NAME="691"></A>
709<FONT CLASS="LN">92</FONT><A NAME="692"></A> <FONT CLASS="If">if</FONT> (projectHelp) {
710<FONT CLASS="LN">93</FONT><A NAME="693"></A> printDescription(project);
711<FONT CLASS="LN">94</FONT><A NAME="694"></A> printTargets(project, msgOutputLevel &gt; Project.MSG_INFO);
712<FONT CLASS="LN">95</FONT><A NAME="695"></A> <FONT CLASS="Return">return</FONT>;
713<FONT CLASS="LN">96</FONT><A NAME="696"></A> }
714<FONT CLASS="LN">97</FONT><A NAME="697"></A>
715<FONT CLASS="LN">98</FONT><A NAME="698"></A> <FONT CLASS="SingleLineComment">// make sure that we have a target to execute
716<FONT CLASS="LN">99</FONT><A NAME="699"></A></FONT> <FONT CLASS="If">if</FONT> (targets.size() == <FONT CLASS="IntegerLiteral">0</FONT>) {
717<FONT CLASS="LN">00</FONT><A NAME="700"></A> <FONT CLASS="If">if</FONT> (project.getDefaultTarget() != <FONT CLASS="Null">null</FONT>) {
718<FONT CLASS="LN">01</FONT><A NAME="701"></A> targets.addElement(project.getDefaultTarget());
719<FONT CLASS="LN">02</FONT><A NAME="702"></A> }
720<FONT CLASS="LN">03</FONT><A NAME="703"></A> }
721<FONT CLASS="LN">04</FONT><A NAME="704"></A> project.executeTargets(targets);
722<FONT CLASS="LN">05</FONT><A NAME="705"></A> } <FONT CLASS="Finally">finally</FONT> {
723<FONT CLASS="LN">06</FONT><A NAME="706"></A> <FONT CLASS="SingleLineComment">// put back the original security manager
724<FONT CLASS="LN">07</FONT><A NAME="707"></A></FONT> <FONT CLASS="SingleLineComment">//The following will never eval to true. (PD)
725<FONT CLASS="LN">08</FONT><A NAME="708"></A></FONT> <FONT CLASS="If">if</FONT> (oldsm != <FONT CLASS="Null">null</FONT>) {
726<FONT CLASS="LN">09</FONT><A NAME="709"></A> System.setSecurityManager(oldsm);
727<FONT CLASS="LN">10</FONT><A NAME="710"></A> }
728<FONT CLASS="LN">11</FONT><A NAME="711"></A>
729<FONT CLASS="LN">12</FONT><A NAME="712"></A> System.setOut(out);
730<FONT CLASS="LN">13</FONT><A NAME="713"></A> System.setErr(err);
731<FONT CLASS="LN">14</FONT><A NAME="714"></A> System.setIn(in);
732<FONT CLASS="LN">15</FONT><A NAME="715"></A> }
733<FONT CLASS="LN">16</FONT><A NAME="716"></A> } <FONT CLASS="Catch">catch</FONT> (RuntimeException exc) {
734<FONT CLASS="LN">17</FONT><A NAME="717"></A> error = exc;
735<FONT CLASS="LN">18</FONT><A NAME="718"></A> <FONT CLASS="Throw">throw</FONT> exc;
736<FONT CLASS="LN">19</FONT><A NAME="719"></A> } <FONT CLASS="Catch">catch</FONT> (Error err) {
737<FONT CLASS="LN">20</FONT><A NAME="720"></A> error = err;
738<FONT CLASS="LN">21</FONT><A NAME="721"></A> <FONT CLASS="Throw">throw</FONT> err;
739<FONT CLASS="LN">22</FONT><A NAME="722"></A> } <FONT CLASS="Finally">finally</FONT> {
740<FONT CLASS="LN">23</FONT><A NAME="723"></A> <FONT CLASS="If">if</FONT> (!projectHelp) {
741<FONT CLASS="LN">24</FONT><A NAME="724"></A> project.fireBuildFinished(error);
742<FONT CLASS="LN">25</FONT><A NAME="725"></A> } <FONT CLASS="Else">else</FONT> <FONT CLASS="If">if</FONT> (error != <FONT CLASS="Null">null</FONT>) {
743<FONT CLASS="LN">26</FONT><A NAME="726"></A> project.log(error.toString(), Project.MSG_ERR);
744<FONT CLASS="LN">27</FONT><A NAME="727"></A> }
745<FONT CLASS="LN">28</FONT><A NAME="728"></A> }
746<FONT CLASS="LN">29</FONT><A NAME="729"></A> }
747<FONT CLASS="LN">30</FONT><A NAME="730"></A>
748<FONT CLASS="LN">31</FONT><A NAME="731"></A> <FONT CLASS="FormalComment">/**
749<FONT CLASS="LN">32</FONT><A NAME="732"></A> * Adds the listeners specified in the command line arguments,
750<FONT CLASS="LN">33</FONT><A NAME="733"></A> * along with the default listener, to the specified project.
751<FONT CLASS="LN">34</FONT><A NAME="734"></A> *
752<FONT CLASS="LN">35</FONT><A NAME="735"></A> * @param project The project to add listeners to.
753<FONT CLASS="LN">36</FONT><A NAME="736"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
754<FONT CLASS="LN">37</FONT><A NAME="737"></A> */</FONT>
755<FONT CLASS="LN">38</FONT><A NAME="738"></A> <FONT CLASS="Protected">protected</FONT> <FONT CLASS="Void">void</FONT> addBuildListeners(Project project) {
756<FONT CLASS="LN">39</FONT><A NAME="739"></A>
757<FONT CLASS="LN">40</FONT><A NAME="740"></A> <FONT CLASS="SingleLineComment">// Add the default listener
758<FONT CLASS="LN">41</FONT><A NAME="741"></A></FONT> project.addBuildListener(createLogger());
759<FONT CLASS="LN">42</FONT><A NAME="742"></A>
760<FONT CLASS="LN">43</FONT><A NAME="743"></A> <FONT CLASS="SingleLineComment">//Add the AntInstaller Listener
761<FONT CLASS="LN">44</FONT><A NAME="744"></A></FONT> <FONT CLASS="If">if</FONT>(ctx.getBuildListener()!=<FONT CLASS="Null">null</FONT>){
762<FONT CLASS="LN">45</FONT><A NAME="745"></A> project.addBuildListener(ctx.getBuildListener());
763<FONT CLASS="LN">46</FONT><A NAME="746"></A> }
764<FONT CLASS="LN">47</FONT><A NAME="747"></A>
765<FONT CLASS="LN">48</FONT><A NAME="748"></A> <FONT CLASS="For">for</FONT> (<FONT CLASS="Int">int</FONT> i = <FONT CLASS="IntegerLiteral">0</FONT>; i &lt; listeners.size(); i++) {
766<FONT CLASS="LN">49</FONT><A NAME="749"></A> String className = (String) listeners.elementAt(i);
767<FONT CLASS="LN">50</FONT><A NAME="750"></A> <FONT CLASS="Try">try</FONT> {
768<FONT CLASS="LN">51</FONT><A NAME="751"></A> BuildListener listener =
769<FONT CLASS="LN">52</FONT><A NAME="752"></A> (BuildListener) Class.forName(className).newInstance();
770<FONT CLASS="LN">53</FONT><A NAME="753"></A> <FONT CLASS="If">if</FONT> (project != <FONT CLASS="Null">null</FONT>) {
771<FONT CLASS="LN">54</FONT><A NAME="754"></A> project.setProjectReference(listener);
772<FONT CLASS="LN">55</FONT><A NAME="755"></A> }
773<FONT CLASS="LN">56</FONT><A NAME="756"></A> project.addBuildListener(listener);
774<FONT CLASS="LN">57</FONT><A NAME="757"></A> } <FONT CLASS="Catch">catch</FONT> (Throwable exc) {
775<FONT CLASS="LN">58</FONT><A NAME="758"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Unable to instantiate listener "</FONT>
776<FONT CLASS="LN">59</FONT><A NAME="759"></A> + className, exc);
777<FONT CLASS="LN">60</FONT><A NAME="760"></A> }
778<FONT CLASS="LN">61</FONT><A NAME="761"></A> }
779<FONT CLASS="LN">62</FONT><A NAME="762"></A> }
780<FONT CLASS="LN">63</FONT><A NAME="763"></A>
781<FONT CLASS="LN">64</FONT><A NAME="764"></A> <FONT CLASS="FormalComment">/**
782<FONT CLASS="LN">65</FONT><A NAME="765"></A> * Creates the InputHandler and adds it to the project.
783<FONT CLASS="LN">66</FONT><A NAME="766"></A> *
784<FONT CLASS="LN">67</FONT><A NAME="767"></A> * @param project the project instance.
785<FONT CLASS="LN">68</FONT><A NAME="768"></A> *
786<FONT CLASS="LN">69</FONT><A NAME="769"></A> * @exception BuildException if a specified InputHandler
787<FONT CLASS="LN">70</FONT><A NAME="770"></A> * implementation could not be loaded.
788<FONT CLASS="LN">71</FONT><A NAME="771"></A> */</FONT>
789<FONT CLASS="LN">72</FONT><A NAME="772"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Void">void</FONT> addInputHandler(Project project) <FONT CLASS="Throws">throws</FONT> BuildException {
790<FONT CLASS="LN">73</FONT><A NAME="773"></A> InputHandler handler = <FONT CLASS="Null">null</FONT>;
791<FONT CLASS="LN">74</FONT><A NAME="774"></A> <FONT CLASS="If">if</FONT> (inputHandlerClassname == <FONT CLASS="Null">null</FONT>) {
792<FONT CLASS="LN">75</FONT><A NAME="775"></A> handler = <FONT CLASS="New">new</FONT> DefaultInputHandler();
793<FONT CLASS="LN">76</FONT><A NAME="776"></A> } <FONT CLASS="Else">else</FONT> {
794<FONT CLASS="LN">77</FONT><A NAME="777"></A> <FONT CLASS="Try">try</FONT> {
795<FONT CLASS="LN">78</FONT><A NAME="778"></A> handler = (InputHandler)
796<FONT CLASS="LN">79</FONT><A NAME="779"></A> (Class.forName(inputHandlerClassname).newInstance());
797<FONT CLASS="LN">80</FONT><A NAME="780"></A> <FONT CLASS="If">if</FONT> (project != <FONT CLASS="Null">null</FONT>) {
798<FONT CLASS="LN">81</FONT><A NAME="781"></A> project.setProjectReference(handler);
799<FONT CLASS="LN">82</FONT><A NAME="782"></A> }
800<FONT CLASS="LN">83</FONT><A NAME="783"></A> } <FONT CLASS="Catch">catch</FONT> (ClassCastException e) {
801<FONT CLASS="LN">84</FONT><A NAME="784"></A> String msg = <FONT CLASS="StringLiteral">"The specified input handler class "</FONT>
802<FONT CLASS="LN">85</FONT><A NAME="785"></A> + inputHandlerClassname
803<FONT CLASS="LN">86</FONT><A NAME="786"></A> + <FONT CLASS="StringLiteral">" does not implement the InputHandler interface"</FONT>;
804<FONT CLASS="LN">87</FONT><A NAME="787"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
805<FONT CLASS="LN">88</FONT><A NAME="788"></A> } <FONT CLASS="Catch">catch</FONT> (Exception e) {
806<FONT CLASS="LN">89</FONT><A NAME="789"></A> String msg = <FONT CLASS="StringLiteral">"Unable to instantiate specified input handler "</FONT>
807<FONT CLASS="LN">90</FONT><A NAME="790"></A> + <FONT CLASS="StringLiteral">"class "</FONT> + inputHandlerClassname + <FONT CLASS="StringLiteral">" : "</FONT>
808<FONT CLASS="LN">91</FONT><A NAME="791"></A> + e.getClass().getName();
809<FONT CLASS="LN">92</FONT><A NAME="792"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(msg);
810<FONT CLASS="LN">93</FONT><A NAME="793"></A> }
811<FONT CLASS="LN">94</FONT><A NAME="794"></A> }
812<FONT CLASS="LN">95</FONT><A NAME="795"></A> project.setInputHandler(handler);
813<FONT CLASS="LN">96</FONT><A NAME="796"></A> }
814<FONT CLASS="LN">97</FONT><A NAME="797"></A>
815<FONT CLASS="LN">98</FONT><A NAME="798"></A> <FONT CLASS="SingleLineComment">// XXX: (Jon Skeet) Any reason for writing a message and then using a bare
816<FONT CLASS="LN">99</FONT><A NAME="799"></A></FONT> <FONT CLASS="SingleLineComment">// RuntimeException rather than just using a BuildException here? Is it
817<FONT CLASS="LN">00</FONT><A NAME="800"></A></FONT> <FONT CLASS="SingleLineComment">// in case the message could end up being written to no loggers (as the
818<FONT CLASS="LN">01</FONT><A NAME="801"></A></FONT> <FONT CLASS="SingleLineComment">// loggers could have failed to be created due to this failure)?
819<FONT CLASS="LN">02</FONT><A NAME="802"></A></FONT> <FONT CLASS="FormalComment">/**
820<FONT CLASS="LN">03</FONT><A NAME="803"></A> * Creates the default build logger for sending build events to the ant
821<FONT CLASS="LN">04</FONT><A NAME="804"></A> * log.
822<FONT CLASS="LN">05</FONT><A NAME="805"></A> *
823<FONT CLASS="LN">06</FONT><A NAME="806"></A> * @return the logger instance for this build.
824<FONT CLASS="LN">07</FONT><A NAME="807"></A> */</FONT>
825<FONT CLASS="LN">08</FONT><A NAME="808"></A> <FONT CLASS="Private">private</FONT> BuildLogger createLogger() {
826<FONT CLASS="LN">09</FONT><A NAME="809"></A> BuildLogger logger = <FONT CLASS="Null">null</FONT>;
827<FONT CLASS="LN">10</FONT><A NAME="810"></A> <FONT CLASS="If">if</FONT> (loggerClassname != <FONT CLASS="Null">null</FONT>) {
828<FONT CLASS="LN">11</FONT><A NAME="811"></A> <FONT CLASS="Try">try</FONT> {
829<FONT CLASS="LN">12</FONT><A NAME="812"></A> Class loggerClass = Class.forName(loggerClassname);
830<FONT CLASS="LN">13</FONT><A NAME="813"></A> logger = (BuildLogger) (loggerClass.newInstance());
831<FONT CLASS="LN">14</FONT><A NAME="814"></A> } <FONT CLASS="Catch">catch</FONT> (ClassCastException e) {
832<FONT CLASS="LN">15</FONT><A NAME="815"></A> System.err.println(<FONT CLASS="StringLiteral">"The specified logger class "</FONT>
833<FONT CLASS="LN">16</FONT><A NAME="816"></A> + loggerClassname
834<FONT CLASS="LN">17</FONT><A NAME="817"></A> + <FONT CLASS="StringLiteral">" does not implement the BuildLogger interface"</FONT>);
835<FONT CLASS="LN">18</FONT><A NAME="818"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> RuntimeException();
836<FONT CLASS="LN">19</FONT><A NAME="819"></A> } <FONT CLASS="Catch">catch</FONT> (Exception e) {
837<FONT CLASS="LN">20</FONT><A NAME="820"></A> System.err.println(<FONT CLASS="StringLiteral">"Unable to instantiate specified logger "</FONT>
838<FONT CLASS="LN">21</FONT><A NAME="821"></A> + <FONT CLASS="StringLiteral">"class "</FONT> + loggerClassname + <FONT CLASS="StringLiteral">" : "</FONT>
839<FONT CLASS="LN">22</FONT><A NAME="822"></A> + e.getClass().getName());
840<FONT CLASS="LN">23</FONT><A NAME="823"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> RuntimeException();
841<FONT CLASS="LN">24</FONT><A NAME="824"></A> }
842<FONT CLASS="LN">25</FONT><A NAME="825"></A> } <FONT CLASS="Else">else</FONT> {
843<FONT CLASS="LN">26</FONT><A NAME="826"></A> logger = <FONT CLASS="New">new</FONT> DefaultLogger();
844<FONT CLASS="LN">27</FONT><A NAME="827"></A> }
845<FONT CLASS="LN">28</FONT><A NAME="828"></A>
846<FONT CLASS="LN">29</FONT><A NAME="829"></A> logger.setMessageOutputLevel(msgOutputLevel);
847<FONT CLASS="LN">30</FONT><A NAME="830"></A> logger.setOutputPrintStream(out);
848<FONT CLASS="LN">31</FONT><A NAME="831"></A> logger.setErrorPrintStream(err);
849<FONT CLASS="LN">32</FONT><A NAME="832"></A> logger.setEmacsMode(emacsMode);
850<FONT CLASS="LN">33</FONT><A NAME="833"></A>
851<FONT CLASS="LN">34</FONT><A NAME="834"></A> <FONT CLASS="Return">return</FONT> logger;
852<FONT CLASS="LN">35</FONT><A NAME="835"></A> }
853<FONT CLASS="LN">36</FONT><A NAME="836"></A>
854<FONT CLASS="LN">37</FONT><A NAME="837"></A> <FONT CLASS="FormalComment">/**
855<FONT CLASS="LN">38</FONT><A NAME="838"></A> * Prints the usage information for this class to &lt;code&gt;System.out&lt;/code&gt;.
856<FONT CLASS="LN">39</FONT><A NAME="839"></A> */</FONT>
857<FONT CLASS="LN">40</FONT><A NAME="840"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printUsage() {
858<FONT CLASS="LN">41</FONT><A NAME="841"></A> String lSep = System.getProperty(<FONT CLASS="StringLiteral">"line.separator"</FONT>);
859<FONT CLASS="LN">42</FONT><A NAME="842"></A> StringBuffer msg = <FONT CLASS="New">new</FONT> StringBuffer();
860<FONT CLASS="LN">43</FONT><A NAME="843"></A> msg.append(<FONT CLASS="StringLiteral">"ant [options] [target [target2 [target3] ...]]"</FONT> + lSep);
861<FONT CLASS="LN">44</FONT><A NAME="844"></A> msg.append(<FONT CLASS="StringLiteral">"Options: "</FONT> + lSep);
862<FONT CLASS="LN">45</FONT><A NAME="845"></A> msg.append(<FONT CLASS="StringLiteral">" -help, -h print this message"</FONT> + lSep);
863<FONT CLASS="LN">46</FONT><A NAME="846"></A> msg.append(<FONT CLASS="StringLiteral">" -projecthelp, -p print project help information"</FONT> + lSep);
864<FONT CLASS="LN">47</FONT><A NAME="847"></A> msg.append(<FONT CLASS="StringLiteral">" -version print the version information and exit"</FONT> + lSep);
865<FONT CLASS="LN">48</FONT><A NAME="848"></A> msg.append(<FONT CLASS="StringLiteral">" -diagnostics print information that might be helpful to"</FONT> + lSep);
866<FONT CLASS="LN">49</FONT><A NAME="849"></A> msg.append(<FONT CLASS="StringLiteral">" diagnose or report problems."</FONT> + lSep);
867<FONT CLASS="LN">50</FONT><A NAME="850"></A> msg.append(<FONT CLASS="StringLiteral">" -quiet, -q be extra quiet"</FONT> + lSep);
868<FONT CLASS="LN">51</FONT><A NAME="851"></A> msg.append(<FONT CLASS="StringLiteral">" -verbose, -v be extra verbose"</FONT> + lSep);
869<FONT CLASS="LN">52</FONT><A NAME="852"></A> msg.append(<FONT CLASS="StringLiteral">" -debug, -d print debugging information"</FONT> + lSep);
870<FONT CLASS="LN">53</FONT><A NAME="853"></A> msg.append(<FONT CLASS="StringLiteral">" -emacs, -e produce logging information without adornments"</FONT> + lSep);
871<FONT CLASS="LN">54</FONT><A NAME="854"></A> msg.append(<FONT CLASS="StringLiteral">" -lib &lt;path&gt; specifies a path to search for jars and classes"</FONT> + lSep);
872<FONT CLASS="LN">55</FONT><A NAME="855"></A> msg.append(<FONT CLASS="StringLiteral">" -logfile &lt;file&gt; use given file for log"</FONT> + lSep);
873<FONT CLASS="LN">56</FONT><A NAME="856"></A> msg.append(<FONT CLASS="StringLiteral">" -l &lt;file&gt; ''"</FONT> + lSep);
874<FONT CLASS="LN">57</FONT><A NAME="857"></A> msg.append(<FONT CLASS="StringLiteral">" -logger &lt;classname&gt; the class which is to perform logging"</FONT> + lSep);
875<FONT CLASS="LN">58</FONT><A NAME="858"></A> msg.append(<FONT CLASS="StringLiteral">" -listener &lt;classname&gt; add an instance of class as a project listener"</FONT> + lSep);
876<FONT CLASS="LN">59</FONT><A NAME="859"></A> msg.append(<FONT CLASS="StringLiteral">" -noinput do not allow interactive input"</FONT> + lSep);
877<FONT CLASS="LN">60</FONT><A NAME="860"></A> msg.append(<FONT CLASS="StringLiteral">" -buildfile &lt;file&gt; use given buildfile"</FONT> + lSep);
878<FONT CLASS="LN">61</FONT><A NAME="861"></A> msg.append(<FONT CLASS="StringLiteral">" -file &lt;file&gt; ''"</FONT> + lSep);
879<FONT CLASS="LN">62</FONT><A NAME="862"></A> msg.append(<FONT CLASS="StringLiteral">" -f &lt;file&gt; ''"</FONT> + lSep);
880<FONT CLASS="LN">63</FONT><A NAME="863"></A> msg.append(<FONT CLASS="StringLiteral">" -D&lt;property&gt;=&lt;value&gt; use value for given property"</FONT> + lSep);
881<FONT CLASS="LN">64</FONT><A NAME="864"></A> msg.append(<FONT CLASS="StringLiteral">" -keep-going, -k execute all targets that do not depend"</FONT> + lSep);
882<FONT CLASS="LN">65</FONT><A NAME="865"></A> msg.append(<FONT CLASS="StringLiteral">" on failed target(s)"</FONT> + lSep);
883<FONT CLASS="LN">66</FONT><A NAME="866"></A> msg.append(<FONT CLASS="StringLiteral">" -propertyfile &lt;name&gt; load all properties from file with -D"</FONT> + lSep);
884<FONT CLASS="LN">67</FONT><A NAME="867"></A> msg.append(<FONT CLASS="StringLiteral">" properties taking precedence"</FONT> + lSep);
885<FONT CLASS="LN">68</FONT><A NAME="868"></A> msg.append(<FONT CLASS="StringLiteral">" -inputhandler &lt;class&gt; the class which will handle input requests"</FONT> + lSep);
886<FONT CLASS="LN">69</FONT><A NAME="869"></A> msg.append(<FONT CLASS="StringLiteral">" -find &lt;file&gt; (s)earch for buildfile towards the root of"</FONT> + lSep);
887<FONT CLASS="LN">70</FONT><A NAME="870"></A> msg.append(<FONT CLASS="StringLiteral">" -s &lt;file&gt; the filesystem and use it"</FONT> + lSep);
888<FONT CLASS="LN">71</FONT><A NAME="871"></A> msg.append(<FONT CLASS="StringLiteral">" -nice number A niceness value for the main thread:"</FONT> + lSep +
889<FONT CLASS="LN">72</FONT><A NAME="872"></A> <FONT CLASS="StringLiteral">" 1 (lowest) to 10 (highest); 5 is the default"</FONT> + lSep);
890<FONT CLASS="LN">73</FONT><A NAME="873"></A> System.out.println(msg.toString());
891<FONT CLASS="LN">74</FONT><A NAME="874"></A> }
892<FONT CLASS="LN">75</FONT><A NAME="875"></A>
893<FONT CLASS="LN">76</FONT><A NAME="876"></A> <FONT CLASS="FormalComment">/**
894<FONT CLASS="LN">77</FONT><A NAME="877"></A> * Prints the Ant version information to &lt;code&gt;System.out&lt;/code&gt;.
895<FONT CLASS="LN">78</FONT><A NAME="878"></A> *
896<FONT CLASS="LN">79</FONT><A NAME="879"></A> * @exception BuildException if the version information is unavailable
897<FONT CLASS="LN">80</FONT><A NAME="880"></A> */</FONT>
898<FONT CLASS="LN">81</FONT><A NAME="881"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printVersion() <FONT CLASS="Throws">throws</FONT> BuildException {
899<FONT CLASS="LN">82</FONT><A NAME="882"></A> System.out.println(getAntVersion());
900<FONT CLASS="LN">83</FONT><A NAME="883"></A> }
901<FONT CLASS="LN">84</FONT><A NAME="884"></A>
902<FONT CLASS="LN">85</FONT><A NAME="885"></A> <FONT CLASS="FormalComment">/**
903<FONT CLASS="LN">86</FONT><A NAME="886"></A> * Cache of the Ant version information when it has been loaded.
904<FONT CLASS="LN">87</FONT><A NAME="887"></A> */</FONT>
905<FONT CLASS="LN">88</FONT><A NAME="888"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> String antVersion = <FONT CLASS="Null">null</FONT>;
906<FONT CLASS="LN">89</FONT><A NAME="889"></A>
907<FONT CLASS="LN">90</FONT><A NAME="890"></A> <FONT CLASS="FormalComment">/**
908<FONT CLASS="LN">91</FONT><A NAME="891"></A> * Returns the Ant version information, if available. Once the information
909<FONT CLASS="LN">92</FONT><A NAME="892"></A> * has been loaded once, it's cached and returned from the cache on future
910<FONT CLASS="LN">93</FONT><A NAME="893"></A> * calls.
911<FONT CLASS="LN">94</FONT><A NAME="894"></A> *
912<FONT CLASS="LN">95</FONT><A NAME="895"></A> * @return the Ant version information as a String
913<FONT CLASS="LN">96</FONT><A NAME="896"></A> * (always non-&lt;code&gt;null&lt;/code&gt;)
914<FONT CLASS="LN">97</FONT><A NAME="897"></A> *
915<FONT CLASS="LN">98</FONT><A NAME="898"></A> * @exception BuildException if the version information is unavailable
916<FONT CLASS="LN">99</FONT><A NAME="899"></A> */</FONT>
917<FONT CLASS="LN">00</FONT><A NAME="900"></A> <FONT CLASS="Public">public</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Synchronized">synchronized</FONT> String getAntVersion() <FONT CLASS="Throws">throws</FONT> BuildException {
918<FONT CLASS="LN">01</FONT><A NAME="901"></A> <FONT CLASS="If">if</FONT> (antVersion == <FONT CLASS="Null">null</FONT>) {
919<FONT CLASS="LN">02</FONT><A NAME="902"></A> <FONT CLASS="Try">try</FONT> {
920<FONT CLASS="LN">03</FONT><A NAME="903"></A> Properties props = <FONT CLASS="New">new</FONT> Properties();
921<FONT CLASS="LN">04</FONT><A NAME="904"></A> InputStream in =
922<FONT CLASS="LN">05</FONT><A NAME="905"></A> <A HREF="../../../../org/tp23/antinstaller/antmod/Main.java.html">Main</A>.<FONT CLASS="Class">class</FONT>.getResourceAsStream(<FONT CLASS="StringLiteral">"/org/apache/tools/ant/version.txt"</FONT>);
923<FONT CLASS="LN">06</FONT><A NAME="906"></A> props.load(in);
924<FONT CLASS="LN">07</FONT><A NAME="907"></A> in.close();
925<FONT CLASS="LN">08</FONT><A NAME="908"></A>
926<FONT CLASS="LN">09</FONT><A NAME="909"></A> StringBuffer msg = <FONT CLASS="New">new</FONT> StringBuffer();
927<FONT CLASS="LN">10</FONT><A NAME="910"></A> msg.append(<FONT CLASS="StringLiteral">"Apache Ant version "</FONT>);
928<FONT CLASS="LN">11</FONT><A NAME="911"></A> msg.append(props.getProperty(<FONT CLASS="StringLiteral">"VERSION"</FONT>));
929<FONT CLASS="LN">12</FONT><A NAME="912"></A> msg.append(<FONT CLASS="StringLiteral">" compiled on "</FONT>);
930<FONT CLASS="LN">13</FONT><A NAME="913"></A> msg.append(props.getProperty(<FONT CLASS="StringLiteral">"DATE"</FONT>));
931<FONT CLASS="LN">14</FONT><A NAME="914"></A> antVersion = msg.toString();
932<FONT CLASS="LN">15</FONT><A NAME="915"></A> } <FONT CLASS="Catch">catch</FONT> (IOException ioe) {
933<FONT CLASS="LN">16</FONT><A NAME="916"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Could not load the version information:"</FONT>
934<FONT CLASS="LN">17</FONT><A NAME="917"></A> + ioe.getMessage());
935<FONT CLASS="LN">18</FONT><A NAME="918"></A> } <FONT CLASS="Catch">catch</FONT> (NullPointerException npe) {
936<FONT CLASS="LN">19</FONT><A NAME="919"></A> <FONT CLASS="Throw">throw</FONT> <FONT CLASS="New">new</FONT> BuildException(<FONT CLASS="StringLiteral">"Could not load the version information."</FONT>);
937<FONT CLASS="LN">20</FONT><A NAME="920"></A> }
938<FONT CLASS="LN">21</FONT><A NAME="921"></A> }
939<FONT CLASS="LN">22</FONT><A NAME="922"></A> <FONT CLASS="Return">return</FONT> antVersion;
940<FONT CLASS="LN">23</FONT><A NAME="923"></A> }
941<FONT CLASS="LN">24</FONT><A NAME="924"></A>
942<FONT CLASS="LN">25</FONT><A NAME="925"></A> <FONT CLASS="FormalComment">/**
943<FONT CLASS="LN">26</FONT><A NAME="926"></A> * Prints the description of a project (if there is one) to
944<FONT CLASS="LN">27</FONT><A NAME="927"></A> * &lt;code&gt;System.out&lt;/code&gt;.
945<FONT CLASS="LN">28</FONT><A NAME="928"></A> *
946<FONT CLASS="LN">29</FONT><A NAME="929"></A> * @param project The project to display a description of.
947<FONT CLASS="LN">30</FONT><A NAME="930"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
948<FONT CLASS="LN">31</FONT><A NAME="931"></A> */</FONT>
949<FONT CLASS="LN">32</FONT><A NAME="932"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printDescription(Project project) {
950<FONT CLASS="LN">33</FONT><A NAME="933"></A> <FONT CLASS="If">if</FONT> (project.getDescription() != <FONT CLASS="Null">null</FONT>) {
951<FONT CLASS="LN">34</FONT><A NAME="934"></A> project.log(project.getDescription());
952<FONT CLASS="LN">35</FONT><A NAME="935"></A> }
953<FONT CLASS="LN">36</FONT><A NAME="936"></A> }
954<FONT CLASS="LN">37</FONT><A NAME="937"></A>
955<FONT CLASS="LN">38</FONT><A NAME="938"></A> <FONT CLASS="FormalComment">/**
956<FONT CLASS="LN">39</FONT><A NAME="939"></A> * Prints a list of all targets in the specified project to
957<FONT CLASS="LN">40</FONT><A NAME="940"></A> * &lt;code&gt;System.out&lt;/code&gt;, optionally including subtargets.
958<FONT CLASS="LN">41</FONT><A NAME="941"></A> *
959<FONT CLASS="LN">42</FONT><A NAME="942"></A> * @param project The project to display a description of.
960<FONT CLASS="LN">43</FONT><A NAME="943"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
961<FONT CLASS="LN">44</FONT><A NAME="944"></A> * @param printSubTargets Whether or not subtarget names should also be
962<FONT CLASS="LN">45</FONT><A NAME="945"></A> * printed.
963<FONT CLASS="LN">46</FONT><A NAME="946"></A> */</FONT>
964<FONT CLASS="LN">47</FONT><A NAME="947"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printTargets(Project project, <FONT CLASS="Boolean">boolean</FONT> printSubTargets) {
965<FONT CLASS="LN">48</FONT><A NAME="948"></A> <FONT CLASS="SingleLineComment">// find the target with the longest name
966<FONT CLASS="LN">49</FONT><A NAME="949"></A></FONT> <FONT CLASS="Int">int</FONT> maxLength = <FONT CLASS="IntegerLiteral">0</FONT>;
967<FONT CLASS="LN">50</FONT><A NAME="950"></A> Enumeration ptargets = project.getTargets().elements();
968<FONT CLASS="LN">51</FONT><A NAME="951"></A> String targetName;
969<FONT CLASS="LN">52</FONT><A NAME="952"></A> String targetDescription;
970<FONT CLASS="LN">53</FONT><A NAME="953"></A> Target currentTarget;
971<FONT CLASS="LN">54</FONT><A NAME="954"></A> <FONT CLASS="SingleLineComment">// split the targets in top-level and sub-targets depending
972<FONT CLASS="LN">55</FONT><A NAME="955"></A></FONT> <FONT CLASS="SingleLineComment">// on the presence of a description
973<FONT CLASS="LN">56</FONT><A NAME="956"></A></FONT> Vector topNames = <FONT CLASS="New">new</FONT> Vector();
974<FONT CLASS="LN">57</FONT><A NAME="957"></A> Vector topDescriptions = <FONT CLASS="New">new</FONT> Vector();
975<FONT CLASS="LN">58</FONT><A NAME="958"></A> Vector subNames = <FONT CLASS="New">new</FONT> Vector();
976<FONT CLASS="LN">59</FONT><A NAME="959"></A>
977<FONT CLASS="LN">60</FONT><A NAME="960"></A> <FONT CLASS="While">while</FONT> (ptargets.hasMoreElements()) {
978<FONT CLASS="LN">61</FONT><A NAME="961"></A> currentTarget = (Target) ptargets.nextElement();
979<FONT CLASS="LN">62</FONT><A NAME="962"></A> targetName = currentTarget.getName();
980<FONT CLASS="LN">63</FONT><A NAME="963"></A> <FONT CLASS="If">if</FONT> (targetName.equals(<FONT CLASS="StringLiteral">""</FONT>)) {
981<FONT CLASS="LN">64</FONT><A NAME="964"></A> <FONT CLASS="Continue">continue</FONT>;
982<FONT CLASS="LN">65</FONT><A NAME="965"></A> }
983<FONT CLASS="LN">66</FONT><A NAME="966"></A> targetDescription = currentTarget.getDescription();
984<FONT CLASS="LN">67</FONT><A NAME="967"></A> <FONT CLASS="SingleLineComment">// maintain a sorted list of targets
985<FONT CLASS="LN">68</FONT><A NAME="968"></A></FONT> <FONT CLASS="If">if</FONT> (targetDescription == <FONT CLASS="Null">null</FONT>) {
986<FONT CLASS="LN">69</FONT><A NAME="969"></A> <FONT CLASS="Int">int</FONT> pos = findTargetPosition(subNames, targetName);
987<FONT CLASS="LN">70</FONT><A NAME="970"></A> subNames.insertElementAt(targetName, pos);
988<FONT CLASS="LN">71</FONT><A NAME="971"></A> } <FONT CLASS="Else">else</FONT> {
989<FONT CLASS="LN">72</FONT><A NAME="972"></A> <FONT CLASS="Int">int</FONT> pos = findTargetPosition(topNames, targetName);
990<FONT CLASS="LN">73</FONT><A NAME="973"></A> topNames.insertElementAt(targetName, pos);
991<FONT CLASS="LN">74</FONT><A NAME="974"></A> topDescriptions.insertElementAt(targetDescription, pos);
992<FONT CLASS="LN">75</FONT><A NAME="975"></A> <FONT CLASS="If">if</FONT> (targetName.length() &gt; maxLength) {
993<FONT CLASS="LN">76</FONT><A NAME="976"></A> maxLength = targetName.length();
994<FONT CLASS="LN">77</FONT><A NAME="977"></A> }
995<FONT CLASS="LN">78</FONT><A NAME="978"></A> }
996<FONT CLASS="LN">79</FONT><A NAME="979"></A> }
997<FONT CLASS="LN">80</FONT><A NAME="980"></A>
998<FONT CLASS="LN">81</FONT><A NAME="981"></A> printTargets(project, topNames, topDescriptions, <FONT CLASS="StringLiteral">"Main targets:"</FONT>,
999<FONT CLASS="LN">82</FONT><A NAME="982"></A> maxLength);
1000<FONT CLASS="LN">83</FONT><A NAME="983"></A> <FONT CLASS="SingleLineComment">//if there were no main targets, we list all subtargets
1001<FONT CLASS="LN">84</FONT><A NAME="984"></A></FONT> <FONT CLASS="SingleLineComment">//as it means nothing has a description
1002<FONT CLASS="LN">85</FONT><A NAME="985"></A></FONT> <FONT CLASS="If">if</FONT> (topNames.size() == <FONT CLASS="IntegerLiteral">0</FONT>) {
1003<FONT CLASS="LN">86</FONT><A NAME="986"></A> printSubTargets = <FONT CLASS="True">true</FONT>;
1004<FONT CLASS="LN">87</FONT><A NAME="987"></A> }
1005<FONT CLASS="LN">88</FONT><A NAME="988"></A> <FONT CLASS="If">if</FONT> (printSubTargets) {
1006<FONT CLASS="LN">89</FONT><A NAME="989"></A> printTargets(project, subNames, <FONT CLASS="Null">null</FONT>, <FONT CLASS="StringLiteral">"Other targets:"</FONT>, <FONT CLASS="IntegerLiteral">0</FONT>);
1007<FONT CLASS="LN">90</FONT><A NAME="990"></A> }
1008<FONT CLASS="LN">91</FONT><A NAME="991"></A>
1009<FONT CLASS="LN">92</FONT><A NAME="992"></A> String defaultTarget = project.getDefaultTarget();
1010<FONT CLASS="LN">93</FONT><A NAME="993"></A> <FONT CLASS="If">if</FONT> (defaultTarget != <FONT CLASS="Null">null</FONT> &amp;&amp; !<FONT CLASS="StringLiteral">""</FONT>.equals(defaultTarget)) {
1011<FONT CLASS="LN">94</FONT><A NAME="994"></A> <FONT CLASS="SingleLineComment">// shouldn't need to check but...
1012<FONT CLASS="LN">95</FONT><A NAME="995"></A></FONT> project.log(<FONT CLASS="StringLiteral">"Default target: "</FONT> + defaultTarget);
1013<FONT CLASS="LN">96</FONT><A NAME="996"></A> }
1014<FONT CLASS="LN">97</FONT><A NAME="997"></A> }
1015<FONT CLASS="LN">98</FONT><A NAME="998"></A>
1016<FONT CLASS="LN">99</FONT><A NAME="999"></A> <FONT CLASS="FormalComment">/**
1017<FONT CLASS="LN">00</FONT><A NAME="1000"></A> * Searches for the correct place to insert a name into a list so as
1018<FONT CLASS="LN">01</FONT><A NAME="1001"></A> * to keep the list sorted alphabetically.
1019<FONT CLASS="LN">02</FONT><A NAME="1002"></A> *
1020<FONT CLASS="LN">03</FONT><A NAME="1003"></A> * @param names The current list of names. Must not be &lt;code&gt;null&lt;/code&gt;.
1021<FONT CLASS="LN">04</FONT><A NAME="1004"></A> * @param name The name to find a place for.
1022<FONT CLASS="LN">05</FONT><A NAME="1005"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
1023<FONT CLASS="LN">06</FONT><A NAME="1006"></A> *
1024<FONT CLASS="LN">07</FONT><A NAME="1007"></A> * @return the correct place in the list for the given name
1025<FONT CLASS="LN">08</FONT><A NAME="1008"></A> */</FONT>
1026<FONT CLASS="LN">09</FONT><A NAME="1009"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Int">int</FONT> findTargetPosition(Vector names, String name) {
1027<FONT CLASS="LN">10</FONT><A NAME="1010"></A> <FONT CLASS="Int">int</FONT> res = names.size();
1028<FONT CLASS="LN">11</FONT><A NAME="1011"></A> <FONT CLASS="For">for</FONT> (<FONT CLASS="Int">int</FONT> i = <FONT CLASS="IntegerLiteral">0</FONT>; i &lt; names.size() &amp;&amp; res == names.size(); i++) {
1029<FONT CLASS="LN">12</FONT><A NAME="1012"></A> <FONT CLASS="If">if</FONT> (name.compareTo((String) names.elementAt(i)) &lt; <FONT CLASS="IntegerLiteral">0</FONT>) {
1030<FONT CLASS="LN">13</FONT><A NAME="1013"></A> res = i;
1031<FONT CLASS="LN">14</FONT><A NAME="1014"></A> }
1032<FONT CLASS="LN">15</FONT><A NAME="1015"></A> }
1033<FONT CLASS="LN">16</FONT><A NAME="1016"></A> <FONT CLASS="Return">return</FONT> res;
1034<FONT CLASS="LN">17</FONT><A NAME="1017"></A> }
1035<FONT CLASS="LN">18</FONT><A NAME="1018"></A>
1036<FONT CLASS="LN">19</FONT><A NAME="1019"></A> <FONT CLASS="FormalComment">/**
1037<FONT CLASS="LN">20</FONT><A NAME="1020"></A> * Writes a formatted list of target names to &lt;code&gt;System.out&lt;/code&gt;
1038<FONT CLASS="LN">21</FONT><A NAME="1021"></A> * with an optional description.
1039<FONT CLASS="LN">22</FONT><A NAME="1022"></A> *
1040<FONT CLASS="LN">23</FONT><A NAME="1023"></A> *
1041<FONT CLASS="LN">24</FONT><A NAME="1024"></A> * @param project the project instance.
1042<FONT CLASS="LN">25</FONT><A NAME="1025"></A> * @param names The names to be printed.
1043<FONT CLASS="LN">26</FONT><A NAME="1026"></A> * Must not be &lt;code&gt;null&lt;/code&gt;.
1044<FONT CLASS="LN">27</FONT><A NAME="1027"></A> * @param descriptions The associated target descriptions.
1045<FONT CLASS="LN">28</FONT><A NAME="1028"></A> * May be &lt;code&gt;null&lt;/code&gt;, in which case
1046<FONT CLASS="LN">29</FONT><A NAME="1029"></A> * no descriptions are displayed.
1047<FONT CLASS="LN">30</FONT><A NAME="1030"></A> * If non-&lt;code&gt;null&lt;/code&gt;, this should have
1048<FONT CLASS="LN">31</FONT><A NAME="1031"></A> * as many elements as &lt;code&gt;names&lt;/code&gt;.
1049<FONT CLASS="LN">32</FONT><A NAME="1032"></A> * @param heading The heading to display.
1050<FONT CLASS="LN">33</FONT><A NAME="1033"></A> * Should not be &lt;code&gt;null&lt;/code&gt;.
1051<FONT CLASS="LN">34</FONT><A NAME="1034"></A> * @param maxlen The maximum length of the names of the targets.
1052<FONT CLASS="LN">35</FONT><A NAME="1035"></A> * If descriptions are given, they are padded to this
1053<FONT CLASS="LN">36</FONT><A NAME="1036"></A> * position so they line up (so long as the names really
1054<FONT CLASS="LN">37</FONT><A NAME="1037"></A> * &lt;i&gt;are&lt;/i&gt; shorter than this).
1055<FONT CLASS="LN">38</FONT><A NAME="1038"></A> */</FONT>
1056<FONT CLASS="LN">39</FONT><A NAME="1039"></A> <FONT CLASS="Private">private</FONT> <FONT CLASS="Static">static</FONT> <FONT CLASS="Void">void</FONT> printTargets(Project project, Vector names,
1057<FONT CLASS="LN">40</FONT><A NAME="1040"></A> Vector descriptions, String heading,
1058<FONT CLASS="LN">41</FONT><A NAME="1041"></A> <FONT CLASS="Int">int</FONT> maxlen) {
1059<FONT CLASS="LN">42</FONT><A NAME="1042"></A> <FONT CLASS="SingleLineComment">// now, start printing the targets and their descriptions
1060<FONT CLASS="LN">43</FONT><A NAME="1043"></A></FONT> String lSep = System.getProperty(<FONT CLASS="StringLiteral">"line.separator"</FONT>);
1061<FONT CLASS="LN">44</FONT><A NAME="1044"></A> <FONT CLASS="SingleLineComment">// got a bit annoyed that I couldn't find a pad function
1062<FONT CLASS="LN">45</FONT><A NAME="1045"></A></FONT> String spaces = <FONT CLASS="StringLiteral">" "</FONT>;
1063<FONT CLASS="LN">46</FONT><A NAME="1046"></A> <FONT CLASS="While">while</FONT> (spaces.length() &lt;= maxlen) {
1064<FONT CLASS="LN">47</FONT><A NAME="1047"></A> spaces += spaces;
1065<FONT CLASS="LN">48</FONT><A NAME="1048"></A> }
1066<FONT CLASS="LN">49</FONT><A NAME="1049"></A> StringBuffer msg = <FONT CLASS="New">new</FONT> StringBuffer();
1067<FONT CLASS="LN">50</FONT><A NAME="1050"></A> msg.append(heading);
1068<FONT CLASS="LN">51</FONT><A NAME="1051"></A> msg.append(lSep);
1069<FONT CLASS="LN">52</FONT><A NAME="1052"></A> msg.append(lSep);
1070<FONT CLASS="LN">53</FONT><A NAME="1053"></A> <FONT CLASS="For">for</FONT> (<FONT CLASS="Int">int</FONT> i = <FONT CLASS="IntegerLiteral">0</FONT>; i &lt; names.size(); i++) {
1071<FONT CLASS="LN">54</FONT><A NAME="1054"></A> msg.append(<FONT CLASS="StringLiteral">" "</FONT>);
1072<FONT CLASS="LN">55</FONT><A NAME="1055"></A> msg.append(names.elementAt(i));
1073<FONT CLASS="LN">56</FONT><A NAME="1056"></A> <FONT CLASS="If">if</FONT> (descriptions != <FONT CLASS="Null">null</FONT>) {
1074<FONT CLASS="LN">57</FONT><A NAME="1057"></A> msg.append(spaces.substring(<FONT CLASS="IntegerLiteral">0</FONT>, maxlen - ((String) names.elementAt(i)).length() + <FONT CLASS="IntegerLiteral">2</FONT>));
1075<FONT CLASS="LN">58</FONT><A NAME="1058"></A> msg.append(descriptions.elementAt(i));
1076<FONT CLASS="LN">59</FONT><A NAME="1059"></A> }
1077<FONT CLASS="LN">60</FONT><A NAME="1060"></A> msg.append(lSep);
1078<FONT CLASS="LN">61</FONT><A NAME="1061"></A> }
1079<FONT CLASS="LN">62</FONT><A NAME="1062"></A> project.log(msg.toString());
1080<FONT CLASS="LN">63</FONT><A NAME="1063"></A> }
1081<FONT CLASS="LN">64</FONT><A NAME="1064"></A>}
1082<FONT CLASS="LN">65</FONT><A NAME="1065"></A></pre>
1083</BODY>
1084</HTML>
Note: See TracBrowser for help on using the repository browser.