|
What this is
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-2003 Sun
* Microsystems, Inc. All Rights Reserved.
*/
package org.netbeans.api.project;
import java.io.OutputStream;
import java.net.URI;
import java.net.URL;
import java.util.zip.CRC32;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import org.netbeans.junit.NbTestCase;
import org.openide.filesystems.FileLock;
import org.openide.filesystems.FileObject;
import org.openide.filesystems.FileUtil;
import org.openide.filesystems.Repository;
import org.openide.filesystems.URLMapper;
import org.openide.util.Lookup;
/**
* Test functionality of FileOwnerQuery.
* @author Jesse Glick
*/
public class FileOwnerQueryTest extends NbTestCase {
public FileOwnerQueryTest(String name) {
super(name);
}
private FileObject scratch;
private FileObject projdir;
private FileObject randomfile;
private FileObject projfile;
private FileObject projfile2;
private FileObject subprojdir;
private FileObject subprojfile;
private Project p;
private FileObject zippedfile;
protected void setUp() throws Exception {
TestUtil.setLookup(new Object[] {
TestUtil.testProjectFactory(),
}, FileOwnerQueryTest.class.getClassLoader());
ProjectManager.getDefault().reset();
FileOwnerQuery.reset();
scratch = TestUtil.makeScratchDir(this);
projdir = scratch.createFolder("my-project");
projdir.createFolder("testproject");
randomfile = scratch.createData("randomfile");
projfile = projdir.createData("projfile");
FileObject projsubdir = projdir.createFolder("projsubdir");
projfile2 = projsubdir.createData("projfile2");
subprojdir = projdir.createFolder("subproject");
subprojdir.createFolder("testproject");
subprojfile = subprojdir.createData("subprojfile");
scratch.createFolder("external1").createFolder("subdir").createData("file");
scratch.createFolder("external2").createFolder("subdir").createData("file");
scratch.createFolder("external3").createFolder("subproject").createFolder("testproject");
p = ProjectManager.getDefault().findProject(projdir);
assertNotNull("found a project successfully", p);
// make jar:file:/.../projdir/foo.jar!/zipfile/zippedfile
FileObject foojar = projdir.createData("foo.jar");
FileLock lock = foojar.lock();
try {
OutputStream os = foojar.getOutputStream(lock);
try {
ZipOutputStream zos = new ZipOutputStream(os);
ZipEntry ze = new ZipEntry("zipdir/");
ze.setMethod(ZipEntry.STORED);
ze.setSize(0L);
ze.setCrc(new CRC32().getValue());
zos.putNextEntry(ze);
ze = new ZipEntry("zipdir/zippedfile");
ze.setMethod(ZipEntry.STORED);
ze.setSize(0L);
ze.setCrc(new CRC32().getValue());
zos.putNextEntry(ze);
zos.closeEntry();
zos.close();
} finally {
os.close();
}
} finally {
lock.releaseLock();
}
FileObject foojarRoot = FileUtil.getArchiveRoot(foojar);
assertNotNull("have an archive in " + foojar, foojarRoot);
zippedfile = foojarRoot.getFileObject("zipdir/zippedfile");
assertNotNull("zippedfile found in it", zippedfile);
}
protected void tearDown() throws Exception {
scratch = null;
projdir = null;
randomfile = null;
projfile = null;
p = null;
TestUtil.setLookup(Lookup.EMPTY);
}
public void testFileOwner() throws Exception {
assertEquals("correct project from projfile FileObject", p, FileOwnerQuery.getOwner(projfile));
URI u = FileUtil.toFile(projfile).toURI();
assertEquals("correct project from projfile URI " + u, p, FileOwnerQuery.getOwner(u));
assertEquals("correct project from projfile2 FileObject", p, FileOwnerQuery.getOwner(projfile2));
assertEquals("correct project from projfile2 URI", p, FileOwnerQuery.getOwner(FileUtil.toFile(projfile2).toURI()));
assertEquals("correct project from projdir FileObject", p, FileOwnerQuery.getOwner(projdir));
assertEquals("correct project from projdir URI", p, FileOwnerQuery.getOwner(FileUtil.toFile(projdir).toURI()));
// Check that it loads the project even though we have not touched it yet:
Project p2 = FileOwnerQuery.getOwner(subprojfile);
Project subproj = ProjectManager.getDefault().findProject(subprojdir);
assertEquals("correct project from subprojdir FileObject", subproj, p2);
assertEquals("correct project from subprojdir URI", subproj, FileOwnerQuery.getOwner(FileUtil.toFile(subprojdir).toURI()));
assertEquals("correct project from subprojfile FileObject", subproj, FileOwnerQuery.getOwner(subprojfile));
assertEquals("correct project from subprojfile URI", subproj, FileOwnerQuery.getOwner(FileUtil.toFile(subprojfile).toURI()));
assertEquals("no project from randomfile FileObject", null, FileOwnerQuery.getOwner(randomfile));
assertEquals("no project from randomfile URI", null, FileOwnerQuery.getOwner(FileUtil.toFile(randomfile).toURI()));
assertEquals("no project in C:\\", null, FileOwnerQuery.getOwner(URI.create("file:/C:/")));
}
public void testJarOwners() throws Exception {
assertEquals("correct owner of a ZIPped file", p, FileOwnerQuery.getOwner(zippedfile));
assertEquals("correct owner of a ZIPped file URL", p, FileOwnerQuery.getOwner(URI.create(zippedfile.getURL().toExternalForm())));
}
public void testExternalOwner() throws Exception {
FileObject ext1 = scratch.getFileObject("external1");
FileObject extfile1 = ext1.getFileObject("subdir/file");
assertEquals("no owner yet", null, FileOwnerQuery.getOwner(extfile1));
FileOwnerQuery.markExternalOwner(ext1, p, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
assertEquals("now have an owner", p, FileOwnerQuery.getOwner(extfile1));
assertEquals("even for the projdir", p, FileOwnerQuery.getOwner(ext1));
assertEquals("but not for something else", null, FileOwnerQuery.getOwner(scratch));
FileObject ext2 = scratch.getFileObject("external2");
FileObject extfile2 = ext2.getFileObject("subdir/file");
assertEquals("no owner yet", null, FileOwnerQuery.getOwner(extfile2));
Project p2 = ProjectManager.getDefault().findProject(subprojdir);
FileOwnerQuery.markExternalOwner(ext2, p2, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
assertEquals("now have an owner", p2, FileOwnerQuery.getOwner(extfile2));
assertEquals("even for the projdir", p2, FileOwnerQuery.getOwner(ext2));
assertEquals("but not for something else", null, FileOwnerQuery.getOwner(scratch));
assertEquals("still correct for first proj", p, FileOwnerQuery.getOwner(extfile1));
FileObject ext3 = scratch.getFileObject("external3");
assertEquals("no owner yet", null, FileOwnerQuery.getOwner(ext3));
FileOwnerQuery.markExternalOwner(ext3, p, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
assertEquals("now have an owner", p, FileOwnerQuery.getOwner(ext3));
FileObject ext3subproj = ext3.getFileObject("subproject");
Project p3 = FileOwnerQuery.getOwner(ext3subproj);
assertNotSame("different project", p, p3);
assertEquals("but subprojects are not part of it", ProjectManager.getDefault().findProject(ext3subproj), p3);
FileOwnerQuery.markExternalOwner(ext3, null, FileOwnerQuery.EXTERNAL_ALGORITHM_TRANSIENT);
assertEquals("unmarking an owner works", null, FileOwnerQuery.getOwner(ext3));
}
// XXX test URI usage of external owner
// XXX test GC of roots and projects used in external ownership:
// - the owning Project is not held strongly (just PM's soft cache)
// - the root is not held strongly (note - FOQ won't be accurate after it is collected)
// XXX test IAE from illegal calls to FOQ.markExternalOwner
// XXX test an owner which is above the project directory
}
|
| ... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
Copyright 1998-2024 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.