/*******************************************************************************
 * Copyright (c) 2001, 2005 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.jst.j2ee.commonarchivecore.internal.impl;



import java.util.Collection;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.common.notify.NotificationChain;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.ecore.EClass;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.InternalEObject;
import org.eclipse.emf.ecore.util.EObjectContainmentWithInverseEList;
import org.eclipse.emf.ecore.util.InternalEList;
import org.eclipse.jst.j2ee.commonarchivecore.internal.CommonarchivePackage;
import org.eclipse.jst.j2ee.commonarchivecore.internal.Container;
import org.eclipse.jst.j2ee.commonarchivecore.internal.File;
import org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy;
import org.eclipse.jst.j2ee.commonarchivecore.internal.util.ArchiveUtil;


/**
 * @generated
 */
public abstract class ContainerImpl extends FileImpl implements Container {


	/**
	 * Inner class which maintains the index for the domain's collection of nodes keyed by name.
	 */
	protected class FileNotificationAdapter extends AdapterImpl {
		public boolean isAdapterForType(Object type) {
			return (type == "FileNotificationAdapter");//$NON-NLS-1$
		}

		public void addIndexedFile(String newValue, Notifier notifier) {
			fileIndex.put(newValue, notifier);
			if (notifier.eAdapters() == null || !notifier.eAdapters().contains(this))
				notifier.eAdapters().add(this);
		}

		public void removeIndexedFile(String oldValue, Notifier notifier) {
			fileIndex.remove(oldValue);
			notifier.eAdapters().remove(this);
		}

		public void notifyChanged(Notification notification) {
			if (fileIndex == null || notification.getFeature() == null)
				return;
			//If the name changed, update the index
			if (notification.getFeature().equals(CommonarchivePackage.eINSTANCE.getFile_URI()) && ((File) notification.getNotifier()).getContainer() == ContainerImpl.this) {
				fileIndex.remove(notification.getOldValue());
				fileIndex.put(notification.getNewValue(), notification.getNotifier());
			}
			//Handle adds and removes
			if (notification.getFeature().equals(CommonarchivePackage.eINSTANCE.getContainer_Files()) && notification.getNotifier() == ContainerImpl.this) {
				switch (notification.getEventType()) {
					case Notification.ADD : {
						File file = (File) notification.getNewValue();
						addIndexedFile(file.getURI(), file);
						break;
					}
					case Notification.REMOVE : {
						removeIndexedFile(((File) notification.getOldValue()).getURI(), (File) notification.getOldValue());
						break;
					}
					case Notification.ADD_MANY : {
						filesAdded((List) notification.getNewValue());
						break;
					}
					case Notification.REMOVE_MANY : {
						filesRemoved((List) notification.getOldValue());
						break;
					}
					case Notification.MOVE : {
						break;
					}
					case Notification.SET : {
						if (notification.getPosition() != Notification.NO_INDEX) { //This is now a
																				   // replace in
																				   // MOF2
							File file = (File) notification.getNewValue();
							removeIndexedFile(((File) notification.getOldValue()).getURI(), (File) notification.getOldValue());
							addIndexedFile(file.getURI(), file);
						}
						break;
					}
				}
			}
		}

		public void filesAdded(List newFiles) {
			for (int i = 0; i < newFiles.size(); i++) {
				File file = (File) newFiles.get(i);
				addIndexedFile(file.getURI(), file);
			}
		}

		public void filesRemoved(List oldFiles) {
			for (int i = 0; i < oldFiles.size(); i++) {
				File file = (File) oldFiles.get(i);
				removeIndexedFile(file.getURI(), file);
			}
		}

		public void rebuildFileIndex() {
			removeAdaptersIfNecessary();
			fileIndex = new HashMap();

			// If the primary collection already has elements,
			//'reflect them in the index...
			if (getFiles().size() > 0) {
				Iterator i = getFiles().iterator();
				while (i.hasNext()) {
					File file = (File) i.next();
					addIndexedFile(file.getURI(), file);
				}
			}
		}

		public void removeAdaptersIfNecessary() {
			if (fileIndex == null)
				return;
			Iterator iter = fileIndex.values().iterator();
			while (iter.hasNext()) {
				File aFile = (File) iter.next();
				aFile.eAdapters().remove(this);
			}
		}
	}

	/** Implementer for loading entries in this container */
	protected LoadStrategy loadStrategy;
	/**
	 * Index to provide fast lookup by name of files.
	 */
	protected Map fileIndex;
	/**
	 * An adapter which maintains the file index
	 */
	protected FileNotificationAdapter fileIndexAdapter;
	/**
	 * @generated This field/method will be replaced during code generation.
	 */
	/**
	 * @generated This field/method will be replaced during code generation.
	 */
	protected EList files = null;

	public ContainerImpl() {
		super();
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	protected EClass eStaticClass() {
		return CommonarchivePackage.eINSTANCE.getContainer();
	}

	/**
	 * @see com.ibm.etools.commonarchive.Archive
	 */
	public boolean containsFile(java.lang.String aUri) {
		String key = aUri.startsWith("/") ? ArchiveUtil.truncateFromFrontIgnoreCase(aUri, "/") : aUri;//$NON-NLS-2$//$NON-NLS-1$
		if (isIndexed())
			return getFileIndex().containsKey(key);
		return getLoadStrategy().contains(key);

	}

	/**
	 * @see com.ibm.etools.commonarchive.Container
	 */
	public java.lang.String getAbsolutePath() throws java.io.FileNotFoundException {
		return getLoadStrategy().getAbsolutePath();
	}

	public File getFile(String URI) throws java.io.FileNotFoundException {
		if (!isIndexed()) {
			getFiles();
		}
		File file = (File) getFileIndex().get(URI);
		if (file == null) {
			throw new java.io.FileNotFoundException(URI);
		}
		return file;
	}

	/**
	 * Insert the method's description here. Creation date: (12/05/00 7:20:21 PM)
	 * 
	 * @return java.util.Map
	 */
	protected java.util.Map getFileIndex() {
		if (fileIndex == null)
			getFileIndexAdapter().rebuildFileIndex();
		return fileIndex;
	}

	/**
	 * Insert the method's description here. Creation date: (12/05/00 7:20:21 PM)
	 * 
	 * @return FileNotificationAdapter
	 */
	protected FileNotificationAdapter getFileIndexAdapter() {
		if (fileIndexAdapter == null) {
			fileIndexAdapter = new FileNotificationAdapter();
			eAdapters().add(fileIndexAdapter);
		}
		return fileIndexAdapter;
	}

	/**
	 * List is built on demand, by requesting from the load strategy.
	 */
	public EList getFiles() {
		EList filesList = this.getFilesGen();
		if (!isIndexed()) {
			if (filesList.isEmpty() && getLoadStrategy() != null) {
				filesList.addAll(getLoadStrategy().collectFiles());
			}
			//Causes the index to be built
			getFileIndex();
		}
		return filesList;
	}

	/**
	 * @see com.ibm.etools.commonarchive.Archive Looks for a file with the given uri, and returns an
	 *      input stream; optimization: if the file list has not been built, goes directly to the
	 *      loadStrategy.
	 */
	public java.io.InputStream getInputStream(java.lang.String aUri) throws java.io.IOException, java.io.FileNotFoundException {
		if (isIndexed()) {
			return getFile(aUri).getInputStream();
		}
		return primGetInputStream(aUri);
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @return com.ibm.etools.archive.LoadStrategy
	 */
	public org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy getLoadStrategy() {
		return loadStrategy;
	}

	public boolean isContainer() {
		return true;
	}

	public boolean isIndexed() {
		return fileIndex != null;
	}

	/**
	 * @see com.ibm.etools.commonarchive.Archive Goes directly to the loadStrategy.
	 */
	public java.io.InputStream primGetInputStream(java.lang.String aUri) throws java.io.IOException, java.io.FileNotFoundException {
		return getLoadStrategy().getInputStream(aUri);
	}

	public void rebuildFileIndex() {
		getFileIndexAdapter().rebuildFileIndex();
	}

	/**
	 * Insert the method's description here. Creation date: (11/29/00 6:35:08 PM)
	 * 
	 * @param newLoadStrategy
	 *            com.ibm.etools.archive.LoadStrategy
	 */
	public void setLoadStrategy(org.eclipse.jst.j2ee.commonarchivecore.internal.strategy.LoadStrategy newLoadStrategy) {

		if (newLoadStrategy != null) {
			newLoadStrategy.setContainer(this);
			if (loadStrategy != null) {
				newLoadStrategy.setRendererType(loadStrategy.getRendererType());
				newLoadStrategy.setReadOnly(loadStrategy.isReadOnly());
				loadStrategy.setContainer(null);
				loadStrategy.close();
			}
		}
		loadStrategy = newLoadStrategy;
	}

	/**
	 * @generated This field/method will be replaced during code generation
	 */
	public EList getFilesGen() {
		if (files == null) {
			files = new EObjectContainmentWithInverseEList(File.class, this, CommonarchivePackage.CONTAINER__FILES, CommonarchivePackage.FILE__CONTAINER);
		}
		return files;
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain eInverseAdd(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
		if (featureID >= 0) {
			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
				case CommonarchivePackage.CONTAINER__CONTAINER:
					if (eContainer != null)
						msgs = eBasicRemoveFromContainer(msgs);
					return eBasicSetContainer(otherEnd, CommonarchivePackage.CONTAINER__CONTAINER, msgs);
				case CommonarchivePackage.CONTAINER__FILES:
					return ((InternalEList)getFiles()).basicAdd(otherEnd, msgs);
				default:
					return eDynamicInverseAdd(otherEnd, featureID, baseClass, msgs);
			}
		}
		if (eContainer != null)
			msgs = eBasicRemoveFromContainer(msgs);
		return eBasicSetContainer(otherEnd, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, Class baseClass, NotificationChain msgs) {
		if (featureID >= 0) {
			switch (eDerivedStructuralFeatureID(featureID, baseClass)) {
				case CommonarchivePackage.CONTAINER__CONTAINER:
					return eBasicSetContainer(null, CommonarchivePackage.CONTAINER__CONTAINER, msgs);
				case CommonarchivePackage.CONTAINER__FILES:
					return ((InternalEList)getFiles()).basicRemove(otherEnd, msgs);
				default:
					return eDynamicInverseRemove(otherEnd, featureID, baseClass, msgs);
			}
		}
		return eBasicSetContainer(null, featureID, msgs);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public NotificationChain eBasicRemoveFromContainer(NotificationChain msgs) {
		if (eContainerFeatureID >= 0) {
			switch (eContainerFeatureID) {
				case CommonarchivePackage.CONTAINER__CONTAINER:
					return eContainer.eInverseRemove(this, CommonarchivePackage.CONTAINER__FILES, Container.class, msgs);
				default:
					return eDynamicBasicRemoveFromContainer(msgs);
			}
		}
		return eContainer.eInverseRemove(this, EOPPOSITE_FEATURE_BASE - eContainerFeatureID, null, msgs);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public Object eGet(EStructuralFeature eFeature, boolean resolve) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case CommonarchivePackage.CONTAINER__URI:
				return getURI();
			case CommonarchivePackage.CONTAINER__LAST_MODIFIED:
				return new Long(getLastModified());
			case CommonarchivePackage.CONTAINER__SIZE:
				return new Long(getSize());
			case CommonarchivePackage.CONTAINER__DIRECTORY_ENTRY:
				return isDirectoryEntry() ? Boolean.TRUE : Boolean.FALSE;
			case CommonarchivePackage.CONTAINER__ORIGINAL_URI:
				return getOriginalURI();
			case CommonarchivePackage.CONTAINER__LOADING_CONTAINER:
				if (resolve) return getLoadingContainer();
				return basicGetLoadingContainer();
			case CommonarchivePackage.CONTAINER__CONTAINER:
				return getContainer();
			case CommonarchivePackage.CONTAINER__FILES:
				return getFiles();
		}
		return eDynamicGet(eFeature, resolve);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void eSet(EStructuralFeature eFeature, Object newValue) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case CommonarchivePackage.CONTAINER__URI:
				setURI((String)newValue);
				return;
			case CommonarchivePackage.CONTAINER__LAST_MODIFIED:
				setLastModified(((Long)newValue).longValue());
				return;
			case CommonarchivePackage.CONTAINER__SIZE:
				setSize(((Long)newValue).longValue());
				return;
			case CommonarchivePackage.CONTAINER__DIRECTORY_ENTRY:
				setDirectoryEntry(((Boolean)newValue).booleanValue());
				return;
			case CommonarchivePackage.CONTAINER__ORIGINAL_URI:
				setOriginalURI((String)newValue);
				return;
			case CommonarchivePackage.CONTAINER__LOADING_CONTAINER:
				setLoadingContainer((Container)newValue);
				return;
			case CommonarchivePackage.CONTAINER__CONTAINER:
				setContainer((Container)newValue);
				return;
			case CommonarchivePackage.CONTAINER__FILES:
				getFiles().clear();
				getFiles().addAll((Collection)newValue);
				return;
		}
		eDynamicSet(eFeature, newValue);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public void eUnset(EStructuralFeature eFeature) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case CommonarchivePackage.CONTAINER__URI:
				setURI(URI_EDEFAULT);
				return;
			case CommonarchivePackage.CONTAINER__LAST_MODIFIED:
				unsetLastModified();
				return;
			case CommonarchivePackage.CONTAINER__SIZE:
				unsetSize();
				return;
			case CommonarchivePackage.CONTAINER__DIRECTORY_ENTRY:
				unsetDirectoryEntry();
				return;
			case CommonarchivePackage.CONTAINER__ORIGINAL_URI:
				setOriginalURI(ORIGINAL_URI_EDEFAULT);
				return;
			case CommonarchivePackage.CONTAINER__LOADING_CONTAINER:
				setLoadingContainer((Container)null);
				return;
			case CommonarchivePackage.CONTAINER__CONTAINER:
				setContainer((Container)null);
				return;
			case CommonarchivePackage.CONTAINER__FILES:
				getFiles().clear();
				return;
		}
		eDynamicUnset(eFeature);
	}

	/**
	 * <!-- begin-user-doc --> <!-- end-user-doc -->
	 * @generated
	 */
	public boolean eIsSet(EStructuralFeature eFeature) {
		switch (eDerivedStructuralFeatureID(eFeature)) {
			case CommonarchivePackage.CONTAINER__URI:
				return URI_EDEFAULT == null ? uri != null : !URI_EDEFAULT.equals(uri);
			case CommonarchivePackage.CONTAINER__LAST_MODIFIED:
				return isSetLastModified();
			case CommonarchivePackage.CONTAINER__SIZE:
				return isSetSize();
			case CommonarchivePackage.CONTAINER__DIRECTORY_ENTRY:
				return isSetDirectoryEntry();
			case CommonarchivePackage.CONTAINER__ORIGINAL_URI:
				return ORIGINAL_URI_EDEFAULT == null ? originalURI != null : !ORIGINAL_URI_EDEFAULT.equals(originalURI);
			case CommonarchivePackage.CONTAINER__LOADING_CONTAINER:
				return loadingContainer != null;
			case CommonarchivePackage.CONTAINER__CONTAINER:
				return getContainer() != null;
			case CommonarchivePackage.CONTAINER__FILES:
				return files != null && !files.isEmpty();
		}
		return eDynamicIsSet(eFeature);
	}

	public void clearFiles() {
		boolean oldDelivery = eDeliver();
		files.clear();
		eSetDeliver(oldDelivery);
		if (isIndexed()) {
			eAdapters().remove(fileIndexAdapter);
			fileIndexAdapter = null;
			fileIndex = null;
		}
	}
}
