/*******************************************************************************
 * Copyright (c) 2003, 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.internal.ejb.provider;


import java.util.Arrays;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notification;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.emf.ecore.EStructuralFeature;
import org.eclipse.emf.ecore.EcorePackage;
import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
import org.eclipse.jface.viewers.TreeViewer;
import org.eclipse.jst.j2ee.ejb.AssemblyDescriptor;
import org.eclipse.jst.j2ee.ejb.CMPAttribute;
import org.eclipse.jst.j2ee.ejb.EjbMethodElementComparator;
import org.eclipse.jst.j2ee.ejb.EnterpriseBean;
import org.eclipse.jst.j2ee.ejb.MethodElement;
import org.eclipse.jst.j2ee.ejb.internal.impl.EjbFactoryImpl;
import org.eclipse.swt.widgets.TreeItem;
import org.eclipse.wst.common.frameworks.internal.ui.DisplayUtility;


public abstract class AbstractMethodsContentProvider extends AdapterFactoryContentProvider {
	protected static EStructuralFeature ME_EJB_SF = EjbFactoryImpl.getPackage().getMethodElement_EnterpriseBean();
	protected static EStructuralFeature JAR_ASSEMBLY_SF = EjbFactoryImpl.getPackage().getEJBJar_AssemblyDescriptor();
	private static final EStructuralFeature ECORE_BEAN_NAME = EcorePackage.eINSTANCE.getENamedElement_Name(); //ENAMED_ELEMENT__NAME
	protected Comparator meComparator;
	protected boolean isRoot = true;

	public class EJBMethodItem {
		public EObject refObject;
		public EnterpriseBean ejb;

		public EJBMethodItem(EObject aRefObject, EnterpriseBean anEJB) {
			refObject = aRefObject;
			ejb = anEJB;
		}

	}

	/**
	 * Constructor for AbstractMethodsContentProvider.
	 * 
	 * @param adapterFactory
	 */
	public AbstractMethodsContentProvider(AdapterFactory adapterFactory) {
		super(adapterFactory);
	}

	public AbstractMethodsContentProvider(AdapterFactory adapterFactory, boolean root) {
		super(adapterFactory);
		isRoot = root;
	}

	protected Comparator getEnterpriseBeanComparator() {
		return EJBNameComparator.singleton();
	}

	protected Comparator getMethodElementComparator() {
		if (meComparator == null)
			meComparator = new EjbMethodElementComparator();
		return meComparator;
	}

	/*
	 * @see ITreeContentProvider#getChildren(Object)
	 */
	@Override
	public Object[] getChildren(Object parentElement) {
		if (parentElement instanceof AbstractMethodsContentProvider.EJBMethodItem)
			return getMethodElements((AbstractMethodsContentProvider.EJBMethodItem) parentElement);
		return new Object[0];
	}

	protected Object[] getMethodElements(AbstractMethodsContentProvider.EJBMethodItem ejbItem) {
		EObject refObject = ejbItem.refObject;
		if (refObject == null)
			return new Object[0];
		List elements = getMethodElements(refObject, ejbItem.ejb);
		Object[] result = elements.toArray();
		if (result.length == 1)
			return result;
		Arrays.sort(result, getMethodElementComparator());
		return result;
	}

	protected abstract List getMethodElements(EObject aRefObject, EnterpriseBean anEJB);

	protected Object[] getEnterpriseBeans(EObject parentElement, List someMethodElements) {
		if (someMethodElements.isEmpty())
			return new Object[0];
		Set ejbs = new HashSet();
		EnterpriseBean ejb = null;
		MethodElement me = null;
		for (int i = 0; i < someMethodElements.size(); i++) {
			me = (MethodElement) someMethodElements.get(i);
			ejb = me.getEnterpriseBean();
			if (ejb != null)
				ejbs.add(ejb);
		}
		Object[] result = ejbs.toArray();
		if (result.length != 1)
			Arrays.sort(result, getEnterpriseBeanComparator());
		ejb = null;
		for (int i = 0; i < result.length; i++) {
			ejb = (EnterpriseBean) result[i];
			result[i] = new EJBMethodItem(parentElement, ejb);
		}
		return result;
	}

	protected AssemblyDescriptor getAssemblyDescriptor(EnterpriseBean ejb) {
		if (ejb == null)
			return null;
		return ejb.getEjbJar().getAssemblyDescriptor();
	}

	/*
	 * @see ITreeContentProvider#hasChildren(Object)
	 */
	@Override
	public boolean hasChildren(Object element) {
		if (element instanceof AbstractMethodsContentProvider.EJBMethodItem)
			return true;
		return false;
	}

	protected TreeViewer getTreeViewer() {
		return (TreeViewer) viewer;
	}

	protected void refreshTreeViewer(Object obj) {
		if (viewer != null)
			DisplayUtility.asyncExec(createRefreshTreeRunnable(obj));
	}

	protected void refreshTreeViewer() {
		if (viewer != null)
			DisplayUtility.asyncExec(createRefreshTreeRunnable(null));
	}

	protected void refreshTreeViewer(MethodElement me) {
		refreshTreeViewer(me.eContainer());
	}

	protected void refreshTreeViewer(List aList) {
		if (aList.isEmpty())
			return;
		refreshTreeViewer((MethodElement) aList.get(0));
	}

	protected void addToTreeViewer(final MethodElement me) {
		if (viewer == null)
			return;
		DisplayUtility.asyncExec(new Runnable() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {
				// findMethodItem() should be run in a Display thread
				EJBMethodItem item = findMethodItem(me);
				if (item != null)
					DisplayUtility.asyncExec(createAddItemTreeRunnable(item, me));
				else
					refreshTreeViewer(me.eContainer());

			}
		});
	}

	protected void removeFromTreeViewer(final EObject parent, final MethodElement me) {
		if (viewer == null)
			return;
		DisplayUtility.asyncExec(new Runnable() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {
				EnterpriseBean ejb = me.getEnterpriseBean();
				EJBMethodItem item = findMethodItem(ejb, parent);
				if (item != null)
					refreshTreeViewer(item);
				else
					refreshTreeViewer((Object) null);
			}
		});
	}

	protected EJBMethodItem findMethodItem(MethodElement me) {
		return findMethodItem(me.getEnterpriseBean(), me.eContainer());
	}

	protected EJBMethodItem findMethodItem(EnterpriseBean ejb, EObject parentMethod) {
		TreeItem[] items = getTreeViewer().getTree().getItems();
		return findMethodItem(ejb, parentMethod, items);
	}

	protected EJBMethodItem findMethodItem(EnterpriseBean ejb, EObject parentMethod, TreeItem[] items) {
		TreeItem item = null;
		Object data = null;
		EJBMethodItem methodItem = null, found = null;
		for (int i = 0; i < items.length; i++) {
			item = items[i];
			data = item.getData();
			if (data instanceof EJBMethodItem) {
				methodItem = (EJBMethodItem) data;
				if (methodItem.ejb == ejb && methodItem.refObject == parentMethod)
					return methodItem;
			}
			found = findMethodItem(ejb, parentMethod, item.getItems());
			if (found != null)
				return found;
		}
		return null;
	}

	/*
	 * @see INotifyChangedListener#notifyChanged(new ENotificationImpl((InternalEObject)Object,
	 *      int,(EStructuralFeature) Object, Object, Object, int))
	 */
	@Override
	public void notifyChanged(Notification notifier) {
		if (notifier.getEventType() == Notification.RESOLVE)
			return;
		else if (notifier.getOldValue() instanceof CMPAttribute && notifier.getNewValue() == null)
			return;
		else if (notifier.getFeature() == ME_EJB_SF) {
			refreshTreeViewer((MethodElement) notifier.getNotifier());
			return;
		} else if (notifier.getFeature() == ECORE_BEAN_NAME) {
			refreshTreeViewer();
			return;
		} else if (getMethodElementsReference() == notifier.getFeature()) {
			if (notifier.getEventType() == Notification.ADD)
				addToTreeViewer((MethodElement) notifier.getNewValue());
			else if (notifier.getEventType() == Notification.REMOVE)
				removeFromTreeViewer((EObject) notifier.getNotifier(), (MethodElement) notifier.getOldValue());
			return;
		} else if (notifier.getFeature() == JAR_ASSEMBLY_SF && isRoot) {
			updateTreeInput(notifier.getNewValue());
		} else if (notifier.getFeature() == getMethodElementsContainerReference())
			super.notifyChanged(notifier);
	}

	/**
	 * @param notifier
	 */
	protected void updateTreeInput(final Object target) {
		DisplayUtility.asyncExec(new Runnable() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {

				getTreeViewer().setInput(target); //reset the input
				getTreeViewer().refresh(target);

			}
		});
	}

	private Runnable createAddItemTreeRunnable(final Object parent, final MethodElement me) {
		return new Runnable() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {
				getTreeViewer().add(parent, me);
			}
		};
	}

	private Runnable createRefreshTreeRunnable(final Object target) {
		return new Runnable() {

			/*
			 * (non-Javadoc)
			 * 
			 * @see java.lang.Runnable#run()
			 */
			public void run() {
				if (target != null)
					getTreeViewer().refresh(target);
				else
					getTreeViewer().refresh();
			}
		};
	}

	protected abstract EStructuralFeature getMethodElementsReference();

	protected abstract EStructuralFeature getMethodElementsContainerReference();
}
