Statistics
| Revision:

svn-gvsig-desktop / tags / Root_v06 / applications / appgvSIG / src / com / iver / cit / gvsig / project / Project.java @ 4811

History | View | Annotate | Download (27.1 KB)

1 1222 fernando
/* gvSIG. Sistema de Informaci?n Geogr?fica de la Generalitat Valenciana
2
 *
3
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
4
 *
5
 * This program is free software; you can redistribute it and/or
6
 * modify it under the terms of the GNU General Public License
7
 * as published by the Free Software Foundation; either version 2
8
 * of the License, or (at your option) any later version.
9
 *
10
 * This program is distributed in the hope that it will be useful,
11
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13
 * GNU General Public License for more details.
14
 *
15
 * You should have received a copy of the GNU General Public License
16
 * along with this program; if not, write to the Free Software
17
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
18
 *
19
 * For more information, contact:
20
 *
21
 *  Generalitat Valenciana
22
 *   Conselleria d'Infraestructures i Transport
23
 *   Av. Blasco Ib??ez, 50
24
 *   46010 VALENCIA
25
 *   SPAIN
26
 *
27
 *      +34 963862235
28
 *   gvsig@gva.es
29
 *      www.gvsig.gva.es
30
 *
31
 *    or
32
 *
33
 *   IVER T.I. S.A
34
 *   Salamanca 50
35
 *   46005 Valencia
36
 *   Spain
37
 *
38
 *   +34 963163400
39
 *   dac@iver.es
40
 */
41
package com.iver.cit.gvsig.project;
42
43 2217 fernando
import java.awt.Color;
44
import java.beans.PropertyChangeEvent;
45
import java.beans.PropertyChangeListener;
46
import java.beans.PropertyChangeSupport;
47
import java.io.Serializable;
48
import java.text.DateFormat;
49
import java.util.ArrayList;
50
import java.util.Date;
51 3060 fjp
import java.util.Hashtable;
52 2217 fernando
import java.util.Iterator;
53 1222 fernando
54 2217 fernando
import org.cresques.cts.IProjection;
55
import org.cresques.cts.ProjectionPool;
56 1222 fernando
57 3060 fjp
import com.hardcode.driverManager.DriverLoadException;
58
import com.hardcode.gdbms.engine.data.DataSource;
59
import com.hardcode.gdbms.engine.data.NoSuchTableException;
60 2217 fernando
import com.hardcode.gdbms.engine.data.SourceInfo;
61
import com.hardcode.gdbms.engine.data.db.DBSourceInfo;
62
import com.hardcode.gdbms.engine.data.db.DBTableSourceInfo;
63
import com.hardcode.gdbms.engine.data.file.FileSourceInfo;
64
import com.hardcode.gdbms.engine.data.object.ObjectSourceInfo;
65 1222 fernando
import com.iver.cit.gvsig.fmap.DriverException;
66
import com.iver.cit.gvsig.fmap.core.v02.FSymbol;
67
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
68
import com.iver.cit.gvsig.fmap.layers.FLayer;
69
import com.iver.cit.gvsig.fmap.layers.FLayers;
70 3060 fjp
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
71 1222 fernando
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
72 2610 fernando
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
73 1222 fernando
import com.iver.cit.gvsig.fmap.layers.XMLException;
74
import com.iver.cit.gvsig.fmap.layers.layerOperations.AlphanumericData;
75 2183 fernando
import com.iver.cit.gvsig.fmap.operations.selection.LinkSelectionListener;
76 3183 caballero
import com.iver.cit.gvsig.gui.project.OpenException;
77
import com.iver.cit.gvsig.gui.project.SaveException;
78 2673 fjp
import com.iver.utiles.PostProcessSupport;
79 1222 fernando
import com.iver.utiles.StringUtilities;
80
import com.iver.utiles.XMLEntity;
81
82
83
/**
84
 * Clase que representa un proyecto de openSIG
85
 *
86
 * @author Fernando Gonz?lez Cort?s
87
 */
88
public class Project implements Serializable, PropertyChangeListener {
89 3863 luisw2
        public static String VERSION = "0.6";
90 1830 fernando
        static private IProjection defaultProjection = ProjectionPool.get(
91
                        "EPSG:23030");
92 1222 fernando
        private PropertyChangeSupport change;
93
        boolean modified = false;
94
        private String name;
95
        private String path;
96
        private String creationDate;
97
        private String modificationDate;
98
        private String owner;
99
        private String comments;
100
        private Color selectionColor = new Color(255, 255, 0);
101
        private ArrayList views = new ArrayList();
102
        private ArrayList tables = new ArrayList();
103
        private ArrayList maps = new ArrayList();
104
        private ArrayList extents = new ArrayList();
105
106
        /**
107
         * Creates a new Project object.
108
         */
109
        public Project() {
110
                change = new PropertyChangeSupport(this);
111
112
                //        change.addPropertyChangeListener(this);
113
                creationDate = DateFormat.getDateInstance().format(new Date());
114
                modificationDate = creationDate;
115
116 2183 fernando
                /*                LayerFactory.setDriversPath(PluginServices.getPluginServices(this)
117
                   .getPluginDirectory()
118
                   .getAbsolutePath() +
119
                   File.separator + "drivers");
120
                 */
121
        }
122
123 1222 fernando
        /**
124
         * Obtiene la fecha de creaci?n del proyecto
125
         *
126
         * @return
127
         */
128
        public String getCreationDate() {
129
                return creationDate;
130
        }
131
132
        /**
133
         * Obtiene el nombre del proyecto
134
         *
135
         * @return
136
         */
137
        public String getName() {
138
                return name;
139
        }
140
141
        /**
142
         * Obtiene la ruta completa del fichero donde se guardo por ?ltima vez el
143
         * proyecto
144
         *
145
         * @return
146
         */
147
        public String getPath() {
148
                return path;
149
        }
150
151
        /**
152
         * Asigna la fecha de creaci?n del proyecto. Este m?todo tiene sentido s?lo
153
         * por que al recuperar la fecha del XML hay que asignarla al objeto
154
         * proyecto de alguna manera. La fecha se asigna en el constructor y no se
155
         * deber?a de modificar nunca
156
         *
157
         * @param string
158
         */
159
        public void setCreationDate(String string) {
160
                creationDate = string;
161
                modified = true;
162
                change.firePropertyChange("", null, null);
163
        }
164
165
        /**
166
         * A?ade un mapa al proyecto
167
         *
168
         * @param m
169
         */
170
        public void addMap(ProjectMap m) {
171
                maps.add(m);
172
                m.addPropertyChangeListener(this);
173
                modified = true;
174
                change.firePropertyChange("", null, null);
175 2183 fernando
                m.setProject(this, maps.size() - 1);
176 1222 fernando
        }
177
178
        /**
179
         * Elimina un mapa del proyecto
180
         *
181
         * @param i indice del mapa
182
         */
183
        public void delMap(int i) {
184
                maps.remove(i);
185
                modified = true;
186
                change.firePropertyChange("", null, null);
187
        }
188
189
        /**
190
         * Establece el nombre del proyecto
191
         *
192
         * @param string
193
         */
194
        public void setName(String string) {
195
                name = string;
196
                modified = true;
197
                change.firePropertyChange("", null, null);
198
        }
199
200
        /**
201
         * establece la ruta completa de donde se encuentra guardado el proyecto
202
         *
203
         * @param string
204
         */
205
        public void setPath(String string) {
206
                path = string;
207
                modified = true;
208
                change.firePropertyChange("", null, null);
209
        }
210
211
        /**
212
         * DOCUMENT ME!
213
         *
214
         * @param co DOCUMENT ME!
215
         *
216
         * @return DOCUMENT ME!
217
         */
218
        public ProjectTable getTable(AlphanumericData co) {
219
                /**
220
                 * Como las tablas se pueden a?adir cuando se pincha en "ver tabla" de
221
                 * una capa, se puede intentar a?adir dos veces la misma tabla
222
                 */
223
                for (int i = 0; i < tables.size(); i++) {
224
                        if (((ProjectTable) tables.get(i)).getAssociatedTable() == co) {
225
                                return (ProjectTable) tables.get(i);
226
                        }
227
                }
228
229
                return null;
230
        }
231
232
        /**
233
         * A?ade una tabla al proyecto
234
         *
235
         * @param t
236
         */
237
        public void addTable(ProjectTable t) {
238
                tables.add(t);
239
                t.addPropertyChangeListener(this);
240
                modified = true;
241
                change.firePropertyChange("", null, null);
242 2183 fernando
                t.setProject(this, tables.size() - 1);
243 1222 fernando
        }
244 2183 fernando
245 1222 fernando
        /**
246
         * Elimina una tabla del proyecto
247
         *
248
         * @param i indice de la tabla
249
         */
250
        public void delTable(int i) {
251
                tables.remove(i);
252
                modified = true;
253
                change.firePropertyChange("", null, null);
254
        }
255
256
        /**
257
         * A?ade una vista al proyecto
258
         *
259
         * @param v
260
         */
261
        public void addView(ProjectView v) {
262
                views.add(v);
263
                v.addPropertyChangeListener(this);
264
                modified = true;
265
                change.firePropertyChange("", null, null);
266 1830 fernando
                v.setProject(this, views.size() - 1);
267 1222 fernando
        }
268
269
        /**
270
         * Elimina una tabla del proyecto
271
         *
272
         * @param i indice del proyecto
273
         */
274
        public void delView(int i) {
275
                views.remove(i);
276
                modified = true;
277
                change.firePropertyChange("", null, null);
278
        }
279
280
        /**
281
         * Devuelve true si el proyecto (o alguna tabla, vista o mapa que contiene)
282
         * fue modificado
283
         *
284
         * @return
285
         */
286
        public boolean isModified() {
287
                return modified;
288
        }
289
290
        /**
291
         * Obtiene los comentarios
292
         *
293
         * @return
294
         */
295
        public String getComments() {
296
                return comments;
297
        }
298
299
        /**
300
         * Obtiene la fecha de la ?ltima modificaci?n
301
         *
302
         * @return
303
         */
304
        public String getModificationDate() {
305
                return modificationDate;
306
        }
307
308
        /**
309
         * Obtiene el propietario del proyecto
310
         *
311
         * @return
312
         */
313
        public String getOwner() {
314
                return owner;
315
        }
316
317
        /**
318
         * Establece una cadena como comentarios al proyecto
319
         *
320
         * @param string
321
         */
322
        public void setComments(String string) {
323
                comments = string;
324
                modified = true;
325
                change.firePropertyChange("", null, null);
326
        }
327
328
        /**
329
         * Establece la fecha de la ?ltima modificaci?n
330
         *
331
         * @param string
332
         */
333
        public void setModificationDate(String string) {
334
                modificationDate = string;
335
                modified = true;
336
                change.firePropertyChange("", null, null);
337
        }
338
339
        /**
340
         * Establece el propietario del proyecto
341
         *
342
         * @param string
343
         */
344
        public void setOwner(String string) {
345
                owner = string;
346
                modified = true;
347
                change.firePropertyChange("", null, null);
348
        }
349
350
        /**
351
         * Establece el flag de modificado del proyecto
352
         *
353
         * @param b
354
         */
355
        public void setModified(boolean b) {
356
                modified = b;
357
        }
358
359
        /**
360
         * Obtiene el color de selecci?n que se usar? en el proyecto
361
         *
362
         * @return
363
         */
364
        public Color getSelectionColor() {
365
                return selectionColor;
366
        }
367
368
        /**
369
         * Establece el color de selecci?n
370
         *
371
         * @param color
372
         */
373
        public void setSelectionColor(Color color) {
374
                selectionColor = color;
375
                FSymbol.setSelectionColor(color);
376
                modified = true;
377
                change.firePropertyChange("selectionColor", null, color);
378
        }
379
380
        /**
381
         * Obtiene el color como un entero para su serializaci?n a XML
382
         *
383
         * @return
384
         */
385
        public String getColor() {
386
                return StringUtilities.color2String(selectionColor);
387
        }
388
389
        /**
390
         * M?todo invocado al recuperar de XML para establecer el color de
391
         * seleccion del proyecto
392
         *
393
         * @param color Entero que representa un color
394
         */
395
        public void setColor(String color) {
396
                modified = true;
397
                selectionColor = StringUtilities.string2Color(color);
398
        }
399
400
        /* (non-Javadoc)
401
         * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent)
402
         */
403
        public void propertyChange(PropertyChangeEvent evt) {
404
                this.modified = true;
405
                change.firePropertyChange(evt);
406
        }
407
408
        /**
409
         * DOCUMENT ME!
410
         *
411
         * @param arg1
412
         */
413
        public void addExtent(ProjectExtent arg1) {
414
                extents.add(arg1);
415
                modified = true;
416
                change.firePropertyChange("addExtent", null, null);
417
        }
418
419
        /**
420
         * DOCUMENT ME!
421
         *
422
         * @param arg0
423
         *
424
         * @return
425
         */
426
        public Object removeExtent(int arg0) {
427
                modified = true;
428
                change.firePropertyChange("delExtent", null, null);
429
430
                return extents.remove(arg0);
431
        }
432
433
        /**
434
         * DOCUMENT ME!
435
         *
436
         * @return DOCUMENT ME!
437
         */
438
        public ProjectExtent[] getExtents() {
439
                return (ProjectExtent[]) extents.toArray(new ProjectExtent[0]);
440
        }
441
442
        /**
443
         * DOCUMENT ME!
444
         *
445
         * @param arg0
446
         */
447
        public synchronized void addPropertyChangeListener(
448
                PropertyChangeListener arg0) {
449
                change.addPropertyChangeListener(arg0);
450
        }
451
452
        /**
453
         * DOCUMENT ME!
454
         *
455
         * @return
456
         */
457
        public ArrayList getMaps() {
458
                return maps;
459
        }
460
461
        /**
462
         * DOCUMENT ME!
463
         *
464
         * @return
465
         */
466
        public ArrayList getTables() {
467
                return tables;
468
        }
469
470
        /**
471
         * DOCUMENT ME!
472
         *
473
         * @return
474
         */
475
        public ArrayList getViews() {
476
                return views;
477
        }
478
479
        /**
480
         * DOCUMENT ME!
481
         *
482
         * @return DOCUMENT ME!
483
         *
484
         * @throws DriverException
485 1830 fernando
         * @throws XMLException
486 1222 fernando
         */
487 1830 fernando
        public XMLEntity getXMLEntity() throws DriverException, XMLException {
488 1222 fernando
                XMLEntity xml = new XMLEntity();
489 1830 fernando
                xml.putProperty("className", this.getClass().getName());
490
                xml.putProperty("VERSION", VERSION);
491 1222 fernando
                xml.putProperty("comments", comments);
492
                xml.putProperty("creationDate", creationDate);
493
494 1302 vcaballero
                int numExtents = extents.size();
495 1830 fernando
496 1302 vcaballero
                /*double[] xs = new double[size];
497 1830 fernando
                   double[] ys = new double[size];
498
                   double[] ws = new double[size];
499
                   double[] hs = new double[size];
500
                 */
501
                xml.putProperty("numExtents", numExtents);
502
503 1302 vcaballero
                for (int i = 0; i < numExtents; i++) {
504 1830 fernando
                        /*        Rectangle2D rect = (Rectangle2D) extents.get(i);
505
                           xs[i] = rect.getX();
506
                           ys[i] = rect.getY();
507
                           ws[i] = rect.getWidth();
508
                           hs[i] = rect.getHeight();
509
                         */
510
                        xml.addChild(((ProjectExtent) extents.get(i)).getXMLEntity());
511 1222 fernando
                }
512 1830 fernando
513 3060 fjp
        // NUEVO: ESTO ESTA EN PRUEBAS. SIRVE PARA
514
        // BORRAR LAS REFERENCIAS A DATASOURCES QUE HEMOS
515
        // BORRADO. Hay que probar a borrarlos cuando se
516
        // borra una tabla y cuando se borra una capa.
517
        cleanBadReferences();
518 2217 fernando
                SourceInfo[] infos = LayerFactory.getDataSourceFactory().getDriverInfos();
519 1830 fernando
                xml.putProperty("data-source-count", infos.length);
520
521
                for (int i = 0; i < infos.length; i++) {
522
                        XMLEntity child = new XMLEntity();
523 2217 fernando
                        SourceInfo di = infos[i];
524 1830 fernando
525 2217 fernando
                        if (di instanceof ObjectSourceInfo) {
526
                                ObjectSourceInfo driver = (ObjectSourceInfo) di;
527 1830 fernando
                                child.putProperty("type", "sameDriverFile");
528
                                child.putProperty("gdbmsname", driver.name);
529 2217 fernando
                        } else if (di instanceof FileSourceInfo) {
530
                                FileSourceInfo vfdi = (FileSourceInfo) di;
531 1830 fernando
                                child.putProperty("type", "otherDriverFile");
532
                                child.putProperty("gdbmsname", vfdi.name);
533
                                child.putProperty("file", vfdi.file);
534
                                child.putProperty("driverName", vfdi.driverName);
535 2217 fernando
                        } else if (di instanceof DBSourceInfo) {
536
                                DBTableSourceInfo dbdi = (DBTableSourceInfo) di;
537 1830 fernando
                                child.putProperty("type", "db");
538
                                child.putProperty("gdbmsname", dbdi.name);
539
                                child.putProperty("dbms", dbdi.dbms);
540
                                child.putProperty("host", dbdi.host);
541
                                child.putProperty("port", dbdi.port);
542
                                child.putProperty("user", dbdi.user);
543
                                child.putProperty("password", dbdi.password);
544
                                child.putProperty("dbName", dbdi.dbName);
545
                                child.putProperty("tableName", dbdi.tableName);
546 2183 fernando
                                child.putProperty("driverInfo", dbdi.driverName);
547 1830 fernando
                        }
548
549
                        xml.addChild(child);
550
                }
551
552
                /*
553
                   xml.putProperty("extentsX", xs);
554
                   xml.putProperty("extentsY", ys);
555
                   xml.putProperty("extentsW", ws);
556
                   xml.putProperty("extentsH", hs);
557
                 */
558 3424 caballero
559
                int numViews=0;
560 1222 fernando
                for (int i = 0; i < views.size(); i++) {
561 3183 caballero
                        try {
562 3424 caballero
                                XMLEntity xmlchild=((ProjectView) views.get(i)).getXMLEntity();
563
                                xml.addChild(xmlchild);
564
                                numViews++;
565 3183 caballero
                        } catch (SaveException e) {
566
                                e.showError();
567
                        }
568 1222 fernando
                }
569 3424 caballero
                xml.putProperty("numViews", numViews);
570
571
                int numMaps=0;
572 1222 fernando
                for (int i = 0; i < maps.size(); i++) {
573 3183 caballero
                        try {
574 3424 caballero
                                XMLEntity xmlchild=((ProjectMap) maps.get(i)).getXMLEntity();
575
                                xml.addChild(xmlchild);
576
                                numMaps++;
577 3183 caballero
                        } catch (SaveException e) {
578
                                e.showError();
579
                        }
580 1222 fernando
                }
581 3424 caballero
                xml.putProperty("numMaps", numMaps);
582 1222 fernando
                xml.putProperty("modificationDate", modificationDate);
583
                xml.putProperty("modified", modified);
584
                xml.putProperty("name", name);
585
                xml.putProperty("owner", owner);
586
                xml.putProperty("path", path);
587
                xml.putProperty("selectionColor",
588
                        StringUtilities.color2String(selectionColor));
589 3424 caballero
590
                int numTables=0;
591 1222 fernando
                for (int i = 0; i < tables.size(); i++) {
592 3183 caballero
                        try {
593 3424 caballero
                                XMLEntity xmlchild=((ProjectTable) tables.get(i)).getXMLEntity();
594
                                xml.addChild(xmlchild);
595
                                numTables++;
596 3183 caballero
                        } catch (SaveException e) {
597 3424 caballero
598 3183 caballero
                                e.showError();
599
                        }
600 1222 fernando
                }
601 3424 caballero
                xml.putProperty("numTables", numTables);
602 1222 fernando
                xml.putProperty("projection", defaultProjection.getAbrev());
603
604
                return xml;
605
        }
606 2183 fernando
        /**
607
         * DOCUMENT ME!
608
         *
609
         * @param xml DOCUMENT ME!
610
         *
611
         * @return DOCUMENT ME!
612
         * @throws XMLException
613
         * @throws DriverException
614
         * @throws DriverIOException
615 3183 caballero
         * @throws OpenException
616 2183 fernando
         */
617
        public static Project createFromXML03(XMLEntity xml)
618 3183 caballero
                throws OpenException {
619 2183 fernando
                Project p = new Project();
620 3183 caballero
                try{
621 2183 fernando
                p.comments = xml.getStringProperty("comments");
622
                p.creationDate = xml.getStringProperty("creationDate");
623
/*
624
                double[] xs = xml.getDoubleArrayProperty("extentsX");
625
                double[] ys = xml.getDoubleArrayProperty("extentsY");
626
                double[] ws = xml.getDoubleArrayProperty("extentsW");
627
                double[] hs = xml.getDoubleArrayProperty("extentsH");
628
*/
629
                int numExtents=xml.getIntProperty("numExtents");
630
                for (int i = 0; i < numExtents; i++) {
631
                        ProjectExtent pe=ProjectExtent.createFromXML03(xml.getChild(i));
632
                        p.extents.add(pe);
633
                }
634 1222 fernando
635 2183 fernando
                int numViews = xml.getIntProperty("numViews");
636
637
                for (int i = numExtents; i < numViews+numExtents; i++) {
638
                        p.views.add(ProjectView.createFromXML03(xml.getChild(i), p));
639
                }
640
641
                int numMaps = xml.getIntProperty("numMaps");
642
643
                for (int i = numViews+numExtents; i < (numMaps + numViews+numExtents); i++) {
644
                        p.maps.add(ProjectMap.createFromXML03(xml.getChild(i), p));
645
                }
646
647
                p.modificationDate = xml.getStringProperty("modificationDate");
648
                p.modified = xml.getBooleanProperty("modified");
649
                p.name = xml.getStringProperty("name");
650
                p.owner = xml.getStringProperty("owner");
651
                p.path = xml.getStringProperty("path");
652
                p.selectionColor = StringUtilities.string2Color(xml.getStringProperty(
653
                                        "selectionColor"));
654
655
                int numTables = xml.getIntProperty("numTables");
656
657
                for (int i = numExtents+numMaps + numViews; i < (numExtents+numTables + numMaps + numViews);
658
                                i++) {
659
                        p.tables.add(ProjectTable.createFromXML03(xml.getChild(i), p));
660
                }
661
                String strProj = xml.getStringProperty("projection");
662
                if (strProj != null)
663
                        Project.setProjection(ProjectionPool.get(strProj));
664 3183 caballero
                }catch (Exception e) {
665
                        throw new OpenException(e,p.getClass().getName());
666
                }
667 2183 fernando
                return p;
668
        }
669
670 1222 fernando
        /**
671
         * DOCUMENT ME!
672
         *
673
         * @param xml DOCUMENT ME!
674
         *
675
         * @return DOCUMENT ME!
676 1830 fernando
         *
677 1222 fernando
         * @throws XMLException
678
         * @throws DriverException
679
         * @throws DriverIOException
680 3183 caballero
         * @throws OpenException
681 3171 caballero
         * @throws VersionException
682 1222 fernando
         */
683
        public static Project createFromXML(XMLEntity xml)
684 3183 caballero
                throws OpenException {
685
686 1830 fernando
                int childNumber = 0;
687 1222 fernando
                Project p = new Project();
688 3183 caballero
                try{
689 1222 fernando
                p.comments = xml.getStringProperty("comments");
690
                p.creationDate = xml.getStringProperty("creationDate");
691 1830 fernando
692
                /*
693
                   double[] xs = xml.getDoubleArrayProperty("extentsX");
694
                   double[] ys = xml.getDoubleArrayProperty("extentsY");
695
                   double[] ws = xml.getDoubleArrayProperty("extentsW");
696
                   double[] hs = xml.getDoubleArrayProperty("extentsH");
697
                 */
698
                int numExtents = xml.getIntProperty("numExtents");
699
700 1302 vcaballero
                for (int i = 0; i < numExtents; i++) {
701 1830 fernando
                        ProjectExtent pe = ProjectExtent.createFromXML(xml.getChild(i));
702 1302 vcaballero
                        p.extents.add(pe);
703 1222 fernando
                }
704
705 1830 fernando
                childNumber = numExtents;
706
707
                int numDataSources = xml.getIntProperty("data-source-count");
708
709
                for (int i = childNumber; i < (childNumber + numDataSources); i++) {
710
                        XMLEntity child = xml.getChild(i);
711
712
                        if (child.getStringProperty("type").equals("otherDriverFile")) {
713
                                LayerFactory.getDataSourceFactory().addFileDataSource(child.getStringProperty(
714
                                                "driverName"), child.getStringProperty("gdbmsname"),
715 2217 fernando
                                        child.getStringProperty("file"));
716 1830 fernando
                        } else if (child.getStringProperty("type").equals("sameDriverFile")) {
717
                                /*                                String layerName = child.getStringProperty("layerName");
718
                                   ProjectView vista = project.getViewByName(child.getStringProperty(
719
                                   "viewName"));
720
                                   FLayer layer = vista.getMapContext().getLayers().getLayer(layerName);
721

722
                                   modelo = ((AlphanumericData) layer).getRecordset();
723
                                   associatedTable = (AlphanumericData) layer;
724
                                 */
725
                        } else if (child.getStringProperty("type").equals("db")) {
726
                                LayerFactory.getDataSourceFactory().addDBDataSourceByTable(child.getStringProperty(
727
                                                "gdbmsname"), child.getStringProperty("host"),
728
                                        child.getIntProperty("port"),
729
                                        child.getStringProperty("user"),
730
                                        child.getStringProperty("password"),
731
                                        child.getStringProperty("dbName"),
732
                                        child.getStringProperty("tableName"),
733 2217 fernando
                                        child.getStringProperty("driverInfo"));
734 1830 fernando
                        }
735
                }
736
737
                childNumber += numDataSources;
738
739 1222 fernando
                int numViews = xml.getIntProperty("numViews");
740
741 1830 fernando
                for (int i = childNumber; i < (numViews + childNumber); i++) {
742 3183 caballero
                        try{
743
                                p.views.add(ProjectView.createFromXML(xml.getChild(i), p));
744
                        }catch(OpenException e){
745
                                e.showError();
746
                        }
747 1222 fernando
                }
748
749 1830 fernando
                childNumber += numViews;
750
751 1222 fernando
                int numMaps = xml.getIntProperty("numMaps");
752
753 1830 fernando
                for (int i = childNumber; i < (numMaps + childNumber); i++) {
754 3183 caballero
                        try{
755
                                p.maps.add(ProjectMap.createFromXML(xml.getChild(i), p));
756
                        }catch(OpenException e){
757
                                e.showError();
758
                        }
759 1222 fernando
                }
760
761 1830 fernando
                childNumber += numMaps;
762 1222 fernando
                p.modificationDate = xml.getStringProperty("modificationDate");
763
                p.modified = xml.getBooleanProperty("modified");
764
                p.name = xml.getStringProperty("name");
765
                p.owner = xml.getStringProperty("owner");
766
                p.path = xml.getStringProperty("path");
767
                p.selectionColor = StringUtilities.string2Color(xml.getStringProperty(
768
                                        "selectionColor"));
769
770
                int numTables = xml.getIntProperty("numTables");
771
772 1830 fernando
                for (int i = childNumber; i < (childNumber + numTables); i++) {
773 3183 caballero
                        try{
774
                                p.tables.add(ProjectTable.createFromXML(xml.getChild(i), p));
775
                        }catch(OpenException e){
776
                                e.showError();
777
                        }
778 1222 fernando
                }
779 1830 fernando
780 2183 fernando
                p.setLinkTable();
781
782 1222 fernando
                String strProj = xml.getStringProperty("projection");
783 1830 fernando
784
                if (strProj != null) {
785 1222 fernando
                        Project.setProjection(ProjectionPool.get(strProj));
786 1830 fernando
                }
787 2673 fjp
        PostProcessSupport.executeCalls();
788 3171 caballero
                }catch (Exception e) {
789 3183 caballero
                        throw new OpenException(e,p.getClass().getName());
790 3171 caballero
                }
791 3183 caballero
                return p;
792
793 1222 fernando
        }
794
795
        /**
796 2183 fernando
         * Reestablece los link que ten?a cada tabla con las dem?s.
797
         */
798
        public void setLinkTable() {
799
                ArrayList tables = getTables();
800
801
                for (int i = 0; i < tables.size(); i++) {
802
                        for (int j = 0; j < tables.size(); j++) {
803
                                /*System.out.println("name = " +
804
                                        ((ProjectTable) tables.get(j)).getModelo().getName());
805
                                System.out.println("linktable = " +
806
                                        ((ProjectTable) tables.get(i)).getLinkTable());
807
*/
808
                                if ((((ProjectTable) tables.get(i)).getLinkTable() != null) &&
809
                                                ((ProjectTable) tables.get(i)).getLinkTable().equals(((ProjectTable) tables
810
                                                                                                                                                                  .get(
811
                                                                j)).getModelo().getName())) {
812
                                        LinkSelectionListener lsl = new LinkSelectionListener(((ProjectTable) tables.get(
813
                                                                i)).getModelo(),
814
                                                        ((ProjectTable) tables.get(j)).getModelo(),
815
                                                        ((ProjectTable) tables.get(i)).getField1(),
816
                                                        ((ProjectTable) tables.get(i)).getField2());
817
                                        ((ProjectTable) tables.get(i)).getModelo()
818
                                         .addSelectionListener(lsl);
819
                                }
820
                        }
821
                }
822
        }
823
824
        /**
825 1830 fernando
         * Obtiene la vista que contiene a la capa que se pasa como par?metro
826 1222 fernando
         *
827
         * @param layer Capa cuya vista se quiere obtener
828
         *
829
         * @return
830
         *
831
         * @throws RuntimeException Si la capa que se pasa como par?metro no se
832 1830 fernando
         *                    encuentra en ninguna vista
833 1222 fernando
         */
834
        public String getView(FLayer layer) {
835
                for (int v = 0; v < views.size(); v++) {
836
                        ProjectView pView = (ProjectView) views.get(v);
837
                        FLayers layers = pView.getMapContext().getLayers();
838 2611 caballero
                        if (isView(layers,layer))return pView.getName();
839
                }
840 1222 fernando
841 2611 caballero
                throw new RuntimeException("The layer is not in a view");
842
        }
843
        public boolean isView(FLayers layers,FLayer layer) {
844 1222 fernando
                        for (int i = 0; i < layers.getLayersCount(); i++) {
845 2611 caballero
                                if (layers.getLayer(i) instanceof FLayers){
846
                                        return isView((FLayers)layers.getLayer(i),layer);
847
                                }else{
848 1222 fernando
                                if (layers.getLayer(i) == layer) {
849 2611 caballero
                                        return true;
850 1222 fernando
                                }
851 2611 caballero
                                }
852 1222 fernando
                        }
853 2611 caballero
                        return false;
854 1222 fernando
        }
855
        /**
856 1830 fernando
         * Devuelve la vista cuyo nombre coincide (sensible a mayusculas) con el
857
         * que se pasa como par?metro. Devuelve null si no hay ninguna vista con
858
         * ese nombre
859 1222 fernando
         *
860
         * @param viewName Nombre de la vista que se quiere obtener
861
         *
862
         * @return DOCUMENT ME!
863
         */
864
        public ProjectView getViewByName(String viewName) {
865 1830 fernando
                Object o = getProjectElementByName(viewName, views);
866 1222 fernando
867 1830 fernando
                if (o == null) {
868
                        return null;
869 1222 fernando
                }
870
871 1830 fernando
                return (ProjectView) o;
872 1222 fernando
        }
873 1830 fernando
874
        /**
875
         * DOCUMENT ME!
876
         *
877
         * @return DOCUMENT ME!
878
         */
879 1222 fernando
        public static IProjection getProjection() {
880
                return defaultProjection;
881
        }
882 1830 fernando
883
        /**
884
         * DOCUMENT ME!
885
         *
886
         * @param defaultProjection DOCUMENT ME!
887
         */
888 1222 fernando
        public static void setProjection(IProjection defaultProjection) {
889
                Project.defaultProjection = defaultProjection;
890
        }
891 1830 fernando
892
        /**
893
         * DOCUMENT ME!
894
         *
895
         * @param name DOCUMENT ME!
896
         * @param l DOCUMENT ME!
897
         *
898
         * @return DOCUMENT ME!
899
         */
900
        private Object getProjectElementByName(String name, ArrayList l) {
901
                for (Iterator iter = l.iterator(); iter.hasNext();) {
902
                        ProjectElement elem = (ProjectElement) iter.next();
903
904
                        if (elem.getName().equals(name)) {
905
                                return elem;
906
                        }
907
                }
908
909
                return null;
910
        }
911
912
        /**
913
         * DOCUMENT ME!
914
         *
915
         * @param name
916
         *
917
         * @return
918
         */
919
        public ProjectTable getTableByName(String name) {
920
                Object o = getProjectElementByName(name, tables);
921
922
                if (o == null) {
923
                        return null;
924
                }
925
926
                return (ProjectTable) o;
927
        }
928
929
        /**
930
         * DOCUMENT ME!
931
         *
932
         * @param name
933
         *
934
         * @return
935
         */
936
        public ProjectMap getLayoutByName(String name) {
937
                Object o = getProjectElementByName(name, maps);
938
939
                if (o == null) {
940
                        return null;
941
                }
942
943
                return (ProjectMap) o;
944
        }
945 2610 fernando
946
    public SelectableDataSource getDataSourceByLayer(FLayer layer) throws DriverException {
947
        ArrayList tables = getTables();
948
        SelectableDataSource dataSource = null;
949
        for (int i = 0; i < tables.size(); i++) {
950
            ProjectTable pt = (ProjectTable) tables.get(i);
951
            if (pt.getOriginal() == ((AlphanumericData) layer).getRecordset()){
952
                dataSource = pt.getModelo();
953
                break;
954
            }else if (pt.getModelo() == ((AlphanumericData) layer).getRecordset()){
955
                dataSource = pt.getModelo();
956
                break;
957
            }
958
        }
959
960
        if (dataSource == null){
961
            //No se ha creado la tabla asociada al tema
962
            dataSource = ((AlphanumericData) layer).getRecordset();
963
        }
964
965
        return dataSource;
966
967
    }
968 3060 fjp
969
    /**
970
     * Recorremos las capas y las tablas del proyecto, y creamos una lista
971
     * con todos los datasources de GDBMS que estamos usando.
972
     * Luego recorremos los que est?n registrados, y borramos
973
     * aquellos que no est?n siendo usados, es decir, aquellos
974
     * que no est?n en nuestra lista (un Hash con clave el nombre
975
     * del GDBMS)
976
     *
977
     */
978
    private void cleanBadReferences()
979
    {
980
        Hashtable usedDataSources = new Hashtable();
981
        // Primero las tablas
982
        int i, j;
983
        for (i=0; i<tables.size(); i++)
984
        {
985
            ProjectTable t = (ProjectTable) tables.get(i);
986
            SelectableDataSource ds = t.getModelo();
987
            if (t.getOriginal() != null)
988
                usedDataSources.put(t.getOriginal().getName(), t.getOriginal());
989
            usedDataSources.put(ds.getName(), ds);
990
        }
991
992
        // Ahora las vistas
993
        try {
994
            for (i=0; i<views.size(); i++)
995
            {
996
                ProjectView pv = (ProjectView) views.get(i);
997
998
                FLayers lyrs = pv.getMapContext().getLayers();
999
                FLayers lyrsOverview = pv.getMapOverViewContext().getLayers();
1000
                for (j=0; j<lyrs.getLayersCount(); j++)
1001
                {
1002
                    FLayer lyr = lyrs.getLayer(j);
1003
                    if (lyr instanceof FLyrVect)
1004
                    {
1005
                        FLyrVect lyrVect = (FLyrVect) lyr;
1006
                        usedDataSources.put(lyrVect.getRecordset().getName(), lyrVect.getRecordset());
1007
                    }
1008
                }
1009
                for (j=0; j<lyrsOverview.getLayersCount(); j++)
1010
                {
1011
                    FLayer lyr = lyrsOverview.getLayer(j);
1012
                    if (lyr instanceof FLyrVect)
1013
                    {
1014
                        FLyrVect lyrVect = (FLyrVect) lyr;
1015
                        usedDataSources.put(lyrVect.getRecordset().getName(), lyrVect.getRecordset());
1016
                    }
1017
                }
1018
1019
            } // for i
1020
        } catch (DriverException e) {
1021
            // TODO Auto-generated catch block
1022
            e.printStackTrace();
1023
        }
1024
        // Recorremos los dataSources y los borramos si no
1025
        // los estamos usando.
1026
        SourceInfo[] infos = LayerFactory.getDataSourceFactory().getDriverInfos();
1027
        try {
1028
            for (i=0; i < infos.length; i++)
1029
            {
1030
                if (!usedDataSources.containsKey(infos[i].name))
1031
                {
1032
                    DataSource ds;
1033
                    ds = LayerFactory.getDataSourceFactory().createRandomDataSource(infos[i].name);
1034
                    ds.remove();
1035
                }
1036
            }
1037
        } catch (DriverLoadException e) {
1038
            // TODO Auto-generated catch block
1039
            e.printStackTrace();
1040
        } catch (NoSuchTableException e) {
1041
            // TODO Auto-generated catch block
1042
            e.printStackTrace();
1043
        } catch (com.hardcode.gdbms.engine.data.driver.DriverException e) {
1044
            // TODO Auto-generated catch block
1045
            e.printStackTrace();
1046
        }
1047
    }
1048 1222 fernando
}