blob: 8be3de90d875246781d30c24e431bbef9df4dbb9 [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2009 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* 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.internal.provisional.p2.core.Version;
import org.eclipse.equinox.internal.provisional.p2.metadata.query.*;
import org.eclipse.equinox.internal.provisional.p2.query.CompositeQuery;
import org.eclipse.equinox.internal.provisional.p2.query.Query;
/**
* @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;
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 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;
}
public String toString() {
StringBuffer buffer = new StringBuffer("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 Query createQuery() {
List queries = new ArrayList();
if (id != null) {
if (version == null || version.length() == 0) {
// Get the latest version of the iu
queries.add(new InstallableUnitQuery(id));
queries.add(new LatestIUVersionQuery());
} else {
Version iuVersion = Version.parseVersion(version);
queries.add(new InstallableUnitQuery(id, iuVersion));
}
}
Query iuQuery = processQueryString();
if (iuQuery != null)
queries.add(iuQuery);
if (queries.size() == 1)
return (Query) queries.get(0);
return new CompositeQuery((Query[]) queries.toArray(new Query[queries.size()]));
}
private Query 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 attributes = processQueryAttributes(queryString.substring(startIdx + 1, endIdx));
if (element.equals(QUERY_PROPERTY)) {
String name = (String) attributes.get(QUERY_NAME);
String value = (String) attributes.get(QUERY_VALUE);
if (name == null)
return null;
return new IUPropertyQuery(name, value);
}
return null;
}
private Map processQueryAttributes(String attributes) {
if (attributes == null || attributes.length() == 0)
return Collections.EMPTY_MAP;
Map 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;
}
}