/****************************************************************************
 * Copyright (c) 2004 Composent, Inc. 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:
 *    Composent, Inc. - initial API and implementation
 *****************************************************************************/
package org.eclipse.ecf.core;

import org.eclipse.core.runtime.Assert;
import org.eclipse.ecf.core.identity.*;
import org.eclipse.ecf.core.provider.BaseContainerInstantiator;
import org.eclipse.ecf.core.security.IConnectContext;

/**
 * Base implementation of IContainer. Subclasses may be created to fill out the
 * behavior of this base implementation. Also, adapter factories may be created
 * via adapterFactory extension point to allow adapters to be added to this
 * BaseContainer implementation without the need to create a separate IContainer
 * implementation class.
 */
public class BaseContainer extends AbstractContainer {

	public static class Instantiator extends BaseContainerInstantiator {
		private static long nextBaseContainerID = 0L;

		public IContainer createInstance(ContainerTypeDescription description, Object[] parameters) throws ContainerCreateException {
			try {
				if (parameters != null && parameters.length > 0) {
					if (parameters[0] instanceof ID)
						return new BaseContainer((ID) parameters[0]);
					if (parameters[0] instanceof String)
						return new BaseContainer(IDFactory.getDefault().createStringID((String) parameters[0]));
				}
			} catch (IDCreateException e) {
				throw new ContainerCreateException("Could not create ID for basecontainer"); //$NON-NLS-1$
			}
			return new BaseContainer(nextBaseContainerID++);
		}

		/*
		 * (non-Javadoc)
		 * 
		 * @see org.eclipse.ecf.core.provider.IContainerInstantiator#getSupportedAdapterTypes(org.eclipse.ecf.core.ContainerTypeDescription)
		 */
		public String[] getSupportedAdapterTypes(ContainerTypeDescription description) {
			return getInterfacesAndAdaptersForClass(BaseContainer.class);
		}

		/* (non-Javadoc)
		 * @see org.eclipse.ecf.core.provider.BaseContainerInstantiator#getSupportedParameterTypes(org.eclipse.ecf.core.ContainerTypeDescription)
		 */
		public Class[][] getSupportedParameterTypes(ContainerTypeDescription description) {
			return new Class[][] { {}, {ID.class}, {String.class}};
		}

	}

	private ID id = null;

	protected BaseContainer(long idl) throws ContainerCreateException {
		try {
			this.id = IDFactory.getDefault().createLongID(idl);
		} catch (IDCreateException e) {
			throw new ContainerCreateException("Could not create ID for basecontainer", e); //$NON-NLS-1$
		}
	}

	protected BaseContainer(ID id) {
		Assert.isNotNull(id);
		this.id = id;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.core.IContainer#connect(org.eclipse.ecf.core.identity.ID,
	 *      org.eclipse.ecf.core.security.IConnectContext)
	 */
	public void connect(ID targetID, IConnectContext connectContext) throws ContainerConnectException {
		throw new ContainerConnectException("Connect not supported"); //$NON-NLS-1$
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.core.IContainer#disconnect()
	 */
	public void disconnect() {
		// Nothing to disconnect
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.core.IContainer#getConnectNamespace()
	 */
	public Namespace getConnectNamespace() {
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.core.IContainer#getConnectedID()
	 */
	public ID getConnectedID() {
		return null;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see org.eclipse.ecf.core.identity.IIdentifiable#getID()
	 */
	public ID getID() {
		return id;
	}

	public String toString() {
		StringBuffer sb = new StringBuffer("BaseContainer["); //$NON-NLS-1$
		sb.append("id=").append(getID()).append("]"); //$NON-NLS-1$ //$NON-NLS-2$
		return sb.toString();
	}
}
