/******************************************************************************* * Copyright (c) 2000, 2006 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.internal.core; import java.util.ArrayList; import java.util.List; import org.eclipse.core.runtime.CoreException; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.update.core.ContentReference; import org.eclipse.update.core.IContentConsumer; import org.eclipse.update.core.IFeature; import org.eclipse.update.core.IFeatureContentConsumer; import org.eclipse.update.core.IFeatureReference; import org.eclipse.update.core.INonPluginEntry; import org.eclipse.update.core.IPluginEntry; /** * ContentConsumer Implementation for a FeatureExecutable */ public class FeatureExecutableContentConsumer extends FeatureContentConsumer { private IFeature feature; private boolean closed= false; private boolean aborted= false; private ISiteContentConsumer contentConsumer; private IFeatureContentConsumer parent = null; private List /* of IFeatureContentCOnsumer */ children; /* * @see IContentConsumer#open(INonPluginEntry) */ public IContentConsumer open(INonPluginEntry nonPluginEntry) throws CoreException { ContentConsumer cons = new NonPluginEntryContentConsumer( getContentConsumer().open(nonPluginEntry)); return cons; } /* * @see IContentConsumer#open(IPluginEntry) */ public IContentConsumer open(IPluginEntry pluginEntry) throws CoreException { ContentConsumer cons = new PluginEntryContentConsumer(getContentConsumer().open(pluginEntry)); return cons; } /* * @see IContentConsumer#addChild(IFeature) */ public void addChild(IFeature child) throws CoreException { IFeatureContentConsumer childConsumer = child.getFeatureContentConsumer(); childConsumer.setParent(this); if (children==null) children = new ArrayList(); children.add(childConsumer); return; } /* * @see IFeatureContentConsumer#store(ContentReference, IProgressMonitor) */ public void store(ContentReference contentReference, IProgressMonitor monitor) throws CoreException { getContentConsumer().store(contentReference, monitor); } /* * @see IFeatureContentConsumer#close() */ public IFeatureReference close() throws CoreException { if (!closed && getParent()!=null){ closed=true; return null; } // parent consumer, log we are about to rename // log files have been downloaded if (getParent()==null){ ErrorRecoveryLog.getLog().append(ErrorRecoveryLog.ALL_INSTALLED); } IFeatureReference ref= null; if (contentConsumer != null) ref = contentConsumer.close(); // close nested feature IFeatureContentConsumer[] children = getChildren(); for (int i = 0; i < children.length; i++) { children[i].close(); } return ref; } /* * @see IFeatureContentConsumer#setFeature(IFeature) */ public void setFeature(IFeature feature) { this.feature= feature; } /* * Sets the parent */ public void setParent(IFeatureContentConsumer featureContentConsumer) { this.parent= featureContentConsumer; } /* * returns the Content Consumer for the feature * * Right now we are the only one to implement SiteContentConsumer * Need to be exposed as API post v2.0 */ private ISiteContentConsumer getContentConsumer() throws CoreException { if (contentConsumer == null) if (feature.getSite() instanceof SiteFile) { SiteFile site= (SiteFile) feature.getSite(); contentConsumer= site.createSiteContentConsumer(feature); } else { throw new UnsupportedOperationException(); } return contentConsumer; } /* * @see IFeatureContentConsumer#abort() */ public void abort() throws CoreException { if (aborted) return; IFeatureContentConsumer[] children = getChildren(); for (int i = 0; i < children.length; i++) { try { children[i].abort(); } catch (Exception e){ //do Nothing } } // do not close plugin and non plugin content consumer // the contentConsumer will abort them // we do not need to abort the NonPluginEntryContentConsumer and PluginEntryContentConsume //implement the cleanup if (contentConsumer!=null) contentConsumer.abort(); aborted = true; } /* * @see IFeatureContentConsumer#getFeature() */ public IFeature getFeature(){ return feature; } /* * @see IFeatureContentConsumer#getParent() */ public IFeatureContentConsumer getParent(){ return parent; } /* * @see IFeatureContentConsumer#getChildren() */ public IFeatureContentConsumer[] getChildren(){ if (children==null || children.size() == 0) return new IFeatureContentConsumer[0]; return (IFeatureContentConsumer[]) children.toArray(arrayTypeFor(children)); } }