/*******************************************************************************
 * Copyright (c) 2015 Obeo.
 * 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:
 *    Obeo - initial API and implementation and/or initial documentation
 *    ...
 *******************************************************************************/
package org.eclipse.intent.mapping.internal.connector;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.eclipse.intent.mapping.base.IBase;
import org.eclipse.intent.mapping.base.ILocation;
import org.eclipse.intent.mapping.base.ILocationContainer;
import org.eclipse.intent.mapping.base.ILocationDescriptor;
import org.eclipse.intent.mapping.connector.IConnector;
import org.eclipse.intent.mapping.connector.IConnectorRegistry;

/**
 * The default implementation of {@link IConnectorRegistry}.
 * 
 * @author <a href="mailto:yvan.lussaud@obeo.fr">Yvan Lussaud</a>
 */
public class ConnectorRegistry implements IConnectorRegistry {

	/**
	 * The {@link List} of {@link ConnectorRegistry#register(IConnector) registered} {@link IConnector}.
	 */
	private final List<IConnector> connectors = Collections.synchronizedList(new ArrayList<IConnector>());

	/**
	 * Mapping of {@link IConnector#getType() connector type} to {@link IConnector}.
	 */
	private final Map<Class<? extends ILocation>, IConnector> typeToConnector = new HashMap<Class<? extends ILocation>, IConnector>();

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#createLocation(org.eclipse.intent.mapping.base.ILocationContainer,
	 *      java.lang.Object)
	 */
	public ILocation createLocation(ILocationContainer container, Object element)
			throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		for (IConnector connector : getConnectors()) {
			final ILocation location = connector.createLocation(container, element);
			if (location != null) {
				return location;
			}
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getLocation(org.eclipse.intent.mapping.base.ILocationContainer,
	 *      java.lang.Object)
	 */
	public ILocation getLocation(ILocationContainer container, Object element) {
		for (IConnector connector : getConnectors()) {
			final ILocation location = connector.getLocation(container, element);
			if (location != null) {
				return location;
			}
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getElement(org.eclipse.intent.mapping.base.ILocation)
	 */
	public Object getElement(ILocation location) {
		for (IConnector connector : getConnectors()) {
			if (connector.canHandle(location)) {
				return connector.getElement(location);
			}
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getOrCreateLocation(org.eclipse.intent.mapping.base.ILocationContainer,
	 *      java.lang.Object)
	 */
	public ILocation getOrCreateLocation(ILocationContainer container, Object element)
			throws InstantiationException, IllegalAccessException, ClassNotFoundException {
		final ILocation res;

		final ILocation foundLocation = getLocation(container, element);
		if (foundLocation != null) {
			res = foundLocation;
		} else {
			res = createLocation(container, element);
		}

		return res;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getLocationType(java.lang.Class,
	 *      java.lang.Object)
	 */
	public Class<? extends ILocation> getLocationType(Class<? extends ILocationContainer> containerType,
			Object element) {
		for (IConnector connector : getConnectors()) {
			final Class<? extends ILocation> locationType = connector.getLocationType(containerType, element);
			if (locationType != null) {
				return locationType;
			}
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getName(org.eclipse.intent.mapping.base.ILocation)
	 */
	public String getName(ILocation location) {
		String res;
		if (!location.isMarkedAsDeleted()) {
			res = null;
			for (IConnector connector : getConnectors()) {
				if (connector.canHandle(location)) {
					res = connector.getName(location);
					break;
				}
			}
		} else {
			res = "(deleted)";
		}

		return res;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getLocationDescriptor(org.eclipse.intent.mapping.base.IBase,
	 *      java.lang.Object)
	 */
	public ILocationDescriptor getLocationDescriptor(IBase base, Object element) {
		for (IConnector connector : getConnectors()) {
			final ILocationDescriptor descriptor = connector.getLocationDescriptor(base, element);
			if (descriptor != null) {
				return descriptor;
			}
		}

		return null;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#updateLocation(org.eclipse.intent.mapping.base.ILocation,
	 *      java.lang.Object)
	 */
	public boolean updateLocation(ILocation location, Object element) {
		if (!location.isMarkedAsDeleted()) {
			for (IConnector connector : getConnectors()) {
				if (connector.canHandle(location)) {
					return connector.updateLocation(location, element);
				}
			}
		}

		return false;
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#register(org.eclipse.intent.mapping.connector.IConnector)
	 */
	public void register(IConnector connector) {
		if (connector != null) {
			synchronized(connectors) {
				int index = 0;
				boolean added = false;
				for (IConnector currentConnector : connectors) {
					if (currentConnector.getType().isAssignableFrom(connector.getType())) {
						connectors.add(index, connector);
						added = true;
						break;
					} else {
						index++;
					}
				}
				if (!added) {
					connectors.add(index, connector);
				}
				typeToConnector.put(connector.getType(), connector);
			}
		} else {
			throw new IllegalArgumentException("IConnector can't be null.");
		}
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#unregister(org.eclipse.intent.mapping.connector.IConnector)
	 */
	public void unregister(IConnector connector) {
		synchronized(connectors) {
			connectors.remove(connector);
			typeToConnector.remove(connector.getType());
		}
	}

	/**
	 * Gets the {@link List} of {@link IConnectorRegistry#register(IConnector) registered} {@link IConnector}.
	 * 
	 * @return the {@link List} of {@link IConnectorRegistry#register(IConnector) registered}
	 *         {@link IConnector}
	 */
	protected List<IConnector> getConnectors() {
		synchronized(connectors) {
			return Collections.unmodifiableList(new ArrayList<IConnector>(connectors));
		}
	}

	/**
	 * {@inheritDoc}
	 *
	 * @see org.eclipse.intent.mapping.connector.IConnectorRegistry#getConnector(java.lang.Class)
	 */
	public IConnector getConnector(Class<? extends ILocation> connectorType) {
		synchronized(connectors) {
			return typeToConnector.get(connectorType);
		}
	}

}
