/*******************************************************************************
 * Copyright (c) 2000, 2003 IBM Corporation and others.
 * All rights reserved. This program and the accompanying materials 
 * are made available under the terms of the Common Public License v1.0
 * which accompanies this distribution, and is available at
 * http://www.eclipse.org/legal/cpl-v10.html
 * 
 * Contributors:
 *     IBM Corporation - initial API and implementation
 *******************************************************************************/
package org.eclipse.compare.examples.xml;

import java.util.ArrayList;
import java.util.Vector;

/** This class is used to represent a id mapping scheme in the XML Compare preference page
 */
public class IdMap {

	private String fName;
	private boolean fInternal;
	private Vector fMappings;
	private String fExtension;
	private ArrayList fOrdered;//contains Mapping elements for list of ordered entries (the children of these elements will be compared in ordered fashion)

	/**
	 * Creates an IdMap which represents an Id Mapping Scheme
	 * @param internal true if the IdMap is internal
	 */
	public IdMap(boolean internal) {
		this("", internal); //$NON-NLS-1$
	}

	/**
	 * Creates an IdMap which represents an Id Mapping Scheme
	 * @param name The name of the mapping, as in fIdMaps/fIdMapsInternal HashMaps and fOrderedElements/fOrderedElementsInternal HashMaps
	 * @param internal true if the IdMap is internal
	 */
	public IdMap(String name, boolean internal) {
		this(name, internal, new Vector());
	}

	/**
	 * Creates an IdMap which represents an Id Mapping Scheme
	 * @param name The name of the mapping, as in fIdMaps/fIdMapsInternal HashMaps and fOrderedElements/fOrderedElementsInternal HashMaps
	 * @param internal true if the IdMap is internal
	 * @param mappings Vector of Mapping elements which represent the id mappings of this id mapping scheme
	 */
	public IdMap(String name, boolean internal, Vector mappings) {
		this(name, internal, mappings, ""); //$NON-NLS-1$
	}

	/**
	 * Creates an IdMap which represents an Id Mapping Scheme.
	 * @param name The name of the mapping, as in fIdMaps/fIdMapsInternal HashMaps and fOrderedElements/fOrderedElementsInternal HashMaps.
	 * @param internal true if the IdMap is internal.
	 * @param mappings Vector of Mapping elements which represent the id mappings of this id mapping scheme.
	 * @param extension Optional extension to be associated with this id mapping scheme.
	 */
	public IdMap(String name, boolean internal, Vector mappings, String extension) {
		this(name, internal, mappings, extension, null);
	}

	/**
	 * Creates an IdMap which represents an Id Mapping Scheme.
	 * @param name The name of the mapping, as in fIdMaps/fIdMapsInternal HashMaps and fOrderedElements/fOrderedElementsInternal HashMaps.
	 * @param internal true if the IdMap is internal.
	 * @param mappings Vector of Mapping elements which represent the id mappings of this id mapping scheme.
	 * @param extension Optional extension to be associated with this id mapping scheme.
	 * @param ordered Optional ArrayList of Mapping elements representing ordered entries.
	 */
	public IdMap(String name, boolean internal, Vector mappings, String extension, ArrayList ordered) {
		fName = name;
		fInternal = internal;
		fMappings = mappings;
		fExtension= extension.toLowerCase();
		fOrdered= ordered;
	}
	
	/*
	 * @see Object#equals(Object)
	 */
	public boolean equals(Object object) {
		if (!(object instanceof IdMap))
			return false;
			
		IdMap idmap= (IdMap) object;

		if (idmap == this)
			return true;		

		return
			idmap.getName().equals(fName) &&
			idmap.getMappings().equals(fMappings);
	}
	
	/*
	 * @see Object#hashCode()
	 */
	public int hashCode() {
		return fName.hashCode() ^ fMappings.hashCode();
	}

	public void setName(String name) {
		fName = name;
	}
	
	public String getName() {
		return fName;
	}

	public void setMappings(Vector mappings) {
		fMappings = mappings;
	}
	
	public Vector getMappings() {
		return fMappings;
	}

	public void setInternal(boolean bool) {
		fInternal = bool;
	}
	
	public boolean isInternal() {
		return fInternal;
	}
	
	public void setExtension(String extension) {
		fExtension= extension;
	}
	
	public String getExtension() {
		return fExtension;
	}
	public void setOrdered(ArrayList ordered) {
		fOrdered= ordered;
	}
	public ArrayList getOrdered() {
		return fOrdered;
	}

}
