/*******************************************************************************
 * 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.ui.navigator.internal.dnd;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;

import org.eclipse.core.runtime.IConfigurationElement;
import org.eclipse.jface.util.Assert;
import org.eclipse.ui.navigator.CommonViewer;
import org.eclipse.ui.navigator.ICommonDropActionDelegate;
import org.eclipse.ui.navigator.internal.CommonNavigatorMessages;
import org.eclipse.ui.navigator.internal.NavigatorPlugin;
import org.eclipse.ui.navigator.internal.extensions.RegistryReader;

/**
 * <p>
 * <strong>EXPERIMENTAL</strong>. This class or interface has been added as part of a work in
 * progress. There is a guarantee neither that this API will work nor that it will remain the same.
 * Please do not use this API without consulting with the Platform/UI team.
 * </p>
 * 
 * @since 3.2
 *  
 */
public class CommonDropHandlerService extends RegistryReader {

	private static final DropHandlerDescriptor[] NO_DROP_HANDLER_DESCRIPTORS = new DropHandlerDescriptor[0];

	private Map descriptors;

	private Map actions;

	private static Map registries;

	private String viewerId;

	protected CommonDropHandlerService(String viewerId) {
		super(NavigatorPlugin.PLUGIN_ID, DropHandlerDescriptor.ExtensionPointElements.DROP_HANDLER);
		this.viewerId = viewerId;
	}

	public DropHandlerDescriptor[] getDropHandlersEnabledFor(Object source, Object target) {
		try {
			List results = new ArrayList();
			DropHandlerDescriptor descr = null;
			for (Iterator descriptorIterator = getDescriptors().values().iterator(); descriptorIterator.hasNext();) {
				descr = (DropHandlerDescriptor) descriptorIterator.next();
				if (descr.isDropEnabledFor(target) && (source == null || descr.isDragEnabledFor(source)))
					results.add(descr);
			}
			if (results.size() > 0)
				return (DropHandlerDescriptor[]) results.toArray(new DropHandlerDescriptor[results.size()]);
			return NO_DROP_HANDLER_DESCRIPTORS;
		} catch (Throwable t) {
			NavigatorPlugin.log(CommonNavigatorMessages.CommonDropHandlerService_0 + t); 
			return NO_DROP_HANDLER_DESCRIPTORS;
		}
	}

	public DropHandlerDescriptor[] getDropHandlersBySerializerId(String id) {
		try {
			List results = new ArrayList();
			DropHandlerDescriptor descr = null;
			SerializerCollectionDescriptor serializerCollectionDescriptor = null;
			for (Iterator descriptorIterator = getDescriptors().values().iterator(); descriptorIterator.hasNext();) {
				descr = (DropHandlerDescriptor) descriptorIterator.next();
				serializerCollectionDescriptor = descr.getSerializersDescriptor();
				if (serializerCollectionDescriptor != null && serializerCollectionDescriptor.getSerializerById(id) != null)
					results.add(descr);
			}
			if (results.size() > 0)
				return (DropHandlerDescriptor[]) results.toArray(new DropHandlerDescriptor[results.size()]);
			return NO_DROP_HANDLER_DESCRIPTORS;
		} catch (Throwable t) {
			NavigatorPlugin.log(CommonNavigatorMessages.CommonDropHandlerService_0 + t); 
			return NO_DROP_HANDLER_DESCRIPTORS;
		}
	}


	public SerializerDescriptor getSerializerById(String id) {
		DropHandlerDescriptor descr = null;
		SerializerDescriptor result = null;
		SerializerCollectionDescriptor serializerCollectionDescriptor = null;
		for (Iterator descriptorIterator = getDescriptors().values().iterator(); descriptorIterator.hasNext();) {
			descr = (DropHandlerDescriptor) descriptorIterator.next();
			serializerCollectionDescriptor = descr.getSerializersDescriptor();
			if (serializerCollectionDescriptor != null && (result = serializerCollectionDescriptor.getSerializerById(id)) != null)
				break;
		}
		return result;
	}

	public ICommonDropActionDelegate getActionForSerializerId(String serializerId) {

		DropHandlerDescriptor descr = null;
		SerializerCollectionDescriptor serializerCollectionDescriptor = null;
		ICommonDropActionDelegate action = null;
		for (Iterator descriptorIterator = getDescriptors().values().iterator(); descriptorIterator.hasNext();) {
			descr = (DropHandlerDescriptor) descriptorIterator.next();
			serializerCollectionDescriptor = descr.getSerializersDescriptor();
			if (serializerCollectionDescriptor != null && serializerCollectionDescriptor.getSerializerById(serializerId) != null) {
				action = descr.createAction();
				break;
			}
		}
		return action;
	}

	public SerializerDescriptor[] getSerializersEnabledFor(Object source) {
		SerializerDescriptor[] serializers = null;
		try {
			List results = new ArrayList();
			Iterator descriptorIterator = getDescriptors().values().iterator();
			DropHandlerDescriptor descr = null;
			SerializerCollectionDescriptor serializerCollectionDescriptor = null;
			while (descriptorIterator.hasNext()) {
				descr = (DropHandlerDescriptor) descriptorIterator.next();
				if (descr.isDragEnabledFor(source)) {
					serializerCollectionDescriptor = descr.getSerializersDescriptor();
					if (serializerCollectionDescriptor != null)
						results.addAll(Arrays.asList(serializerCollectionDescriptor.getSerializersEnabledFor(source)));
				}
			}
			if (results.size() > 0) {
				results.toArray((serializers = new SerializerDescriptor[results.size()]));
			} else
				serializers = new SerializerDescriptor[0];

		} catch (Throwable t) {
			NavigatorPlugin.log(CommonNavigatorMessages.CommonDropHandlerService_0 + t);
			serializers = new SerializerDescriptor[0];
		}
		return serializers;
	}

	public IDropValidator getDropValidator(CommonViewer aViewer, DropHandlerDescriptor descriptor) {
		if (descriptor == null)
			return null;
		ICommonDropActionDelegate action = null;
		IDropValidator dropValidator = descriptor.getDropValidator();
		if (dropValidator == null && (action = getDropActionDelegate(aViewer, descriptor)) instanceof IDropValidator)
			dropValidator = (IDropValidator) action;
		return dropValidator;
	}

	public ICommonDropActionDelegate getDropActionDelegate(CommonViewer aViewer, DropHandlerDescriptor descriptor) {
		Assert.isTrue(this.viewerId.equals(aViewer.getNavigatorContentService().getViewerId()));
		ICommonDropActionDelegate action = (ICommonDropActionDelegate) getActions().get(descriptor.getId());
		if (action == null) {
			if ((action = descriptor.createAction()) != null) {
				action.init(aViewer);
				getActions().put(descriptor.getId(), action);
			}
		}
		return action;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ui.internal.registry.RegistryReader#readElement(org.eclipse.core.runtime.IConfigurationElement)
	 */
	public boolean readElement(IConfigurationElement element) {
		if (DropHandlerDescriptor.ExtensionPointElements.DROP_HANDLER.equals(element.getName())) {
			addDescriptor(new DropHandlerDescriptor(element));
			return true;
		}
		return false;
	}

	protected void addDescriptor(DropHandlerDescriptor descriptor) {
		getDescriptors().put(descriptor.getId(), descriptor);
	}

	/**
	 * @return Returns the descriptors.
	 */
	protected Map getDescriptors() {
		if (descriptors == null)
			descriptors = new HashMap();
		return descriptors;
	}

	/**
	 * @return Returns the actions.
	 */
	protected Map getActions() {
		if (actions == null)
			actions = new HashMap();
		return actions;
	}

	/**
	 * @return Returns the registries.
	 */
	protected static Map getRegistries() {
		if (registries == null)
			registries = new HashMap();
		return registries;
	}

	public static CommonDropHandlerService getInstance(String viewerId) {
		CommonDropHandlerService instance = (CommonDropHandlerService) getRegistries().get(viewerId);
		if (instance == null) {
			getRegistries().put(viewerId, (instance = new CommonDropHandlerService(viewerId)));
			instance.readRegistry();
		}
		return instance;
	}

}
