blob: d670bb4a7165850e7f487dc9ca25330466bbadf9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009, 2018 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* IBM Corporation - initial API and implementation
* Cloudsmith Inc. - converted into expression based query
*******************************************************************************/
package org.eclipse.equinox.p2.repository.artifact;
import java.util.*;
import org.eclipse.equinox.p2.metadata.IArtifactKey;
import org.eclipse.equinox.p2.metadata.VersionRange;
import org.eclipse.equinox.p2.metadata.expression.*;
import org.eclipse.equinox.p2.query.ExpressionMatchQuery;
/**
* A general purpose query for matching {@link IArtifactDescriptor} instances
* that satisfy various criteria.
*
* @since 2.0
*/
public final class ArtifactDescriptorQuery extends ExpressionMatchQuery<IArtifactDescriptor> {
private static final IExpression descriptorMatch = ExpressionUtil.parse(//
"artifactKey.id == $0 && artifactKey.version ~= $1 && ($2.empty || $2.all(x | properties[x.key] == x.value))"); //$NON-NLS-1$
private static IMatchExpression<IArtifactDescriptor> createExpression(String id, VersionRange range, String format, Map<String, String> properties) {
if (range == null)
range = VersionRange.emptyRange;
if (format != null) {
if (properties == null || properties.isEmpty())
properties = Collections.singletonMap(IArtifactDescriptor.FORMAT, format);
else {
properties = new HashMap<>(properties);
properties.put(IArtifactDescriptor.FORMAT, format);
}
} else if (properties == null)
properties = Collections.emptyMap();
IExpressionFactory factory = ExpressionUtil.getFactory();
return factory.matchExpression(descriptorMatch, id, range, properties);
}
/**
* A singleton query that will match all instances of {@link IArtifactDescriptor}.
*/
public static final ArtifactDescriptorQuery ALL_DESCRIPTORS = new ArtifactDescriptorQuery();
/**
* Clients must use {@link #ALL_DESCRIPTORS}.
*/
private ArtifactDescriptorQuery() {
//matches everything
super(IArtifactDescriptor.class, ExpressionUtil.TRUE_EXPRESSION);
}
/**
* The query will match descriptors with the given <code>id</code>, <code>versionRange</code>
* and <code>format</code>
* @param id the descriptor id to match. Can not be <code>null</code>
* @param versionRange the descriptor version range to match or <code>null</code> to match
* any version range
* @param format the descriptor {@link IArtifactDescriptor#FORMAT} value to match, or <code>null</code> to
* match any descriptor format
*/
public ArtifactDescriptorQuery(String id, VersionRange versionRange, String format) {
super(IArtifactDescriptor.class, createExpression(id, versionRange, format, null));
}
/**
* The query will match descriptors whose <code>id</code> and <code>versionRange</code>
* match the supplied key
* @param key the artifact key to match. Cannot be <code>null</code>.
*/
public ArtifactDescriptorQuery(IArtifactKey key) {
super(IArtifactDescriptor.class, createExpression(key.getId(), new VersionRange(key.getVersion(), true, key.getVersion(), true), null, null));
}
/**
* The query will match descriptors with the given <code>id</code>, <code>versionRange</code>,
* <code>format</code>, and <code>properties</code>.
* @param id the descriptor id to match. Can not be <code>null</code>
* @param versionRange the descriptor version range to match or <code>null</code> to match
* any version range
* @param format the descriptor {@link IArtifactDescriptor#FORMAT} value to match, or <code>null</code> to
* match any descriptor format
* @param properties The properties to query for
*/
public ArtifactDescriptorQuery(String id, VersionRange versionRange, String format, Map<String, String> properties) {
super(IArtifactDescriptor.class, createExpression(id, versionRange, format, properties));
}
}