KickJava   Java API By Example, From Geeks To Geeks.

Java > Open Source Codes > com > idaremedia > antx > condition > solo > PreferTask


1 /**
2  * $Id: PreferTask.java 180 2007-03-15 12:56:38Z ssmc $
3  * Copyright 2002-2004 iDare Media, Inc. All rights reserved.
4  *
5  * Originally written by iDare Media, Inc. for release into the public domain. This
6  * library, source form and binary form, is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public License as published by the
8  * Free Software Foundation; either version 2 of the License, or (at your option) any later
9  * version.<p>
10  *
11  * This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
12  * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
13  * See the GNU LGPL (GNU Lesser General Public License) for more details.<p>
14  *
15  * You should have received a copy of the GNU Lesser General Public License along with this
16  * library; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite
17  * 330, Boston, MA 02111-1307 USA. The LGPL can be found online at
18  * http://www.fsf.org/copyleft/lesser.html<p>
19  *
20  * This product has been influenced by several projects within the open-source community.
21  * The JWare developers wish to acknowledge the open-source community's support. For more
22  * information regarding the open-source products used within JWare, please visit the
23  * JWare website.
24  *----------------------------------------------------------------------------------------*
25  * WEBSITE- http://www.jware.info EMAIL- inquiries@jware.info
26  *----------------------------------------------------------------------------------------*
27  **/

28
29 package com.idaremedia.antx.condition.solo;
30
31 import java.io.File JavaDoc;
32
33 import org.apache.tools.ant.BuildException;
34 import org.apache.tools.ant.Project;
35 import org.apache.tools.ant.types.Path;
36 import org.apache.tools.ant.types.Reference;
37
38 import com.idaremedia.antx.AntX;
39 import com.idaremedia.antx.ExportedProperties;
40 import com.idaremedia.antx.FlexString;
41 import com.idaremedia.antx.NoiseLevel;
42 import com.idaremedia.antx.condition.ShortHandConditions;
43 import com.idaremedia.antx.parameters.Handling;
44 import com.idaremedia.antx.parameters.IsA;
45
46 /**
47  * Helper task that allows builder to specify a property's and/or variable's default value
48  * if a conditon has not been met. Usually that condition is a simple <i>is-set</i> check,
49  * but it doesn't have to be. Warning: the target property's value is overridden (that's
50  * one of the main points of this tasks). This task is also useful as a way to document
51  * a preference/warning to the builder that something's not as optimal as it could be:
52  * for example, using an older version of javadoc that generates gobs of errors because
53  * the current source is written expecting javadoc 1.4 or better.
54  * <p>
55  * Example usage:<pre>
56  * &lt;prefer istrue="${jdk14.present}" msgid="warn.old.javadoc"/&gt;
57  *
58  * &lt;prefer isfalse="${scrub.disable}" msgid="warn.notclean.build"/&gt;
59  *
60  * &lt;prefer varset="loop.isdebug"/&gt;
61  *
62  * &lt;prefer varnotset="__loopcount" msgid="warn.baditeration"/&gt;
63  *
64  * &lt;prefer varsettrue="happyfuntimes"/&gt;
65  *
66  * &lt;prefer anyset="junit.present,pet.present" falseproperty="tests.disable"
67  * default="true"/&gt;
68  *
69  * &lt;prefer isnotwhitespace="${module.title}" falseproperty="module.title"
70  * defaultproperty="default.untitled"/&gt;
71  *
72  * &lt;prefer isfile="${build.logfile}" falseproperty="build.logfile"
73  * default="/tmp/build-${TSTAMP}.log"/&gt;
74  *
75  * &lt;prefer httpalive="http://localhost:9090/"
76  * falseproperty="localhost9090.disable" default="true"/&gt;
77  * </pre>
78  * <p>
79  * Note if both the property and variable attributes are specified, <em>both</em> are
80  * updated on a false evaluation; for example both the 'myProp" and 'myVar' items
81  * will be set to "bogus" in the following setup:<pre>
82  * &lt;prefer isfalse="true" falseproperty="myProp" falsevar="myVar" default="bogus"/&gt;
83  * </pre>
84  *
85  * @since JWare/AntX 0.1 (was PreferRule)
86  * @author ssmc, &copy;2002-2004 <a HREF="http://www.jware.info">iDare&nbsp;Media,&nbsp;Inc.</a>
87  * @version 0.5
88  * @.safety single
89  * @.group api,infra
90  **/

91
92 public class PreferTask extends RuleTask implements ShortHandConditions
93 {
94     /**
95      * Initializes a new prefer task.
96      **/

97     public PreferTask()
98     {
99         super(AntX.rules+"prefer");
100     }
101
102
103     /**
104      * Initializes a new CV-labeled prefer task.
105      * @param iam CV-label (non-null)
106      **/

107     public PreferTask(String JavaDoc iam)
108     {
109         super(iam);
110     }
111
112
113     /**
114      * Initializes a new CV-labeled optionally embedded prefer task.
115      * @param iam CV-label (non-null)
116      * @param embedded <i>true</i> to quiet 'execute' method
117      **/

118     protected PreferTask(String JavaDoc iam, boolean embedded)
119     {
120         super(iam, embedded);
121     }
122
123
124     /**
125      * Initializes the enclosing project for this task. Also
126      * updates internal project-component helpers.
127      **/

128     public void setProject(Project project)
129     {
130         super.setProject(project);
131         m_shh.setProject(project);
132     }
133
134
135 // ---------------------------------------------------------------------------------------
136
// Parameters:
137
// ---------------------------------------------------------------------------------------
138

139     /**
140      * Sets the property to be (over)written on a negative
141      * evaluation. Set once.
142      **/

143     public final void setFalseProperty(String JavaDoc propertyName)
144     {
145         setUpdateProperty(propertyName);
146     }
147
148
149     /**
150      * Returns the property to be (over)written on a negative
151      * evaluation. Returns <i>null</i> if never set.
152      **/

153     public final String JavaDoc getFalseProperty()
154     {
155         return getUpdateProperty();
156     }
157
158
159     /**
160      * Sets the exported property to be (over)written on a
161      * negative evaluation. Set once.
162      * @since JWare/AntX 0.2
163      **/

164     public final void setFalseVariable(String JavaDoc variable)
165     {
166         setUpdateVariable(variable);
167     }
168
169
170     /**
171      * Synonym for {@linkplain #setFalseVariable setFalseVariable}.
172      **/

173     public final void setFalseVar(String JavaDoc variable)
174     {
175         setFalseVariable(variable);
176     }
177
178
179     /**
180      * Returns the exported property to be (over)written on
181      * a negative evaluation. Returns <i>null</i> if never set.
182      **/

183     public final String JavaDoc getFalseVariable()
184     {
185         return getUpdateVariable();
186     }
187
188
189     /**
190      * Sets the value used be set specified properties on a
191      * negative evaluation.
192      * @param value the default value used to (over)write properties
193      **/

194     public final void setDefault(String JavaDoc value)
195     {
196         setUpdatePropertyValue(value);
197     }
198
199
200     /**
201      * Sets the property from which default value should be read on
202      * negative evaluation.
203      * @param property the property from which value will be read
204      * @since JWare/AntX 0.3
205      **/

206     public final void setDefaultProperty(String JavaDoc property)
207     {
208         require_(property!=null && property.length()>0,"setDfltProp- nonwspc name");
209         checkModify("setDfltProp");
210
211         FlexString upv = getUpdatePropertyFlexValue();
212         upv.set(property);
213         upv.setIsProperty(true);
214     }
215
216
217     /**
218      * Returns the value to be used to (over)write properties
219      * on a negative evaluation. Returns string "<i>true</i>" if
220      * never set.
221      **/

222     public final String JavaDoc getDefault()
223     {
224         return getUpdatePropertyValue();
225     }
226
227
228     /**
229      * Sets this prefer task to use an existing build rule as its
230      * definition. The reference will be evaluated (and verified)
231      * the first time this task is evaluated.
232      * @param ruleId build rule reference id (non-null)
233      * @see #isIncompatibleReferral
234      * @since JWare/AntX 0.2
235      **/

236     public final void setRuleId(Reference ruleId)
237     {
238         setReferralReference(ruleId);
239     }
240
241
242 // ---------------------------------------------------------------------------------------
243
// Evaluation:
244
// ---------------------------------------------------------------------------------------
245

246     /**
247      * Returns <i>true</i> if the given referral's effect is worse
248      * than a warning.
249      * @since JWare/AntX 0.2
250      **/

251     protected boolean isIncompatibleReferral(ShareableCondition rule)
252     {
253         NoiseLevel effect = rule.getFailureEffect();
254         if (effect==null || effect.isAsBadAs(NoiseLevel.ERROR)) {
255             return true;
256         }
257         return false;
258     }
259
260
261     /**
262      * Returns this task's preferred message noise level.
263      * Calls {@linkplain BooleanRule#getPreferenceMsgLevel(Project)
264      * getPreferredMsgLevel} with this task's enclosing project.
265      **/

266     public NoiseLevel getPreferredMsgLevel()
267     {
268         return BooleanRule.getPreferenceMsgLevel(getProject());
269     }
270
271
272     /**
273      * Triggers preferred overrides if this task's conditions weren't
274      * met. Generates a log entry as a minimal reaction to a negative
275      * evaluation. If an update property is specified, a negative
276      * evaluation will (re)set its value.
277      * @see #getPreferredMsgLevel
278      **/

279     protected void setEvalResult(boolean istrue, final String JavaDoc listing)
280     {
281         if (!istrue) {
282             String JavaDoc msg = getMsg(newMsgGetter(listing));
283             if (msg.length()>0) {
284                 log(msg, getPreferredMsgLevel().getNativeIndex());
285             }
286
287             boolean told = false;
288             String JavaDoc what = getUpdatePropertyValue();
289             String JavaDoc prop = getUpdateProperty();
290
291             if (prop!=null) {
292                 log("Prefer condition false; setting '"+prop+
293                     "' property to "+what, Project.MSG_DEBUG);
294
295                 getProject().setInheritedProperty(prop, what);
296                 told=true;
297
298             }
299             prop = getUpdateVariable();
300             if (prop!=null) {
301                 log("Prefer condition false; setting '"+prop+
302                     "' variable to "+what, Project.MSG_DEBUG);
303
304                 ExportedProperties.set(prop,what);
305                 told=true;
306             }
307
308             if (!told) {
309                 log("Prefer condition false; logged '"+msg+"'",
310                     Project.MSG_DEBUG);
311             }
312         } else {
313             log("Prefer condition true so ignored", Project.MSG_DEBUG);
314         }
315     }
316
317
318     /**
319      * Evaluates this prefer task. If condition not met,
320      * this evaluation logs a predefined message and optionally
321      * (re)sets a project property.
322      **/

323     public boolean eval() throws BuildException
324     {
325         if (runReferral()) {
326             return getReferral().eval(new Referee());
327         }
328
329         verifyCanExecute_("eval");
330
331         return defaultSingleConditionEval();
332     }
333
334
335 // ---------------------------------------------------------------------------------------
336
// Condition Definitions:
337
// ---------------------------------------------------------------------------------------
338

339     /**
340      * Attribute-shortcut for a single 'istrue' condition; for
341      * example: <code>&lt;prefer istrue="${jdk14.present}" msgid="warn.old.javadoc"/&gt;</code>
342      **/

343     public void setIsTrue(String JavaDoc value)
344     {
345         m_shh.setIsTrue(value);
346     }
347
348
349     /**
350      * Attribute-shortcut for a single 'isfalse' condition; for
351      * example: <code>&lt;prefer isfalse="${scrub.disable}" msgid="warn.notclean.build"/&gt;</code>
352      **/

353     public void setIsFalse(String JavaDoc value)
354     {
355         m_shh.setIsFalse(value);
356     }
357
358
359     /**
360      * Attribute-shortcut for a single 'isset' condition; for
361      * example: <code>&lt;prefer isset="stem" default="com.idaremedia"/&gt;</code>
362      **/

363     public void setIsSet(String JavaDoc property)
364     {
365         m_shh.setIsSet(property);
366     }
367
368
369     /**
370      * Attribute-shortcut for a single 'issettrue' condition; for
371      * example: <code>&lt;prefer issettrue="test.engine.present"/&gt;</code>
372      * @since JWare/AntX 0.2
373      **/

374     public void setIsSetTrue(String JavaDoc property)
375     {
376         m_shh.setIsSetTrue(property);
377     }
378
379
380     /**
381      * Attribute-shortcut for a single 'isnotset' condition; for
382      * example: <code>&lt;prefer isnotset="build.number" msgid="warn.notclean.buildnum"/&gt;</code>
383      **/

384     public void setIsNotSet(String JavaDoc property)
385     {
386         m_shh.setIsNotSet(property);
387     }
388
389
390     /**
391      * Set the type-cast modifier for this task's short-hand flex condition.
392      * @param isa the value source for short-hand condition
393      * @since JWare/AntX 0.2
394      **/

395     public void setIsA(IsA isa)
396     {
397         m_shh.setIsA(isa);
398     }
399
400
401     /**
402      * Attribute-shortcut for a single 'varset' condition; for
403      * example: <code>&lt;prefer varset="__loop.debug"/&gt;</code>
404      * @since JWare/AntX 0.2
405      **/

406     public void setVarSet(String JavaDoc variable)
407     {
408         m_shh.setVarSet(variable);
409     }
410
411
412     /**
413      * Attribute-shortcut for a single 'varnotset' condition; for
414      * example: <code>&lt;prefer varnotset="__loopcount" msgid="warn.baditeration"/&gt;</code>
415      **/

416     public void setVarNotSet(String JavaDoc variable)
417     {
418         m_shh.setVarNotSet(variable);
419     }
420
421
422     /**
423      * Attribute-shortcut for a single 'varsettrue' condition; for
424      * example: <code>&lt;prefer varsettrue="happyfuntimes"/&gt;</code>
425      * @since JWare/AntX 0.2
426      **/

427     public void setVarSetTrue(String JavaDoc variable)
428     {
429         m_shh.setVarSetTrue(variable);
430     }
431
432
433     /**
434      * Attribute-shortcut for a single 'anyset' condition; for
435      * example: <code>&lt;prefer anyset="junit.present,pet.present"/&gt;</code>
436      * @since JWare/AntX 0.2
437      **/

438     public void setAnySet(String JavaDoc properties)
439     {
440         m_shh.setAnySet(properties);
441     }
442
443
444     /**
445      * Attribute-shortcut for a single 'allset' condition; for
446      * example: <code>&lt;prefer allset="module.id,module.longname"/&gt;</code>
447      * @since JWare/AntX 0.2
448      **/

449     public void setAllSet(String JavaDoc properties)
450     {
451         m_shh.setAllSet(properties);
452     }
453
454
455     /**
456      * Attribute-shortcut for a single 'noneset' condition; for
457      * example: <code>&lt;prefer noneset="build.number,build.time"
458      * falseproperty="not.clean"/&gt;</code>
459      * @since JWare/AntX 0.2
460      **/

461     public void setNoneSet(String JavaDoc properties)
462     {
463         m_shh.setNoneSet(properties);
464     }
465
466 // ---------------------------------------------------------------------------------------
467

468     /**
469      * Attribute-shortcut for a single 'isboolean' condition; for
470      * example: <code>&lt;prefer isboolean="${loop.isdebug}"/&gt;</code>
471      * @since JWare/AntX 0.2
472      **/

473     public void setIsBoolean(String JavaDoc value)
474     {
475         m_shh.setIsBoolean(value);
476     }
477
478
479     /**
480      * Attribute-shortcut for a single 'isnumeric' condition; for
481      * example: <code>&lt;prefer isnumeric="${build.number}"/&gt;</code>
482      **/

483     public void setIsNumeric(String JavaDoc value)
484     {
485         m_shh.setIsNumeric(value);
486     }
487
488
489     /**
490      * Attribute-shortcut for checking existence of a file;
491      * for example: <code>&lt;prefer isfile="${build.logfile}"
492      * falseproperty="build.logfile" default="/tmp/build-${TSTAMP}.log"/&gt;</code>
493      **/

494     public void setIsFile(File JavaDoc file)
495     {
496         m_shh.setIsFile(file);
497     }
498
499
500     /**
501      * Attribute-shortcut for checking existence of a directory.
502      **/

503     public void setIsDirectory(File JavaDoc directory)
504     {
505         m_shh.setIsDirectory(directory);
506     }
507
508
509     /**
510      * Attribute-shortcut for a single 'isresource' condition; for
511      * example: <code>&lt;prefer isresource="${build.uistrs}"
512      * falseproperty="build.uistrs"
513      * default="common/resources/Messages.properties"/&gt;</code>
514      **/

515     public void setIsResource(String JavaDoc resource)
516     {
517         m_shh.setIsResource(resource);
518     }
519
520
521     /**
522      * Attribute-shortcut for a single 'isclass' condition; for
523      * example: <code>&lt;prefer isclass="junit.framework.Assert"
524      * falseproperty="junit.disable" default="true"/&gt;</code>
525      **/

526     public void setIsClass(String JavaDoc classname)
527     {
528         m_shh.setIsClass(classname);
529     }
530
531
532     /**
533      * Specifies a lookup classpath for a shorthand 'available'
534      * condition.
535      * @since JWare/AntX 0.2
536      **/

537     public void setClasspath(Path clsp)
538     {
539         m_shh.setClasspath(clsp);
540     }
541
542
543     /**
544      * Specifies a lookup filepath for a shorthand 'available'
545      * condition.
546      * @since JWare/AntX 0.2
547      **/

548     public void setFilepath(Path filp)
549     {
550         m_shh.setFilepath(filp);
551     }
552
553
554     /**
555      * Specifies a lookup classpath-ref for a shorthand 'available'
556      * condition.
557      * @since JWare/AntX 0.2
558      **/

559     public void setClasspathRef(Reference cpr)
560     {
561         m_shh.setClasspathRef(cpr);
562     }
563
564
565     /**
566      * Specifies Ant's runtime classes should be included for
567      * a shorthand 'isclass' condition; like <code>&lt;prefer isclass="foo"
568      * systemclasses="false"/&gt;</code>.
569      * @param included <i>false</i> if system classes excluded
570      * @since JWare/AntX 0.2
571      **/

572     public void setSystemClasses(boolean included)
573     {
574         m_shh.setSystemClasses(included);
575     }
576
577 // ---------------------------------------------------------------------------------------
578

579     /**
580      * Attribute-shortcut for checking whether a web server is alive or
581      * not; for example: <code>&lt;prefer httpalive="http://localhost:9090/"
582      * falseproperty="localhost9090.disable" default="true"/&gt;</code>
583      **/

584     public void setHttpAlive(String JavaDoc url)
585     {
586         m_shh.setHttpAlive(url);
587     }
588
589
590     /**
591      * Attribute-shortcut for checking the OS's family name; for example:
592      * <code>&lt;prefer osfamily="unix" msgid="chmod.ignored"/&gt;</code>
593      **/

594     public void setOSFamily(String JavaDoc family)
595     {
596         m_shh.setOSFamily(family);
597     }
598
599
600     public void setOS(String JavaDoc selector)
601     {
602         m_shh.setOS(selector);
603     }
604
605
606 // ---------------------------------------------------------------------------------------
607

608     /**
609      * Attribute-shortcut for checking whether a property's value is
610      * all whitespace; for example:
611      * <code>&lt;prefer isnotwhitespace="${module.title}" falseproperty="module.title"
612      * default="Untitled"/&gt;</code>
613      **/

614     public void setIsNotWhitespace(String JavaDoc value)
615     {
616         m_shh.setIsNotWhitespace(value);
617     }
618
619
620     /**
621      * Attribute-shortcut for checking a '<i>matches</i>' condition; for
622      * example, <code>&lt;prefer matches="(internal)|(dist)" value="${build.type}"/&gt;</code>
623      * @param pattern pattern against which other arg ('value') matched
624      * @since JWare/AntX 0.2
625      **/

626     public void setMatches(String JavaDoc pattern)
627     {
628         m_shh.setMatches(pattern);
629     }
630
631
632     /**
633      * Sets the unknown value being compared in a inlined equality condition.
634      * @param value the second (unknown) value to match
635      * @since JWare/AntX 0.2
636      **/

637     public void setValue(String JavaDoc value)
638     {
639         m_shh.setValue(value);
640     }
641
642
643     /**
644      * Sets the unknown value in an inlined equality condition as a variable
645      * property's name. The exported property's value will be read at comparison
646      * time.
647      * @param variable the variable whose contents will be matched
648      * @since JWare/AntX 0.2
649      **/

650     public void setVariable(String JavaDoc variable)
651     {
652         m_shh.setVariable(variable);
653     }
654
655
656     /**
657      * Synonym for {@linkplain #setVariable setVariable}.
658      **/

659     public final void setVar(String JavaDoc variable)
660     {
661         setVariable(variable);
662     }
663
664
665     /**
666      * Sets the unknown value in an inlined equality condition as a property's
667      * name. The property's value will be read at comparison time.
668      * @param property the property whose contents will be matched
669      * @since JWare/AntX 0.2
670      **/

671     public void setProperty(String JavaDoc property)
672     {
673         m_shh.setProperty(property);
674     }
675
676
677     /**
678      * Sets the unknown value in an inlined equality condition as a reference's
679      * name. The reference's (stringified) value will be read at comparison time.
680      * @param refid the reference whose contents will be matched
681      * @since JWare/AntX 0.2
682      **/

683     public void setReference(String JavaDoc refid)
684     {
685         m_shh.setReference(refid);
686     }
687
688
689 // ---------------------------------------------------------------------------------------
690

691     /**
692      * Set the case-sensitivity of this task's short-hand condition.
693      * @param ignore <i>true</i> if case insensitive
694      **/

695     public void setIgnoreCase(boolean ignore)
696     {
697         m_shh.setIgnoreCase(ignore);
698     }
699
700
701     /**
702      * Returns <i>true</i> if task's short-hand condition's ignore case
703      * option is activated.
704      * @since JWare/AntX 0.2
705      **/

706     public boolean isIgnoreCase()
707     {
708         return m_shh.isIgnoreCase();
709     }
710
711
712     /**
713      * Set the will-trim option of this task's short-hand condition
714      * @param trim <i>true</i> if condition' unknown strings will be trimmed
715      **/

716     public void setTrim(boolean trim)
717     {
718         m_shh.setTrim(trim);
719     }
720
721
722     /**
723      * Returns <i>true</i> if task's short-hand condition's trim strings
724      * option is activated.
725      * @since JWare/AntX 0.2
726      **/

727     public boolean willTrim()
728     {
729         return m_shh.willTrim();
730     }
731
732
733     /**
734      * Set the ignore-whitespace of a inlined string comparison condition.
735      * @param response <i>ignore</i> if all-whitespace should be ignored
736      * @since JWare/AntX 0.2
737      **/

738     public void setWhitespace(Handling response)
739     {
740         m_shh.setWhitespace(response);
741     }
742
743
744     /**
745      * Returns <i>true</i> if task's short-hand condition's ignore-
746      * whitespace option is activated.
747      * @since JWare/AntX 0.2
748      **/

749     public boolean ignoreWhitespace()
750     {
751         return m_shh.ignoreWhitespace();
752     }
753
754
755     /**
756      * Set the allow-synonyms modifier for this task's short-hand condition.
757      * @param allowAll <i>true</i> if boolean synonyms are allowed
758      * @since JWare/AntX 0.2
759      **/

760     public void setSynonyms(boolean allowAll)
761     {
762         m_shh.setSynonyms(allowAll);
763     }
764
765
766     /**
767      * Specifies how a property-dependent condition should treat
768      * unresolved property values.
769      * @since JWare/AntX 0.4
770      **/

771     public void setMalformed(Handling response)
772     {
773         m_shh.setMalformed(response);
774     }
775
776
777     /**
778      * Returns how property-dependent conditions will handle
779      * unresolved properties.
780      * @since JWare/AntX 0.4
781      **/

782     public Handling getMalformedHandling()
783     {
784         return m_shh.getMalformedHandling();
785     }
786
787
788     /**
789      * Specifies that a short-hand 'isnotwhitspace' should
790      * check for failed variable substitution by Ant.
791      * @since JWare/AntX 0.2
792      * @deprecated Use {@linkplain #setMalformed setMalformed}.
793      **/

794     public final void setCheckBadSubst(boolean check)
795     {
796         log(uistrs().get("cv.deprecated", getTaskName(),
797                          "checkbadsubst"), Project.MSG_WARN);
798         m_shh.setMalformed(check ? Handling.REJECT : Handling.ACCEPT);
799     }
800
801
802 // ---------------------------------------------------------------------------------------
803

804     private final ShortHandHelper m_shh = new ShortHandHelper(this);
805 }
806
807 /* end-of-PreferTask.java */
808
Popular Tags