blob: 5092d4e56b75e871367a509f930ce266589cbef7 [file] [log] [blame]
package org.apache.commons.jelly.tags.ant;
/*
* 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
*
* http://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.
*/
import java.io.File;
import java.util.Hashtable;
import org.apache.tools.ant.BuildException;
import org.apache.tools.ant.Project;
import org.apache.tools.ant.ProjectHelper;
/** A subclass of an ant <code>Project</code> which allows
* installation of delegators for particular functions.
*
* <p>
* Current delegation points include:
*
* <ul>
* <li>Properties</li>
* </ul>
*
* @author <a href="mailto:bob@eng.werken.com">bob mcwhirter</a>
*/
public class GrantProject extends Project {
// ------------------------------------------------------------
// Instance members
// ------------------------------------------------------------
/** Properties delegate. */
private PropsHandler propsHandler;
// ------------------------------------------------------------
// Constructors
// ------------------------------------------------------------
/** Construct a new, empty <code>GrantProject</code>.
*
* <p>
* Immediately after initialization, a <code>GrantProject</code>
* delegates <b>all</b> calls to the normal ant <code>Project</code>
* super class. Only after installing delegators will custom
* behaviour be achieved.
* </p>
*/
public GrantProject() {
this.propsHandler = null;
}
// ------------------------------------------------------------
// Instance methods
// ------------------------------------------------------------
/** Install a <code>PropsHandler</code> delegate.
*
* @param propsHandler The <code>PropsHandler</code> to install,
* or <code>null</code> to remove any currently installed
* <code>PropsHandler</code>.
*/
public void setPropsHandler(PropsHandler propsHandler) {
this.propsHandler = propsHandler;
}
/** Retrieve the currently installed <code>PropsHandler</code>.
*
* @return The currently installed <code>PropsHandler</code>,
* or <code>null</code> if no <code>PropsHandler</code>
* had yet to be installed.
*/
public PropsHandler getPropsHandler() {
return this.propsHandler;
}
// ------------------------------------------------------------
// org.apache.tools.ant.Project implementation
// ------------------------------------------------------------
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// properties delegators:
//
// If a PropsHandler is not installed, delegate
// up the hierarchy to the ant.Project parent
// class. Otherwise, delegate outwards using
// the PropsHandler.
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
public String replaceProperties(String value) throws BuildException {
return ProjectHelper.replaceProperties(this, value, getProperties());
}
public synchronized void setProperty(String key, String value) {
if (this.propsHandler == null) {
super.setProperty(key, value);
}
else {
this.propsHandler.setProperty(key, value);
}
}
public synchronized void setUserProperty(String key, String value) {
if (this.propsHandler == null) {
super.setUserProperty(key, value);
}
else {
this.propsHandler.setUserProperty(key, value);
}
}
public synchronized void setNewProperty(String key, String value) {
if (this.propsHandler == null) {
super.setNewProperty(key, value);
}
else {
this.propsHandler.setNewProperty(key, value);
}
}
public void setInheritedProperty(String key, String value) {
if (this.propsHandler == null) {
super.setInheritedProperty(key, value);
}
else {
this.propsHandler.setInheritedProperty(key, value);
}
}
public String getProperty(String key) {
if (this.propsHandler == null) {
return super.getProperty(key);
}
return this.propsHandler.getProperty(key);
}
public String getUserProperty(String key) {
if (this.propsHandler == null) {
return super.getUserProperty(key);
}
return this.propsHandler.getUserProperty(key);
}
public Hashtable getUserProperties() {
if (this.propsHandler == null) {
return super.getUserProperties();
}
return this.propsHandler.getUserProperties();
}
public Hashtable getProperties() {
if (this.propsHandler == null) {
return super.getProperties();
}
return this.propsHandler.getProperties();
}
public void copyUserProperties(Project other) {
if (this.propsHandler == null) {
super.copyUserProperties(other);
}
else {
this.propsHandler.copyUserProperties(other);
}
}
public void copyInheritedProperties(Project other) {
if (this.propsHandler == null) {
super.copyInheritedProperties(other);
}
else {
this.propsHandler.copyInheritedProperties(other);
}
}
public void setSystemProperties() {
if (this.propsHandler == null) {
super.setSystemProperties();
}
else {
this.propsHandler.setSystemProperties();
}
}
public void setJavaVersionProperty() throws BuildException {
// Always call the super, as they do some sanity checks
super.setJavaVersionProperty();
if (this.propsHandler != null) {
this.propsHandler.setJavaVersionProperty();
}
}
public void setBaseDir(File baseDir) throws BuildException {
super.setBaseDir(baseDir);
if (this.propsHandler != null) {
this.propsHandler.setPropertyIfUndefinedByUser(
"basedir",
baseDir.getPath());
}
}
}