diff options
Diffstat (limited to 'bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java')
-rw-r--r-- | bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java index ab08fffed..5af889ac7 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/expression/Member.java @@ -11,6 +11,7 @@ package org.eclipse.equinox.internal.p2.metadata.expression; import java.lang.reflect.*; +import java.util.*; import org.eclipse.equinox.p2.metadata.expression.*; /** @@ -103,6 +104,50 @@ public abstract class Member extends Unary { } } + public static class LengthMember extends Member { + private static final Integer ZERO = new Integer(0); + + LengthMember(Expression operand) { + super(operand, "length", Expression.emptyArray); //$NON-NLS-1$ + } + + public Object evaluate(IEvaluationContext context) { + int len = getLength(operand.evaluate(context)); + return len == 0 ? ZERO : new Integer(len); + } + + int getLength(Object val) { + if (val == null) + return 0; + + if (val.getClass().isArray()) + return Array.getLength(val); + + if (val instanceof Collection<?>) + return ((Collection<?>) val).size(); + + if (val instanceof String) + return ((String) val).length(); + + if (val instanceof Map<?, ?>) + return ((Map<?, ?>) val).size(); + + return 0; + } + } + + public static class EmptyMember extends LengthMember { + EmptyMember(Expression operand) { + super(operand); + } + + public Object evaluate(IEvaluationContext context) { + Object val = operand.evaluate(context); + boolean empty = (val instanceof Iterator<?>) ? !((Iterator<?>) val).hasNext() : getLength(val) == 0; + return Boolean.valueOf(empty); + } + } + static final Object[] NO_ARGS = new Object[0]; static Member createDynamicMember(Expression operand, String name) { |