You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ConditionalTask.java 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. /* *******************************************************************
  2. * Copyright (c) 1999-2001 Xerox Corporation,
  3. * 2002 Palo Alto Research Center, Incorporated (PARC).
  4. * All rights reserved.
  5. * This program and the accompanying materials are made available
  6. * under the terms of the Eclipse Public License v1.0
  7. * which accompanies this distribution and is available at
  8. * http://www.eclipse.org/legal/epl-v10.html
  9. *
  10. * Contributors:
  11. * Xerox/PARC initial implementation
  12. * ******************************************************************/
  13. package org.aspectj.internal.tools.ant.taskdefs;
  14. import java.util.Iterator;
  15. import java.util.List;
  16. import java.util.StringTokenizer;
  17. import java.util.Vector;
  18. import org.apache.tools.ant.BuildException;
  19. import org.apache.tools.ant.Task;
  20. @SuppressWarnings("deprecation")
  21. public abstract class ConditionalTask extends Task {
  22. public final static String TRUE = "true";
  23. private List<If> ifs;
  24. protected List<If> ifs() {
  25. return ifs != null ? ifs : (ifs = new Vector<If>());
  26. }
  27. public If createIf() {
  28. If i = new If();
  29. ifs().add(i);
  30. return i;
  31. }
  32. public If createIf(String name, String equals, boolean strict) {
  33. If i = createIf();
  34. i.setName(name);
  35. i.setEquals(equals);
  36. i.setStrict(strict);
  37. return i;
  38. }
  39. public If createIf(String name, String equals) {
  40. return createIf(name, equals, false);
  41. }
  42. public If createIf(String name) {
  43. return createIf(name, TRUE, false);
  44. }
  45. public If createIf(String name, boolean strict) {
  46. return createIf(name, TRUE, strict);
  47. }
  48. public void setIfs(String ifs) {
  49. StringTokenizer tok = new StringTokenizer(ifs, ",;: ", false);
  50. while (tok.hasMoreTokens()) {
  51. String next = tok.nextToken();
  52. int iequals = next.lastIndexOf("=");
  53. String equals;
  54. String name;
  55. boolean strict;
  56. If i = createIf();
  57. if (iequals != -1) {
  58. name = next.substring(0, iequals);
  59. equals = next.substring(iequals + 1);
  60. strict = true;
  61. } else {
  62. name = next.substring(0);
  63. equals = TRUE;
  64. strict = false;
  65. }
  66. i.setName(name);
  67. i.setEquals(equals);
  68. i.setStrict(strict);
  69. }
  70. }
  71. public void setIf(String ifStr) {
  72. setIfs(ifStr);
  73. }
  74. public class If {
  75. public If() {
  76. this(null, null);
  77. }
  78. public If(String name) {
  79. this(name, TRUE);
  80. }
  81. public If(String name, String equals) {
  82. setName(name);
  83. setEquals(equals);
  84. }
  85. private String name;
  86. public void setName(String name) {
  87. this.name = name;
  88. }
  89. public String getName() {
  90. return name;
  91. }
  92. private String equals;
  93. public void setEquals(String equals) {
  94. this.equals = equals;
  95. }
  96. public String getEquals() {
  97. return equals;
  98. }
  99. private boolean strict = false;
  100. public void setStrict(boolean strict) {
  101. this.strict = strict;
  102. }
  103. public boolean isStrict() {
  104. return strict;
  105. }
  106. public boolean isOk(String prop) {
  107. return isOk(prop, isStrict());
  108. }
  109. //XXX Need a better boolean parser
  110. public boolean isOk(String prop, boolean isStrict) {
  111. if (isStrict) {
  112. return prop != null && prop.equals(getEquals());
  113. } else {
  114. if (isOk(prop, true)) {
  115. return true;
  116. }
  117. if (prop == null || isFalse(getEquals())) {
  118. return true;
  119. }
  120. if ( (isTrue(getEquals()) && isTrue(prop)) ||
  121. (isFalse(getEquals()) && isFalse(prop)) ) {
  122. return true;
  123. }
  124. return false;
  125. }
  126. }
  127. private boolean isFalse(String prop) {
  128. return isOneOf(prop, falses) || isOneOf(prop, complement(trues));
  129. }
  130. private boolean isTrue(String prop) {
  131. return isOneOf(prop, trues) || isOneOf(prop, complement(falses));
  132. }
  133. private boolean isOneOf(String prop, String[] strings) {
  134. for (String string : strings) {
  135. if (string.equals(prop)) {
  136. return true;
  137. }
  138. }
  139. return false;
  140. }
  141. private String[] complement(String[] strings) {
  142. for (int i = 0; i < strings.length; i++) {
  143. strings[i] = "!" + strings[i];
  144. }
  145. return strings;
  146. }
  147. }
  148. final static String[] falses = { "false", "no" };
  149. final static String[] trues = { "true", "yes" };
  150. protected boolean checkIfs() {
  151. return getFalses().size() == 0;
  152. }
  153. protected List<String> getFalses() {
  154. Iterator<If> iter = ifs().iterator();
  155. List<String> result = new Vector<String>();
  156. while (iter.hasNext()) {
  157. If next = iter.next();
  158. String name = next.getName();
  159. String prop = project.getProperty(name);
  160. if (prop == null) {
  161. prop = project.getUserProperty(name);
  162. }
  163. if (!next.isOk(prop)) {
  164. result.add(name);
  165. }
  166. }
  167. return result;
  168. }
  169. public abstract void execute() throws BuildException;
  170. }