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

import org.eclipse.emf.common.notify.Adapter;
import org.eclipse.emf.common.notify.AdapterFactory;
import org.eclipse.emf.common.notify.Notifier;
import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
import org.eclipse.emf.common.util.EList;
import org.eclipse.emf.edit.provider.INotifyChangedListener;
import org.eclipse.jst.j2ee.internal.webservice.adapter.AdapterViewerItem;


public class ATKUIAdapterFactory extends AdapterFactoryImpl {
	private AdapterFactory[] adapterFactories_;

	public ATKUIAdapterFactory() {
		adapterFactories_ = new AdapterFactory[4];
		adapterFactories_[0] = new WsddItemProviderAdapterFactory();
		adapterFactories_[1] = new ATKUIWscddAdapterFactory();
		adapterFactories_[2] = new ATKUIWscommonAdapterFactory();
		adapterFactories_[3] = new ATKUICommonAdapterFactory();

	}

	@Override
	public Object adapt(Object target, Object type) {

		if (target instanceof Notifier) {
			for (int i = 0; i < adapterFactories_.length; i++) {
				Object object = adapterFactories_[i].adapt(target, type);
				if (object != null) {
					return object;
				}
			}
			return null;
		}
		return resolve(target, type);
	}

	@Override
	public Adapter adapt(Notifier target, Object type) {
		Object object = adapt((Object) target, type);
		if (object instanceof Adapter) {
			return (Adapter) object;
		}
		return null;
	}

	/**
	 * This is called by {@link #adapt(Object,Object) adapt(Object, Object)}for objects that aren't
	 * notifiers.
	 * 
	 * @param an
	 *            arbitrary object to adapt.
	 * @param type
	 *            the key indicating the type of adapter required.
	 * @return the object itself.
	 * @see #adapt(Object,Object)
	 */
	@Override
	protected Object resolve(Object object, Object type) {
		if (object instanceof EList)
			return resolveEList((EList) object, type);
		else if (object instanceof AdapterViewerItem)
			return resolveAdapterViewerItem((AdapterViewerItem) object, type);
		else
			return null;
	}

	private Object resolveEList(EList eList, Object type) {
		if (eList.size() > 0)
			return adapt(eList.get(0), type);
		return null;
	}

	private Object resolveAdapterViewerItem(AdapterViewerItem adapterViewerItem, Object type) {
		return resolveEList(adapterViewerItem.getEObjectList(), type);
	}

	public void addListener(INotifyChangedListener listener) {
		((WsddItemProviderAdapterFactory) adapterFactories_[0]).addListener(listener);
		((ATKUIWscddAdapterFactory) adapterFactories_[1]).addListener(listener);
		((ATKUIWscommonAdapterFactory) adapterFactories_[2]).addListener(listener);
		((ATKUICommonAdapterFactory) adapterFactories_[3]).addListener(listener);
	}
}