diff options
author | Thomas Hallgren | 2010-03-09 22:56:48 +0000 |
---|---|---|
committer | Thomas Hallgren | 2010-03-09 22:56:48 +0000 |
commit | 4fcf6f3590cc065409c77d40f916feb0cad6c304 (patch) | |
tree | f97a818a2600a8c703191e6651a1d06fc200f7d2 | |
parent | f132871e558df2d448cf72ceeddfa1d5691da81c (diff) | |
download | rt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.tar.gz rt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.tar.xz rt.equinox.p2-4fcf6f3590cc065409c77d40f916feb0cad6c304.zip |
303469 : [discovery] Discover bundles have anonymous MatchQuery subclasses (IAE)
2 files changed, 33 insertions, 5 deletions
diff --git a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java index df8deb674..b5051bf3d 100644 --- a/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java +++ b/bundles/org.eclipse.equinox.p2.metadata/src/org/eclipse/equinox/internal/p2/metadata/index/Index.java @@ -58,10 +58,18 @@ public abstract class Index<T> implements IIndex<T> { Binary eqExpr = (Binary) targetExpr; IExpression lhs = eqExpr.lhs; IExpression rhs = eqExpr.rhs; - if (isIndexedMember(lhs, variable, memberName)) - return concatenateUnique(queriedKeys, rhs.evaluate(ctx)); - if (isIndexedMember(rhs, variable, memberName)) - return concatenateUnique(queriedKeys, lhs.evaluate(ctx)); + if (isIndexedMember(lhs, variable, memberName)) { + Object val = safeEvaluate(ctx, rhs); + if (val == null) + return null; + return concatenateUnique(queriedKeys, val); + } + if (isIndexedMember(rhs, variable, memberName)) { + Object val = safeEvaluate(ctx, lhs); + if (val == null) + return null; + return concatenateUnique(queriedKeys, val); + } // Not applicable for indexing return null; @@ -103,7 +111,12 @@ public abstract class Index<T> implements IIndex<T> { // We must evaluate the lhs to find the referenced keys // CollectionFilter cf = (CollectionFilter) targetExpr; - Iterator<?> values = cf.getOperand().evaluateAsIterator(ctx); + Iterator<?> values; + try { + values = cf.getOperand().evaluateAsIterator(ctx); + } catch (IllegalArgumentException e) { + return null; + } if (!values.hasNext()) // No keys are requested but we know that an exists must // fail at this point. An all will however succeed regardless @@ -125,4 +138,12 @@ public abstract class Index<T> implements IIndex<T> { } return null; } + + private static Object safeEvaluate(IEvaluationContext ctx, IExpression expr) { + try { + return expr.evaluate(ctx); + } catch (IllegalArgumentException e) { + return null; + } + } } diff --git a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java index 2d71470f4..c5f35eef0 100644 --- a/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java +++ b/bundles/org.eclipse.equinox.p2.tests/src/org/eclipse/equinox/p2/tests/ql/TestIndexes.java @@ -56,6 +56,13 @@ public class TestIndexes extends AbstractProvisioningTest { assertEquals(queryResultSize(result), 1); } + public void testComplexIndexMatches() throws Exception { + IMetadataRepository repo = getMDR("/testData/galileoM7"); + IQuery<IInstallableUnit> query = QueryUtil.createMatchQuery("id ~= /*.feature.group/ && properties['org.eclipse.equinox.p2.type.group'] == true && providedCapabilities.exists(p | p.namespace == 'org.eclipse.equinox.p2.iu' && p.name == id)"); + IQueryResult<IInstallableUnit> result = repo.query(query, getMonitor()); + assertEquals(queryResultSize(result), 487); + } + private IMetadataRepository getMDR(String uri) throws Exception { URI metadataRepo = getTestData("1.1", uri).toURI(); |