/*******************************************************************************
 * Copyright (c) 2000, 2004 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.tests.implementation;

import java.io.InputStream;
import java.net.URL;

import org.eclipse.core.runtime.CoreException;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.update.configuration.*;
import org.eclipse.update.core.*;
import org.eclipse.update.core.IFeature;
import org.eclipse.update.core.IFeatureReference;
import org.eclipse.update.core.IPluginEntry;
import org.eclipse.update.core.IURLEntry;
import org.eclipse.update.core.model.InstallAbortedException;
import org.eclipse.update.internal.core.*;

public class SiteFTP implements ISite {

	private URL url;
	public SiteFTP(URL url){
		this.url = url;
	}

	/*
	 * @see ISite#getFeatureReferences()
	 */
	public ISiteFeatureReference[] getFeatureReferences() {
		return null;
	}

	/*
	 * @see ISite#install(IFeature, FeatureVerification verifier,IProgressMonitor)
	 */
	public IFeatureReference install(IFeature feature,IVerificationListener verificationListener, IProgressMonitor monitor) throws CoreException {
		return null;
	}

	/*
	 * @see ISite#remove(IFeature, IProgressMonitor)
	 */
	public void remove(IFeature feature, IProgressMonitor monitor) throws CoreException {
	}

	/*
	 * @see ISite#addSiteChangedListener(IConfiguredSiteChangedListener)
	 */
	public void addSiteChangedListener(IConfiguredSiteChangedListener listener) {
	}

	/*
	 * @see ISite#removeSiteChangedListener(IConfiguredSiteChangedListener)
	 */
	public void removeSiteChangedListener(IConfiguredSiteChangedListener listener) {
	}

	/*
	 * @see ISite#getURL()
	 */
	public URL getURL() {
		return url;
	}

	/*
	 * @see ISite#getType()
	 */
	public String getType() {
		return "org.eclipse.update.tests.ftp";
	}

	/*
	 * @see ISite#getCategories()
	 */
	public ICategory[] getCategories() {
		return null;
	}

	/*
	 * @see ISite#getArchives()
	 */
	public IArchiveReference[] getArchives() {
		return null;
	}
 
	/*
	 * @see ISite#addCategory(ICategory)
	 */
	public void addCategory(ICategory category) {
	}

	/*
	 * @see ISite#save()
	 */
	public void save() throws CoreException {
	}

	/*
	 * @see IPluginContainer#getPluginEntries()
	 */
	public IPluginEntry[] getPluginEntries() {
		return null;
	}

	/*
	 * @see IPluginContainer#getPluginEntryCount()
	 */
	public int getPluginEntryCount() {
		return 0;
	}

	/*
	 * @see ISite#getDownloadSizeFor(IFeature)
	 */
	public long getDownloadSizeFor(IFeature feature) {
		return 0;
	}

	/*
	 * @see ISite#getInstallSizeFor(IFeature)
	 */
	public long getInstallSizeFor(IFeature feature) {
		return 0;
	}


	/*
	 * @see IPluginContainer#store(IPluginEntry, String, InputStream)
	 */
	public void store(IPluginEntry entry, String name, InputStream inStream) throws CoreException {
	}

	/*
	 * @see IAdaptable#getAdapter(Class)
	 */
	public Object getAdapter(Class adapter) {
		return null;
	}

	/*
	 * @see IPluginContainer#remove(IPluginEntry)
	 */
	public void remove(IPluginEntry entry) throws CoreException {
	}

	/*
	 * @see ISite#setSiteContentConsumer(ISiteContentConsumer)
	 */
	public void setSiteContentConsumer(ISiteContentConsumer contentConsumer) {
	}

	/*
	 * @see ISite#setSiteContentProvider(ISiteContentProvider)
	 */
	public void setSiteContentProvider(ISiteContentProvider siteContentProvider) {
	}

	/*
	 * @see ISite#getSiteContentProvider()
	 */
	public ISiteContentProvider getSiteContentProvider() {
		return null;
	}

	/*
	 * @see ISite#getDefaultPackagedFeatureType()
	 */
	public String getDefaultPackagedFeatureType() {
		return null;
	}

	/*
	 * @see ISite#store(IFeature, String, InputStream, IProgressMonitor)
	 */
	public void store(IFeature feature, String name, InputStream inStream, IProgressMonitor monitor) throws CoreException {
	}


	/*
	 * @see IPluginContainer#remove(IPluginEntry, IProgressMonitor)
	 */
	public void remove(IPluginEntry entry, IProgressMonitor monitor) throws CoreException {
	}

	/*
	 * @see ISite#getCategory(String)
	 */
	public ICategory getCategory(String key) {
		return null;
	}

	/*
	 * @see ISite#createSiteContentConsumer(IFeature)
	 */
	public ISiteContentConsumer createSiteContentConsumer(IFeature feature) throws CoreException {
		return null;
	}

	/*
	 * @see ISite#getFeatureReference(IFeature)
	 */
	public ISiteFeatureReference getFeatureReference(IFeature feature) {
		return null;
	}

	/*
	 * @see ISite#getDescription()
	 */
	public IURLEntry getDescription() {
		return null;
	}

	/*
	 * @see ISite#getPluginEntriesOnlyReferencedBy(IFeature)
	 */
	public IPluginEntry[] getPluginEntriesOnlyReferencedBy(IFeature feature) throws CoreException {
		return null;
	}

	/**
	 * @see ISite#addPluginEntry(IPluginEntry)
	 */
	public void addPluginEntry(IPluginEntry pluginEntry) {
	}

	/**
	 * @see org.eclipse.update.core.ISite#install(IFeature, IFeatureReference[], IVerificationListener, IProgressMonitor)
	 */
	public IFeatureReference install(IFeature feature, IFeatureReference[] optionalfeatures, IVerificationListener verificationListener, IProgressMonitor monitor) throws InstallAbortedException, CoreException {
		return null;
	}


	public IConfiguredSite getCurrentConfiguredSite() {
		return null;
	}

	public IFeature createFeature(String type, URL url) throws CoreException {
		return null;
	}

	/**
	 * @see org.eclipse.update.core.ISite#createFeature(java.lang.String, java.net.URL, org.eclipse.core.runtime.IProgressMonitor)
	 */
	public IFeature createFeature(String type, URL url, IProgressMonitor monitor) throws CoreException {
		return null;
	}


	/**
	 * @see org.eclipse.update.core.ISite#getRawFeatureReferences()
	 */
	public ISiteFeatureReference[] getRawFeatureReferences() {
		return null;
	}


	/* (non-Javadoc)
	 * @see org.eclipse.update.core.ISite#getMirrorSiteEntries()
	 */
	public IURLEntry[] getMirrorSiteEntries() throws CoreException {
		return null;
	}
}
