blob: d5112fd184906c3aefe994c380997bbce70f202c [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
*******************************************************************************/
package org.eclipse.equinox.p2.internal.repository.tools.tasks;
import java.util.*;
import org.apache.tools.ant.types.DataType;
import org.eclipse.equinox.p2.internal.repository.tools.Activator;
import org.eclipse.equinox.p2.metadata.IInstallableUnit;
import org.eclipse.equinox.p2.metadata.Version;
import org.eclipse.equinox.p2.query.IQuery;
import org.eclipse.equinox.p2.query.QueryUtil;
import org.osgi.framework.Filter;
import org.osgi.framework.InvalidSyntaxException;
/**
* @since 1.0
*/
public class IUDescription extends DataType {
static private final String QUERY_PROPERTY = "property"; //$NON-NLS-1$
static private final String QUERY_NAME = "name"; //$NON-NLS-1$
static private final String QUERY_VALUE = "value"; //$NON-NLS-1$
static private final String ANT_PREFIX = "${"; //$NON-NLS-1$
private String id;
private String version;
private String queryString;
private boolean required = true;
private String artifactFilter = null;
public IUDescription() {
super();
}
public void setId(String value) {
if (value != null && !value.startsWith(ANT_PREFIX))
this.id = value;
}
public void setVersion(String value) {
if (value != null && !value.startsWith(ANT_PREFIX))
this.version = value;
}
public void setQuery(String query) {
if (query != null && !query.startsWith(ANT_PREFIX))
this.queryString = query;
}
public void setArtifacts(String filter) {
if (filter != null && !filter.startsWith(ANT_PREFIX))
this.artifactFilter = filter;
}
public Filter getArtifactFilter() throws InvalidSyntaxException {
if (artifactFilter != null)
return Activator.getBundleContext().createFilter(artifactFilter);
return null;
}
public void setRequired(boolean required) {
this.required = required;
}
public boolean isRequired() {
return required;
}
public String getQueryString() {
return queryString;
}
public String getId() {
return id;
}
public String getVersion() {
return version;
}
@Override
public String toString() {
StringBuilder buffer = new StringBuilder("Installable Unit ["); //$NON-NLS-1$
if (id != null) {
buffer.append(" id="); //$NON-NLS-1$
buffer.append(id);
}
if (version != null) {
buffer.append(" version="); //$NON-NLS-1$
buffer.append(version);
}
if (queryString != null) {
buffer.append(" query="); //$NON-NLS-1$
buffer.append(queryString);
}
buffer.append(" ]"); //$NON-NLS-1$
return buffer.toString();
}
public IQuery<IInstallableUnit> createQuery() {
List<IQuery<IInstallableUnit>> queries = new ArrayList<>();
if (id != null) {
if (version == null || version.length() == 0) {
// Get the latest version of the iu
queries.add(QueryUtil.createLatestQuery(QueryUtil.createIUQuery(id)));
} else {
Version iuVersion = Version.parseVersion(version);
queries.add(QueryUtil.createIUQuery(id, iuVersion));
}
}
IQuery<IInstallableUnit> iuQuery = processQueryString();
if (iuQuery != null)
queries.add(iuQuery);
if (queries.size() == 1)
return queries.get(0);
IQuery<IInstallableUnit> query = QueryUtil.createPipeQuery(queries);
return query;
}
private IQuery<IInstallableUnit> processQueryString() {
if (queryString == null)
return null;
int startIdx = queryString.indexOf('[');
int endIdx = queryString.lastIndexOf(']');
if (startIdx == -1 || endIdx == -1 || endIdx < startIdx)
return null;
String element = queryString.substring(0, startIdx);
Map<String, String> attributes = processQueryAttributes(queryString.substring(startIdx + 1, endIdx));
if (element.equals(QUERY_PROPERTY)) {
String name = attributes.get(QUERY_NAME);
String value = attributes.get(QUERY_VALUE);
if (name == null)
return null;
if (value == null)
value = QueryUtil.ANY;
return QueryUtil.createIUPropertyQuery(name, value);
}
return null;
}
private Map<String, String> processQueryAttributes(String attributes) {
if (attributes == null || attributes.length() == 0)
return Collections.emptyMap();
Map<String, String> result = new HashMap<>();
int start = 0;
int idx = 0;
while ((idx = attributes.indexOf('@', start)) > -1) {
int equals = attributes.indexOf('=', idx);
int startQuote = attributes.indexOf('\'', equals);
int endQuote = attributes.indexOf('\'', startQuote + 1);
if (equals == -1 || startQuote <= equals || endQuote <= startQuote)
break;
String key = attributes.substring(idx + 1, equals).trim();
String value = attributes.substring(startQuote + 1, endQuote);
result.put(key, value);
start = endQuote + 1;
}
return result;
}
}