/*******************************************************************************
 * Copyright (c) Nov 13, 2012, 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.util.ArrayList;
import java.util.List;

import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.RuntimeConfigurable;
import org.apache.tools.ant.Task;
import org.eclipse.ant.core.AntSecurityException;
import org.eclipse.ant.internal.core.IAntCoreConstants;
import org.eclipse.ant.internal.ui.preferences.AntEditorPreferenceConstants;

/**
 * Supports the Ant augment task, which over-writes (augments) existing nodes
 * based on their id
 * 
 * @see "http://ant.apache.org/manual/Tasks/augment.html"
 */
public class AntAugmentTaskNode extends AntTaskNode {

	String attrId = null;
	
	public AntAugmentTaskNode(Task task, String label) {
		super(task, label);
		//we need to cache the id as it is removed from the wrapping attribute list when the AugemntReference is configured
		RuntimeConfigurable wrapper = task.getRuntimeConfigurableWrapper();
		attrId = (String) wrapper.getAttributeMap().get(IAntCoreConstants.ID);
	}

	/* (non-Javadoc)
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#configure(boolean)
	 */
	public boolean configure(boolean validateFully) {
		if(fConfigured) {
			return false;
		}
	    //only configure if the user cares about the problems
		try {
			getTask().maybeConfigure();
			fConfigured= true;
			return true;
		} catch (BuildException be) {
			handleBuildException(be, AntEditorPreferenceConstants.PROBLEM_TASKS);
		} catch (AntSecurityException se) {
			//either a system exit or setting of system property was attempted
			handleBuildException(new BuildException(AntModelMessages.AntTaskNode_0), AntEditorPreferenceConstants.PROBLEM_SECURITY);
		}
		catch(IllegalStateException ise) {
			//this is thrown when the id to augment does not exist
			//https://bugs.eclipse.org/bugs/show_bug.cgi?id=396219
			handleBuildException(new BuildException(ise), AntEditorPreferenceConstants.PROBLEM_TASKS);
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#containsOccurrence(java.lang.String)
	 */
	public boolean containsOccurrence(String identifier) {
		if(identifier != null) {
			boolean prop= identifier.startsWith("${") && identifier.endsWith("}"); //$NON-NLS-1$ //$NON-NLS-2$
			//the 'id' is the only attribute of an augment
			if(!prop) {
				return identifier.equals(attrId);
			}
			return attrId  != null && identifier.indexOf(attrId) > -1;
		}
		return false;
	}
	
	/* (non-Javadoc)
	 * @see org.eclipse.ant.internal.ui.model.AntTaskNode#computeIdentifierOffsets(java.lang.String)
	 */
	public List computeIdentifierOffsets(String identifier) {
		//augment nodes can only contain an occurrence of the id of the task
		//they augment, compute the offset based on the the index of the id + the node offset
		if(attrId != null && identifier != null && identifier.length() > 0) {
			String text = getAntModel().getText(getOffset(), getLength());
	        if (text == null || text.length() == 0) {
	        	return null;
	        }
			ArrayList list = new ArrayList();
			int idx = text.indexOf(attrId);
			if(idx > -1) {
				list.add(new Integer(getOffset() + idx));
			}
			return list;
		}
		return null;
	}
}
