/******************************************************************************* * Copyright (c) 2000, 2010 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.update.core; import java.net.MalformedURLException; import java.net.URL; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.osgi.util.NLS; import org.eclipse.update.core.model.FeatureReferenceModel; import org.eclipse.update.core.model.SiteModel; import org.eclipse.update.internal.core.FeatureTypeFactory; import org.eclipse.update.internal.core.Messages; import org.eclipse.update.internal.core.UpdateCore; /** * Convenience implementation of a feature reference. * <p> * This class may be instantiated or subclassed by clients. * </p> * <p> * <b>Note:</b> This class/interface is part of an interim API that is still under development and expected to * change significantly before reaching stability. It is being made available at this early stage to solicit feedback * from pioneering adopters on the understanding that any code that uses this API will almost certainly be broken * (repeatedly) as the API evolves. * </p> * @see org.eclipse.update.core.IFeatureReference * @see org.eclipse.update.core.model.FeatureReferenceModel * @since 2.0 * @deprecated The org.eclipse.update component has been replaced by Equinox p2. * This API will be deleted in a future release. See bug 311590 for details. */ public class FeatureReference extends FeatureReferenceModel implements IFeatureReference, IPlatformEnvironment { private VersionedIdentifier versionId; //PERF: new instance variable private IFeature exactFeature; /** * Feature reference default constructor */ public FeatureReference() { super(); } /** * Constructor FeatureReference. * @param ref the reference to copy */ public FeatureReference(IFeatureReference ref) { super((FeatureReferenceModel) ref); try { setURL(ref.getURL()); } catch (CoreException e) { UpdateCore.warn("", e); //$NON-NLS-1$ } } /** * Constructor FeatureReference. * @param ref the reference to copy */ public FeatureReference(FeatureReferenceModel ref) { super(ref); try { setURL(ref.getURL()); } catch (CoreException e) { UpdateCore.warn("", e); //$NON-NLS-1$ } } /** * Returns the feature this reference points to * @return the feature on the Site * @deprecated use getFeaure(IProgressMonitor) */ public IFeature getFeature() throws CoreException { return getFeature(null); } /** * Returns the feature this reference points to * @return the feature on the Site */ public IFeature getFeature(IProgressMonitor monitor) throws CoreException { if (exactFeature != null) return exactFeature; exactFeature = getFeature(this,monitor); return exactFeature; } /** * Returns the feature the reference points to * @param ref the feature reference * @return the feature on the Site */ protected IFeature getFeature(IFeatureReference ref,IProgressMonitor monitor) throws CoreException { IFeature feature = null; URL refURL = ref.getURL(); feature = createFeature(refURL,monitor); return feature; } /* * create an instance of a concrete feature corresponding to this reference */ private IFeature createFeature(URL url,IProgressMonitor monitor) throws CoreException { String type = getType(); ISite site = getSite(); // if the site exists, use the site factory if (site != null) { return site.createFeature(type, url, monitor); } IFeatureFactory factory = FeatureTypeFactory.getInstance().getFactory(type); return factory.createFeature(url, site, monitor); } /** * Returns the update site for the referenced feature * * @see IFeatureReference#getSite() * @since 2.0 */ public ISite getSite() { return (ISite) getSiteModel(); } /** * Sets the feature reference URL. * This is typically performed as part of the feature reference creation * operation. Once set, the url should not be reset. * * @see IFeatureReference#setURL(URL) * @since 2.0 */ public void setURL(URL url) throws CoreException { if (url != null) { setURLString(url.toExternalForm()); try { resolve(url, null); } catch (MalformedURLException e) { throw Utilities.newCoreException(NLS.bind(Messages.FeatureReference_UnableToResolveURL, (new String[] { url.toExternalForm() })), e); } } } /** * Associates a site with the feature reference. * This is typically performed as part of the feature reference creation * operation. Once set, the site should not be reset. * * @see IFeatureReference#setSite(ISite) * @since 2.0 */ public void setSite(ISite site) { setSiteModel((SiteModel) site); } /** * Returns the feature identifier. * * @see IFeatureReference#getVersionedIdentifier() * @since 2.0 */ public VersionedIdentifier getVersionedIdentifier() { if (versionId != null) return versionId; String id = getFeatureIdentifier(); String ver = getFeatureVersion(); if (id != null && ver != null) { try { versionId = new VersionedIdentifier(id, ver); return versionId; } catch (Exception e) { UpdateCore.warn("Unable to create versioned identifier:" + id + ":" + ver); //$NON-NLS-1$ //$NON-NLS-2$ } } // we need the exact match or we may have an infinite loop versionId = new VersionedIdentifier(getURL().toExternalForm(), null); try { versionId = getFeature(null).getVersionedIdentifier(); } catch (CoreException e) { UpdateCore.warn("", e); //$NON-NLS-1$ } return versionId; } /** * @see org.eclipse.update.core.IFeatureReference#getName() */ public String getName() { if (super.getLabel() != null) return super.getLabel(); try { return getFeature(null).getLabel(); } catch (CoreException e) { return getVersionedIdentifier().toString(); } } /** * Get optional operating system specification as a comma-separated string. * * @return the operating system specification string, or <code>null</code>. * @since 2.1 */ public String getOS() { if (super.getOS() == null && getURL()!=null) try { return getFeature(null).getOS(); } catch (CoreException e) { return null; } return super.getOS(); } /** * Get optional windowing system specification as a comma-separated string. * * @return the windowing system specification string, or <code>null</code>. * @since 2.1 */ public String getWS() { if (super.getWS() == null && getURL()!=null) try { return getFeature(null).getWS(); } catch (CoreException e) { return null; } return super.getWS(); } /** * Get optional system architecture specification as a comma-separated string. * * @return the system architecture specification string, or <code>null</code>. * @since 2.1 */ public String getOSArch() { if (super.getOSArch() == null && getURL()!=null) try { return getFeature(null).getOSArch(); } catch (CoreException e) { return null; } return super.getOSArch(); } /** * Get optional locale specification as a comma-separated string. * * @return the locale specification string, or <code>null</code>. * @since 2.1 */ public String getNL() { if (super.getNL() == null && getURL()!=null) try { return getFeature(null).getNL(); } catch (CoreException e) { return null; } return super.getNL(); } /** * Returns <code>true</code> if this feature is patching another feature, * <code>false</code> otherwise * @return boolean */ public boolean isPatch() { if (super.getPatch() == null) try { return getFeature(null).isPatch(); } catch (CoreException e) { return false; } return "true".equalsIgnoreCase(super.getPatch()); //$NON-NLS-1$ } }