From d25488cbbb28cf25e1f91f714c70999fd105432d Mon Sep 17 00:00:00 2001 From: Matthew Jason Benson Date: Mon, 20 Aug 2012 17:48:34 +0000 Subject: [PATCH] Any FileResource whose represented File has a parent also has a basedir. git-svn-id: https://svn.apache.org/repos/asf/ant/core/trunk@1375136 13f79535-47bb-0310-9956-ffa450edef68 --- WHATSNEW | 2 + .../ant/types/resources/FileResource.java | 15 ++- .../ant/types/resources/FileResourceTest.java | 109 ++++++++++++++++++ 3 files changed, 121 insertions(+), 5 deletions(-) create mode 100644 src/tests/junit/org/apache/tools/ant/types/resources/FileResourceTest.java diff --git a/WHATSNEW b/WHATSNEW index f9ab98345..811246f24 100644 --- a/WHATSNEW +++ b/WHATSNEW @@ -14,6 +14,8 @@ Changes that could break older environments: classes of Execute has been extracted to the org.apache.tools.ant.taskdefs.launcher package. + * Any FileResource whose represented File has a parent also has a basedir. + Fixed bugs: ----------- diff --git a/src/main/org/apache/tools/ant/types/resources/FileResource.java b/src/main/org/apache/tools/ant/types/resources/FileResource.java index e4284d9ed..6e0600f0e 100644 --- a/src/main/org/apache/tools/ant/types/resources/FileResource.java +++ b/src/main/org/apache/tools/ant/types/resources/FileResource.java @@ -57,8 +57,8 @@ public class FileResource extends Resource implements Touchable, FileProvider, * @param name the relative filename. */ public FileResource(File b, String name) { - setFile(FILE_UTILS.resolveFile(b, name)); - setBaseDir(b); + this.baseDir = b; + this.file = FILE_UTILS.resolveFile(b, name); } /** @@ -76,8 +76,8 @@ public class FileResource extends Resource implements Touchable, FileProvider, * @since Ant 1.8 */ public FileResource(Project p, File f) { + this(f); setProject(p); - setFile(f); } /** @@ -97,6 +97,9 @@ public class FileResource extends Resource implements Touchable, FileProvider, public void setFile(File f) { checkAttributesAllowed(); file = f; + if (f != null && (getBaseDir() == null || !FILE_UTILS.isLeadingPath(getBaseDir(), f))) { + setBaseDir(f.getParentFile()); + } } /** @@ -372,7 +375,7 @@ public class FileResource extends Resource implements Touchable, FileProvider, /** * Create a new resource that matches a relative or absolute path. - * If the current instance has a baseDir attribute, it is copied. + * If the current instance has a compatible baseDir attribute, it is copied. * @param path relative/absolute path to a resource * @return a new resource of type FileResource * @throws BuildException if desired @@ -381,7 +384,9 @@ public class FileResource extends Resource implements Touchable, FileProvider, public Resource getResource(String path) { File newfile = FILE_UTILS.resolveFile(getFile(), path); FileResource fileResource = new FileResource(newfile); - fileResource.setBaseDir(getBaseDir()); + if (FILE_UTILS.isLeadingPath(getBaseDir(), newfile)) { + fileResource.setBaseDir(getBaseDir()); + } return fileResource; } } diff --git a/src/tests/junit/org/apache/tools/ant/types/resources/FileResourceTest.java b/src/tests/junit/org/apache/tools/ant/types/resources/FileResourceTest.java new file mode 100644 index 000000000..bd7a8b397 --- /dev/null +++ b/src/tests/junit/org/apache/tools/ant/types/resources/FileResourceTest.java @@ -0,0 +1,109 @@ +/* + * 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. + * + */ +package org.apache.tools.ant.types.resources; + +import java.io.File; + +import org.apache.tools.ant.Project; + +import junit.framework.TestCase; + +/** + * Test Java API of {@link FileResource}. + */ +public class FileResourceTest extends TestCase { + + private File root; + + public void setUp() { + root = new File(System.getProperty("root")); + } + + public void testAttributes() { + FileResource f = new FileResource(); + f.setBaseDir(root); + f.setName("foo"); + assertEquals(new File(root, "foo"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo", f.getName()); + } + + public void testNonImmediateBasedir() { + FileResource f = new FileResource(); + f.setBaseDir(root); + f.setName("foo/bar"); + assertEquals(new File(root, "foo/bar"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo/bar", f.getName()); + } + + public void testFile() { + FileResource f = new FileResource(new File(root, "foo")); + assertEquals(new File(root, "foo"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo", f.getName()); + } + + public void testBasedirAndName() { + FileResource f = new FileResource(root, "foo"); + assertEquals(new File(root, "foo"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo", f.getName()); + } + + public void testNonImmediateBasedirAndName() { + FileResource f = new FileResource(root, "foo/bar"); + assertEquals(new File(root, "foo/bar"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo/bar", f.getName()); + } + + public void testProjectAndFilename() { + Project p = new Project(); + p.setBaseDir(root); + FileResource f = new FileResource(p, "foo"); + assertEquals(new File(root, "foo"), f.getFile()); + assertEquals(root, f.getBaseDir()); + assertEquals("foo", f.getName()); + } + + public void testRelativeFactoryResource() { + FileResource f = new FileResource(root, "foo"); + FileResource relative = f.getResource("bar").as(FileResource.class); + assertEquals(new File(root, "foo/bar"), relative.getFile()); + assertEquals("foo/bar", relative.getName()); + assertEquals(root, relative.getBaseDir()); + } + + public void testAbsoluteFactoryResource() { + FileResource f = new FileResource(new File(root, "foo/a")); + assertEquals(new File(root, "foo"), f.getBaseDir()); + File bar = new File(root, "bar"); + FileResource fromFactory = f.getResource(bar.getAbsolutePath()).as(FileResource.class); + assertEquals(bar, fromFactory.getFile()); + assertEquals(root, fromFactory.getBaseDir()); + } + + public void testParentSiblingFactoryResource() { + FileResource f = new FileResource(new File(root, "foo/a")); + assertEquals(new File(root, "foo"), f.getBaseDir()); + FileResource parentSibling = f.getResource("../../bar").as(FileResource.class); + assertEquals(root, parentSibling.getBaseDir()); + assertEquals("bar", parentSibling.getName()); + } +}