Statistics
| Revision:

svn-gvsig-desktop / branches / v2_0_0_prep / libraries / libFMap_dataFile / src-test / org / gvsig / fmap / data / feature / file / ResourceManagerTest.java @ 23878

History | View | Annotate | Download (14.2 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
 *
3
 * Copyright (C) 2007-2008 Infrastructures and Transports Department
4
 * of the Valencian Government (CIT)
5
 *
6
 * This program is free software; you can redistribute it and/or
7
 * modify it under the terms of the GNU General Public License
8
 * as published by the Free Software Foundation; either version 2
9
 * of the License, or (at your option) any later version.
10
 *
11
 * This program is distributed in the hope that it will be useful,
12
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
 * GNU General Public License for more details.
15
 *
16
 * You should have received a copy of the GNU General Public License
17
 * along with this program; if not, write to the Free Software
18
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
19
 * MA  02110-1301, USA.
20
 *
21
 */
22

    
23
/*
24
* AUTHORS (In addition to CIT):
25
* 2008 IVER T.I. S.A.   {{Task}}
26
*/
27

    
28
package org.gvsig.fmap.data.feature.file;
29

    
30
import java.security.KeyException;
31
import java.util.Comparator;
32
import java.util.Iterator;
33
import java.util.SortedSet;
34
import java.util.TreeSet;
35

    
36
import junit.framework.TestCase;
37

    
38
import org.gvsig.fmap.data.DataSet;
39
import org.gvsig.fmap.data.DataManager;
40
import org.gvsig.fmap.data.DataStore;
41
import org.gvsig.fmap.data.exceptions.CloseException;
42
import org.gvsig.fmap.data.exceptions.DataException;
43
import org.gvsig.fmap.data.feature.file.shp.SHPTest;
44
import org.gvsig.fmap.data.impl.DefaultDataManager;
45
import org.gvsig.fmap.data.resource.Resource;
46
import org.gvsig.fmap.data.resource.ResourceManager;
47
import org.gvsig.fmap.data.resource.ResourceNotification;
48
import org.gvsig.fmap.data.resource.impl.DefaultResourceManager;
49
import org.gvsig.fmap.data.resource.spi.AbstractResource;
50
import org.gvsig.tools.exception.BaseException;
51
import org.gvsig.tools.observer.Observable;
52
import org.gvsig.tools.observer.Observer;
53

    
54
public class ResourceManagerTest extends TestCase {
55

    
56
        private DataManager dataManager = DefaultDataManager.getManager();
57

    
58
        public class ResourceCloser implements Observer {
59
                private int maxOpened = 3;
60

    
61
                public void update(Observable observable, Object notification) {
62
                        ResourceNotification rNotification;
63
                        if (notification instanceof ResourceNotification) {
64
                                rNotification = (ResourceNotification) notification;
65
                        } else {
66
                                return;
67
                        }
68
                        if (rNotification.getType().equals(ResourceNotification.OPENED)) {
69
                                try {
70
                                        this.ajustResources();
71
                                } catch (CloseException e) {
72
                                        e.printStackTrace();
73
                                }
74

    
75
                        }
76

    
77
                }
78

    
79
                public void closeAndDisposeAll() throws KeyException, DataException {
80
                        DefaultResourceManager rManager = DefaultResourceManager.getResourceManager();
81

    
82
                        Iterator iter = rManager.iterator();
83
                        String name, key;
84
                        while (iter.hasNext()) {
85
                                Resource res = (Resource) iter.next();
86
                                name = res.getName();
87
                                key = res.getKey();
88
                                if (res.isOpen()) {
89
                                        res.close();
90
                                        System.out.println("** closed: " + name + "(" + key + ")");
91
                                }
92

    
93
                                rManager.forceRemove(res);
94
                                System.out.println("** removed (forced): " + name + "(" + key
95
                                                + ")");
96

    
97
                                iter = rManager.iterator();
98
                        }
99

    
100
                        System.out.println("** Closed and Disposed all resources");
101
                }
102

    
103

    
104
                public void ajustResources() throws CloseException {
105
                        SortedSet resources = this.getResourcesOrdered();
106
                        if (resources.isEmpty() || resources.size() < this.maxOpened) {
107
                                return;
108
                        }
109

    
110
                        int opened = this.getOpenedResources();
111
                        int toClose = opened - this.maxOpened;
112
                        if (toClose < 1) {
113
                                return;
114
                        }
115
                        System.out.println("** Resources to close: " + toClose);
116
                        Iterator iter = resources.iterator();
117
                        while (iter.hasNext() && toClose > 0) {
118
                                Resource res = (Resource) iter.next();
119
                                if (res.isOpen()) {
120
                                        res.close();
121
                                        toClose--;
122
                                        System.out.println("** closed: " + res.getName() + "("
123
                                                        + res.getKey() + ")");
124
                                }
125

    
126
                        }
127
                }
128

    
129
                public Comparator getResourceComparator() {
130
                        Comparator resourceComparator = new Comparator(){
131

    
132
                                public int compare(Object arg0, Object arg1) {
133
                                        Resource res0=(Resource) arg0;
134
                                        Resource res1=(Resource) arg1;
135
                                        if (res0.isOpen() != res1.isOpen()){
136
                                                if (res0.isOpen()){
137
                                                        return -1;
138
                                                } else{
139
                                                        return 1;
140
                                                }
141
                                        } else{
142
                                                if (res0.getLastTimeUsed().before(res1.getLastTimeUsed())){
143
                                                        return -1;
144
                                                } else{
145
                                                        return 1;
146
                                                }
147
                                        }
148
                                }
149
                        };
150

    
151
                        return resourceComparator;
152
                }
153

    
154
                public SortedSet getResourcesOrdered() {
155
                        SortedSet set = new TreeSet(this.getResourceComparator());
156
                        ResourceManager resManager = DefaultResourceManager.getResourceManager();
157
                        Iterator iter = resManager.iterator();
158

    
159
                        while (iter.hasNext()) {
160
                                set.add(iter.next());
161
                        }
162
                        return set;
163
                }
164

    
165

    
166
                public void setMaxOpened(int maxOpened) {
167
                        this.maxOpened = maxOpened;
168
                }
169

    
170
                public int getMaxOpened() {
171
                        return maxOpened;
172
                }
173

    
174
                public int getOpenedResources() {
175
                        ResourceManager resManager = DefaultResourceManager.getResourceManager();
176
                        Iterator iter = resManager.iterator();
177
                        int opened = 0;
178

    
179
                        while (iter.hasNext()) {
180
                                if (((Resource) iter.next()).isOpen()) {
181
                                        opened++;
182
                                }
183
                        }
184

    
185
                        return opened;
186
                }
187

    
188
                public void sys_out_resources() {
189
                        ResourceManager resManager = DefaultResourceManager.getResourceManager();
190
                        Iterator iter = resManager.iterator();
191
                        while (iter.hasNext()) {
192
                                Resource res = (Resource) iter.next();
193
                                System.out.print("- Resource: " + res.getName() + "("
194
                                                + res.getKey() + ") ");
195
                                if (res.isOpen()) {
196
                                        System.out.println(" [Open]");
197
                                } else {
198
                                        System.out.println(" [Close]");
199
                                }
200
                        }
201

    
202
                }
203

    
204

    
205
        }
206

    
207

    
208
        public void test_manual() {
209
                ResourceCloser closer = new ResourceCloser();
210

    
211
                //Nos aseguramos que no hay recursos abiertos
212
                try {
213
                        closer.closeAndDisposeAll();
214
                } catch (Exception e1) {
215
                        e1.printStackTrace();
216
                        fail();
217
                }
218

    
219
                org.gvsig.fmap.data.feature.file.dbf.Register.selfRegister();
220
                org.gvsig.fmap.data.feature.file.shp.Register.selfRegister();
221
                org.gvsig.fmap.data.feature.file.dxf.Register.selfRegister();
222
                org.gvsig.fmap.data.feature.file.dgn.Register.selfRegister();
223

    
224
                DataStore shp = null;
225
                DataStore shp_bis = null;
226
                DataStore shpNull = null;
227
                //                DataStore dbf = null;
228

    
229

    
230
                // Abrimos y cerrarmos uno (ojo los shp son dos recursos el dbf y el shp)
231
                try {
232
                        shp = dataManager.createDataStore(SHPTest
233
                                        .getParams(SHPTest.fileNormal));
234
                        shp.getMetadata();
235
                } catch (BaseException e) {
236
                        e.printStackTrace();
237
                        fail();
238
                }
239
                assertEquals(2, closer.getOpenedResources());
240
                try {
241
                        shp.dispose();
242
                } catch (CloseException e) {
243
                        e.printStackTrace();
244
                        fail();
245
                }
246
                assertEquals(0, closer.getOpenedResources());
247

    
248

    
249

    
250

    
251
                // Abrimos dos veces el mismo y comprobamos que solo
252
                // hay un recurso
253
                try {
254
                        shp = dataManager.createDataStore(SHPTest
255
                                        .getParams(SHPTest.fileNormal));
256
                        shp.getMetadata();
257
                } catch (BaseException e) {
258
                        e.printStackTrace();
259
                        fail();
260
                }
261

    
262
                assertEquals(2, closer.getOpenedResources());
263
                try {
264
                        shp_bis = dataManager.createDataStore(SHPTest
265
                                        .getParams(SHPTest.fileNormal));
266
                        shp_bis.getMetadata();
267
                } catch (BaseException e) {
268
                        e.printStackTrace();
269
                        fail();
270
                }
271
                assertEquals(2, closer.getOpenedResources());
272

    
273
                // Abrimos un shp mas, llamamos al 'ajuste del closer' y comprobamos si deja solo 2
274
                try {
275
                        shpNull = dataManager.createDataStore(SHPTest
276
                                        .getParams(SHPTest.fileGeometryNull));
277
                        shpNull.getMetadata();
278
                } catch (BaseException e) {
279
                        e.printStackTrace();
280
                        fail();
281
                }
282
                assertEquals(4, closer.getOpenedResources());
283

    
284
                closer.setMaxOpened(2);
285
                try {
286
                        closer.ajustResources();
287
                } catch (CloseException e) {
288
                        e.printStackTrace();
289
                        fail();
290
                }
291
                assertEquals(2, closer.getOpenedResources());
292

    
293
                //comprobamos que todos se puede volver a usar sin
294
                //problemas
295

    
296
                DataSet coll;
297
                try {
298
                        coll = shp.getDataSet();
299
                        coll.size();
300
                        coll.iterator().next();
301
                        coll.dispose();
302

    
303
                        coll = shp_bis.getDataSet();
304
                        coll.size();
305
                        coll.iterator().next();
306
                        coll.dispose();
307

    
308
                        coll = shpNull.getDataSet();
309
                        coll.size();
310
                        coll.iterator().next();
311
                        coll.dispose();
312

    
313
                } catch (BaseException e) {
314
                        e.printStackTrace();
315
                        fail();
316
                }
317

    
318
                //ahora deberian estar todos abiertos (4)
319
                closer.sys_out_resources();
320
                assertEquals(4, closer.getOpenedResources());
321

    
322
                //volvemos a comprobar que funciona
323
                closer.setMaxOpened(2);
324
                try {
325
                        closer.ajustResources();
326
                } catch (CloseException e) {
327
                        e.printStackTrace();
328
                        fail();
329
                }
330
                assertEquals(2, closer.getOpenedResources());
331

    
332
                try {
333
                        shp.dispose();
334
                        shp_bis.dispose();
335
                        shpNull.dispose();
336
                } catch (CloseException e) {
337
                        e.printStackTrace();
338
                        fail();
339
                }
340

    
341

    
342
        }
343

    
344

    
345

    
346
        public void test_auto() {
347
                ResourceCloser closer = new ResourceCloser();
348

    
349
                //Nos aseguramos que no hay recursos abiertos
350
                try {
351
                        closer.closeAndDisposeAll();
352
                } catch (Exception e1) {
353
                        e1.printStackTrace();
354
                        fail();
355
                }
356
                org.gvsig.fmap.data.feature.file.dbf.Register.selfRegister();
357
                org.gvsig.fmap.data.feature.file.shp.Register.selfRegister();
358
                org.gvsig.fmap.data.feature.file.dxf.Register.selfRegister();
359
                org.gvsig.fmap.data.feature.file.dgn.Register.selfRegister();
360

    
361
                DataStore shp = null;
362
                DataStore shp_bis = null;
363
                DataStore shpNull = null;
364
                //DataStore dbf = null;
365

    
366
                // A?adimos el 'closer' como observador para que no deje abierta
367
                // nunca mas de 2 fuentes
368
                DefaultResourceManager rManager = DefaultResourceManager.getResourceManager();
369
                closer.setMaxOpened(2);
370
                rManager.addObserver(closer);
371

    
372
                // Abrimos y cerrarmos uno (ojo los shp son dos recursos el dbf y el shp)
373
                try {
374
                        shp = dataManager.createDataStore(SHPTest
375
                                        .getParams(SHPTest.fileNormal));
376
                        shp.getMetadata();
377
                } catch (BaseException e) {
378
                        e.printStackTrace();
379
                        fail();
380
                }
381
                assertEquals(2, closer.getOpenedResources());
382
                try {
383
                        shp.dispose();
384
                } catch (CloseException e) {
385
                        e.printStackTrace();
386
                        fail();
387
                }
388
                assertEquals(0, closer.getOpenedResources());
389

    
390
                // Abrimos dos veces el mismo y comprobamos que solo
391
                // hay un recurso
392
                try {
393
                        shp = dataManager.createDataStore(SHPTest
394
                                        .getParams(SHPTest.fileNormal));
395
                        shp.getMetadata();
396
                } catch (BaseException e) {
397
                        e.printStackTrace();
398
                        fail();
399
                }
400

    
401
                assertEquals(2, closer.getOpenedResources());
402
                try {
403
                        shp_bis = dataManager.createDataStore(SHPTest
404
                                        .getParams(SHPTest.fileNormal));
405
                        shp_bis.getMetadata();
406
                } catch (BaseException e) {
407
                        e.printStackTrace();
408
                        fail();
409
                }
410
                assertEquals(2, closer.getOpenedResources());
411

    
412
                // Abrimos un shp mas y comprobamos si deja solo 2
413
                try {
414
                        shpNull = dataManager.createDataStore(SHPTest
415
                                        .getParams(SHPTest.fileGeometryNull));
416
                        shpNull.getMetadata();
417
                } catch (BaseException e) {
418
                        e.printStackTrace();
419
                        fail();
420
                }
421
                assertEquals(2, closer.getOpenedResources());
422

    
423
                //comprobamos que todos se puede volver a usar sin
424
                //problemas
425

    
426
                DataSet coll;
427
                try {
428
                        coll = shp.getDataSet();
429
                        coll.size();
430
                        coll.iterator().next();
431
                        coll.dispose();
432
                        assertEquals(2, closer.getOpenedResources());
433

    
434
                        coll = shp_bis.getDataSet();
435
                        coll.size();
436
                        coll.iterator().next();
437
                        coll.dispose();
438
                        assertEquals(2, closer.getOpenedResources());
439

    
440
                        coll = shpNull.getDataSet();
441
                        coll.size();
442
                        coll.iterator().next();
443
                        coll.dispose();
444
                        assertEquals(2, closer.getOpenedResources());
445

    
446
                } catch (BaseException e) {
447
                        e.printStackTrace();
448
                        fail();
449
                }
450

    
451
                assertEquals(2, closer.getOpenedResources());
452

    
453
        }
454

    
455
        public void test_deadResources() {
456
                ResourceCloser closer = new ResourceCloser();
457

    
458
                //Nos aseguramos que no hay recursos abiertos
459
                try {
460
                        closer.closeAndDisposeAll();
461
                } catch (Exception e1) {
462
                        e1.printStackTrace();
463
                        fail();
464
                }
465
                org.gvsig.fmap.data.feature.file.dbf.Register.selfRegister();
466
                org.gvsig.fmap.data.feature.file.shp.Register.selfRegister();
467
                org.gvsig.fmap.data.feature.file.dxf.Register.selfRegister();
468
                org.gvsig.fmap.data.feature.file.dgn.Register.selfRegister();
469

    
470
                DataStore shp = null;
471

    
472
                ResourceManager rManager = DefaultResourceManager.getResourceManager();
473

    
474
                try {
475
                        shp = dataManager.createDataStore(SHPTest
476
                                        .getParams(SHPTest.fileNormal));
477
                        shp.getMetadata();
478
                } catch (BaseException e) {
479
                        e.printStackTrace();
480
                        fail();
481
                }
482
                assertEquals(2, closer.getOpenedResources());
483

    
484
                // Eliminamos la referencia al Store para que se quede 'colgado' el recurso
485
                shp = null;
486
                assertEquals(2, closer.getOpenedResources());
487

    
488
                // lanzamos el garbageCollector para que se muera la referencia
489
                System.gc();
490
                System.gc();
491
                System.gc();
492

    
493
                // Cogemos el primer recuros y pedimos su cantidad de referencias
494
                // esto deber?a de dejar la referencias a 0.
495
                Iterator iter = rManager.iterator();
496

    
497
                assertEquals(0, ((AbstractResource) iter.next()).getRefencesCount());
498

    
499
                //lanzamos la 'recoleccion' y deber?a de dejar todas las referencia limpias
500
                // y el manager vacio
501
                try {
502
                        rManager.collectDeadResources();
503
                } catch (DataException e) {
504
                        e.printStackTrace();
505
                        fail();
506
                        return;
507
                }
508

    
509
                assertEquals(0, closer.getOpenedResources());
510

    
511
                assertEquals(0, closer.getResourcesOrdered().size());
512

    
513

    
514
        }
515

    
516
        public void test_deadResourcesThread() {
517
                ResourceCloser closer = new ResourceCloser();
518

    
519
                //Nos aseguramos que no hay recursos abiertos
520
                try {
521
                        closer.closeAndDisposeAll();
522
                } catch (Exception e1) {
523
                        e1.printStackTrace();
524
                        fail();
525
                }
526
                org.gvsig.fmap.data.feature.file.dbf.Register.selfRegister();
527
                org.gvsig.fmap.data.feature.file.shp.Register.selfRegister();
528
                org.gvsig.fmap.data.feature.file.dxf.Register.selfRegister();
529
                org.gvsig.fmap.data.feature.file.dgn.Register.selfRegister();
530

    
531
                DataStore shp = null;
532

    
533
                ResourceManager rManager = DefaultResourceManager.getResourceManager();
534

    
535
                //Lanzamos el thread
536

    
537
                rManager.startDeadResourceCollectorThread(10); // 1/100 seg
538

    
539
                try {
540
                        shp = dataManager.createDataStore(SHPTest
541
                                        .getParams(SHPTest.fileNormal));
542
                        shp.getMetadata();
543
                } catch (BaseException e) {
544
                        e.printStackTrace();
545
                        fail();
546
                }
547
                assertEquals(2, closer.getOpenedResources());
548

    
549
                // Eliminamos la referencia al Store para que se quede 'colgado' el recurso
550
                shp = null;
551
                assertEquals(2, closer.getOpenedResources());
552

    
553
                long t = System.currentTimeMillis();
554
                while (System.currentTimeMillis() - t < 50) {
555
                        // lanzamos el garbageCollector para que se muera la referencia
556
                        System.gc();
557
                }
558

    
559

    
560
                // Comprobamos que los recursos ya no existen
561
                assertEquals(0, closer.getOpenedResources());
562

    
563
                assertEquals(0, closer.getResourcesOrdered().size());
564

    
565
                rManager.stopDeadResourceCollectorThread();
566

    
567
        }
568

    
569
}