blob: bdba43ddb4ee5dd37203a9240d66d81f75de06cc [file] [log] [blame]
/*******************************************************************************
* Copyright (c) 2012, 2013 IBM Corporation and others.
*
* This program and the accompanying materials
* are made available under the terms of the Eclipse Public License 2.0
* which accompanies this distribution, and is available at
* https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* 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)
*/
@Override
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)
*/
@Override
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)
*/
@Override
public List<Integer> 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<Integer> list = new ArrayList<>();
int idx = text.indexOf(attrId);
if (idx > -1) {
list.add(Integer.valueOf(getOffset() + idx));
}
return list;
}
return null;
}
}