alvinalexander.com | career | drupal | java | mac | mysql | perl | scala | uml | unix  

What this is

This file is included in the DevDaily.com "Java Source Code Warehouse" project. The intent of this project is to help you "Learn Java by Example" TM.

Other links

The source code

/*
 *                 Sun Public License Notice
 *
 * The contents of this file are subject to the Sun Public License
 * Version 1.0 (the "License"). You may not use this file except in
 * compliance with the License. A copy of the License is available at
 * http://www.sun.com/
 *
 * The Original Code is NetBeans. The Initial Developer of the Original
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2004 Sun
 * Microsystems, Inc. All Rights Reserved.
 */

package org.netbeans.spi.project.support.ant;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import org.netbeans.api.project.ProjectManager;
import org.netbeans.api.project.TestUtil;
import org.netbeans.api.queries.FileBuiltQuery;
import org.netbeans.junit.NbTestCase;
import org.netbeans.spi.queries.FileBuiltQueryImplementation;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.filesystems.LocalFileSystem;
import org.openide.loaders.DataObject;

// XXX testChangesFromAntPropertyChanges

/**
 * Test functionality of GlobFileBuiltQuery.
 * @author Jesse Glick
 */
public class GlobFileBuiltQueryTest extends NbTestCase {
    
    static {
        TestUtil.setLookup(new Object[] {
            AntBasedTestUtil.testAntBasedProjectType(),
        }, GlobFileBuiltQueryTest.class.getClassLoader());
    }
    
    public GlobFileBuiltQueryTest(String name) {
        super(name);
    }
    
    private FileObject scratch;
    private FileObject prj;
    private FileObject extsrc;
    private FileObject extbuild;
    private AntProjectHelper h;
    private FileBuiltQueryImplementation fbqi;
    private FileObject foo, bar, fooTest, baz, nonsense;
    private FileBuiltQuery.Status fooStatus, barStatus, fooTestStatus, bazStatus;
    
    protected void setUp() throws Exception {
        super.setUp();
        scratch = TestUtil.makeScratchDir(this);
        prj = scratch.createFolder("prj");
        h = ProjectGenerator.createProject(prj, "test");
        extsrc = scratch.createFolder("extsrc");
        extbuild = scratch.createFolder("extbuild");
        EditableProperties ep = h.getProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH);
        ep.setProperty("src.dir", "src");
        ep.setProperty("test.src.dir", "test/src");
        ep.setProperty("ext.src.dir", "../extsrc");
        ep.setProperty("build.classes.dir", "build/classes");
        ep.setProperty("test.build.classes.dir", "build/test/classes");
        ep.setProperty("ext.build.classes.dir", "../extbuild/classes");
        h.putProperties(AntProjectHelper.PROJECT_PROPERTIES_PATH, ep);
        ProjectManager.getDefault().saveProject(ProjectManager.getDefault().findProject(prj));
        foo = TestUtil.createFileFromContent(null, prj, "src/pkg/Foo.java");
        bar = TestUtil.createFileFromContent(null, prj, "src/pkg/Bar.java");
        fooTest = TestUtil.createFileFromContent(null, prj, "test/src/pkg/FooTest.java");
        baz = TestUtil.createFileFromContent(null, extsrc, "pkg2/Baz.java");
        nonsense = TestUtil.createFileFromContent(null, prj, "misc-src/whatever/Nonsense.java");
        fbqi = h.createGlobFileBuiltQuery(h.getStandardPropertyEvaluator(), new String[] {
            "${src.dir}/*.java",
            "${test.src.dir}/*.java",
            "${ext.src.dir}/*.java",
        }, new String[] {
            "${build.classes.dir}/*.class",
            "${test.build.classes.dir}/*.class",
            "${ext.build.classes.dir}/*.class",
        });
        fooStatus = fbqi.getStatus(foo);
        barStatus = fbqi.getStatus(bar);
        fooTestStatus = fbqi.getStatus(fooTest);
        bazStatus = fbqi.getStatus(baz);
    }
    
    /** Enough time (millisec) for file timestamps to be different. */
    private static final long PAUSE = 1500;
    
    public void testBasicFunctionality() throws Exception {
        assertNotNull("have status for Foo.java", fooStatus);
        assertNotNull("have status for Bar.java", barStatus);
        assertNotNull("have status for FooTest.java", fooTestStatus);
        assertNull("non-matching file ignored", fbqi.getStatus(nonsense));
        assertFalse("Foo.java not built", fooStatus.isBuilt());
        assertFalse("Bar.java not built", barStatus.isBuilt());
        assertFalse("FooTest.java not built", fooTestStatus.isBuilt());
        FileObject fooClass = TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("Foo.java now built", fooStatus.isBuilt());
        Thread.sleep(PAUSE);
        TestUtil.createFileFromContent(null, prj, "src/pkg/Foo.java");
        assertFalse("Foo.class out of date", fooStatus.isBuilt());
        TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("Foo.class rebuilt", fooStatus.isBuilt());
        fooClass.delete();
        assertFalse("Foo.class deleted", fooStatus.isBuilt());
        TestUtil.createFileFromContent(null, prj, "build/test/classes/pkg/FooTest.class");
        assertTrue("FooTest.java now built", fooTestStatus.isBuilt());
        assertFalse("Bar.java still not built", barStatus.isBuilt());
        TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("Foo.java built again", fooStatus.isBuilt());
        DataObject.find(foo).setModified(true);
        assertFalse("Foo.java modified", fooStatus.isBuilt());
        DataObject.find(foo).setModified(false);
        assertTrue("Foo.java unmodified again", fooStatus.isBuilt());
        FileObject buildDir = prj.getFileObject("build");
        assertNotNull("build dir exists", buildDir);
        buildDir.delete();
        assertFalse("Foo.java not built (build dir gone)", fooStatus.isBuilt());
        assertFalse("Bar.java still not built", barStatus.isBuilt());
        assertFalse("FooTest.java not built (build dir gone)", fooTestStatus.isBuilt());
        // Just to check that you can delete a source file safely:
        bar.delete();
        barStatus.isBuilt();
    }
    
    /** Maximum amount of time (in milliseconds) to wait for expected changes. */
    private static final long WAIT = 10000;
    /** Maximum amount of time (in milliseconds) to wait for unexpected changes. */
    private static final long QUICK_WAIT = 500;
    
    public void testChangeFiring() throws Exception {
        AntBasedTestUtil.TestCL fooL = new AntBasedTestUtil.TestCL();
        fooStatus.addChangeListener(fooL);
        AntBasedTestUtil.TestCL barL = new AntBasedTestUtil.TestCL();
        barStatus.addChangeListener(barL);
        AntBasedTestUtil.TestCL fooTestL = new AntBasedTestUtil.TestCL();
        fooTestStatus.addChangeListener(fooTestL);
        assertFalse("Foo.java not built", fooStatus.isBuilt());
        FileObject fooClass = TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("change in Foo.java", fooL.expect(WAIT));
        assertTrue("Foo.java now built", fooStatus.isBuilt());
        assertFalse("no more changes in Foo.java", fooL.expect(QUICK_WAIT));
        fooClass.delete();
        assertTrue("change in Foo.java", fooL.expect(WAIT));
        assertFalse("Foo.java no longer built", fooStatus.isBuilt());
        assertFalse("no changes yet in FooTest.java", fooTestL.expect(QUICK_WAIT));
        assertFalse("FooTest.java not yet built", fooTestStatus.isBuilt());
        FileObject fooTestClass = TestUtil.createFileFromContent(null, prj, "build/test/classes/pkg/FooTest.class");
        assertTrue("change in FooTest.java", fooTestL.expect(WAIT));
        assertTrue("FooTest.java now built", fooTestStatus.isBuilt());
        FileObject buildDir = prj.getFileObject("build");
        assertNotNull("build dir exists", buildDir);
        buildDir.delete();
        assertFalse("no change in Foo.java (still not built)", fooL.expect(QUICK_WAIT));
        assertFalse("Foo.java not built (build dir gone)", fooStatus.isBuilt());
        assertTrue("got change in FooTest.java (build dir gone)", fooTestL.expect(WAIT));
        assertFalse("FooTest.java not built (build dir gone)", fooTestStatus.isBuilt());
        assertFalse("never got changes in Bar.java (never built)", barL.expect(QUICK_WAIT));
        TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("change in Foo.class", fooL.expect(WAIT));
        assertTrue("Foo.class created", fooStatus.isBuilt());
        Thread.sleep(PAUSE);
        TestUtil.createFileFromContent(null, prj, "src/pkg/Foo.java");
        assertTrue("change in Foo.java", fooL.expect(WAIT));
        assertFalse("Foo.class out of date", fooStatus.isBuilt());
        TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("touched Foo.class", fooL.expect(WAIT));
        assertTrue("Foo.class touched", fooStatus.isBuilt());
        DataObject.find(foo).setModified(true);
        assertTrue("Foo.java modified in memory", fooL.expect(WAIT));
        assertFalse("Foo.java modified in memory", fooStatus.isBuilt());
        DataObject.find(foo).setModified(false);
        assertTrue("Foo.java unmodified in memory", fooL.expect(WAIT));
        assertTrue("Foo.java unmodified again", fooStatus.isBuilt());
        File buildF = new File(FileUtil.toFile(prj), "build");
        assertTrue("build dir exists", buildF.isDirectory());
        TestUtil.deleteRec(buildF);
        assertFalse(buildF.getAbsolutePath() + " is gone", buildF.exists());
        prj.getFileSystem().refresh(false);
        assertTrue("build dir deleted", fooL.expect(WAIT));
        assertFalse("Foo.class gone (no build dir)", fooStatus.isBuilt());
        File pkg = new File(buildF, "classes/pkg".replace('/', File.separatorChar));
        File fooClassF = new File(pkg, "Foo.class");
        //System.err.println("--> going to make " + fooClassF);
        assertTrue("created " + pkg, pkg.mkdirs());
        assertFalse("no such file yet: " + fooClassF, fooClassF.exists());
        OutputStream os = new FileOutputStream(fooClassF);
        os.close();
        prj.getFileSystem().refresh(false);
        assertTrue(fooClassF.getAbsolutePath() + " created on disk", fooL.expect(WAIT));
        assertTrue("Foo.class back", fooStatus.isBuilt());
        Thread.sleep(PAUSE);
        TestUtil.createFileFromContent(null, prj, "src/pkg/Foo.java");
        assertTrue("change in Foo.java", fooL.expect(WAIT));
        assertFalse("Foo.class out of date", fooStatus.isBuilt());
        os = new FileOutputStream(fooClassF);
        os.write(69); // force Mac OS X to update timestamp
        os.close();
        prj.getFileSystem().refresh(false);
        assertTrue("Foo.class recreated on disk", fooL.expect(WAIT));
        assertTrue("Foo.class touched", fooStatus.isBuilt());
    }
    
    public void testExternalSourceRoots() throws Exception {
        // Cf. #43609.
        assertNotNull("have status for Baz.java", bazStatus);
        AntBasedTestUtil.TestCL bazL = new AntBasedTestUtil.TestCL();
        bazStatus.addChangeListener(bazL);
        assertFalse("Baz.java not built", bazStatus.isBuilt());
        FileObject bazClass = TestUtil.createFileFromContent(null, extbuild, "classes/pkg2/Baz.class");
        assertTrue("got change", bazL.expect(WAIT));
        assertTrue("Baz.java now built", bazStatus.isBuilt());
        Thread.sleep(PAUSE);
        TestUtil.createFileFromContent(null, extsrc, "pkg2/Baz.java");
        assertTrue("got change", bazL.expect(WAIT));
        assertFalse("Baz.class out of date", bazStatus.isBuilt());
        TestUtil.createFileFromContent(null, extbuild, "classes/pkg2/Baz.class");
        assertTrue("got change", bazL.expect(WAIT));
        assertTrue("Baz.class rebuilt", bazStatus.isBuilt());
        bazClass.delete();
        assertTrue("got change", bazL.expect(WAIT));
        assertFalse("Baz.class deleted", bazStatus.isBuilt());
        TestUtil.createFileFromContent(null, extbuild, "classes/pkg2/Baz.class");
        assertTrue("got change", bazL.expect(WAIT));
        assertTrue("Baz.java built again", bazStatus.isBuilt());
        DataObject.find(baz).setModified(true);
        assertTrue("got change", bazL.expect(WAIT));
        assertFalse("Baz.java modified", bazStatus.isBuilt());
        DataObject.find(baz).setModified(false);
        assertTrue("got change", bazL.expect(WAIT));
        assertTrue("Baz.java unmodified again", bazStatus.isBuilt());
        extbuild.delete();
        assertTrue("got change", bazL.expect(WAIT));
        assertFalse("Baz.java not built (build dir gone)", bazStatus.isBuilt());
    }
    
    public void testFileRenames() throws Exception {
        // Cf. #45694.
        assertNotNull("have status for Foo.java", fooStatus);
        AntBasedTestUtil.TestCL fooL = new AntBasedTestUtil.TestCL();
        fooStatus.addChangeListener(fooL);
        assertFalse("Foo.java not built", fooStatus.isBuilt());
        FileObject fooClass = TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo.class");
        assertTrue("got change", fooL.expect(WAIT));
        assertTrue("Foo.java now built", fooStatus.isBuilt());
        FileLock lock = foo.lock();
        try {
            foo.rename(lock, "Foo2", "java");
        } finally {
            lock.releaseLock();
        }
        assertTrue("got change", fooL.expect(WAIT));
        assertFalse("Foo2.java no longer built", fooStatus.isBuilt());
        fooClass = TestUtil.createFileFromContent(null, prj, "build/classes/pkg/Foo2.class");
        assertTrue("got change", fooL.expect(WAIT));
        assertTrue("Now Foo2.java is built", fooStatus.isBuilt());
    }
    
}
... this post is sponsored by my books ...

#1 New Release!

FP Best Seller

 

new blog posts

 

Copyright 1998-2021 Alvin Alexander, alvinalexander.com
All Rights Reserved.

A percentage of advertising revenue from
pages under the /java/jwarehouse URI on this website is
paid back to open source projects.