/*******************************************************************************
 * Copyright (c) 2000, 2015 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
 *     Alexander Kurtakov - Bug 460858
 *******************************************************************************/
package org.eclipse.help.internal.workingset;

import java.util.Arrays;
import java.util.HashMap;

import org.eclipse.core.runtime.*;
import org.eclipse.help.*;

/**
 * Makes help resources adaptable and persistable
 */
public class AdaptableTocsArray implements IAdaptable {

	IToc[] element;
	AdaptableToc[] children;
	HashMap<String, AdaptableToc> map;

	/**
	 * This constructor will be called when wrapping help resources.
	 */
	public AdaptableTocsArray(IToc[] tocs) {
		this.element = tocs;
	}

	/**
	 * @see org.eclipse.core.runtime.IAdaptable#getAdapter(java.lang.Class)
	 */
	@SuppressWarnings("unchecked")
	public <T> T getAdapter(Class<T> adapter) {
		if (adapter == IToc[].class)
			return (T) element;
		return null;
	}

	public IAdaptable[] getChildren() {

		if (children == null) {
			children = new AdaptableToc[element.length];
			for (int i = 0; i < element.length; i++) {
				children[i] = new AdaptableToc(element[i]);
				children[i].setParent(this);
			}
		}
		return children;

	}

	public AdaptableToc getAdaptableToc(String href) {
		if (map == null) {
			getChildren(); // make sure children are initialized
			map = new HashMap<String, AdaptableToc>(children.length);
			for (int i = 0; i < children.length; i++)
				map.put(children[i].getHref(), children[i]);
		}
		return (AdaptableToc) map.get(href);
	}

	IToc[] asArray() {
		return element;
	}

	/**
	 * Tests the receiver and the object for equality
	 *
	 * @param object
	 *            object to compare the receiver to
	 * @return true=the object equals the receiver, the name is the same. false
	 *         otherwise
	 */
	public boolean equals(Object object) {
		if (this == object) {
			return true;
		}
		if (!(object instanceof AdaptableTocsArray)) {
			return false;
		}

		AdaptableTocsArray res = (AdaptableTocsArray) object;
		return (Arrays.equals(asArray(), res.asArray()));

	}

	/**
	 * Returns the hash code.
	 *
	 * @return the hash code.
	 */
	public int hashCode() {
		if (element == null)
			return -1;
		return element.hashCode();
	}
}

