make condition evaluator work for restricted types, which most conditions are

git-svn-id: https://svn.apache.org/repos/asf/ant/antlibs/props/trunk@916435 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/main/org/apache/ant/props/ConditionEvaluator.java b/src/main/org/apache/ant/props/ConditionEvaluator.java
index 4a5d81b..8fcb4f8 100644
--- a/src/main/org/apache/ant/props/ConditionEvaluator.java
+++ b/src/main/org/apache/ant/props/ConditionEvaluator.java
@@ -16,11 +16,16 @@
  */
 package org.apache.ant.props;
 
+import java.util.Iterator;
+import java.util.List;
 import java.util.regex.Pattern;
+
+import org.apache.tools.ant.AntTypeDefinition;
 import org.apache.tools.ant.ComponentHelper;
 import org.apache.tools.ant.IntrospectionHelper;
 import org.apache.tools.ant.Project;
 import org.apache.tools.ant.PropertyHelper;
+import org.apache.tools.ant.TypeAdapter;
 import org.apache.tools.ant.taskdefs.condition.Condition;
 
 /**
@@ -35,28 +40,62 @@
     private static final Pattern COMMA = Pattern.compile(",");
     private static final Pattern EQ = Pattern.compile("=");
 
+    /**
+     * Create a new ConditionEvaluator instance.
+     */
     public ConditionEvaluator() {
         super("^(.+?)\\(((?:(?:.+?)=(?:.+?))?(?:,(?:.+?)=(?:.+?))*?)\\)$");
     }
 
+    /**
+     * {@inheritDoc}
+     */
     protected Object evaluate(String[] groups, PropertyHelper propertyHelper) {
         Project p = propertyHelper.getProject();
-        Object instance = ComponentHelper.getComponentHelper(p)
-            .createComponent(groups[1]);
-        if (instance instanceof Condition) {
-            Condition cond = (Condition) instance;
+        Condition cond = createCondition(p, groups[1]);
+        if (cond != null) {
             if (groups[2].length() > 0) {
-                IntrospectionHelper ih =
-                    IntrospectionHelper.getHelper(instance.getClass());
+                Object realObject = TypeAdapter.class.isInstance(cond) ? ((TypeAdapter) cond)
+                        .getProxy() : cond;
+                if (realObject == null) {
+                    throw new IllegalStateException(
+                            "Found null proxy object for adapted condition " + cond.toString());
+                }
+                IntrospectionHelper ih = IntrospectionHelper.getHelper(realObject.getClass());
                 String[] attributes = COMMA.split(groups[2]);
                 for (int i = 0; i < attributes.length; i++) {
                     String[] keyValue = EQ.split(attributes[i]);
-                    ih.setAttribute(p, instance, keyValue[0].trim(),
-                                    keyValue[1].trim());
+                    ih.setAttribute(p, realObject, keyValue[0].trim(), keyValue[1].trim());
                 }
             }
             return Boolean.valueOf(cond.eval());
         }
         return null;
     }
+
+    private Condition createCondition(Project project, String type) {
+        Condition result = null;
+        ComponentHelper componentHelper = ComponentHelper.getComponentHelper(project);
+        Object o = componentHelper.createComponent(type);
+        if (o instanceof Condition) {
+            result = (Condition) o;
+        } else {
+            List restrictedDefinitions = componentHelper.getRestrictedDefinitions(type);
+            for (Iterator iter = restrictedDefinitions.iterator(); iter.hasNext();) {
+                AntTypeDefinition typeDefinition = (AntTypeDefinition) iter.next();
+                Class exposedClass = typeDefinition.getExposedClass(project);
+                if (exposedClass != null && Condition.class.isAssignableFrom(exposedClass)) {
+                    try {
+                        result = (Condition) typeDefinition.create(project);
+                        break;
+                    } catch (Exception e) {
+                        project.log("Exception creating type " + typeDefinition, e,
+                                Project.MSG_WARN);
+                    }
+                }
+            }
+        }
+        return result;
+    }
+
 }