Statistics
| Revision:

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

History | View | Annotate | Download (8.75 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
         * @throws DriverException
66
         *
67
         * @throws DriverException
68
         * @throws DriverIOException
69
         */
70
        public static FLayer createLayer(String layerName, String driverName,
71
                File f, IProjection proj) throws DriverException  {
72
                //Se obtiene el driver que lee
73
                DriverManager dm = getDM();
74

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

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

    
87
                return null;
88
        }
89

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

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

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

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

    
139
                return capa;
140
        }
141

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

    
168
                return layer;
169
        }
170

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

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

    
191
                //TODO Meter esto dentro de la comprobaci?n de si hay memoria
192
                if (false) {
193
                } else {
194
                        capa.setSource(adapter);
195
                        capa.setProjection(proj);
196
                        try {
197
                                capa.load();
198
                        } catch (DriverIOException e) {
199
                                throw new DriverException(e);
200
                        }
201
                }
202

    
203
                return capa;
204
        }
205

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

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

    
246
        /**
247
         * Obtiene el adaptador de un driver si ya se ha a?adido el origen de datos
248
         * o null si es un origen de datos nuevo
249
         *
250
         * @param source Adaptador.
251
         */
252
        private static void getAdapter(Source source) {
253
        }
254

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

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

    
281
        /**
282
         * Devuelve el DriverManager.
283
         *
284
         * @return DriverManager.
285
         */
286
        public static DriverManager getDM() {
287
                if (driverManager == null) {
288
                        initializeDriverManager();
289
                }
290

    
291
                return driverManager;
292
        }
293

    
294
        /**
295
         * Inicializa el DriverManager.
296
         */
297
        private static void initializeDriverManager() {
298
                if (driverManager == null) {
299
                        driverManager = new DriverManager();
300
                        driverManager.loadDrivers(new File(LayerFactory.driversPath));
301

    
302
                        Throwable[] failures = driverManager.getLoadFailures();
303

    
304
                        for (int i = 0; i < failures.length; i++) {
305
                                logger.error(failures[i]);
306
                        }
307

    
308
                        DataSourceFactory.setDriverManager(driverManager);
309
                }
310
        }
311

    
312
        /**
313
         * sets drivers Directory
314
         *
315
         * @param path
316
         */
317
        public static void setDriversPath(String path) {
318
                LayerFactory.driversPath = path;
319
                initializeDriverManager();
320
        }
321
}