Statistics
| Revision:

root / trunk / libraries / libFMap / src / com / iver / cit / gvsig / fmap / layers / LayerFactory.java @ 25274

History | View | Annotate | Download (22.8 KB)

1 1100 fjp
/* 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 214 fernando
package com.iver.cit.gvsig.fmap.layers;
42
43 2277 vcaballero
import java.io.File;
44
import java.io.IOException;
45
import java.sql.SQLException;
46
import java.sql.Types;
47 13760 nacho
import java.util.Hashtable;
48 2277 vcaballero
import java.util.TreeMap;
49
50
import org.apache.log4j.Logger;
51
import org.cresques.cts.IProjection;
52 17117 vcaballero
import org.gvsig.exceptions.BaseException;
53 2277 vcaballero
54 408 fernando
import com.hardcode.driverManager.Driver;
55
import com.hardcode.driverManager.DriverLoadException;
56
import com.hardcode.driverManager.DriverManager;
57 14573 vcaballero
import com.hardcode.driverManager.IDelayedDriver;
58 4143 caballero
import com.hardcode.driverManager.WriterManager;
59 10627 caballero
import com.hardcode.gdbms.driver.exceptions.InitializeDriverException;
60
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
61
import com.hardcode.gdbms.driver.exceptions.WriteDriverException;
62 1828 fernando
import com.hardcode.gdbms.engine.customQuery.QueryManager;
63 2183 fernando
import com.hardcode.gdbms.engine.data.DataSource;
64 408 fernando
import com.hardcode.gdbms.engine.data.DataSourceFactory;
65 2183 fernando
import com.hardcode.gdbms.engine.data.NoSuchTableException;
66 10627 caballero
import com.hardcode.gdbms.engine.data.driver.DriverException;
67 2183 fernando
import com.hardcode.gdbms.engine.data.edition.DataWare;
68
import com.hardcode.gdbms.engine.values.Value;
69
import com.hardcode.gdbms.engine.values.ValueFactory;
70 24424 vcaballero
import com.iver.cit.gvsig.exceptions.layers.ConnectionErrorLayerException;
71 10627 caballero
import com.iver.cit.gvsig.exceptions.layers.LegendLayerException;
72
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
73 7459 azabala
import com.iver.cit.gvsig.fmap.DriverNotLoadedExceptionType;
74
import com.iver.cit.gvsig.fmap.LegendDriverExceptionType;
75 2183 fernando
import com.iver.cit.gvsig.fmap.ProgressListener;
76 11971 caballero
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
77
import com.iver.cit.gvsig.fmap.drivers.DBException;
78 3236 fjp
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
79 422 fjp
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
80 12062 azabala
import com.iver.cit.gvsig.fmap.drivers.IVectorialDatabaseDriver;
81
import com.iver.cit.gvsig.fmap.drivers.IVectorialJDBCDriver;
82 408 fernando
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
83 438 fernando
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
84 714 fjp
import com.iver.cit.gvsig.fmap.drivers.WithDefaultLegend;
85 1828 fernando
import com.iver.cit.gvsig.fmap.operations.arcview.ArcJoin;
86 13884 jaume
import com.iver.cit.gvsig.fmap.rendering.IVectorLegend;
87 458 fjp
import com.iver.cit.gvsig.fmap.rendering.LegendFactory;
88 18621 jdominguez
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.AttrInTableLabelingStrategy;
89
import com.iver.cit.gvsig.fmap.rendering.styling.labeling.ILabelingStrategy;
90 303 fernando
91 214 fernando
/**
92
 * Crea un adaptador del driver que se le pasa como par?metro en los m?todos
93
 * createLayer. Si hay memoria suficiente se crea un FLyrMemory que pasa todas
94
 * las features del driver a memoria
95
 */
96
public class LayerFactory {
97 17117 vcaballero
//        private static ArrayList<ISolveErrorListener> solveListeners=new ArrayList<ISolveErrorListener>();
98
        private static Hashtable<Class, ISolveErrorListener> solveListeners = new Hashtable<Class,ISolveErrorListener>();
99
100
101 7459 azabala
        private static Logger logger = Logger.getLogger(LayerFactory.class
102
                        .getName());
103
104 439 luisw
        private static String driversPath = "../FMap 03/drivers";
105 4781 fjp
        private static String writersPath = "../FMap 03/drivers";
106 732 fernando
        private static DriverManager driverManager;
107 4143 caballero
        private static WriterManager writerManager;
108 1828 fernando
        private static DataSourceFactory dataSourceFactory;
109 4143 caballero
110 732 fernando
        /**
111
         * Map en el que se guarda para cada fuente de datos a?adida al sistema, el
112 7459 azabala
         * adaptador que la maneja. Ha de ser un TreeMap ya que esta clase define la
113
         * igualdad entre las claves a traves del m?todo equals de las mismas. Los
114
         * objetos FileSource, DBSource y WFSSource tienen definido el m?todo equals
115
         * de forma que devuelven true cuando dos objetos apuntan a la misma fuente
116
         * de datos
117 732 fernando
         */
118
        private static TreeMap sourceAdapter;
119 14450 vcaballero
120 13760 nacho
        /**
121
         * This Hashtable allows to register an alternative LayerClass for
122
         * an specific LayerClass than is attempting to create this factory
123
         */
124
        private static Hashtable layerClassMapping = new Hashtable();
125 214 fernando
126 1828 fernando
        /*
127 7459 azabala
         * Crea un RandomVectorialFile con el driver que se le pasa como par?metro y
128
         * guard?ndose el nombre del fichero para realizar los accesos, la capa
129 732 fernando
         * tendr? asociada la proyecci?n que se pasa como parametro tambi?n
130 9634 caballero
         *
131 7459 azabala
         * @param layerName Nombre de la capa. @param driverName Nombre del driver.
132
         * @param f fichero. @param proj Proyecci?n.
133 9634 caballero
         *
134 7459 azabala
         * @return FLayer. @throws DriverException
135 9634 caballero
         *
136 7459 azabala
         * @throws DriverException @throws DriverIOException
137 2183 fernando
         */
138 732 fernando
        public static FLayer createLayer(String layerName, String driverName,
139 10627 caballero
                        File f, IProjection proj) throws LoadLayerException  {
140 7459 azabala
                // Se obtiene el driver que lee
141 732 fernando
                DriverManager dm = getDM();
142 438 fernando
143 732 fernando
                try {
144
                        Driver d = dm.getDriver(driverName);
145 438 fernando
146 732 fernando
                        if (d instanceof VectorialFileDriver) {
147
                                return createLayer(layerName, (VectorialFileDriver) d, f, proj);
148
                        }
149
                } catch (DriverLoadException e) {
150 7459 azabala
                        //hay un poco de lio sobre que excepciones se dejan subir
151
                        //arriba y que excepciones se quedan en LayerFactory
152
                        //(esto se debe a que queremos intentar recuperar ciertas capas)
153
                        //las excepciones de este metodo se dejan subir todas, puesto
154
                        //que las excepciones de los dos otros metodos createLayer si que
155
                        //se atrapan
156 9634 caballero
                        DriverNotLoadedExceptionType exceptionType =
157 7459 azabala
                                new DriverNotLoadedExceptionType();
158
                        exceptionType.setDriverName(driverName);
159 10627 caballero
//                        DriverException exception =
160
//                                new DriverException(e, exceptionType);
161
                        throw new LoadLayerException(layerName,e);
162 732 fernando
                }
163 438 fernando
164 732 fernando
                return null;
165
        }
166 2183 fernando
167 1034 vcaballero
        /**
168 7459 azabala
         * It creates a FLayer (FLyrVect) which reads its data from a file driver,
169
         * projected in the specified projection.
170 9634 caballero
         *
171 7459 azabala
         * @param layerName
172
         *            name of the layer
173
         * @param d
174
         *            vectorial file driver to read layer's data
175
         * @param f
176
         *            file associated to the driver
177
         * @param proj
178
         *            layer projection
179 9634 caballero
         *
180 7459 azabala
         * @return FLayer new vectorial layer
181 10627 caballero
         * @throws LoadLayerException
182 9634 caballero
         *
183 1034 vcaballero
         * @throws DriverException
184
         */
185
        public static FLayer createLayer(String layerName, VectorialFileDriver d,
186 9634 caballero
                        File f, IProjection proj)
187
188 7459 azabala
        /*throws DriverException*/ {
189 10814 jaume
                FLyrVect layer = new FLyrVect();
190 10627 caballero
                try {
191 7459 azabala
                // TODO Comprobar si hay un adaptador ya
192 1034 vcaballero
                VectorialFileAdapter adapter = new VectorialFileAdapter(f);
193 10627 caballero
                adapter.setDriver(d);
194 11853 jaume
195 11286 azabala
                //TODO azo: adapter needs a reference to projection and to spatial index (review)
196
                adapter.setProjection(proj);
197 214 fernando
198 10814 jaume
                layer.setName(layerName);
199 7459 azabala
200
                // TODO Meter esto dentro de la comprobaci?n de si hay memoria
201 1034 vcaballero
                if (false) {
202
                } else {
203 10814 jaume
                        layer.setSource(adapter);
204
                        layer.setProjection(proj);
205 1034 vcaballero
                }
206 4143 caballero
207 15594 jdominguez
208 470 fjp
                        // Le asignamos tambi?n una legenda por defecto acorde con
209
                        // el tipo de shape que tenga. Tampoco s? si es aqu? el
210
                        // sitio adecuado, pero en fin....
211 1034 vcaballero
                        if (d instanceof WithDefaultLegend) {
212
                                WithDefaultLegend aux = (WithDefaultLegend) d;
213 10627 caballero
214
                                        adapter.start();
215 13884 jaume
                                        layer.setLegend((IVectorLegend) aux.getDefaultLegend());
216 10814 jaume
217
                                        ILabelingStrategy labeler = aux.getDefaultLabelingStrategy();
218 18621 jdominguez
                                        if (labeler instanceof AttrInTableLabelingStrategy) {
219
                                                ((AttrInTableLabelingStrategy) labeler).setLayer(layer);
220 10814 jaume
                                        }
221 14450 vcaballero
                                        layer.setLabelingStrategy(labeler);
222 10814 jaume
                                        layer.setIsLabeled(true); // TODO: ac? no s'hauria de detectar si t? etiquetes?????
223 10627 caballero
                                        adapter.stop();
224
225 1034 vcaballero
                        } else {
226 15594 jdominguez
                                IVectorLegend leg = LegendFactory.createSingleSymbolLegend(layer
227
                                                .getShapeType());
228
                                layer.setLegend(leg);
229 17117 vcaballero
230 1034 vcaballero
                        }
231 10627 caballero
        } catch (ReadDriverException e) {
232 17117 vcaballero
                layer=tryToSolveError(e,layer,d);
233
        } catch (LoadLayerException e) {
234
                layer=tryToSolveError(e,layer,d);
235
        }
236
                return layer;
237
        }
238
239
        private static FLyrVect tryToSolveError(BaseException e,FLayer layer,Driver d) {
240
                ISolveErrorListener sel = solveListeners.get(e.getClass());
241
                if (sel!=null){
242
                        FLyrVect solvedLayer=null;
243
                        solvedLayer=(FLyrVect)sel.solve(layer,d);
244
                        if (solvedLayer!=null && sel!=null){
245
                                return solvedLayer;
246
                        }
247
                }
248 10814 jaume
                layer.setAvailable(false);
249
                layer.addError(e);
250 17117 vcaballero
                return (FLyrVect)layer;
251 10627 caballero
        }
252 17117 vcaballero
253
        public static void addSolveErrorForLayer(Class exception, ISolveErrorListener sel) {
254
                solveListeners.put(exception,sel);
255 1034 vcaballero
        }
256 17117 vcaballero
        public static void removeSolveErrorListener(Class exception){
257
                solveListeners.remove(exception);
258
        }
259 7459 azabala
        /**
260
         * Creates a new vectorial layer from a generic layer (by generic whe mean
261
         * that we dont know a priory its origin: file, memory, jdbc database, etc.
262 9634 caballero
         *
263 7459 azabala
         * @param layerName
264
         * @param d
265
         * @param proj
266
         * @return
267
         * @throws DriverException
268
         */
269
        public static FLayer createLayer(String layerName, VectorialDriver d,
270 9634 caballero
                        IProjection proj)
271 7459 azabala
        /*
272 9634 caballero
        throws DriverException
273 7459 azabala
        */{
274
                VectorialAdapter adapter = null;
275
                if (d instanceof VectorialFileDriver) {
276
                        adapter = new VectorialFileAdapter(((VectorialFileDriver) d)
277
                                        .getFile());
278 11971 caballero
                } else if (d instanceof IVectorialDatabaseDriver) {
279 7459 azabala
                        adapter = new VectorialDBAdapter();
280
                } else {
281
                        adapter = new VectorialDefaultAdapter();
282
                }
283
                adapter.setDriver((VectorialDriver) d);
284 11286 azabala
                //TODO azo:adapter needs a reference to the projection
285
                adapter.setProjection(proj);
286 11853 jaume
287 10814 jaume
                FLyrVect layer = new FLyrVect();
288
                layer.setName(layerName);
289 3301 fjp
290 10814 jaume
                layer.setSource(adapter);
291
                layer.setProjection(proj);
292 3301 fjp
293 7459 azabala
                try {
294 4143 caballero
295 7459 azabala
                        // Le asignamos tambi?n una legenda por defecto acorde con
296
                        // el tipo de shape que tenga. Tampoco s? si es aqu? el
297
                        // sitio adecuado, pero en fin....
298
                        if (d instanceof WithDefaultLegend) {
299
                                WithDefaultLegend aux = (WithDefaultLegend) d;
300
                                adapter.start();
301 13884 jaume
                                layer.setLegend((IVectorLegend) aux.getDefaultLegend());
302 10814 jaume
303
                                ILabelingStrategy labeler = aux.getDefaultLabelingStrategy();
304 20706 vcaballero
                                if (labeler != null) {
305
                                        labeler.setLayer(layer);
306
                                        layer.setLabelingStrategy(labeler);
307
                                        layer.setIsLabeled(true); // TODO: ac? no s'hauria de detectar si t? etiquetes?????
308 10814 jaume
                                }
309
310 7459 azabala
                                adapter.stop();
311
                        } else {
312 10814 jaume
                                layer.setLegend(LegendFactory.createSingleSymbolLegend(layer
313 7459 azabala
                                                .getShapeType()));
314
                        }
315 10627 caballero
                } catch (LegendLayerException e) {
316 3301 fjp
317 10814 jaume
                        layer.setAvailable(false);
318
                        layer.addError(e);
319 15594 jdominguez
320 10627 caballero
                } catch (ReadDriverException e) {
321 10814 jaume
                        layer.setAvailable(false);
322
                        layer.addError(e);
323 7459 azabala
                }
324 1034 vcaballero
325 10814 jaume
                return layer;
326 7459 azabala
        }
327
328
        public static FLayer createArcSDELayer(String layerName,
329 11971 caballero
                        IVectorialDatabaseDriver driver, IProjection proj) {
330 7459 azabala
                // throw new UnsupportedOperationException();
331
                FLyrVect layer = new FLyrVect();
332
                VectorialAdapter adapter = new VectorialDBAdapter();
333
                adapter.setDriver(driver);
334 11286 azabala
                adapter.setProjection(proj);
335 4143 caballero
336 7459 azabala
                layer.setName(layerName);
337
                layer.setSource(adapter);
338
                layer.setProjection(proj);
339
                try {
340
                        if (driver instanceof WithDefaultLegend) {
341
                                WithDefaultLegend aux = (WithDefaultLegend) driver;
342
                                adapter.start();
343 13884 jaume
                                layer.setLegend((IVectorLegend) aux.getDefaultLegend());
344 10814 jaume
345
                                ILabelingStrategy labeler = aux.getDefaultLabelingStrategy();
346 18621 jdominguez
                                if (labeler instanceof AttrInTableLabelingStrategy) {
347
                                        ((AttrInTableLabelingStrategy) labeler).setLayer(layer);
348 10814 jaume
                                }
349
                                layer.setLabelingStrategy(labeler);layer.setIsLabeled(true); // TODO: ac? no s'hauria de detectar si t? etiquetes?????
350
351 7459 azabala
                                adapter.stop();
352
                        } else {
353
                                layer.setLegend(LegendFactory.createSingleSymbolLegend(layer
354
                                                .getShapeType()));
355
                        }
356 10627 caballero
                } catch (LegendLayerException e) {
357 7459 azabala
                        throw new UnsupportedOperationException(e.getMessage());
358 10627 caballero
                } catch (InitializeDriverException e) {
359 7459 azabala
                        throw new UnsupportedOperationException(e.getMessage());
360 10627 caballero
                } catch (ReadDriverException e) {
361
                        throw new UnsupportedOperationException(e.getMessage());
362 7459 azabala
                }
363 4143 caballero
364 7459 azabala
                try {
365
                        layer.setLegend(LegendFactory.createSingleSymbolLegend(layer
366
                                        .getShapeType()));
367 10627 caballero
                } catch (LegendLayerException e) {
368 7459 azabala
                        e.printStackTrace();
369 10627 caballero
                } catch (ReadDriverException e) {
370 7459 azabala
                        e.printStackTrace();
371
                }
372
                return layer;
373
        }
374 4143 caballero
375 732 fernando
        /**
376
         * Crea un RandomVectorialWFS con el driver que se le pasa como par?metro y
377
         * guard?ndose la URL del servidor que se pasa como par?metro
378 9634 caballero
         *
379 1034 vcaballero
         * @param driver
380
         * @param host
381
         * @param port
382
         * @param user
383
         * @param password
384
         * @param dbName
385
         * @param tableName
386
         * @param proj
387 9634 caballero
         *
388 1034 vcaballero
         * @return Capa creada.
389 9634 caballero
         *
390 1034 vcaballero
         * @throws UnsupportedOperationException
391 732 fernando
         */
392 11971 caballero
        public static FLayer createLayer(IVectorialDatabaseDriver driver,
393 7459 azabala
                        String host, int port, String user, String password, String dbName,
394
                        String tableName, IProjection proj) {
395 732 fernando
                throw new UnsupportedOperationException();
396
        }
397 4143 caballero
398 11971 caballero
        public static FLayer createDBLayer(IVectorialDatabaseDriver driver,
399 7459 azabala
                        String layerName, IProjection proj) {
400 4143 caballero
401 10814 jaume
                FLyrVect layer = new FLyrVect();
402 4143 caballero
403 10814 jaume
                layer.setName(layerName);
404 1691 fjp
                VectorialDBAdapter dbAdapter = new VectorialDBAdapter();
405 4143 caballero
                dbAdapter.setDriver(driver);
406 12062 azabala
                dbAdapter.setProjection(proj);//adapter needs also a ref to prj. review (azo)
407 4143 caballero
408 10814 jaume
                layer.setSource(dbAdapter);
409
                layer.setProjection(proj);
410 1691 fjp
                try {
411
                        if (driver instanceof WithDefaultLegend) {
412
                                WithDefaultLegend aux = (WithDefaultLegend) driver;
413
                                dbAdapter.start();
414 13884 jaume
                                layer.setLegend((IVectorLegend) aux.getDefaultLegend());
415 10814 jaume
416
                                ILabelingStrategy labeler = aux.getDefaultLabelingStrategy();
417 18621 jdominguez
                                if (labeler instanceof AttrInTableLabelingStrategy) {
418
                                        ((AttrInTableLabelingStrategy) labeler).setLayer(layer);
419 10814 jaume
                                }
420 14573 vcaballero
                                layer.setLabelingStrategy(labeler);
421 10814 jaume
422
                                layer.setIsLabeled(true); // TODO: ac? no s'hauria de detectar si t? etiquetes?????
423
424 1691 fjp
                                dbAdapter.stop();
425 4143 caballero
                        } else {
426 10814 jaume
                                layer.setLegend(LegendFactory.createSingleSymbolLegend(layer
427 7459 azabala
                                                .getShapeType()));
428 1691 fjp
                        }
429 14573 vcaballero
                        if (driver instanceof IDelayedDriver){
430
                                // Por defecto, los drivers est?n listos para entregar
431
                                // features al terminar su initialize. Pero con los drivers
432
                                // que implementan IDelayedDriver, el driver es responsable
433
                                // de avisar cu?ndo est? listo
434
                                layer.getFLayerStatus().setDriverLoaded(false);
435
                                ((IDelayedDriver) driver).addDriverEventListener(new DefaultDelayedDriverListener(layer));
436
                        }
437 10627 caballero
                } catch (LegendLayerException e) {
438 24424 vcaballero
//                        LegendDriverExceptionType exceptType =
439
//                                new LegendDriverExceptionType("Error al construir la leyenda, campo no encontrado");
440 7459 azabala
                        //TODO Para hacer esto extensible tiene que usarse puntos
441
                        //de extension, y comparar las clases de leyendas registradas
442 11853 jaume
//                        IVectorialLegend legend = (IVectorialLegend)
443
//                                ((WithDefaultLegend)driver).getDefaultLegend();
444
//
445
//                        excepType.setLegendLabelField(legend.getLabelField());
446
//                        excepType.setLegendHeightField(legend.getLabelHeightField());
447
//                        excepType.setLegendRotationField(legend.getLabelRotationField());
448 10627 caballero
//                        DriverException exception = new DriverException(e, excepType);
449 10814 jaume
                        layer.setAvailable(false);
450 24424 vcaballero
                        layer.addError(e);
451 10814 jaume
                        return layer;
452 7459 azabala
                        // throw new UnsupportedOperationException(e.getMessage());
453
                } catch (Exception e) {
454 11853 jaume
//                        ExceptionDescription excepType = new GenericDriverExceptionType();
455 10627 caballero
//                        DriverException exception = new DriverException(e, excepType);
456 24424 vcaballero
//                        layer.addError(null);
457
                        layer.addError(new LoadLayerException("No se ha podido cargar la capa",e));
458 10814 jaume
                        layer.setAvailable(false);
459
                        return layer;
460 7459 azabala
                }
461 303 fernando
462 10814 jaume
                return layer;
463 1691 fjp
464 7459 azabala
        }
465 1691 fjp
466 2183 fernando
        /**
467
         * @param driver
468
         * @param layerName
469
         * @param object
470
         * @return
471
         * @throws SQLException
472
         * @throws DriverIOException
473
         * @throws IOException
474
         * @throws DriverLoadException
475
         * @throws com.hardcode.gdbms.engine.data.driver.DriverException
476
         * @throws NoSuchTableException
477
         * @throws ClassNotFoundException
478 10627 caballero
         * @throws ReadDriverException
479
         * @throws IOException
480
         * @throws WriteDriverException
481 4143 caballero
         * @throws
482 2183 fernando
         */
483 11971 caballero
        public static FLayer createDisconnectedDBLayer(IVectorialJDBCDriver driver,
484 7459 azabala
                        String layerName, IProjection proj, ProgressListener listener)
485 11971 caballero
                        throws DBException,
486 7459 azabala
                        DriverLoadException, NoSuchTableException,
487 10627 caballero
                        ClassNotFoundException, ReadDriverException, IOException, WriteDriverException {
488 7459 azabala
                VectorialDisconnectedDBAdapter dbAdapter = new VectorialDisconnectedDBAdapter();
489
                dbAdapter.setDriver(driver);
490 12062 azabala
                dbAdapter.setProjection(proj);
491 7459 azabala
                DataSource ds = dbAdapter.getRecordset();
492
                ds.start();
493
                String database = dataSourceFactory.getTempFile();
494
                String[] fieldNames = new String[ds.getFieldCount() + 1];
495
                System.arraycopy(ds.getFieldNames(), 0, fieldNames, 1, ds
496
                                .getFieldCount());
497
                fieldNames[0] = "the_geom";
498
                int[] types = new int[fieldNames.length];
499
                types[0] = Types.BINARY;
500
                for (int i = 1; i < types.length; i++) {
501
                        types[i] = ds.getFieldType(i - 1);
502
                }
503 11971 caballero
                String dsName=null;
504
                try {
505
                        dsName = dataSourceFactory.createTable(database,
506
                                        ds.getPKNames(), fieldNames, types);
507
                } catch (ReadDriverException e) {
508
                        // TODO Auto-generated catch block
509
                        e.printStackTrace();
510
                } catch (SQLException e) {
511
                        throw new DBException(e);
512
                }
513 4143 caballero
514 7459 azabala
                DBLayerDefinition lyrDef = new DBLayerDefinition();
515
                lyrDef.setTableName(dsName);
516
                lyrDef.setName(layerName);
517
                lyrDef.setFieldNames(ds.getFieldNames());
518
                lyrDef.setFieldGeometry("the_geom");
519
                lyrDef.setFieldID(ds.getPKNames()[0]);
520
                lyrDef.setClassToInstantiate("org.hsqldb.jdbcDriver");
521 4143 caballero
522 7459 azabala
                dataSourceFactory.addDBDataSourceByTable(dsName, null, 0, "sa", "",
523
                                database, dsName, "GDBMS HSQLDB Transactional driver");
524
                DataSource local = dataSourceFactory.createRandomDataSource(dsName,
525 14588 vcaballero
                                DataSourceFactory.AUTOMATIC_OPENING);
526 7459 azabala
                local.start();
527
                DataWare dw = local
528
                                .getDataWare(DataSourceFactory.DATA_WARE_COHERENT_ROW_ORDER);
529
                dw.start();
530
                long t1 = System.currentTimeMillis();
531
                dw.beginTrans();
532 4143 caballero
533 7459 azabala
                if (listener == null) {
534
                        listener = new ProgressListener() {
535
                                /**
536
                                 * @see com.iver.cit.gvsig.fmap.ProgressListener#progress(int)
537
                                 */
538
                                public void progress(int n) {
539
                                        // do nothing
540
                                }
541
                        };
542
                }
543 4143 caballero
544 7459 azabala
                for (int i = 0; i < dbAdapter.getShapeCount(); i++) {
545
                        Value[] row = new Value[ds.getFieldCount() + 1];
546 4143 caballero
547 7459 azabala
                        byte[] bytes = dbAdapter.getShape(i).toWKB();
548
                        row[0] = ValueFactory.createValue(bytes);
549 4143 caballero
550 7459 azabala
                        for (int j = 0; j < ds.getFieldCount(); j++) {
551
                                row[j + 1] = ds.getFieldValue(i, j);
552
                        }
553 2183 fernando
554 7459 azabala
                        dw.insertFilledRow(row);
555
                        listener.progress(100 * i / dbAdapter.getShapeCount());
556
                }
557 4143 caballero
558 7459 azabala
                long t2 = System.currentTimeMillis();
559
                dw.commitTrans();
560
                long t3 = System.currentTimeMillis();
561
                System.out.println((t2 - t1) + " - " + (t3 - t2));
562
                dw.stop();
563
                local.stop();
564
                ds.stop();
565 11971 caballero
                IVectorialJDBCDriver cacheDriver = (IVectorialJDBCDriver) LayerFactory
566 7459 azabala
                                .getDM().getDriver("HSQLDB Driver");
567
                Class.forName("org.hsqldb.jdbcDriver");
568 2183 fernando
569 11971 caballero
                cacheDriver.setData(ConnectionFactory.createConnection(
570 7459 azabala
                                "jdbc:hsqldb:file:" + database, "sa", ""), lyrDef);
571
                cacheDriver.setWorkingArea(driver.getWorkingArea());
572
                return createDBLayer(cacheDriver, layerName, proj);
573 2183 fernando
        }
574 4143 caballero
575 732 fernando
        /**
576 1034 vcaballero
         * Devuelve el DriverManager.
577 9634 caballero
         *
578 1034 vcaballero
         * @return DriverManager.
579 732 fernando
         */
580
        public static DriverManager getDM() {
581 1839 fernando
                initializeDriverManager();
582 732 fernando
583
                return driverManager;
584
        }
585 7459 azabala
586 4143 caballero
        /**
587
         * Devuelve el WriterManager.
588 9634 caballero
         *
589 4143 caballero
         * @return WriterManager.
590
         */
591
        public static WriterManager getWM() {
592
                initializeWriterManager();
593 732 fernando
594 4143 caballero
                return writerManager;
595
        }
596 7459 azabala
597 732 fernando
        /**
598 1034 vcaballero
         * Inicializa el DriverManager.
599 732 fernando
         */
600
        private static void initializeDriverManager() {
601
                if (driverManager == null) {
602
                        driverManager = new DriverManager();
603
                        driverManager.loadDrivers(new File(LayerFactory.driversPath));
604
605
                        Throwable[] failures = driverManager.getLoadFailures();
606
607
                        for (int i = 0; i < failures.length; i++) {
608 2183 fernando
                                logger.error("", failures[i]);
609 626 fernando
                        }
610
611 1828 fernando
                        getDataSourceFactory().setDriverManager(driverManager);
612 2183 fernando
                        getDataSourceFactory().initialize();
613 1836 fernando
                        QueryManager.registerQuery(new ArcJoin());
614 732 fernando
                }
615
        }
616 7459 azabala
617 4143 caballero
        /**
618
         * Inicializa el DriverManager.
619
         */
620
        private static void initializeWriterManager() {
621
                if (writerManager == null) {
622
                        writerManager = new WriterManager();
623
                        writerManager.loadWriters(new File(LayerFactory.writersPath));
624 408 fernando
625 4143 caballero
                        Throwable[] failures = writerManager.getLoadFailures();
626
627
                        for (int i = 0; i < failures.length; i++) {
628
                                logger.error("", failures[i]);
629
                        }
630
631
                        getDataSourceFactory().setWriterManager(writerManager);
632
                        getDataSourceFactory().initialize();
633 7459 azabala
                        // QueryManager.registerQuery(new ArcJoin());
634 4143 caballero
                }
635
        }
636 7459 azabala
637 732 fernando
        /**
638
         * sets drivers Directory
639 9634 caballero
         *
640 732 fernando
         * @param path
641
         */
642
        public static void setDriversPath(String path) {
643
                LayerFactory.driversPath = path;
644
                initializeDriverManager();
645
        }
646 7459 azabala
647 1773 fernando
        /**
648 4143 caballero
         * sets writers Directory
649 9634 caballero
         *
650 4143 caballero
         * @param path
651
         */
652
        public static void setWritersPath(String path) {
653
                LayerFactory.writersPath = path;
654
                initializeWriterManager();
655
        }
656
657
        /**
658 1773 fernando
         * @return Returns the dataSourceFactory.
659
         */
660
        public static DataSourceFactory getDataSourceFactory() {
661 7459 azabala
                if (dataSourceFactory == null) {
662 1828 fernando
                        dataSourceFactory = new DataSourceFactory();
663
                }
664 1773 fernando
                return dataSourceFactory;
665
        }
666 9634 caballero
667
        public static void initialize() {
668
                initializeDriverManager();
669
                initializeWriterManager();
670
        }
671 14450 vcaballero
672 13760 nacho
        /**
673
         * Set a class to use instead of the originalLayerClassName.
674
         *
675
         * @param originalLayerClassName name of class to relpace
676
         * @param layerClassToUse Class than implements FLayer interface to use
677
         *
678
         * @see  getLayerClassForLayerClassName(String,Class)
679
         * @see  unregisterLayerClassForName(String)
680
        */
681
        public static void registerLayerClassForName (String originalLayerClassName, Class layerClassToUse){
682
                Class[] interfaces = layerClassToUse.getInterfaces();
683
                for (int i = 0;i < interfaces.length; i++){
684
                        if (interfaces[i] == FLayer.class)
685
                                break;
686
                }
687
688
                layerClassMapping.put(originalLayerClassName,layerClassToUse);
689
        }
690
691
        /**
692
         * Unregister the originalLayerClassName class replacement.
693
         *
694
         * @param originalLayerClassName name of class to relpace
695
         * @param layerClassToUse Class than implements FLayer interface to use
696
         * @return true if the class had been registered
697
         *
698
         * @see  getLayerClassForLayerClassName(String,Class)
699
         * @see  unregisterLayerClassForName(String)
700
        */
701
        public static boolean unregisterLayerClassForName (String originalLayerClassName){
702
                return layerClassMapping.remove(originalLayerClassName) != null;
703
        }
704
705
        /**
706
         * Gets the class to use for the layerClassName.
707
         * If isn't registered an alternative class for this layerClass
708
         * the this returns 'Class.forName(layerClassName)'
709
         *
710
         * @param layerClassName
711
         * @return Class implements FLayer to use
712
         * @throws ClassNotFoundException
713
         *
714
         * @see  registerLayerClassForName(String,Class)
715
         * @see  unregisterLayerClassForName(String)
716
         */
717
        public static Class getLayerClassForLayerClassName(String layerClassName) throws ClassNotFoundException{
718
                Class layerClass = (Class)layerClassMapping.get(layerClassName);
719
                if (layerClass == null)
720
                        layerClass = Class.forName(layerClassName);
721
                return layerClass;
722
        }
723 214 fernando
}