This Bugzilla instance is a read-only archive of historic NetBeans bug reports. To report a bug in NetBeans please follow the project's instructions for reporting issues.

View | Details | Raw Unified | Return to bug 43189
Collapse All | Expand All

(-)loaders/src/org/openide/loaders/DataFolder.java (+86 lines)
Lines 21-26 Link Here
21
import java.io.File;
21
import java.io.File;
22
import java.lang.ref.*;
22
import java.lang.ref.*;
23
import java.lang.reflect.InvocationTargetException;
23
import java.lang.reflect.InvocationTargetException;
24
import java.lang.reflect.Method;
24
import java.util.*;
25
import java.util.*;
25
import javax.swing.Action;
26
import javax.swing.Action;
26
import javax.swing.UIManager;
27
import javax.swing.UIManager;
Lines 34-42 Link Here
34
import org.openide.filesystems.*;
35
import org.openide.filesystems.*;
35
import org.openide.util.HelpCtx;
36
import org.openide.util.HelpCtx;
36
import org.openide.nodes.*;
37
import org.openide.nodes.*;
38
import org.openide.options.SystemOption;
37
import org.openide.util.Lookup;
39
import org.openide.util.Lookup;
38
import org.openide.util.NbBundle;
40
import org.openide.util.NbBundle;
39
import org.openide.util.RequestProcessor;
41
import org.openide.util.RequestProcessor;
42
import org.openide.util.SharedClassObject;
40
43
41
/** A folder containing data objects.
44
/** A folder containing data objects.
42
* Is actually itself a data object, whose primary (and only) file object
45
* Is actually itself a data object, whose primary (and only) file object
Lines 147-152 Link Here
147
            throw new IllegalArgumentException ("Not folder: " + fo); // NOI18N
150
            throw new IllegalArgumentException ("Not folder: " + fo); // NOI18N
148
        }
151
        }
149
        list = reassignList (fo, attach);
152
        list = reassignList (fo, attach);
153
        
154
        // if this is not DefaultFS then start listening on IDESettings
155
        try {
156
            if (!isDefaultFS()) {
157
                initGlobalSorting();
158
                if (ideSettings != null && getSortingMethod != null) {
159
                    ideSettings.addPropertyChangeListener(new PropertyChangeListener() {
160
                            public void propertyChange(PropertyChangeEvent evt) {
161
                                if ("sorting".equals(evt.getPropertyName())) { //NOI18N
162
                                    list.changeComparator();
163
                                    firePropertyChange (PROP_SORT_MODE, null, null);
164
                                }
165
                            }
166
                        });
167
                }
168
            }
169
        } catch (IOException e) {
170
            ErrorManager.getDefault().log(ErrorManager.WARNING, e.toString());
171
            // OK, no sorting
172
        }
173
        
150
    }
174
    }
151
    
175
    
152
    /** Attaches a listener to the folder list, removes any previous one if registered.
176
    /** Attaches a listener to the folder list, removes any previous one if registered.
Lines 191-196 Link Here
191
    * @exception IOException if the mode cannot be set
215
    * @exception IOException if the mode cannot be set
192
    */
216
    */
193
    public synchronized final void setSortMode (SortMode mode) throws IOException {
217
    public synchronized final void setSortMode (SortMode mode) throws IOException {
218
        if (!isDefaultFS()) {
219
            throw new IOException("Order can be set only on DefaultFileSystem DataFolders."); // NOI18N
220
        }
194
        SortMode old = getOrder ().getSortMode ();
221
        SortMode old = getOrder ().getSortMode ();
195
        getOrder ().setSortMode (mode);
222
        getOrder ().setSortMode (mode);
196
        firePropertyChange (PROP_SORT_MODE, old, getOrder ().getSortMode ());
223
        firePropertyChange (PROP_SORT_MODE, old, getOrder ().getSortMode ());
Lines 218-227 Link Here
218
    *
245
    *
219
    */
246
    */
220
    public synchronized final void setOrder (DataObject[] arr) throws IOException {
247
    public synchronized final void setOrder (DataObject[] arr) throws IOException {
248
        if (!isDefaultFS()) {
249
            throw new IOException("Order can be set only on DefaultFileSystem DataFolders."); // NOI18N
250
        }
221
        getOrder ().setOrder (arr);
251
        getOrder ().setOrder (arr);
222
        firePropertyChange (PROP_ORDER, null, null);
252
        firePropertyChange (PROP_ORDER, null, null);
223
    }
253
    }
254
    
255
    private boolean isDefaultFS() throws IOException {
256
        return getPrimaryFile().getFileSystem().equals(Repository.getDefault().getDefaultFileSystem());
257
    }
258
    
259
    // XXX: find IDESettings and read the global sort mode.
260
    // Ugly, but there is no other way. Should be resolved once
261
    // we have Settings API.
262
    static SortMode getGlobalSorting() {
263
        try {
264
            if (ideSettings != null && getSortingMethod != null) {
265
                return (SortMode)getSortingMethod.invoke(ideSettings, new Object[0]);
266
            }
267
        } catch (Exception e) {
268
            // ignore, default sorting will be used
269
            ErrorManager.getDefault().log(ErrorManager.WARNING, e.toString());
270
        }
271
        return SortMode.FOLDER_NAMES;
272
    }
273
    
274
    // XXX: find IDESettings and read the global sort mode.
275
    // Ugly, but there is no other way. Should be resolved once
276
    // we have Settings API.
277
    static synchronized void initGlobalSorting() {
278
        try {
279
            if (!globalSortingInitialized) {
280
                globalSortingInitialized = true;
281
                ClassLoader l = (ClassLoader) Lookup.getDefault().lookup(ClassLoader.class);
282
                Class clazz = l.loadClass("org.netbeans.core.IDESettings"); // NOI18N
283
                ideSettings = (SystemOption)SharedClassObject.findObject(clazz, true);
284
                if (ideSettings != null) {
285
                    getSortingMethod = clazz.getMethod("getSorting", null); // NOI18N
286
                    assert getSortingMethod != null;
287
                }
288
            }
289
        } catch (Exception e) {
290
            ErrorManager.getDefault().notify(e);
291
        }
292
    }
224
293
294
    // IDESettings instance
295
    private static SystemOption ideSettings;
296
    
297
    // IDESettings.getSortingMethod() method
298
    private static Method getSortingMethod;
299
    
300
    // was IDESettings already initialized?
301
    private static boolean globalSortingInitialized = false;
302
    
225
    /** Getter for order object.
303
    /** Getter for order object.
226
    * @return order of children
304
    * @return order of children
227
    */
305
    */
Lines 1128-1133 Link Here
1128
        */
1206
        */
1129
        protected Sheet createSheet () {
1207
        protected Sheet createSheet () {
1130
            Sheet s = super.createSheet ();
1208
            Sheet s = super.createSheet ();
1209
            try {
1210
                if (!DataFolder.this.isDefaultFS()) {
1211
                    return s;
1212
                }
1213
            } catch (IOException ex) {
1214
                // something wrong: disable sorting
1215
                return s;
1216
            }
1131
1217
1132
            Sheet.Set ss = new Sheet.Set ();
1218
            Sheet.Set ss = new Sheet.Set ();
1133
            ss.setName (SET_SORTING);
1219
            ss.setName (SET_SORTING);
(-)loaders/src/org/openide/loaders/DataShadow.java (-3 / +30 lines)
Lines 34-42 Link Here
34
import org.openide.util.MutexException;
34
import org.openide.util.MutexException;
35
35
36
/** Default implementation of a shortcut to another data object.
36
/** Default implementation of a shortcut to another data object.
37
* Since 1.13 it extends MultiDataObject.
37
 * Since 1.13 it extends MultiDataObject.
38
* @author Jan Jancura, Jaroslav Tulach
38
 * <p><strong>Usage deprecation:</strong> usage of DataShadow on
39
*/
39
 * non-DefaultFileSystem is deprecated. Also a DataShadow on DefaultFileSystem
40
 * can point only to file/folder on DefaultFileSystem. The main usage of
41
 * DataShadow on client filesystems was in old project system which is now
42
 * replaced by buildsystem. If there is somebody who still need this
43
 * functionality they should think about Datasystems independent solution,
44
 * because #1) Datasystems are planned for redesign and #2) after Settings
45
 * API is implemented the DataShadow will be fully deprecated.
46
 * @author Jan Jancura, Jaroslav Tulach
47
 */
40
public class DataShadow extends MultiDataObject implements DataObject.Container {
48
public class DataShadow extends MultiDataObject implements DataObject.Container {
41
    /** generated Serialized Version UID */
49
    /** generated Serialized Version UID */
42
    static final long serialVersionUID = 6305590675982925167L;
50
    static final long serialVersionUID = 6305590675982925167L;
Lines 238-243 Link Here
238
    private void init(DataObject original) {
246
    private void init(DataObject original) {
239
        if (original == null)
247
        if (original == null)
240
            throw new IllegalArgumentException();
248
            throw new IllegalArgumentException();
249
        try {
250
            if (!original.getPrimaryFile().getFileSystem().equals(
251
                    Repository.getDefault().getDefaultFileSystem())) {
252
                ErrorManager.getDefault().log(ErrorManager.WARNING, "Usage of " +
253
                    "DataShadow on non-DefaultFileSystem was deprecated. Found: "+this); // NOI18N
254
            }
255
        } catch (FileStateInvalidException e) {
256
            ErrorManager.getDefault().log(ErrorManager.WARNING, e.toString());
257
        }
241
        setOriginal (original);
258
        setOriginal (original);
242
        enqueueDataShadow(this);
259
        enqueueDataShadow(this);
243
    }
260
    }
Lines 391-396 Link Here
391
    */
408
    */
392
    protected static DataObject deserialize (FileObject fileObject) throws java.io.IOException {
409
    protected static DataObject deserialize (FileObject fileObject) throws java.io.IOException {
393
        URL url = readURL(fileObject);
410
        URL url = readURL(fileObject);
411
        checkDeprecatedUsage(fileObject, url);
394
        FileObject fo = URLMapper.findFileObject(url);
412
        FileObject fo = URLMapper.findFileObject(url);
395
        if (fo == null) {
413
        if (fo == null) {
396
            throw new java.io.FileNotFoundException (url.toExternalForm());
414
            throw new java.io.FileNotFoundException (url.toExternalForm());
Lines 398-403 Link Here
398
        return DataObject.find (fo);
416
        return DataObject.find (fo);
399
    }
417
    }
400
    
418
    
419
    private static void checkDeprecatedUsage(FileObject fo, URL u) {
420
        if (u != null && (!u.getProtocol().startsWith("nbfs"))) {
421
            ErrorManager.getDefault().log(ErrorManager.WARNING, "Found " + // NOI18N
422
                "DataShadow which points to a non-DefaultFileSystem file. " + // NOI18N
423
                "Such a usage was deprecated. It is "+fo+" and it points to "+u); // NOI18N
424
        }
425
    }
426
    
401
    static URL readURL(final FileObject f) throws IOException {
427
    static URL readURL(final FileObject f) throws IOException {
402
        if ( f.getSize() == 0 ) {
428
        if ( f.getSize() == 0 ) {
403
            Object fileName = f.getAttribute ("originalFile"); // NOI18N
429
            Object fileName = f.getAttribute ("originalFile"); // NOI18N
Lines 562-567 Link Here
562
    
588
    
563
    private void tryUpdate() throws IOException {
589
    private void tryUpdate() throws IOException {
564
        URL url = readURL(getPrimaryFile ());
590
        URL url = readURL(getPrimaryFile ());
591
        checkDeprecatedUsage(getPrimaryFile(), url);
565
        if (url.equals(original.getPrimaryFile().getURL())) {
592
        if (url.equals(original.getPrimaryFile().getURL())) {
566
            return;
593
            return;
567
        }
594
        }
(-)loaders/src/org/openide/loaders/FolderComparator.java (-1 / +18 lines)
Lines 13-18 Link Here
13
13
14
package org.openide.loaders;
14
package org.openide.loaders;
15
15
16
import java.io.InvalidObjectException;
17
import java.io.ObjectStreamException;
18
import java.io.Serializable;
16
import java.util.*;
19
import java.util.*;
17
import org.openide.filesystems.FileObject;
20
import org.openide.filesystems.FileObject;
18
21
Lines 23-29 Link Here
23
 * Compares objects in a folder.
26
 * Compares objects in a folder.
24
 * @author Jaroslav Tulach, Jesse Glick
27
 * @author Jaroslav Tulach, Jesse Glick
25
 */
28
 */
26
class FolderComparator extends DataFolder.SortMode implements Comparator {
29
class FolderComparator extends DataFolder.SortMode implements Comparator, Serializable {
27
    /** modes */
30
    /** modes */
28
    public static final int NONE = 0;
31
    public static final int NONE = 0;
29
    public static final int NAMES = 1;
32
    public static final int NAMES = 1;
Lines 37-42 Link Here
37
    /** by folders, then size */
40
    /** by folders, then size */
38
    public static final int SIZE = 5;
41
    public static final int SIZE = 5;
39
42
43
    private static final long serialVersionUID = 3328227315468795461L;
40
44
41
    /** mode to use */
45
    /** mode to use */
42
    private int mode;
46
    private int mode;
Lines 211-214 Link Here
211
        }
215
        }
212
    }
216
    }
213
217
218
    private Object readResolve() throws ObjectStreamException {
219
        switch (mode) {
220
            case NONE: return DataFolder.SortMode.NONE;
221
            case NAMES: return DataFolder.SortMode.NAMES;
222
            case CLASS: return DataFolder.SortMode.CLASS;
223
            case FOLDER_NAMES: return DataFolder.SortMode.FOLDER_NAMES;
224
            case LAST_MODIFIED: return DataFolder.SortMode.LAST_MODIFIED;
225
            case SIZE: return DataFolder.SortMode.SIZE;
226
            default:
227
                throw new InvalidObjectException("Cannot deserialize FolderComparator for mode "+mode); // NOI18N
228
        }
229
    }
230
    
214
}
231
}
(-)loaders/src/org/openide/loaders/FolderList.java (-2 / +2 lines)
Lines 262-268 Link Here
262
262
263
    /** Setter for sort mode.
263
    /** Setter for sort mode.
264
    */
264
    */
265
    private synchronized void changeComparator () {
265
    synchronized void changeComparator () {
266
        final boolean LOG = err.isLoggable(ErrorManager.INFORMATIONAL);
266
        final boolean LOG = err.isLoggable(ErrorManager.INFORMATIONAL);
267
        if (LOG) err.log ("changeComparator on " + folder);
267
        if (LOG) err.log ("changeComparator on " + folder);
268
        final RequestProcessor.Task previous = comparatorTask;
268
        final RequestProcessor.Task previous = comparatorTask;
Lines 813-819 Link Here
813
    */
813
    */
814
    private void fireChildrenChange (Collection add, Collection removed) {
814
    private void fireChildrenChange (Collection add, Collection removed) {
815
        if (pcs != null) {
815
        if (pcs != null) {
816
            if (!add.isEmpty() || !removed.isEmpty()) {
816
            if ((!add.isEmpty() || !removed.isEmpty()) && !add.equals(removed)) {
817
                pcs.firePropertyChange (PROP_CHILDREN, null, null);
817
                pcs.firePropertyChange (PROP_CHILDREN, null, null);
818
            }
818
            }
819
        }
819
        }
(-)loaders/src/org/openide/loaders/FolderOrder.java (-3 / +46 lines)
Lines 18-23 Link Here
18
18
19
import java.io.IOException;
19
import java.io.IOException;
20
import java.util.*;
20
import java.util.*;
21
import org.openide.ErrorManager;
21
22
22
import org.openide.filesystems.*;
23
import org.openide.filesystems.*;
23
import org.openide.loaders.DataFolder.SortMode;
24
import org.openide.loaders.DataFolder.SortMode;
Lines 27-33 Link Here
27
 *
28
 *
28
 * @author  Jaroslav Tulach
29
 * @author  Jaroslav Tulach
29
 */
30
 */
30
final class FolderOrder extends Object implements Comparator {
31
class FolderOrder extends Object implements Comparator {
31
    /** Separator of names of two files. The first file should be before
32
    /** Separator of names of two files. The first file should be before
32
     * the second one in partial ordering
33
     * the second one in partial ordering
33
     */
34
     */
Lines 207-213 Link Here
207
208
208
    /** Stores the order to files.
209
    /** Stores the order to files.
209
    */
210
    */
210
    public void write () throws IOException {
211
    private void write () throws IOException {
211
        // Let it throw the IOException:
212
        // Let it throw the IOException:
212
        //if (folder.getFileSystem ().isReadOnly ()) return; // cannot write to read-only FS
213
        //if (folder.getFileSystem ().isReadOnly ()) return; // cannot write to read-only FS
213
        if (order == null) {
214
        if (order == null) {
Lines 393-398 Link Here
393
    * @return the order
394
    * @return the order
394
    */
395
    */
395
    public static FolderOrder findFor (FileObject folder) {
396
    public static FolderOrder findFor (FileObject folder) {
397
        try {
398
            if (!folder.getFileSystem().equals(Repository.getDefault().getDefaultFileSystem())) {
399
                return getGlobalOrdering();
400
            }
401
        } catch (FileStateInvalidException ex) {
402
            // something wrong, return global order
403
            ErrorManager.getDefault().log(ErrorManager.WARNING, ex.toString());
404
            return getGlobalOrdering();
405
        }
396
        FolderOrder order = null;
406
        FolderOrder order = null;
397
        synchronized (map) {
407
        synchronized (map) {
398
            Reference ref = (Reference)map.get (folder);
408
            Reference ref = (Reference)map.get (folder);
Lines 411-417 Link Here
411
            return order;            
421
            return order;            
412
        }        
422
        }        
413
    }
423
    }
424
425
    private static FolderOrder globalFolderOrder;
426
    
427
    private static synchronized FolderOrder getGlobalOrdering() {
428
        if (globalFolderOrder == null) {
429
            globalFolderOrder = new GlobalFolderOrder();
430
        }
431
        return globalFolderOrder;
432
    }
433
    
434
    private static class GlobalFolderOrder extends FolderOrder {
435
        
436
        private GlobalFolderOrder() {
437
            super(null);
438
            DataFolder.initGlobalSorting();
439
        }
440
        
441
        public void setSortMode(SortMode mode) throws IOException {
442
            // ignore
443
        }
444
        
445
        public SortMode getSortMode() {
446
            return DataFolder.getGlobalSorting();
447
        }
448
        
449
        public void setOrder(DataObject[] arr) throws IOException {
450
            // ignore
451
        }
414
        
452
        
415
     
453
        public Map getOrderingConstraints(Collection objects) {
454
            // ignore
455
            return null;
456
        }
457
        
458
    }
416
    
459
    
417
}
460
}
(-)test/cfg-unit.xml (+13 lines)
Lines 208-213 Link Here
208
        <testset dir="unit/src">
208
        <testset dir="unit/src">
209
            <patternset>
209
            <patternset>
210
                <!-- Add your own code tests -->
210
                <!-- Add your own code tests -->
211
                <include name="org/openide/loaders/InstanceDataObjectTest.class/testFiringEventWhenDeleted"/>
212
                <!-- Don't worry about these, cannot be fixed currently: -->
213
                <exclude name="org/openide/loaders/DataFolderTest.class/testSortMode"/> <!-- failing in cont. test -->
214
                <exclude name="org/openide/loaders/DataFolderTest.class/testMove"/> <!-- failing in cont. test -->
215
                <exclude name="org/openide/loaders/DataFolderTest.class/testPropChildrenFiredAfterInvalidation"/> <!-- failing in cont. test -->
216
                <exclude name="org/openide/loaders/DataFolderTest.class/testOrderWhenMultiFileSystemSetDelegatesIsCalled" /> <!-- failing in cont. test -->
217
                <!-- following was disabled because of issue #20179 -->
218
                <exclude name="org/openide/loaders/DataFolderMoveTest.class"/>
219
                <!-- does not work an nobody knows why -->
220
                <exclude name="org/openide/loaders/FolderInstanceTest.class/testFolderInstanceNeverPassesInvObjects"/>
221
                <exclude name="org/openide/loaders/FolderInstanceTest.class/testChangeOfOrder"/>
222
                <exclude name="org/openide/loaders/FolderInstanceTest.class/testListenersCountWithCookie"/>
223
                <exclude name="org/openide/loaders/FolderInstanceTest.class/testChangeCookie"/>
211
            </patternset>
224
            </patternset>
212
        </testset>
225
        </testset>
213
    </testbag>
226
    </testbag>
(-)test/unit/src/org/openide/loaders/DataFolderSetOrderTest.java (-132 / +25 lines)
Lines 16-34 Link Here
16
import org.openide.filesystems.*;
16
import org.openide.filesystems.*;
17
17
18
import java.beans.*;
18
import java.beans.*;
19
import java.io.File;
19
import java.io.IOException;
20
import java.io.IOException;
20
import java.util.ArrayList;
21
import java.util.ArrayList;
21
import java.util.Arrays;
22
import java.util.Arrays;
22
import junit.framework.AssertionFailedError;
23
import junit.framework.AssertionFailedError;
23
24
24
import org.netbeans.junit.*;
25
import org.netbeans.junit.*;
26
import org.openide.modules.ModuleInfo;
27
import org.openide.util.Lookup;
25
28
26
/** Does a change in order on folder fire the right properties?
29
/** Does a change in order on folder fire the right properties?
27
 *
30
 *
28
 * @author  Jaroslav Tulach
31
 * @author  Jaroslav Tulach
29
 */
32
 */
30
public class DataFolderSetOrderTest extends NbTestCase 
33
public class DataFolderSetOrderTest extends NbTestCase {
31
implements PropertyChangeListener {
32
    private DataFolder aa;
34
    private DataFolder aa;
33
    private DataFolder bb;
35
    private DataFolder bb;
34
    private ArrayList events = new ArrayList ();
36
    private ArrayList events = new ArrayList ();
Lines 38-98 Link Here
38
        super (name);
40
        super (name);
39
    }
41
    }
40
42
41
    public static void main (String[] args) throws Exception {
42
        junit.textui.TestRunner.run(new NbTestSuite (DataFolderSetOrderTest.class));
43
    }
44
45
    /** If execution fails we wrap the exception with 
46
     * new log message.
47
     */
48
    protected void runTest () throws Throwable {
49
        ErrManager.messages.append ("Starting test ");
50
        ErrManager.messages.append (getName ());
51
        ErrManager.messages.append ('\n');
52
        
53
        try {
54
            super.runTest ();
55
        } catch (AssertionFailedError ex) {
56
            AssertionFailedError ne = new AssertionFailedError (ex.getMessage () + " Log:\n" + ErrManager.messages);
57
            ne.setStackTrace (ex.getStackTrace ());
58
            throw ne;
59
        }
60
    }
61
    
62
    protected void setUp () throws Exception {
43
    protected void setUp () throws Exception {
63
        System.setProperty("org.openide.util.Lookup", "org.openide.loaders.DataFolderSetOrderTest$Lkp");
64
        assertNotNull ("ErrManager has to be in lookup", org.openide.util.Lookup.getDefault ().lookup (ErrManager.class));
65
        
66
        if (previous != null) {
44
        if (previous != null) {
67
            previous.waitFinished ();
45
            previous.waitFinished ();
68
        }
46
        }
47
        clearWorkDir();
48
49
        AddLoaderManuallyHid.addRemoveLoader(DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class), true);
69
        
50
        
70
        TestUtilHid.destroyLocalFileSystem (getName());
51
        TestUtils.initDefaultFS(this);
71
        String fsstruct [] = new String [] {
52
        String fsstruct [] = new String [] {
72
            "AA/X.txt",
53
            "AA/X.txt",
73
            "AA/Y.txt",
54
            "AA/Y.txt",
74
            "BB/X.slow",
55
            "BB/X.slow",
75
        };
56
        };
57
        TestUtils.createFilesOnDefaultFS(fsstruct);
76
        
58
        
77
        FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct);
59
        FileSystem lfs = Repository.getDefault().getDefaultFileSystem();
60
        aa = DataFolder.findFolder (lfs.getRoot().getFileObject("AA"));
61
        bb = DataFolder.findFolder (lfs.getRoot().getFileObject("BB"));    
62
        aa.addPropertyChangeListener (new PropertyChangeListener() {
63
                public void propertyChange(PropertyChangeEvent evt) {
64
                    events.add(evt.getPropertyName());
65
                }
78
66
79
        aa = DataFolder.findFolder (lfs.findResource ("AA"));
67
            });
80
        bb = DataFolder.findFolder (lfs.findResource ("BB"));    
81
        
82
        aa.addPropertyChangeListener (this);
83
    }
68
    }
84
    
69
    
85
    protected void tearDown () throws Exception {
70
    protected void tearDown () throws Exception {
86
        final DataLoader l = DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class);
71
        AddLoaderManuallyHid.addRemoveLoader(DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class), false);
87
        
88
        aa.removePropertyChangeListener (this);
89
    }
72
    }
90
    
73
    
91
    private void makeFolderRecognizerBusy () throws Exception {
74
    private void makeFolderRecognizerBusy () throws Exception {
92
        if (getName().indexOf ("Busy") < 0) {
93
            return;
94
        }
95
        
96
        final DataLoader l = DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class);
75
        final DataLoader l = DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class);
97
        synchronized (l) {
76
        synchronized (l) {
98
            // this will trigger bb.getChildren
77
            // this will trigger bb.getChildren
Lines 109-122 Link Here
109
        // now the folder recognizer is blocked at least for 2s
88
        // now the folder recognizer is blocked at least for 2s
110
    }
89
    }
111
90
112
    private void doTest () throws Exception {
91
    private void doTest(boolean slow) throws Exception {
113
        DataObject[] arr = aa.getChildren ();
92
        DataObject[] arr = aa.getChildren ();
114
        assertEquals ("Two objects", 2, arr.length);
93
        assertEquals ("Two objects", 2, arr.length);
115
        ArrayList l = new ArrayList (Arrays.asList (arr));
94
        ArrayList l = new ArrayList (Arrays.asList (arr));
116
        java.util.Collections.reverse (l);
95
        java.util.Collections.reverse (l);
117
        
96
        
118
        assertEquals ("No changes yet", 0, events.size ());
97
        assertEquals ("No changes yet "+events, 0, events.size ());
119
        makeFolderRecognizerBusy ();
98
        if (slow) {
99
            makeFolderRecognizerBusy();
100
        }
120
        aa.setOrder ((DataObject[])l.toArray (new DataObject[0]));
101
        aa.setOrder ((DataObject[])l.toArray (new DataObject[0]));
121
        
102
        
122
        DataObject[] narr = aa.getChildren ();
103
        DataObject[] narr = aa.getChildren ();
Lines 133-232 Link Here
133
    }
114
    }
134
    
115
    
135
    public void testReorderWithoutChecksWhenFolderReconizerIsBusy () throws Exception {
116
    public void testReorderWithoutChecksWhenFolderReconizerIsBusy () throws Exception {
136
        doTest ();
117
        doTest(true);
137
    }
118
    }
138
119
139
    
120
    
140
    public void testReorderWithoutChecks () throws Exception {
121
    public void testReorderWithoutChecks () throws Exception {
141
        doTest ();
122
        doTest(false);
142
    }
123
    }
143
    
124
    
144
    public void propertyChange (PropertyChangeEvent evt) {
145
        events.add (evt.getPropertyName ());
146
    }
147
148
    //
149
    // Our fake lookup
150
    //
151
    public static final class Lkp extends org.openide.util.lookup.AbstractLookup {
152
        public Lkp () {
153
            this (new org.openide.util.lookup.InstanceContent ());
154
        }
155
        
156
        private Lkp (org.openide.util.lookup.InstanceContent ic) {
157
            super (ic);
158
            ic.add (new ErrManager ());
159
            ic.add (new Pool ());
160
        }
161
    }
162
    //
163
    // Logging support
164
    //
165
    public static final class ErrManager extends org.openide.ErrorManager {
166
        public static final StringBuffer messages = new StringBuffer ();
167
        
168
        private String prefix;
169
        
170
        public ErrManager () {
171
            this (null);
172
        }
173
        public ErrManager (String prefix) {
174
            this.prefix = prefix;
175
        }
176
        
177
        public Throwable annotate (Throwable t, int severity, String message, String localizedMessage, Throwable stackTrace, java.util.Date date) {
178
            return t;
179
        }
180
        
181
        public Throwable attachAnnotations (Throwable t, org.openide.ErrorManager.Annotation[] arr) {
182
            return t;
183
        }
184
        
185
        public org.openide.ErrorManager.Annotation[] findAnnotations (Throwable t) {
186
            return null;
187
        }
188
        
189
        public org.openide.ErrorManager getInstance (String name) {
190
            if (
191
                name.startsWith ("org.openide.loaders.FolderList")
192
//              || name.startsWith ("org.openide.loaders.FolderInstance")
193
            ) {
194
                return new ErrManager ('[' + name + ']');
195
            } else {
196
                // either new non-logging or myself if I am non-logging
197
                return new ErrManager ();
198
            }
199
        }
200
        
201
        public void log (int severity, String s) {
202
            if (prefix != null) {
203
                messages.append (prefix);
204
                messages.append (s);
205
                messages.append ('\n');
206
            }
207
        }
208
        
209
        public void notify (int severity, Throwable t) {
210
            log (severity, t.getMessage ());
211
        }
212
        
213
        public boolean isNotifiable (int severity) {
214
            return prefix != null;
215
        }
216
        
217
        public boolean isLoggable (int severity) {
218
            return prefix != null;
219
        }
220
        
221
    } // end of ErrManager
222
    
223
    private static final class Pool extends DataLoaderPool {
224
        
225
        protected java.util.Enumeration loaders () {
226
            return new org.openide.util.enum.SingletonEnumeration (
227
                DataLoader.getLoader(DataObjectInvalidationTest.SlowDataLoader.class)
228
            );
229
        }
230
        
231
    } // end of Pool
232
}
125
}
(-)test/unit/src/org/openide/loaders/DataFolderTest.java (-38 / +35 lines)
Lines 171-185 Link Here
171
    /** Tests whether children are updated immediatelly.
171
    /** Tests whether children are updated immediatelly.
172
     */
172
     */
173
    public void testOrderInAtomicAction () throws Exception {
173
    public void testOrderInAtomicAction () throws Exception {
174
        clearWorkDir();
175
        TestUtils.initDefaultFS(this);
174
        String fsstruct [] = new String [] {
176
        String fsstruct [] = new String [] {
175
            "AA/",
177
            "AA/",
176
        };
178
        };
179
        TestUtils.createFilesOnDefaultFS(fsstruct);
177
        
180
        
178
        TestUtilHid.destroyLocalFileSystem (getName());
181
        DataFolder df = DataFolder.findFolder (Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("AA"));
179
        FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct);
180
181
        
182
        DataFolder df = DataFolder.findFolder (lfs.findResource ("AA"));
183
182
184
        int expected = 0;
183
        int expected = 0;
185
        int count = 5;
184
        int count = 5;
Lines 243-262 Link Here
243
     * layers on system filesystem.
242
     * layers on system filesystem.
244
     */
243
     */
245
    public void testOrderWhenAttributeIsChanged () throws Exception {
244
    public void testOrderWhenAttributeIsChanged () throws Exception {
246
//        if (System.getProperty("netbeans.user") == null)
245
        clearWorkDir();
247
//            fail("Test can't run in this environment, use -Dxtest.mode=ide");
246
        TestUtils.initDefaultFS(this);
248
        
249
        String fsstruct [] = new String [] {
247
        String fsstruct [] = new String [] {
250
            "AA/AAA/",
248
            "AA/AAA/",
251
            "AA/BBB/",
249
            "AA/BBB/",
252
            "AA/CCC/"
250
            "AA/CCC/"
253
        };
251
        };
252
        TestUtils.createFilesOnDefaultFS(fsstruct);
253
        DataFolder df = DataFolder.findFolder (Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("AA"));
254
        
254
        
255
        TestUtilHid.destroyLocalFileSystem (getName());
256
        FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct);
257
258
        
259
        DataFolder df = DataFolder.findFolder (lfs.findResource ("AA"));
260
        DataObject[] arr = df.getChildren ();
255
        DataObject[] arr = df.getChildren ();
261
256
262
        String append = "";
257
        String append = "";
Lines 294-310 Link Here
294
    }
289
    }
295
    
290
    
296
    public void testOrderWhenSet () throws Exception {
291
    public void testOrderWhenSet () throws Exception {
292
        clearWorkDir();
293
        TestUtils.initDefaultFS(this);
297
        String fsstruct [] = new String [] {
294
        String fsstruct [] = new String [] {
298
            "AA/AAA/",
295
            "AA/AAA/",
299
            "AA/BBB/",
296
            "AA/BBB/",
300
            "AA/CCC/"
297
            "AA/CCC/"
301
        };
298
        };
299
        TestUtils.createFilesOnDefaultFS(fsstruct);
300
        DataFolder df = DataFolder.findFolder (Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("AA"));
302
        
301
        
303
        TestUtilHid.destroyLocalFileSystem (getName());
304
        FileSystem lfs = TestUtilHid.createLocalFileSystem (getName (), fsstruct);
305
306
        
307
        DataFolder df = DataFolder.findFolder (lfs.findResource ("AA"));
308
        DataObject[] arr = df.getChildren ();
302
        DataObject[] arr = df.getChildren ();
309
        DataObject[] rev = new DataObject [arr.length];
303
        DataObject[] rev = new DataObject [arr.length];
310
        
304
        
Lines 323-329 Link Here
323
        assertChildrenArrays ("", arr, df.getChildren (), false);
317
        assertChildrenArrays ("", arr, df.getChildren (), false);
324
    }
318
    }
325
319
320
    // XXX: rewrite this test somehow. only DefaultFS can be ordered now
321
    /*
326
    public void testOrderWhenMultiFileSystemSetDelegatesIsCalled () throws Exception {
322
    public void testOrderWhenMultiFileSystemSetDelegatesIsCalled () throws Exception {
323
        clearWorkDir();
327
        String fsstruct [] = new String [] {
324
        String fsstruct [] = new String [] {
328
            "AA/AAA/",
325
            "AA/AAA/",
329
            "AA/BBB/",
326
            "AA/BBB/",
Lines 371-410 Link Here
371
        assertTrue(l.gotSomething());
368
        assertTrue(l.gotSomething());
372
        //System.out.println("df " + df.getPrimaryFile ().getAttribute (DataFolder.EA_ORDER));
369
        //System.out.println("df " + df.getPrimaryFile ().getAttribute (DataFolder.EA_ORDER));
373
        assertChildrenArrays ("", arr, df.getChildren (), false);
370
        assertChildrenArrays ("", arr, df.getChildren (), false);
374
    }
371
    }*/
375
    
372
    
376
    // #13820:
373
    // #13820:
377
    public void testOrderWhenFileRenamed() throws Exception {
374
    public void testOrderWhenFileRenamed() throws Exception {
378
        TestUtilHid.destroyLocalFileSystem(getName());
375
        clearWorkDir();
379
        FileSystem fs = TestUtilHid.createLocalFileSystem(getName(), new String[] {
376
        TestUtils.initDefaultFS(this);
377
        String fsstruct [] = new String [] {
380
            "folder/a1/",
378
            "folder/a1/",
381
            "folder/b2/",
379
            "folder/b2/",
382
            "folder/c3/",
380
            "folder/c3/",
383
        });
381
        };
384
        DataFolder folder = DataFolder.findFolder(fs.findResource("folder"));
382
        TestUtils.createFilesOnDefaultFS(fsstruct);
383
        DataFolder folder = DataFolder.findFolder (Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("folder"));
384
        
385
        assertEquals("initial order is alphabetical", "a1/b2/c3", childrenOrder(folder));
385
        assertEquals("initial order is alphabetical", "a1/b2/c3", childrenOrder(folder));
386
        OrderListener l = new OrderListener();
386
        OrderListener l = new OrderListener();
387
        folder.addPropertyChangeListener(l);
387
        folder.addPropertyChangeListener(l);
388
        DataObject.find(fs.findResource("folder/b2")).rename("d4");
388
        DataObject.find(Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("folder/b2")).rename("d4");
389
        assertTrue("Renaming a file fires PROP_CHILDREN on folder", l.gotSomething());
389
        assertTrue("Renaming a file fires PROP_CHILDREN on folder", l.gotSomething());
390
        assertEquals("order after rename is still alphabetical", "a1/c3/d4", childrenOrder(folder));
390
        assertEquals("order after rename is still alphabetical", "a1/c3/d4", childrenOrder(folder));
391
    }
391
    }
392
    
392
    
393
    public void testSortMode() throws Exception {
393
    public void testSortMode() throws Exception {
394
        TestUtilHid.destroyLocalFileSystem(getName());
394
        clearWorkDir();
395
        FileSystem fs = TestUtilHid.createLocalFileSystem(getName(), new String[] {
395
        TestUtils.initDefaultFS(this);
396
            "folder/a/",
396
        String fsstruct [] = new String [] {
397
            "folder/b.xml",
397
            "folder2/a/",
398
            "folder/c/",
398
            "folder2/b.xml",
399
            "folder/e.xml",
399
            "folder2/c/",
400
            "folder/d.instance",
400
            "folder2/e.xml",
401
        });
401
            "folder2/d.instance",
402
        assertTrue(fs.findResource("folder/a").isFolder());
402
        };
403
        assertTrue(fs.findResource("folder/b.xml").isData());
403
        TestUtils.createFilesOnDefaultFS(fsstruct);
404
        assertTrue(fs.findResource("folder/c").isFolder());
404
        DataFolder folder = DataFolder.findFolder (Repository.getDefault().getDefaultFileSystem().getRoot().getFileObject("folder2"));
405
        assertTrue(fs.findResource("folder/e.xml").isData());
406
        assertTrue(fs.findResource("folder/d.instance").isData());
407
        DataFolder folder = DataFolder.findFolder(fs.findResource("folder"));
408
        assertEquals("initial order is alphabetical, folders first", "a/c/b.xml/d.instance/e.xml", childrenOrder(folder));
405
        assertEquals("initial order is alphabetical, folders first", "a/c/b.xml/d.instance/e.xml", childrenOrder(folder));
409
        folder.setSortMode(DataFolder.SortMode.NAMES);
406
        folder.setSortMode(DataFolder.SortMode.NAMES);
410
        assertEquals("next order is alphabetical", "a/b.xml/c/d.instance/e.xml", childrenOrder(folder));
407
        assertEquals("next order is alphabetical", "a/b.xml/c/d.instance/e.xml", childrenOrder(folder));
(-)test/unit/src/org/openide/loaders/DataShadowBrokenSlownessTest.java (-7 / +12 lines)
Lines 20-26 Link Here
20
import java.util.Enumeration;
20
import java.util.Enumeration;
21
import org.openide.nodes.Node;
21
import org.openide.nodes.Node;
22
import org.openide.cookies.InstanceCookie;
22
import org.openide.cookies.InstanceCookie;
23
import org.openide.filesystems.Repository;
24
import org.netbeans.junit.*;
23
import org.netbeans.junit.*;
25
import org.openide.filesystems.*;
24
import org.openide.filesystems.*;
26
25
Lines 51-65 Link Here
51
    }
50
    }
52
    
51
    
53
    protected void setUp() throws Exception {
52
    protected void setUp() throws Exception {
54
        TestUtilHid.destroyLocalFileSystem(getName());
53
        TestUtils.initDefaultFS(this);
55
        lfs = TestUtilHid.createLocalFileSystem(getName(), new String[] {
54
//        TestUtilHid.destroyLocalFileSystem(getName());
55
        String[] fsstruct = {
56
            "shadows/",
56
            "shadows/",
57
            "brokenshadows",
57
            "brokenshadows",
58
            "folder/original.txt",
58
            "folder/original.txt",
59
            "folder/orig.txt",
59
            "folder/orig.txt",
60
            "modify/"
60
            "modify/"
61
        });
61
        };
62
        Repository.getDefault ().addFileSystem (lfs);
62
      TestUtils.createFilesOnDefaultFS(fsstruct);
63
        lfs = Repository.getDefault().getDefaultFileSystem();
64
//      Repository.getDefault ().addFileSystem (lfs);
63
        
65
        
64
        int count = getNumber ().intValue ();
66
        int count = getNumber ().intValue ();
65
        
67
        
Lines 125-132 Link Here
125
    protected void tearDown() throws Exception {
127
    protected void tearDown() throws Exception {
126
        long now = System.currentTimeMillis ();
128
        long now = System.currentTimeMillis ();
127
        
129
        
128
        Repository.getDefault ().removeFileSystem (lfs);
130
//        Repository.getDefault ().removeFileSystem (lfs);
129
        TestUtilHid.destroyLocalFileSystem(getName());
131
//        TestUtilHid.destroyLocalFileSystem(getName());
132
//        TestUtils.destroyDefaultFS(this);
133
        lfs.findResource("shadows").delete();
134
        lfs.getRoot().createFolder("shadows");
130
        
135
        
131
        times.put (getNumber (), new Long (now - time));
136
        times.put (getNumber (), new Long (now - time));
132
                
137
                
(-)test/unit/src/org/openide/loaders/DataShadowSlowness39981Test.java (-7 / +10 lines)
Lines 20-26 Link Here
20
import java.util.Enumeration;
20
import java.util.Enumeration;
21
import org.openide.nodes.Node;
21
import org.openide.nodes.Node;
22
import org.openide.cookies.InstanceCookie;
22
import org.openide.cookies.InstanceCookie;
23
import org.openide.filesystems.Repository;
24
import org.netbeans.junit.*;
23
import org.netbeans.junit.*;
25
import org.openide.filesystems.*;
24
import org.openide.filesystems.*;
26
25
Lines 53-67 Link Here
53
    }
52
    }
54
    
53
    
55
    protected void setUp() throws Exception {
54
    protected void setUp() throws Exception {
56
        TestUtilHid.destroyLocalFileSystem(getName());
55
        TestUtils.initDefaultFS(this);
57
        lfs = TestUtilHid.createLocalFileSystem(getName(), new String[] {
56
        String[] fsstruct = {
58
            "shadows/",
57
            "shadows/",
59
            "brokenshadows",
58
            "brokenshadows",
60
            "folder/original.txt",
59
            "folder/original.txt",
61
            "folder/orig.txt",
60
            "folder/orig.txt",
62
            "modify/"
61
            "modify/"
63
        });
62
        };
64
        Repository.getDefault ().addFileSystem (lfs);
63
        TestUtils.createFilesOnDefaultFS(fsstruct);
64
        lfs = Repository.getDefault().getDefaultFileSystem();
65
//        Repository.getDefault ().addFileSystem (lfs);
65
        
66
        
66
        int count = getNumber ().intValue ();
67
        int count = getNumber ().intValue ();
67
        
68
        
Lines 127-134 Link Here
127
    protected void tearDown() throws Exception {
128
    protected void tearDown() throws Exception {
128
        long now = System.currentTimeMillis ();
129
        long now = System.currentTimeMillis ();
129
        
130
        
130
        Repository.getDefault ().removeFileSystem (lfs);
131
//        Repository.getDefault ().removeFileSystem (lfs);
131
        TestUtilHid.destroyLocalFileSystem(getName());
132
//        TestUtilHid.destroyLocalFileSystem(getName());
133
        lfs.findResource("shadows").delete();
134
        lfs.getRoot().createFolder("shadows");
132
        
135
        
133
        times.put (getNumber (), new Long (now - time));
136
        times.put (getNumber (), new Long (now - time));
134
                
137
                
(-)test/unit/src/org/openide/loaders/DataShadowTest.java (-5 / +10 lines)
Lines 46-53 Link Here
46
    }
46
    }
47
    
47
    
48
    protected void setUp() throws Exception {
48
    protected void setUp() throws Exception {
49
        lfs = Repository.getDefault ().getDefaultFileSystem ();
49
        TestUtils.initDefaultFS(this);
50
        FileObject fo = FileUtil.createData (lfs.getRoot (), getName () + "/folder/original.txt");
50
        String[] fsstruct = {
51
            "folder/original.txt",
52
            "folder/orig.txt",
53
            "modify/"
54
        };
55
        TestUtils.createFilesOnDefaultFS(fsstruct);
56
        lfs = Repository.getDefault().getDefaultFileSystem();
57
        FileObject fo = lfs.findResource("folder/original.txt");
51
        assertNotNull(fo);
58
        assertNotNull(fo);
52
        original = DataObject.find (fo);
59
        original = DataObject.find (fo);
53
        assertFalse ("Just to be sure that this is not shadow", original instanceof DataShadow);
60
        assertFalse ("Just to be sure that this is not shadow", original instanceof DataShadow);
Lines 56-63 Link Here
56
        assertNotNull(fo);
63
        assertNotNull(fo);
57
        assertTrue (fo.isFolder ());
64
        assertTrue (fo.isFolder ());
58
        folder = DataFolder.findFolder (fo);
65
        folder = DataFolder.findFolder (fo);
59
        
60
        Repository.getDefault ().addFileSystem (lfs);
61
    }
66
    }
62
    
67
    
63
    protected void tearDown() throws Exception {
68
    protected void tearDown() throws Exception {
Lines 153-159 Link Here
153
        shade = null;
158
        shade = null;
154
        assertGC ("Shadow can disappear", ref);
159
        assertGC ("Shadow can disappear", ref);
155
        
160
        
156
        original.rename ("newname");
161
        original.rename ("newname2.txt");
157
        
162
        
158
        
163
        
159
        DataObject obj = DataObject.find (primary);
164
        DataObject obj = DataObject.find (primary);
(-)test/unit/src/org/openide/loaders/InstanceDataObjectTest.java (-1 / +1 lines)
Lines 129-135 Link Here
129
                    try {
129
                    try {
130
                        final FileObject primary = ido.getPrimaryFile();
130
                        final FileObject primary = ido.getPrimaryFile();
131
                        System.err.println("Deleting file=" + primary);
131
                        System.err.println("Deleting file=" + primary);
132
                        primary.delete(primary.lock());
132
                        primary.delete();
133
133
134
                        // XXX Testing the case event is fired.
134
                        // XXX Testing the case event is fired.
135
//                        l.propertyChange(new PropertyChangeEvent(
135
//                        l.propertyChange(new PropertyChangeEvent(
(-)test/unit/src/org/openide/loaders/TestUtils.java (+51 lines)
Added Link Here
1
/*
2
 *                 Sun Public License Notice
3
 * 
4
 * The contents of this file are subject to the Sun Public License
5
 * Version 1.0 (the "License"). You may not use this file except in
6
 * compliance with the License. A copy of the License is available at
7
 * http://www.sun.com/
8
 * 
9
 * The Original Code is NetBeans. The Initial Developer of the Original
10
 * Code is Sun Microsystems, Inc. Portions Copyright 1997-2001 Sun
11
 * Microsystems, Inc. All Rights Reserved.
12
 */
13
14
package org.openide.loaders;
15
16
import org.netbeans.junit.NbTestCase;
17
import org.openide.filesystems.FileObject;
18
import org.openide.filesystems.FileUtil;
19
import org.openide.filesystems.Repository;
20
import org.openide.modules.ModuleInfo;
21
import org.openide.util.Lookup;
22
23
/** Misc utilities for easier testing.
24
 * @author David Konecny
25
 */
26
public final class TestUtils {
27
    
28
    private TestUtils() {}
29
    
30
    public static void initDefaultFS(NbTestCase test) throws Exception {
31
        System.setProperty("netbeans.user", test.getWorkDir().getAbsolutePath());
32
//        System.out.println(">>>>>"+test.getWorkDir().getAbsolutePath());
33
        Lookup.getDefault().lookup(ModuleInfo.class);
34
    }
35
    
36
    public static void createFilesOnDefaultFS(String[] files) throws Exception {
37
        FileObject folder = Repository.getDefault().getDefaultFileSystem().getRoot();
38
        for (int i=0; i<files.length; i++) {
39
            if (files[i].endsWith("/")) {
40
                FileUtil.createFolder(folder, files[i].substring(0, files[i].length()-1));
41
            } else {
42
                FileUtil.createData(folder, files[i]);
43
            }
44
        }
45
    }
46
    
47
    public static void destroyDefaultFS(NbTestCase test) throws Exception {
48
        test.getWorkDir().delete();
49
    }
50
    
51
}

Return to bug 43189