Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
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.java45
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) {

Back to the top