/*******************************************************************************
 * Copyright (c) 2004, 2013 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.ant.internal.ui.model;

import java.io.File;
import java.net.URLClassLoader;
import java.util.Map;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.Target;
import org.apache.tools.ant.Task;
import org.eclipse.core.resources.IFile;
import org.eclipse.jface.text.BadLocationException;
import org.xml.sax.Attributes;

public interface IAntModel {

	/**
	 * Returns the project node for this Ant model
	 * 
	 * @return the project node for this Ant model
	 */
	AntProjectNode getProjectNode();

	/**
	 * Returns the name of the external entity defined by the specified path
	 * 
	 * @param path
	 *            the path to the entity
	 * @return the name or the entity or <code>null</code> if no entity could be resolved
	 */
	String getEntityName(String path);

	/**
	 * Returns the location provider for this Ant model
	 * 
	 * @return the location provider for this Ant model
	 */
	LocationProvider getLocationProvider();

	/**
	 * Disposes this Ant model
	 */
	void dispose();

	/**
	 * Reconciles this Ant model with the buildfile it represents
	 */
	void reconcile();

	/**
	 * Sets the classloader for this Ant model
	 * 
	 * @param newClassLoader
	 *            the classloader to use when resolving this Ant model
	 */
	void setClassLoader(URLClassLoader newClassLoader);

	/**
	 * Sets the extra properties to be used for parsing If global settings as defined in the Ant UI preferences are to be used this method does not
	 * need to be called.
	 * 
	 * @param properties
	 *            the properties to ensure are set for parsing.
	 */
	void setProperties(Map<String, String> properties);

	/**
	 * Sets the property files to be used for parsing If global settings as defined in the Ant UI preferences are to be used this method does not need
	 * to be called.
	 * 
	 * @param propertyFiles
	 *            the file names of the property files to use for parsing
	 */
	void setPropertyFiles(String[] propertyFiles);

	/**
	 * Returns the Eclipse resource for the buildfile this Ant model represents
	 * 
	 * @return the Eclipse resource or <code>null</null> if the buildfile is not in the workspace
	 */
	IFile getFile();

	/**
	 * Returns the encoding from the backing {@link IAntModel}. If the model is <code>null</code> or the encoding cannot be computed from the location
	 * backing the model, <code>UTF-8</code> is returned
	 * 
	 * @return the encoding
	 * @since 3.7
	 */
	String getEncoding();

	/**
	 * Handles a <code>BuildException</code> that occurred during parsing.
	 * 
	 * @param be
	 *            the build exception that occurred
	 * @param node
	 *            the node associated with the problem
	 * @param severity
	 *            the severity of the problem
	 */
	void handleBuildException(BuildException be, AntElementNode node, int severity);

	/**
	 * Returns the project node for this Ant model
	 * 
	 * @param reconcile
	 *            whether or not to ensure the Ant model is reconciled before retrieving the project node
	 * @return the project node for this Ant model
	 */
	AntProjectNode getProjectNode(boolean reconcile);

	/**
	 * Adds the new target to this Ant model
	 * 
	 * @param newTarget
	 *            the new Apache Ant target
	 * @param lineNumber
	 *            the line number of the new target
	 * @param columnNumber
	 *            the column number of the new target
	 */
	void addTarget(Target newTarget, int lineNumber, int columnNumber);

	/**
	 * Adds the new project to this Ant model
	 * 
	 * @param project
	 *            the new Apache Ant project
	 * @param lineNumber
	 *            the line number of the new target
	 * @param columnNumber
	 *            the column number of the new target
	 */
	void addProject(Project project, int lineNumber, int columnNumber);

	/**
	 * Return the <code>java.io.File</code> that is the buildfile that this Ant model represents
	 * 
	 * @return the <code>java.io.File</code> that is the buildfile
	 */
	// TODO Could this just be getPath().toLocation();
	File getEditedFile();

	/**
	 * Returns whether this model contains task information
	 * 
	 * @return whether task information is included in this model
	 */
	boolean canGetTaskInfo();

	/**
	 * Returns whether this model contains lexical information
	 * 
	 * @return whether lexical information is included in this model
	 */
	boolean canGetLexicalInfo();

	/**
	 * Returns whether this model contains position information for the elements
	 * 
	 * @return whether position information is included in this model
	 */
	boolean canGetPositionInfo();

	/**
	 * Adds a comment to the Ant model Only called if <code>canGetLexicalInfo()</code> is <code>true</code>
	 * 
	 * @param lineNumber
	 *            the line number of the comment
	 * @param columnNumber
	 *            the column number of the comment
	 * @param length
	 *            the length of the comment
	 */
	void addComment(int lineNumber, int columnNumber, int length);

	/**
	 * Adds a DTD element to the Ant model Only called if <code>canGetLexicalInfo()</code> is <code>true</code>
	 * 
	 * @param name
	 *            the name of the DTD element
	 * @param lineNumber
	 *            the line number of the comment
	 * @param columnNumber
	 *            the column number of the comment
	 */
	void addDTD(String name, int lineNumber, int columnNumber);

	/**
	 * Adds the external entity to the Ant model
	 * 
	 * @param name
	 *            the name of the external entity
	 * @param currentEntityPath
	 *            the path of the entity
	 */
	void addEntity(String name, String currentEntityPath);

	/**
	 * Adds a task element to the Ant model Only called if <code>canGetTaskInfo()</code>() is <code>true</code>
	 * 
	 * @param task
	 *            the new Apache Ant task
	 * @param parentTask
	 *            the parent Apache Ant task or <code>null</code>
	 * @param attributes
	 *            the attributes of the new task
	 * @param lineNumber
	 *            the line number of the task
	 * @param columnNumber
	 *            the column number of the task
	 */
	void addTask(Task newTask, Task parentTask, Attributes attributes, int lineNumber, int columnNumber);

	/**
	 * Sets the length of the current element that was just finished being parsed
	 * 
	 * @param lineNumber
	 *            the current line number of parsing
	 * @param columnNumber
	 *            the current column number of parsing
	 */
	void setCurrentElementLength(int lineNumber, int columnNumber);

	/**
	 * Returns the offset in the document associated with this Ant model for the given line number and position in the line
	 * 
	 * @param lineNumber
	 *            the line number in the doc
	 * @param column
	 *            the column number in that line
	 * @return the offset in the document
	 * @throws BadLocationException
	 */
	int getOffset(int lineNumber, int column) throws BadLocationException;

	/**
	 * Handles a fatal error from an exception during parsing.
	 * 
	 * @param e
	 *            the exception that occurred
	 */
	void error(Exception e);

	/**
	 * Handles a fatal error from an exception during parsing.
	 * 
	 * @param e
	 *            the exception that occurred
	 */
	void fatalError(Exception e);

	/**
	 * Handles a warning from an exception during parsing.
	 * 
	 * @param e
	 *            the exception that occurred
	 */
	void warning(Exception e);

	void errorFromElement(Exception e, AntElementNode element, int lineNumber, int columnNumber);

	void errorFromElementText(Exception e, int offset, int columnNumber);

	/**
	 * Returns the text in the document of this Ant model for the given offset and length
	 * 
	 * @param offset
	 *            the offset within the document
	 * @param length
	 *            the length of text to retrieve
	 * @return the text at the given offset of <code>null</code> if not contained within the document range
	 */
	String getText(int offset, int length);

	/**
	 * Caches the text from the provided defining node so that the node definitions are only updated if the text changes on reconciliation
	 * 
	 * @param node
	 *            the defining task node to cache the associated text
	 */
	void setDefiningTaskNodeText(AntDefiningTaskNode node);

	/**
	 * Record the prefix-URI Namespace mapping.
	 * 
	 * @param prefix
	 *            The Namespace prefix being declared.
	 * @param uri
	 *            The Namespace URI the prefix is mapped to.
	 */
	void addPrefixMapping(String prefix, String uri);
}
