blob: ebefde96d394e02b1bcc3915a533afc152f724da [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* https://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.ivy.ant;
import java.util.HashMap;
import java.util.Map;
import org.apache.ivy.core.settings.IvyVariableContainer;
import org.apache.ivy.core.settings.IvyVariableContainerImpl;
import org.apache.ivy.util.Message;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.taskdefs.Property;
class IvyAntVariableContainer extends IvyVariableContainerImpl implements IvyVariableContainer {
private Map<String, String> overwrittenProperties = new HashMap<>();
private Project project;
public IvyAntVariableContainer(Project project) {
this.project = project;
}
public String getVariable(String name) {
String r = overwrittenProperties.get(name);
if (r == null) {
r = project.getProperty(name);
}
if (r == null) {
r = super.getVariable(name);
}
return r;
}
public void setVariable(String varName, String value, boolean overwrite) {
if (overwrite) {
Message.debug("setting '" + varName + "' to '" + value + "'");
overwrittenProperties.put(varName, substitute(value));
} else {
super.setVariable(varName, value, overwrite);
}
}
/**
* Updates the Ant Project used in this container with variables set in Ivy.
*
* All variables defined in Ivy will be set in the Ant project under two names:
* <ul>
* <li>the name of the variable</li>
* <li>the name of the variable suffixed with a dot + the given id, if the given id is not null
* </li>
* </ul>
*
* @param id
* The identifier of the settings in which the variables have been set, which should
* be used as property names suffix
*/
public void updateProject(String id) {
Map<String, String> r = new HashMap<>(super.getVariables());
r.putAll(overwrittenProperties);
for (Map.Entry<String, String> entry : r.entrySet()) {
setPropertyIfNotSet(entry.getKey(), entry.getValue());
if (id != null) {
setPropertyIfNotSet(entry.getKey() + "." + id, entry.getValue());
}
}
if (getEnvironmentPrefix() != null) {
Property propTask = new Property();
propTask.setProject(project);
propTask.setEnvironment(getEnvironmentPrefix());
propTask.init();
propTask.execute();
}
}
private void setPropertyIfNotSet(String property, String value) {
if (project.getProperty(property) == null) {
project.setProperty(property, value);
}
}
@SuppressWarnings("unchecked")
public Object clone() {
IvyAntVariableContainer result = (IvyAntVariableContainer) super.clone();
result.overwrittenProperties = (HashMap<String, String>) ((HashMap<String, String>) this.overwrittenProperties)
.clone();
return result;
}
}