| /******************************************************************************* |
| * 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)); |
| } |
| } |