aboutsummaryrefslogtreecommitdiffstats
path: root/build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java
diff options
context:
space:
mode:
Diffstat (limited to 'build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java')
-rw-r--r--build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java182
1 files changed, 182 insertions, 0 deletions
diff --git a/build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java b/build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java
new file mode 100644
index 000000000..8b5184121
--- /dev/null
+++ b/build/src/org/aspectj/internal/tools/ant/taskdefs/ConditionalTask.java
@@ -0,0 +1,182 @@
+/* *******************************************************************
+ * Copyright (c) 1999-2001 Xerox Corporation,
+ * 2002 Palo Alto Research Center, Incorporated (PARC).
+ * All rights reserved.
+ * This program and the accompanying materials are made available
+ * under the terms of the Common Public License v1.0
+ * which accompanies this distribution and is available at
+ * http://www.eclipse.org/legal/cpl-v10.html
+ *
+ * Contributors:
+ * Xerox/PARC initial implementation
+ * ******************************************************************/
+
+package org.aspectj.internal.tools.ant.taskdefs;
+
+import org.apache.tools.ant.*;
+import java.util.*;
+
+public abstract class ConditionalTask extends Task {
+
+ public final static String TRUE = "true";
+
+ private List ifs;
+ protected List ifs() {
+ return ifs != null ? ifs : (ifs = new Vector());
+ }
+
+ public If createIf() {
+ If i = new If();
+ ifs().add(i);
+ return i;
+ }
+
+ public If createIf(String name, String equals, boolean strict) {
+ If i = createIf();
+ i.setName(name);
+ i.setEquals(equals);
+ i.setStrict(strict);
+ return i;
+ }
+
+ public If createIf(String name, String equals) {
+ return createIf(name, equals, false);
+ }
+
+ public If createIf(String name) {
+ return createIf(name, TRUE, false);
+ }
+
+ public If createIf(String name, boolean strict) {
+ return createIf(name, TRUE, strict);
+ }
+
+ public void setIfs(String ifs) {
+ StringTokenizer tok = new StringTokenizer(ifs, ",;: ", false);
+ while (tok.hasMoreTokens()) {
+ String next = tok.nextToken();
+ int iequals = next.lastIndexOf("=");
+ String equals;
+ String name;
+ boolean strict;
+ If i = createIf();
+ if (iequals != -1) {
+ name = next.substring(0, iequals);
+ equals = next.substring(iequals + 1);
+ strict = true;
+ } else {
+ name = next.substring(0);
+ equals = TRUE;
+ strict = false;
+ }
+ i.setName(name);
+ i.setEquals(equals);
+ i.setStrict(strict);
+ }
+ }
+
+ public void setIf(String ifStr) {
+ setIfs(ifStr);
+ }
+
+ public class If {
+ public If() {
+ this(null, null);
+ }
+ public If(String name) {
+ this(name, TRUE);
+ }
+ public If(String name, String equals) {
+ setName(name);
+ setEquals(equals);
+ }
+ private String name;
+ public void setName(String name) {
+ this.name = name;
+ }
+ public String getName() {
+ return name;
+ }
+ private String equals;
+ public void setEquals(String equals) {
+ this.equals = equals;
+ }
+ public String getEquals() {
+ return equals;
+ }
+ private boolean strict = false;
+ public void setStrict(boolean strict) {
+ this.strict = strict;
+ }
+ public boolean isStrict() {
+ return strict;
+ }
+ public boolean isOk(String prop) {
+ return isOk(prop, isStrict());
+ }
+ //XXX Need a better boolean parser
+ public boolean isOk(String prop, boolean isStrict) {
+ if (isStrict) {
+ return prop != null && prop.equals(getEquals());
+ } else {
+ if (isOk(prop, true)) {
+ return true;
+ }
+ if (prop == null || isFalse(getEquals())) {
+ return true;
+ }
+ if ( (isTrue(getEquals()) && isTrue(prop)) ||
+ (isFalse(getEquals()) && isFalse(prop)) ) {
+ return true;
+ }
+ return false;
+ }
+ }
+ private boolean isFalse(String prop) {
+ return isOneOf(prop, falses) || isOneOf(prop, complement(trues));
+ }
+ private boolean isTrue(String prop) {
+ return isOneOf(prop, trues) || isOneOf(prop, complement(falses));
+ }
+ private boolean isOneOf(String prop, String[] strings) {
+ for (int i = 0; i < strings.length; i++) {
+ if (strings[i].equals(prop)) {
+ return true;
+ }
+ }
+ return false;
+ }
+ private String[] complement(String[] strings) {
+ for (int i = 0; i < strings.length; i++) {
+ strings[i] = "!" + strings[i];
+ }
+ return strings;
+ }
+ }
+
+ final static String[] falses = { "false", "no" };
+ final static String[] trues = { "true", "yes" };
+
+ protected boolean checkIfs() {
+ return getFalses().size() == 0;
+ }
+
+ protected List getFalses() {
+ Iterator iter = ifs().iterator();
+ List result = new Vector();
+ while (iter.hasNext()) {
+ If next = (If) iter.next();
+ String name = next.getName();
+ String prop = project.getProperty(name);
+ if (prop == null) {
+ prop = project.getUserProperty(name);
+ }
+ if (!next.isOk(prop)) {
+ result.add(name);
+ }
+ }
+ return result;
+ }
+
+ public abstract void execute() throws BuildException;
+}