Statistics
| Revision:

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

History | View | Annotate | Download (8.66 KB)

1
package com.iver.cit.gvsig.fmap.layers;
2

    
3
import com.hardcode.driverManager.Driver;
4
import com.hardcode.driverManager.DriverLoadException;
5
import com.hardcode.driverManager.DriverManager;
6

    
7
import com.hardcode.gdbms.engine.data.DataSourceFactory;
8
import com.hardcode.gdbms.engine.instruction.FieldNotFoundException;
9

    
10
import com.iver.cit.gvsig.fmap.DriverException;
11
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
12
import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
13
import com.iver.cit.gvsig.fmap.drivers.VectorialDatabaseDriver;
14
import com.iver.cit.gvsig.fmap.drivers.VectorialDriver;
15
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
16
import com.iver.cit.gvsig.fmap.drivers.WithDefaultLegend;
17
import com.iver.cit.gvsig.fmap.drivers.wfs.WFSDriver;
18
import com.iver.cit.gvsig.fmap.rendering.LegendFactory;
19
import com.iver.cit.gvsig.fmap.rendering.VectorialLegend;
20

    
21
import org.apache.log4j.Logger;
22

    
23
import org.cresques.cts.IProjection;
24

    
25
import java.awt.geom.Rectangle2D;
26

    
27
import java.io.File;
28

    
29
import java.net.URL;
30

    
31
import java.util.TreeMap;
32

    
33

    
34
/**
35
 * Crea un adaptador del driver que se le pasa como par?metro en los m?todos
36
 * createLayer. Si hay memoria suficiente se crea un FLyrMemory que pasa todas
37
 * las features del driver a memoria
38
 */
39
public class LayerFactory {
40
        private static Logger logger = Logger.getLogger(LayerFactory.class.getName());
41
        private static String driversPath = "../FMap 03/drivers";
42
        private static DriverManager driverManager;
43

    
44
        /**
45
         * Map en el que se guarda para cada fuente de datos a?adida al sistema, el
46
         * adaptador que la maneja. Ha de ser un TreeMap ya que esta clase define
47
         * la igualdad entre las claves a traves del m?todo equals de las mismas.
48
         * Los objetos FileSource, DBSource y WFSSource tienen definido el m?todo
49
         * equals de forma que devuelven true cuando dos objetos apuntan a la
50
         * misma fuente de datos
51
         */
52
        private static TreeMap sourceAdapter;
53

    
54
        /**
55
         * Crea un RandomVectorialFile con el driver que se le pasa como par?metro
56
         * y guard?ndose el nombre del fichero para realizar los accesos, la capa
57
         * tendr? asociada la proyecci?n que se pasa como parametro tambi?n
58
         *
59
         * @param layerName Nombre de la capa.
60
         * @param driverName Nombre del driver.
61
         * @param f fichero.
62
         * @param proj Proyecci?n.
63
         *
64
         * @return FLayer.
65
         *
66
         * @throws DriverException
67
         * @throws DriverIOException
68
         */
69
        public static FLayer createLayer(String layerName, String driverName,
70
                File f, IProjection proj) throws DriverException, DriverIOException {
71
                //Se obtiene el driver que lee
72
                DriverManager dm = getDM();
73

    
74
                try {
75
                        Driver d = dm.getDriver(driverName);
76

    
77
                        if (d instanceof VectorialFileDriver) {
78
                                return createLayer(layerName, (VectorialFileDriver) d, f, proj);
79
                        } else if (d instanceof RasterDriver) {
80
                                return createLayer(layerName, (RasterDriver) d, f, proj);
81
                        }
82
                } catch (DriverLoadException e) {
83
                        throw new DriverException(e);
84
                }
85

    
86
                return null;
87
        }
88

    
89
        /**
90
         * Crea un RandomVectorialFile con el driver que se le pasa como par?metro
91
         * y guard?ndose el nombre del fichero para realizar los accesos, la capa
92
         * tendr? asociada la proyecci?n que se pasa como parametro tambi?n
93
         *
94
         * @param layerName Nombre del Layer.
95
         * @param d VectorialAdapter.
96
         * @param f Fichero.
97
         * @param proj Proyecci?n.
98
         *
99
         * @return FLayer creado.
100
         *
101
         * @throws DriverException
102
         */
103
        public static FLayer createLayer(String layerName, VectorialFileDriver d,
104
                File f, IProjection proj) throws DriverException {
105
                //TODO Comprobar si hay un adaptador ya
106
                VectorialFileAdapter adapter = new VectorialFileAdapter(f);
107
                adapter.setDriver((VectorialDriver) d);
108

    
109
                FLyrVect capa = new FLyrVect();
110
                capa.setName(layerName);
111

    
112
                //TODO Meter esto dentro de la comprobaci?n de si hay memoria
113
                if (false) {
114
                } else {
115
                        capa.setSource(adapter);
116
                        capa.setProjection(proj);
117
                }
118

    
119
                try {
120
                        // Le asignamos tambi?n una legenda por defecto acorde con
121
                        // el tipo de shape que tenga. Tampoco s? si es aqu? el
122
                        // sitio adecuado, pero en fin....
123
                        if (d instanceof WithDefaultLegend) {
124
                                WithDefaultLegend aux = (WithDefaultLegend) d;
125
                                adapter.start();
126
                                capa.setLegend((VectorialLegend) aux.getDefaultLegend());
127
                                adapter.stop();
128
                        } else {
129
                                capa.setLegend(LegendFactory.createSingleSymbolLegend(
130
                                                capa.getShapeType()));
131
                        }
132
                } catch (FieldNotFoundException e) {
133
                        //Esta no puede saltar
134
                } catch (DriverIOException e) {
135
                        throw new DriverException(e);
136
                }
137

    
138
                return capa;
139
        }
140

    
141
        /**
142
         * Crea una capa WMS con el driver que se le pasa como par?metro y
143
         * guard?ndose el nombre del fichero para realizar los accesos, la capa
144
         * tendr? asociada la proyecci?n que se pasa como parametro tambi?n
145
         *
146
         * @param layerName Nombre de la capa.
147
         * @param rect extent
148
         * @param host URL.
149
         * @param format Formato
150
         * @param query Consulta.
151
         * @param infoQuery inforamci?n de la consulta.
152
         * @param srs SRS.
153
         *
154
         * @return Capa creada.
155
         */
156
        public static FLayer createLayer(String layerName, Rectangle2D rect,
157
                URL host, String format, String query, String infoQuery, String srs) {
158
                FLyrWMS layer = new FLyrWMS();
159
                layer.setHost(host);
160
                layer.setFullExtent(rect);
161
                layer.setFormat(format);
162
                layer.setLayerQuery(query);
163
                layer.setInfoLayerQuery(infoQuery);
164
                layer.setSRS(srs);
165
                layer.setName(layerName);
166

    
167
                return layer;
168
        }
169

    
170
        /**
171
         * Crea una capa Raster a partir del nombre driver, fichero y proyecci?n.
172
         *
173
         * @param layerName Nombre de la capa.
174
         * @param d RasterDriver.
175
         * @param f Fichero.
176
         * @param proj Proyecci?n.
177
         *
178
         * @return Nueva capa de tipo raster.
179
         *
180
         * @throws DriverIOException
181
         */
182
        public static FLyrRaster createLayer(String layerName, RasterDriver d,
183
                File f, IProjection proj) throws DriverIOException {
184
                RasterAdapter adapter = new RasterFileAdapter(f);
185
                adapter.setDriver(d);
186

    
187
                FLyrRaster capa = new FLyrRaster();
188
                capa.setName(layerName);
189

    
190
                //TODO Meter esto dentro de la comprobaci?n de si hay memoria
191
                if (false) {
192
                } else {
193
                        capa.setSource(adapter);
194
                        capa.setProjection(proj);
195
                        capa.load();
196
                }
197

    
198
                return capa;
199
        }
200

    
201
        /**
202
         * Crea un RandomVectorialWFS con el driver que se le pasa como par?metro y
203
         * guard?ndose la URL del servidor que se pasa como par?metro
204
         *
205
         * @param driver Driver WFS.
206
         * @param host URL.
207
         * @param proj Proyecci?n.
208
         *
209
         * @return Capa creada.
210
         *
211
         * @throws UnsupportedOperationException
212
         */
213
        public static FLayer createLayer(WFSDriver driver, URL host,
214
                IProjection proj) {
215
                throw new UnsupportedOperationException();
216
        }
217

    
218
        /**
219
         * Crea un RandomVectorialWFS con el driver que se le pasa como par?metro y
220
         * guard?ndose la URL del servidor que se pasa como par?metro
221
         *
222
         * @param driver
223
         * @param host
224
         * @param port
225
         * @param user
226
         * @param password
227
         * @param dbName
228
         * @param tableName
229
         * @param proj
230
         *
231
         * @return Capa creada.
232
         *
233
         * @throws UnsupportedOperationException
234
         */
235
        public static FLayer createLayer(VectorialDatabaseDriver driver,
236
                String host, int port, String user, String password, String dbName,
237
                String tableName, IProjection proj) {
238
                throw new UnsupportedOperationException();
239
        }
240

    
241
        /**
242
         * Obtiene el adaptador de un driver si ya se ha a?adido el origen de datos
243
         * o null si es un origen de datos nuevo
244
         *
245
         * @param source Adaptador.
246
         */
247
        private static void getAdapter(Source source) {
248
        }
249

    
250
        /**
251
         * Registra la asociaci?n entre la fuente de datos que se pasa como
252
         * par?metro y el VectorialAdapter que se pasa como par?metro, para
253
         * satisfacer futuras llamadas a getAdapter
254
         *
255
         * @param s Adaptador
256
         * @param a VectorialAdapter.
257
         */
258
        private static void saveSourceAdapter(Source s, VectorialAdapter a) {
259
        }
260

    
261
        /**
262
         * Crea una FLyrComplexRaster que ataca al driver que se pasa como
263
         * par?metro.
264
         *
265
         * @param driver
266
         * @param f
267
         * @param proj
268
         *
269
         * @throws IllegalArgumentException Si se pasa un driver que no implementa
270
         *                    GeorreferencedRasterDriver o NotGeorreferencedRasterDriver
271
         */
272
        public static void createLayer(RasterDriver driver, File f, IProjection proj)
273
                throws IllegalArgumentException {
274
        }
275

    
276
        /**
277
         * Devuelve el DriverManager.
278
         *
279
         * @return DriverManager.
280
         */
281
        public static DriverManager getDM() {
282
                if (driverManager == null) {
283
                        initializeDriverManager();
284
                }
285

    
286
                return driverManager;
287
        }
288

    
289
        /**
290
         * Inicializa el DriverManager.
291
         */
292
        private static void initializeDriverManager() {
293
                if (driverManager == null) {
294
                        driverManager = new DriverManager();
295
                        driverManager.loadDrivers(new File(LayerFactory.driversPath));
296

    
297
                        Throwable[] failures = driverManager.getLoadFailures();
298

    
299
                        for (int i = 0; i < failures.length; i++) {
300
                                logger.error(failures[i]);
301
                        }
302

    
303
                        DataSourceFactory.setDriverManager(driverManager);
304
                }
305
        }
306

    
307
        /**
308
         * sets drivers Directory
309
         *
310
         * @param path
311
         */
312
        public static void setDriversPath(String path) {
313
                LayerFactory.driversPath = path;
314
                initializeDriverManager();
315
        }
316
}