001: /*
002: * Licensed to the Apache Software Foundation (ASF) under one or more
003: * contributor license agreements. See the NOTICE file distributed with
004: * this work for additional information regarding copyright ownership.
005: * The ASF licenses this file to You under the Apache License, Version 2.0
006: * (the "License"); you may not use this file except in compliance with
007: * the License. You may obtain a copy of the License at
008: *
009: * http://www.apache.org/licenses/LICENSE-2.0
010: *
011: * Unless required by applicable law or agreed to in writing, software
012: * distributed under the License is distributed on an "AS IS" BASIS,
013: * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
014: * See the License for the specific language governing permissions and
015: * limitations under the License.
016: *
017: */
018:
019: package org.apache.tools.ant.taskdefs;
020:
021: import java.io.File;
022: import org.apache.tools.ant.BuildException;
023: import org.apache.tools.ant.Task;
024:
025: /**
026: * Sets a property to the base name of a specified file, optionally minus a
027: * suffix.
028: *
029: * This task can accept the following attributes:
030: * <ul>
031: * <li>file
032: * <li>property
033: * <li>suffix
034: * </ul>
035: * The <b>file</b> and <b>property</b> attributes are required. The
036: * <b>suffix</b> attribute can be specified either with or without
037: * the ".", and the result will be the same (ie., the
038: * returned file name will be minus the .suffix).
039: * <p>
040: * When this task executes, it will set the specified property to the
041: * value of the last element in the specified file. If file is a
042: * directory, the basename will be the last directory element. If file
043: * is a full-path filename, the basename will be the simple file name.
044: * If a suffix is specified, and the specified file ends in that suffix,
045: * the basename will be the simple file name without the suffix.
046: *
047: *
048: * @since Ant 1.5
049: *
050: * @ant.task category="property"
051: */
052:
053: public class Basename extends Task {
054: private File file;
055: private String property;
056: private String suffix;
057:
058: /**
059: * file or directory to get base name from
060: * @param file file or directory to get base name from
061: */
062: public void setFile(File file) {
063: this .file = file;
064: }
065:
066: /**
067: * Property to set base name to.
068: * @param property name of property
069: */
070: public void setProperty(String property) {
071: this .property = property;
072: }
073:
074: /**
075: * Optional suffix to remove from base name.
076: * @param suffix suffix to remove from base name
077: */
078: public void setSuffix(String suffix) {
079: this .suffix = suffix;
080: }
081:
082: /**
083: * do the work
084: * @throws BuildException if required attributes are not supplied
085: * property and attribute are required attributes
086: */
087: public void execute() throws BuildException {
088: if (property == null) {
089: throw new BuildException("property attribute required",
090: getLocation());
091: }
092: if (file == null) {
093: throw new BuildException("file attribute required",
094: getLocation());
095: }
096: String value = file.getName();
097: if (suffix != null && value.endsWith(suffix)) {
098: // if the suffix does not starts with a '.' and the
099: // char preceding the suffix is a '.', we assume the user
100: // wants to remove the '.' as well (see docs)
101: int pos = value.length() - suffix.length();
102: if (pos > 0 && suffix.charAt(0) != '.'
103: && value.charAt(pos - 1) == '.') {
104: pos--;
105: }
106: value = value.substring(0, pos);
107: }
108: getProject().setNewProperty(property, value);
109: }
110: }
|