/*******************************************************************************
 * Copyright (c) 2000, 2004 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.jdt.core.jdom;

import java.util.Enumeration;

import org.eclipse.jdt.core.IJavaElement;

/**
 * Nodes represent structural fragments of a Java source file, also known as document fragments. Their implementation
 * is known as a DOM (Document Object Model) -  in this case a JDOM (Java DOM). A root node (node
 * with no parent or siblings) represents the root of a document fragment (DF). A complete Java document is
 * represented by a compilation unit node (<code>IDOMCompilationUnit</code>). In this way, a DF is
 * comprised of DFs, and a document itself (compilation unit) is also a DF.
 * <p>
 * A DF may be created empty and programmatically filled, or it may be created from
 * a source code string. The <code>IDOMFactory</code> allows the creation of all kinds
 * of nodes from source code strings. Manipulations performed on a DF are immediately
 * reflected in the DF's contents.
 * </p>
 * <p>
 * Children fragments are represented as a linked list of nodes. Children are inserted via their parent node, and
 * are automatically linked up with previous and next nodes.
 * </p>
 * <p>
 * The contents of any node (DF) may be retrieved at any time. In this way it is possible to retrieve
 * source code representing fragments of the compilation unit (for example, a type or a method), since
 * the contents of any node (not just the root node) may be obtained.
 * </p>
 * <p>
 * The following manipulations on DFs are distinct:
 * <ul>
 * <li>clone - this creates a stand-alone copy of the DF that is in no way dependent on the DF that it was cloned from</li>
 * <li>remove - this orphans a DF from its host DF. The removed DF may still be dependent on its previous host
 *    (perhaps to generate its contents), and hanging onto the fragment means that its previous host is also
 *    retained in memory.</li>
 * <li>add/insert - this splices an un-parented DF (one that has been cloned, removed, or created stand-alone),
 *    into an existing DF such that the newly inserted DF is only dependent on its new host.</li>
 * </ul>
 * </p>
 * <p>
 * Wherever types are specified in DOM APIs, type names must be specified as they would appear
 * in source code. The DOM does not have a notion of type signatures, only raw text. Example type
 * names are <code>"Object"</code>, <code>"java.io.File"</code>, and <code>"int[]"</code>.
 * </p>
 * <p>
 * This interface is not intended to be implemented by clients.
 * </p>
 * @deprecated The JDOM was made obsolete by the addition in 2.0 of the more
 * powerful, fine-grained DOM/AST API found in the 
 * org.eclipse.jdt.core.dom package.
 */
public interface IDOMNode extends Cloneable  {

	/**
	 * Node type constant indicating a compilation unit.
	 * Nodes of this type maybe by safely cast to <code>IDOMCompilationUnit</code>.
	 * @see #getNodeType()
	 */
	public static int COMPILATION_UNIT= 1;
	
	/**
	 * Node type constant indicating a package declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMPackage</code>.
	* @see #getNodeType()
	 */
	public static int PACKAGE= 2;
	
	/**
	 * Node type constant indicating an import declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMImport</code>.
	 * @see #getNodeType()
	 */
	public static int IMPORT= 3;
	
	/**
	 * Node type constant indicating a type declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMType</code>.
	 * @see #getNodeType()
	 */
	public static int TYPE= 4;
	
	/**
	 * Node type constant indicating a field declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMField</code>.
	 * @see #getNodeType()
	 */
	public static int FIELD= 5;
	
	/**
	 * Node type constant indicating a method (or constructor) declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMMethod</code>.
	 * @see #getNodeType()
	 */
	public static int METHOD= 6;
	
	/**
	 * Node type constant indicating an initializer declaration.
	 * Nodes of this type maybe by safely cast to <code>IDOMInitializer</code>.
	 * @see #getNodeType()
	 */
	public static int INITIALIZER= 7;
	
/**
 * Adds the given un-parented node (document fragment) as the last child of this node.
 *
 * @param child the new child node
 * @exception DOMException if any of the following conditions hold:<ul>
 * <li>this node is not allowed to have children,</li>
 * <li>the child is not of an allowable type</li>
 * <li>the child already has a parent</li>
 * <li>the child is an ancestor of this node</li>
 * </ul>
 * @exception IllegalArgumentException if the child is <code>null</code>
 *
 * @see #insertSibling(IDOMNode)
 * @see #remove()
 */
public void addChild(IDOMNode child) throws DOMException, IllegalArgumentException;
/**
 * Returns whether this node is allowed to have children.
 *
 * @return <code>true</code> if this node can have children
 */
public boolean canHaveChildren();
/**
 * Returns a stand-alone copy of the document fragment represented by this node that
 * is in no way dependent on the document this node is part of.
 *
 * @return a copy of type <code>IDOMNode</code>
 * @see #addChild(IDOMNode)
 * @see #insertSibling(IDOMNode)
 * @see #remove()
 */
public Object clone();
/**
 * Returns the current contents of this document fragment as a character array.
 * <p>
 * Note: To obtain complete source for the ".java" file, ask a compilation unit
 * node for its contents.
 * </p>
 *
 * @return the contents, or <code>null</code> if this node has no contents
 */
public char[] getCharacters();
/**
 * Returns the first named child of this node with the given name.
 *
 * @param name the name
 * @return the child node, or <code>null</code> if no such child exists
 */
public IDOMNode getChild(String name);
/**
 * Returns an enumeration of children of this node. Returns an empty enumeration
 * if this node has no children (including nodes that cannot have children). 
 * Children appear in the order in which they are declared in the source code.
 *
 * @return an enumeration of the children
 */
public Enumeration getChildren();
/**
 * Returns the current contents of this document fragment.
 * <p>
 * Note: To obtain complete source for the ".java" file, ask a compilation unit
 * node for its contents.
 * </p>
 *
 * @return the contents, or <code>null</code> if this node has no contents
 */
public String getContents();
/**
 * Returns the first child of this node.
 * Children appear in the order in which they exist in the source code.
 *
 * @return the first child, or <code>null</code> if this node has no children
 * @see #getChildren()
 */
public IDOMNode getFirstChild();
/**
 * Returns a handle for the Java element associated with this 
 * document fragment, based on the parent Java element.
 *
 * @param parent the parent Java element
 * @exception IllegalArgumentException if the parent element is not
 *   of a valid parent type for this node
 * @return a handle for the Java element associated with this 
 *         document fragment, based on the parent Java element
 */
public IJavaElement getJavaElement(IJavaElement parent) throws IllegalArgumentException;
/**
 * Returns the name of this node.
 * More details are provided in each of the subtypes.
 *
 * @return the name, or <code>null</code> if it has no name
 */
public String getName();
/**
 * Returns the sibling node immediately following this node.
 *
 * @return the next node, or <code>null</code> if there is no following node
 */
public IDOMNode getNextNode();
/**
 * Returns the type of this node.
 *
 * @return one of the node type constants defined in <code>IDOMNode</code>
 */
public int getNodeType();
/**
 * Returns the parent of this node.
 *
 * @return the parent node, or <code>null</code> if this node does not have a 
 *   parent
 */
public IDOMNode getParent();
/**
 * Returns the sibling node immediately preceding this node.
 *
 * @return the previous node, or <code>null</code> if there is no preceding node
 */
public IDOMNode getPreviousNode();
/**
 * Inserts the given un-parented node as a sibling of this node, immediately before
 * this node.
 *
 * @param sibling the new sibling node
 * @exception DOMException if any of the following conditions hold:<ul>
 * <li>this node is a document fragment root</li>
 * <li>the sibling is not of the correct type</li>
 * <li>the sibling already has a parent</li>
 * <li>this sibling is an ancestor of this node</li>
 * </ul>
 * @exception IllegalArgumentException if the sibling is <code>null</code>
 *
 * @see #addChild(IDOMNode)
 * @see #clone()
 * @see #remove()
 */
public void insertSibling(IDOMNode sibling) throws DOMException, IllegalArgumentException;
/**
 * Returns whether the given node is an allowable child for this node.
 *
 * @param node the potential child node
 * @return <code>true</code> if the given node is an allowable child
 */
public boolean isAllowableChild(IDOMNode node);
/**
 * Returns whether this node's signature is equivalent to the given
 * node's signature. In other words, if the nodes were siblings,
 * would the declarations collide because they represent the same declaration.
 *
 * @param node the other node
 * @return <code>true</code> if the nodes have equivalent signatures
 */
public boolean isSignatureEqual(IDOMNode node);
/**
 * Separates this node from its parent and siblings, maintaining any ties that this node
 * has to the underlying document fragment. A document fragment that is removed
 * from its host document may still be dependent on that host document until it is
 * inserted into a different document. Removing a root node has no effect.
 *
 * @see #addChild(IDOMNode)
 * @see #clone()
 * @see #insertSibling(IDOMNode)
 */
public void remove();
/**
 * Sets the name of this node. Name format depends on node type.
 * More details are provided in each of the subtypes.
 *
 * @param name the name, or <code>null</code> to clear the name
 */
public void setName(String name);
}
