/******************************************************************************* * Copyright (c) 2004, 2006 * Thomas Hallgren, Kenneth Olwing, Mitch Sonies * Pontus Rydin, Nils Unden, Peer Torngren * The code, documentation and other materials contained herein have been * licensed under the Eclipse Public License - v 1.0 by the individual * copyright holders listed above, as Initial Contributors under such license. * The text of such license is available at www.eclipse.org. *******************************************************************************/ package org.eclipse.buckminster.core.version; import java.util.Map; import org.eclipse.buckminster.core.cspec.builder.CSpecBuilder; import org.eclipse.buckminster.core.cspec.model.ComponentRequest; import org.eclipse.buckminster.core.ctype.IComponentType; import org.eclipse.buckminster.core.metadata.builder.ResolutionBuilder; import org.eclipse.buckminster.core.reader.IComponentReader; import org.eclipse.buckminster.core.reader.IReaderType; import org.eclipse.buckminster.core.resolver.NodeQuery; import org.eclipse.buckminster.core.rmap.model.Provider; import org.eclipse.buckminster.core.rmap.model.ProviderScore; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.ecf.core.security.IConnectContext; /** * A <code>VersionSelectorMatch</code> is the result of a comparison between a * desired version and an existing version using a specific {@link MatchRule}. * The rule denoted in a <code>VersionSelectorMatch</code> is often tighter then * the rule expressed as a rule when the match was performed. * * @author Thomas Hallgren */ public final class ProviderMatch implements Comparable<ProviderMatch> { private IComponentType componentType; private final Provider originalProvider; private Provider provider; private final ProviderScore providerScore; private final NodeQuery query; private VersionMatch versionMatch; private Map<String, String> matcherMap; private String repositoryURI; public ProviderMatch(Provider provider, IComponentType componentType, VersionMatch versionMatch, NodeQuery query) { this(provider, componentType, versionMatch, ProviderScore.PREFERRED, query); } public ProviderMatch(Provider provider, IComponentType componentType, VersionMatch versionMatch, ProviderScore providerScore, NodeQuery query) { this.provider = provider; this.originalProvider = provider; this.componentType = componentType; this.versionMatch = versionMatch == null ? VersionMatch.DEFAULT : versionMatch; this.providerScore = providerScore; this.query = query; } /** * Compare this match to another match. * * @param o * The match to compare to. * @return 1 if this instance is considered a better match than * <code>o</code>, -1 if it's the opposite and 0 if the matches are * considered equal. */ @Override public int compareTo(ProviderMatch o) { int versionCompare = query.compare(versionMatch, o.getVersionMatch()); return versionCompare == 0 ? providerScore.compareTo(o.getProviderScore()) : versionCompare; } /** * Create a CSPEC builder that is initialized with the name, type, and * version from this match. * * @return The initialized builder */ public CSpecBuilder createCSpec() { CSpecBuilder bld = new CSpecBuilder(); ComponentRequest request = query.getComponentRequest(); bld.setName(request.getName()); bld.setComponentTypeID(request.getComponentTypeID()); bld.setVersion(versionMatch.getVersion()); return bld; } public ResolutionBuilder createResolution(CSpecBuilder cspecBuilder, boolean unpack) throws CoreException { ResolutionBuilder resBld = new ResolutionBuilder(cspecBuilder); NodeQuery nq = getNodeQuery(); resBld.setMaterializable(true); resBld.setComponentTypeId(getComponentType().getId()); resBld.getRequest().initFrom(nq.getComponentRequest()); resBld.setAttributes(nq.getRequiredAttributes()); resBld.setProvider(getProvider()); resBld.setVersionMatch(getVersionMatch()); resBld.setRepository(getRepositoryURI()); resBld.setUnpack(unpack); return resBld; } public String getComponentName() { return query.getComponentRequest().getName(); } public IComponentType getComponentType() { return componentType; } public IConnectContext getConnectContext() { IConnectContext cctx = provider.getConnectContext(query.getProperties()); if (cctx == null) cctx = getNodeQuery().getComponentQuery().getConnectContext(); return cctx; } public Map<String, String> getMatcherMap() { return matcherMap; } public NodeQuery getNodeQuery() { return query; } public Provider getOriginalProvider() { return originalProvider; } /** * Returns the provider that matched the request. * * @return the provider that matched */ public Provider getProvider() { return provider; } /** * Get the provider score for this match. The provider score is determined * comparing the MutableLevel and SourceLevel with the corresponding * settings of a provider. * * @return the provider score. */ public final ProviderScore getProviderScore() { return providerScore; } /** * Returns the query used when the math was created. * * @return the query that was used. */ public NodeQuery getQuery() { return query; } /** * Returns a reader initialized to materialize based on this match * * @return * @throws CoreException */ public IComponentReader getReader(IProgressMonitor monitor) throws CoreException { return getReaderType().getReader(this, monitor); } public IReaderType getReaderType() throws CoreException { return provider.getReaderType(); } public synchronized String getRepositoryURI() { if (repositoryURI == null) repositoryURI = provider.getURI(query.getProperties()); return repositoryURI; } public String getUniqueKey() { StringBuilder bld = new StringBuilder(); bld.append(provider.getId()); bld.append('['); ComponentRequest rq = query.getComponentRequest(); bld.append(rq.getName()); String type = rq.getComponentTypeID(); if (type != null) { bld.append(':'); bld.append(type); } versionMatch.toString(bld); bld.append(']'); return bld.toString(); } public IVersionConverter getVersionConverter() throws CoreException { return provider.getVersionConverter(); } /** * Returns the version that matched the requirement. * * @return the version that matched */ public VersionMatch getVersionMatch() { return versionMatch; } public void setComponentType(IComponentType componentType) { this.componentType = componentType; } public void setMatcherMap(Map<String, String> matcherMap) { this.matcherMap = matcherMap; } public synchronized void setProvider(Provider provider) { this.provider = provider; this.repositoryURI = null; } public synchronized void setRepositoryURI(String repositoryURI) { this.repositoryURI = repositoryURI; } public void setVersionMatch(VersionMatch versionMatch) { this.versionMatch = versionMatch; } /** * Returns a string representation of the match. Only intended for debug * purposes * * @return A string representation of the match */ @Override public String toString() { return getUniqueKey(); } }