|
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.openide.loaders; import java.io.IOException; import java.io.Serializable; import java.util.*; import javax.swing.SwingUtilities; import org.openide.filesystems.*; import org.openide.loaders.*; import org.openide.cookies.*; import org.openide.util.*; import org.netbeans.junit.*; import java.util.Enumeration; public class FolderInstanceTest extends NbTestCase { public FolderInstanceTest() { super(""); } public FolderInstanceTest(java.lang.String testName) { super(testName); } public static void main(java.lang.String[] args) { if (args.length == 1) { junit.textui.TestRunner.run(new FolderInstanceTest (args[0])); } else { junit.textui.TestRunner.run(new NbTestSuite(FolderInstanceTest.class)); } } private static void setSystemProp(String key, String value) { java.util.Properties prop = System.getProperties(); if (prop.get(key) != null) return; prop.put(key, value); } /** Checks whether only necessary listeners are attached to the objects. * Initial object does not have a cookie. */ public void testListenersCountNoCookie () throws Exception { doTestListenersCount (false); } /** Checks whether only necessary listeners are attached to the objects. * Initial object has cookie. */ public void testListenersCountWithCookie () throws Exception { doTestListenersCount (true); } /** Because listeners have different code for objects with cookie and * without cookie, we add this utility test and run it twice. * * @param cookie add cookie or not */ private void doTestListenersCount (boolean cookie) throws Exception { FileSystem lfs = org.openide.filesystems.Repository.getDefault().getDefaultFileSystem(); FileObject bb = lfs.findResource("/AA"); if (bb != null) { bb.delete (); } FileUtil.createData (lfs.getRoot (), "/AA/A.simple"); bb = FileUtil.createFolder(lfs.getRoot (), "/AA"); DataFolder folder = DataFolder.findFolder (bb); DataLoader l = DataLoader.getLoader(DataLoaderTest.SimpleUniFileLoader.class); AddLoaderManuallyHid.addRemoveLoader(l, true); try { FileObject aa = lfs.findResource("/AA/A.simple"); DataObject tmp = DataObject.find (aa); assertEquals ("Is of the right type", DataLoaderTest.SimpleDataObject.class, tmp.getClass ()); DataLoaderTest.SimpleDataObject obj = (DataLoaderTest.SimpleDataObject)tmp; if (cookie) { obj.cookieSet().add (new InstanceSupport.Instance (new Integer (100))); } F instance = new F (folder); instance.instanceCreate (); Enumeration en = obj.listeners (); assertTrue ("Folder instance should have add one listener", en.hasMoreElements ()); en.nextElement (); assertTrue ("But there should be just one", !en.hasMoreElements ()); folder.getPrimaryFile().createData("B.simple"); assertEquals ("DO created", folder.getChildren ().length, 2); // wait to finish processing instance.instanceCreate (); en = obj.listeners (); assertTrue ("Folder instance should not change the amount of listeners", en.hasMoreElements ()); en.nextElement (); assertTrue ("And there still should be just one", !en.hasMoreElements ()); } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } } /** Checks whether folder instance correctly reacts to changes of cookies in data objects. */ public void testChangeCookie () throws Exception { String fsstruct [] = new String [] { "AA/A.simple" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject bb = lfs.findResource("/AA"); DataFolder folder = DataFolder.findFolder (bb); DataLoader l = DataLoader.getLoader(DataLoaderTest.SimpleUniFileLoader.class); AddLoaderManuallyHid.addRemoveLoader(l, true); try { FileObject aa = lfs.findResource("/AA/A.simple"); DataObject obj = DataObject.find (aa); if (! (obj instanceof DataLoaderTest.SimpleDataObject)) { fail ("Not instance of desired object"); } F instance = new F (folder); org.openide.nodes.CookieSet set = ((DataLoaderTest.SimpleDataObject)obj).cookieSet (); List list; list = (List)instance.instanceCreate (); if (!list.isEmpty ()) { fail ("Should be empty with object with no cookies"); } InstanceSupport.Instance is = new InstanceSupport.Instance (new Integer (100)); set.add (is); list = (List)instance.instanceCreate (); if (list.isEmpty ()) { fail ("Cookie added, should return instance"); } set.remove (is); list = (List)instance.instanceCreate (); if (!list.isEmpty ()) { fail ("Cookie removed should be empty"); } set.add (is); list = (List)instance.instanceCreate (); if (list.isEmpty ()) { fail ("Cookie added again, should return instance"); } } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } } /** Does FolderInstance react to change of order? */ public void testChangeOfOrder () throws Exception { String fsstruct [] = new String [] { "AA/A.simple", "AA/B.simple" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject f = lfs.findResource("/AA"); DataFolder folder = DataFolder.findFolder (f); DataLoader l = DataLoader.getLoader(DataLoaderTest.SimpleUniFileLoader.class); AddLoaderManuallyHid.addRemoveLoader(l, true); try { FileObject aa = lfs.findResource("/AA/A.simple"); DataObject objA = DataObject.find (aa); FileObject bb = lfs.findResource("/AA/B.simple"); DataObject objB = DataObject.find (bb); if (! (objA instanceof DataLoaderTest.SimpleDataObject)) { fail ("Not instance of desired object: " + objA); } if (! (objB instanceof DataLoaderTest.SimpleDataObject)) { fail ("Not instance of desired object: " + objB); } F instance = new F (folder); { org.openide.nodes.CookieSet set = ((DataLoaderTest.SimpleDataObject)objA).cookieSet (); InstanceSupport.Instance is = new InstanceSupport.Instance (new Integer (1)); set.add (is); } { org.openide.nodes.CookieSet set = ((DataLoaderTest.SimpleDataObject)objB).cookieSet (); InstanceSupport.Instance is = new InstanceSupport.Instance (new Integer (2)); set.add (is); } List list; list = (List)instance.instanceCreate (); assertEquals ("Two integer", 2, list.size ()); assertEquals ("1 is first", new Integer (1), list.get (0)); assertEquals ("2 is next", new Integer (2), list.get (1)); folder.setOrder (new DataObject[] { objB, objA }); list = (List)instance.instanceCreate (); assertEquals ("Two integer", 2, list.size ()); assertEquals ("2 is first", new Integer (2), list.get (0)); assertEquals ("1 is next", new Integer (1), list.get (1)); } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } } /** Tests whether correct result is returned when an object is added and removed * from the folder. */ public void testModification () throws Exception { String fsstruct [] = new String [] { "AA/" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject bb = lfs.findResource("/AA"); DataFolder folder = DataFolder.findFolder (bb); DataFolder subfolder = DataFolder.create (folder, "BB"); modification (new F (folder), folder); } /** Tests whether correct result is returned when an object is added and removed * from the folder. */ public void testModificationOnSubfolder () throws Exception { String fsstruct [] = new String [] { "AA/BB/" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject bb = lfs.findResource("/AA"); DataFolder folder = DataFolder.findFolder (bb); DataFolder subfolder = DataFolder.create (folder, "BB"); modification (new F (folder), subfolder); } /** Tests whether correct result is returned when an object is added and removed * from the folder. */ public void testModificationOnSubSubfolder () throws Exception { String fsstruct [] = new String [] { "/AA/BB/CC/DD/EE/FF/GG/HH/II/JJ/KK" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject bb = lfs.findResource("/AA"); DataFolder folder = DataFolder.findFolder (bb); Enumeration en = lfs.getRoot ().getChildren (true); FileObject fo = null; while (en.hasMoreElements ()) { FileObject f = (FileObject)en.nextElement (); if (f.isFolder ()) { fo = f; } } DataFolder subfolder = DataFolder.findFolder (fo); modification (new F (folder), subfolder); } public void testWhetherRenameTriggersRevalidationOfTheFolderInstance() throws Exception { String fsstruct [] = new String [] { "/AA/OldName.shadow" }; TestUtilHid.destroyLocalFileSystem (getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct); FileObject bb = lfs.findResource("/AA"); class NamedF extends F { public NamedF (DataFolder f) { super (f); } protected InstanceCookie acceptDataObject (DataObject obj) { return new InstanceSupport.Instance (obj.getName ()); } } DataFolder f = DataFolder.findFolder (bb); NamedF namedf = new NamedF (f); List result; result = (List)namedf.instanceCreate (); assertEquals ("One item", 1, result.size ()); assertEquals ("It is the name of data object", "OldName", result.get (0)); FileObject aa = lfs.findResource (fsstruct[0]); DataObject.find (aa).rename ("NewName"); result = (List)namedf.instanceCreate (); assertEquals ("One item", 1, result.size ()); assertEquals ("It is the name of data object", "NewName", result.get (0)); } /** Runs modification test on a given folder with provided folder instance. */ private static void modification (F instance, DataFolder folder) throws Exception { List list; int cnt; list = (List)instance.instanceCreate (); if (list.size () != 0) { fail ("List should be empty: " + list); } cnt = instance.getCount (); if (cnt != 1) { fail ("Too many calls to createInstance during initialization: " + cnt); } InstanceDataObject obj = InstanceDataObject.create (folder, null, Numb.class); list = (List)instance.instanceCreate (); assertEquals ("One item", 1, list.size ()); assertEquals ("The item is of the right class", Numb.class, list.get (0).getClass ()); cnt = instance.getCount (); if (cnt != 1) { fail ("Too many calls to createInstance after create: " + cnt); } obj.delete (); list = (List)instance.instanceCreate (); if (list.size () != 0) { fail ("List should be empty again: " + list); } cnt = instance.getCount (); if (cnt != 1) { fail ("Too many calls to createInstance after delete: " + cnt); } } private static class F extends FolderInstance { /** count number of changes. */ private int count; public F (DataFolder f) { super (f); } /** Getter to number of changes of this folder instance. */ public synchronized int getCount () { int c = count; count = 0; return c; } /** Accepts folder. */ protected InstanceCookie acceptFolder (DataFolder f) { return new F (f); } protected Object createInstance (InstanceCookie[] arr) throws java.io.IOException, ClassNotFoundException { synchronized (this) { count++; } LinkedList ll = new LinkedList (); for (int i = 0; i < arr.length; i++) { Object obj = arr[i].instanceCreate (); if (obj instanceof Collection) { ll.addAll ((Collection)obj); } else { ll.add (obj); } } return ll; } protected Task postCreationTask (Runnable run) { //super.postCreationTask (run); run.run (); return null; } } /** See #12960. * Appears that MenuBar.Folder was being passed already-invalidated objects * on occasion, which of course it was not prepared to deal with. * @author Jesse Glick */ public void testFolderInstanceNeverPassesInvObjects() throws Exception { String[] names = new String[100]; for (int i = 0; i < names.length; i++) { names[i] = "folder/file" + i + ".simple"; } TestUtilHid.destroyLocalFileSystem(getName()); FileSystem lfs = TestUtilHid.createLocalFileSystem(getName(), names); Repository.getDefault().addFileSystem(lfs); try { FileObject folder = lfs.findResource("folder"); DataLoader l = DataLoader.getLoader(DataLoaderTest.SimpleUniFileLoader.class); DataFolder f = DataFolder.findFolder(folder); InvCheckFolderInstance icfi = new InvCheckFolderInstance(f); assertTrue(icfi.ok); assertEquals(new Integer(0), icfi.instanceCreate()); //System.err.println("sample: " + DataObject.find(lfs.findResource(names[0]))); AddLoaderManuallyHid.addRemoveLoader(l, true); try { //System.err.println("sample: " + DataObject.find(lfs.findResource(names[0]))); assertTrue(icfi.ok); /* Thread.sleep(100); SwingUtilities.invokeAndWait(new Runnable() { public void run() { // just get here } }); Thread.sleep(100); System.err.println("sample: " + DataObject.find(lfs.findResource(names[0]))); */ Thread.sleep(1000); assertEquals(new Integer(100), icfi.instanceCreate()); //Thread.sleep(1000); assertTrue(icfi.ok); //Thread.sleep(1000); //assertTrue(icfi.ok); } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } //System.err.println("sample: " + DataObject.find(lfs.findResource(names[0]))); assertTrue(icfi.ok); Thread.sleep(1000); assertEquals(new Integer(0), icfi.instanceCreate()); //Thread.sleep(1000); assertTrue(icfi.ok); AddLoaderManuallyHid.addRemoveLoader(l, true); try { assertTrue(icfi.ok); Thread.sleep(1000); assertTrue(icfi.ok); } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } assertTrue(icfi.ok); AddLoaderManuallyHid.addRemoveLoader(l, true); try { assertTrue(icfi.ok); } finally { AddLoaderManuallyHid.addRemoveLoader(l, false); } assertTrue(icfi.ok); Thread.sleep(1000); assertTrue(icfi.ok); } finally { Repository.getDefault().removeFileSystem(lfs); } TestUtilHid.destroyLocalFileSystem(getName()); } private static final class InvCheckFolderInstance extends FolderInstance { public boolean ok = true; public InvCheckFolderInstance(DataFolder f) { super(f); } protected Object createInstance(InstanceCookie[] cookies) throws IOException, ClassNotFoundException { // Whatever, irrelevant. return new Integer(cookies.length); } protected InstanceCookie acceptDataObject(DataObject o) { if (! o.isValid()) { ok = false; Thread.dumpStack(); return null; } if (o instanceof DataLoaderTest.SimpleDataObject) { //System.err.println("got a simpledataobject"); // Simulate some computation here: try { Thread.sleep(10); } catch (InterruptedException ie) {} return new InstanceSupport.Instance("ignore"); } else { //System.err.println("got a " + o); return null; } } // For faithfulness to the original: protected Task postCreationTask (Runnable run) { return new AWTTask (run); } private static final class AWTTask extends Task { private boolean executed; public AWTTask (Runnable r) { super (r); Mutex.EVENT.readAccess (this); } public void run () { if (!executed) { super.run (); executed = true; } } public void waitFinished () { if (SwingUtilities.isEventDispatchThread ()) { run (); } else { super.waitFinished (); } } } } public static final class Numb extends Object implements Serializable { public Numb () { } } } |
... this post is sponsored by my books ... | |
#1 New Release! |
FP Best Seller |
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.