Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extPublish / src / com / iver / cit / gvsig / publish / servers / mapserver / MapServerPublishControler.java @ 10626

History | View | Annotate | Download (15 KB)

1
package com.iver.cit.gvsig.publish.servers.mapserver;
2

    
3
/* gvSIG. Sistema de Informaci�n Geogr�fica de la Generalitat Valenciana
4
 *
5
 * Copyright (C) 2004 IVER T.I. and Generalitat Valenciana.
6
 *
7
 * This program is free software; you can redistribute it and/or
8
 * modify it under the terms of the GNU General Public License
9
 * as published by the Free Software Foundation; either version 2
10
 * of the License, or (at your option) any later version.
11
 *
12
 * This program is distributed in the hope that it will be useful,
13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 * GNU General Public License for more details.
16
 *
17
 * You should have received a copy of the GNU General Public License
18
 * along with this program; if not, write to the Free Software
19
 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307,USA.
20
 *
21
 * For more information, contact:
22
 *
23
 *  Generalitat Valenciana
24
 *   Conselleria d'Infraestructures i Transport
25
 *   Av. Blasco Ib��ez, 50
26
 *   46010 VALENCIA
27
 *   SPAIN
28
 *
29
 *      +34 963862235
30
 *   gvsig@gva.es
31
 *      www.gvsig.gva.es
32
 *
33
 *    or
34
 *
35
 *   IVER T.I. S.A
36
 *   Salamanca 50
37
 *   46005 Valencia
38
 *   Spain
39
 *
40
 *   +34 963163400
41
 *   dac@iver.es
42
 */
43
import java.awt.geom.Rectangle2D;
44
import java.io.BufferedReader;
45
import java.io.File;
46
import java.io.IOException;
47
import java.io.InputStream;
48
import java.io.InputStreamReader;
49
import java.util.ArrayList;
50
import java.util.Hashtable;
51
import java.util.Iterator;
52
import java.util.SortedSet;
53
import java.util.TreeSet;
54

    
55
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.CRS;
56
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.ConfigFile;
57
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.MapLayer;
58
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.MetadataWeb;
59
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.OutputFormat;
60
import org.gvsig.remoteservices.conf.mapserver.MapServerConfiguration.WebMap;
61
import org.gvsig.remoteservices.conf.mapserver.test.AddFieldToDBF;
62

    
63
import com.iver.cit.gvsig.exceptions.layers.DriverLayerException;
64
import com.iver.cit.gvsig.exceptions.layers.FileLayerException;
65
import com.iver.cit.gvsig.exceptions.layers.LegendLayerException;
66
import com.iver.cit.gvsig.exceptions.layers.LoadLayerException;
67
import com.iver.cit.gvsig.exceptions.layers.NameLayerException;
68
import com.iver.cit.gvsig.exceptions.layers.ProjectionLayerException;
69
import com.iver.cit.gvsig.exceptions.layers.TypeLayerException;
70
import com.iver.cit.gvsig.exceptions.layers.XMLLayerException;
71
import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
72
import com.iver.cit.gvsig.fmap.layers.FLayer;
73
import com.iver.cit.gvsig.fmap.layers.FLayers;
74
import com.iver.cit.gvsig.fmap.layers.FLyrRaster;
75
import com.iver.cit.gvsig.publish.layers.LayerLoader;
76
import com.iver.cit.gvsig.publish.layers.ParamsPostGisLayerException;
77
import com.iver.cit.gvsig.publish.model.LayerInfo;
78
import com.iver.cit.gvsig.publish.model.LayerInfoFactory;
79
import com.iver.cit.gvsig.publish.model.ServiceInfo;
80
import com.iver.cit.gvsig.publish.model.ServiceInfoFactory;
81
import com.iver.cit.gvsig.publish.persistence.PublishPersistence;
82
import com.iver.cit.gvsig.publish.servers.GenericServer;
83
import com.iver.cit.gvsig.publish.servers.PublishControler;
84
import com.iver.utiles.StringUtilities;
85
import com.iver.utiles.swing.jcomboServer.ServerData;
86

    
87
/**
88
 * This class implements the mapserver publication. It has to
89
 * retrieve the current layers from gvSIG and create the
90
 * map file
91
 *
92
 * @author jvhigon
93
 *
94
 */
95
public class MapServerPublishControler extends PublishControler{
96
        private String dataPath = null; //"C:/ms4w/test/";
97
        private String fileIndex = null; //indexDir + "index.shp";
98
        private ConfigFile map = null;
99
        private String mapFile = null;
100
        //private String dirIndex = "/home/knoppix"; // CHANGE THIS !!: we'll use the same as the mapFile!!
101
        /**
102
         * Constructor
103
         */
104
        public MapServerPublishControler(String service) {
105
                super(service);
106
        }
107

    
108
        /*
109
         *  (non-Javadoc)
110
         * @see com.iver.cit.gvsig.publish.servers.PublishControler#publish(com.iver.utiles.swing.jcomboServer.ServerData)
111
         */
112
        public Object publish(ServerData serverData) {
113
                return publish(serverData.getServerAddress(),
114
                        serverData.getProperty(GenericServer.GENERIC_SERVER_PATH),
115
                        serverData.getProperty(MapServer.WMS_MAPFILE),
116
                        serverData.getProperty(MapServer.WMS_SYMBOLS),
117
                        serverData.getProperty(MapServer.WMS_FONTS),
118
                        serverData.getProperty(MapServer.WMS_IMAGEURL),
119
                        serverData.getProperty(MapServer.WMS_IMAGEPATH));
120
        }
121

    
122
        /**
123
         *
124
         * @param url
125
         * @param path
126
         * @param mapFile
127
         * @param symbolsFile
128
         * @param fontsFile
129
         * @param ImageURL
130
         * @param imagePath
131
         * @throws LayerException
132
         * @throws LayerException
133
         */
134
        private ConfigFile publish(String onlineResource, String path, String mapFile,
135
                        String symbolsFile, String fontsFile, String ImageURL,
136
                        String imagePath) {
137
                dataPath = path;
138
                this.mapFile = mapFile;
139

    
140
                map = getConfigFile(dataPath);
141
                map.www = getWebMapVect(onlineResource,imagePath,ImageURL);
142
                OutputFormat o = new OutputFormat("GEOTIFFINT16","GDAL/GTiff","INT16","tif");
143
                map.add(o);
144
                o = new OutputFormat("IMG","GDAL/HFA","BYTE","img");
145
                map.add(o);
146
                o = new OutputFormat("GEOTIFF","GDAL/GTiff","BYTE","tif");
147
                map.add(o);
148

    
149
                for (int i = 0; i < getLayers().getLayersCount(); i++) {
150
                        FLayer lyr = getLayers().getLayer(i);
151
                        if (lyr.isVisible()){
152
                                try{
153
                                        if (lyr instanceof FLayers){
154
                                                ArrayList layers = publishGroupLayer(map,(FLayers)lyr);
155
                                                for (int j=0 ; j<layers.size() ; j++){
156
                                                        MapLayer mapLayer = (MapLayer)layers.get(j);
157
                                                        if (mapLayer != null){
158
                                                                map.add(mapLayer);
159
                                                        }
160
                                                }
161
                                        }else{
162
                                                MapLayer mapLayer = publishSimpleLayer(lyr);
163
                                                if (mapLayer != null){
164
                                                        map.add(mapLayer);
165
                                                }
166
                                        }
167
                                }catch(NameLayerException e){
168
                                        e.printStackTrace();
169
                                }catch(DriverLayerException e){
170
                                        e.printStackTrace();
171
                                }catch(FileLayerException e){
172
                                        e.printStackTrace();
173
                                }catch(LegendLayerException e){
174
                                        e.printStackTrace();
175
                                }catch(ParamsPostGisLayerException e){
176
                                        e.printStackTrace();
177
                                }catch(ProjectionLayerException e){
178
                                        e.printStackTrace();
179
                                }catch(TypeLayerException e){
180
                                        e.printStackTrace();
181
                                }catch(XMLLayerException e){
182
                                        e.printStackTrace();
183
                                }catch(LoadLayerException e){
184
                                        e.printStackTrace();
185
                                }
186
                        }
187
                }
188
                return map;
189
        }
190

    
191
        private MapLayer publishSimpleLayer(FLayer layer) throws LoadLayerException{
192
                MapLayer mapLayer = new MapServerLayerFactory().getMapLayer(layer,getService());
193
                if (mapLayer != null){
194
                        if (getService().compareTo(ServerData.SERVER_TYPE_WMS) == 0){
195
                                mapLayer.metadata.setServiceAsWMS();
196
                        } else if(getService().compareTo(ServerData.SERVER_TYPE_WFS) == 0){
197
                                mapLayer.metadata.setServiceAsWFS();
198
                                mapLayer.metadata.gml_include_items = "all";
199
                                mapLayer.setDump(true);
200
                                mapLayer.classList = new ArrayList();
201
                        } else if(getService().compareTo(ServerData.SERVER_TYPE_WCS) == 0){
202
                                mapLayer.metadata.setServiceAsWCS();
203
                                mapLayer.setDump(true);
204
                        }
205
                }
206
                return mapLayer;
207
        }
208

    
209
        private ArrayList publishGroupLayer(ConfigFile config,FLayers layers) throws LoadLayerException{
210
                ArrayList mapLayers = new ArrayList();
211
                if (layers.getName().startsWith("[")){
212
                        if (layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_TIME)){
213
                                mapLayers.add(publishTimeLayer(config,layers));
214
                        }else if(layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_MOSAIC)){
215
                                mapLayers.add(publishMosaicLayer(config,layers));
216
                        }
217
                else{
218
                                for (int i=0 ; i<layers.getLayersCount() ; i++){
219
                                        mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
220
                                }
221
                        }
222
                }else{
223
                        for (int i=0 ; i<layers.getLayersCount() ; i++){
224
                                mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
225
                        }
226
                }
227
                return mapLayers;
228
        }
229

    
230

    
231
        private MapLayer publishMosaicLayer(ConfigFile config,FLayers layers) throws LoadLayerException{
232
                fileIndex = layers.getName().split("]")[1] + "_index.shp";
233
                MapLayer mapLayer = publishSimpleLayer(layers.getLayer(0));
234
                String[] sFiles = new String[layers.getLayersCount()];
235
                for (int i=0 ; i<sFiles.length ; i++){
236
                        sFiles[i] = getRasterFile(layers.getLayer(i));
237
                }
238

    
239
                mapLayer.name = layers.getName().split("]")[1];
240
                mapLayer.tileIndex = fileIndex;
241
                mapLayer.tileItem = "location";
242
                //mapLayer.data = layers.getName().split("]")[1];
243
                mapLayer.data=null;
244
                mapLayer.metadata.title = mapLayer.name;
245
                Rectangle2D extent = map.extent;
246
                /*try {
247
                        extent = layers.getFullExtent();
248
                } catch (DriverException e) {
249
                        throw new LayerException(LayerException.EXC_NO_DETECTED_EXTENT,e.getMessage());
250
                }*/
251
                mapLayer.metadata.setExtent(extent);
252
                //We'll write on the same directory as mapfile
253

    
254
                generateIndex(dataPath + "/" + fileIndex,sFiles,null);
255
                return mapLayer;
256
        }
257

    
258
        private MapLayer publishTimeLayer(ConfigFile config,FLayers layers) throws LoadLayerException{
259
                fileIndex = layers.getName().split("]")[1] + "_index.shp";
260
                MapLayer mapLayer = publishSimpleLayer(layers.getLayer(0));
261

    
262
                SortedSet times = new TreeSet();
263
                Hashtable files = new Hashtable();
264
                times.add(getTime(layers.getLayer(0).getName()));
265
                files.put(getTime(layers.getLayer(0).getName()),getRasterFile(layers.getLayer(0)));
266
                for (int i = 1; i < layers.getLayersCount(); i++) {
267
                        times.add(getTime(layers.getLayer(i).getName()));
268
                        files.put(getTime(layers.getLayer(i).getName()),getRasterFile(layers.getLayer(i)));
269
                }
270
                //Recuperar los files y los times en orden:
271
                Iterator it = times.iterator();
272
                String[] sFiles = new String[times.size()];
273
                String[] sTimes = new String[times.size()];
274
            int i = 0;
275
            String timeExtent = "";
276
                while (it.hasNext()) {
277
                        sTimes[i] = (String)it.next();
278
                        sFiles[i] = (String)files.get(sTimes[i]);
279
                timeExtent = timeExtent + sTimes[i];
280
                if (i < sTimes.length - 1){
281
                        timeExtent = timeExtent + ",";
282
                }
283
                i++;
284
            }
285
                String sOptions = layers.getName().split("]")[0];
286
                String[] options = sOptions.split(",");
287
                mapLayer.name = layers.getName().split("]")[1];
288
                config.www.metadata.timeFormat = options[1];
289
                mapLayer.tileIndex = fileIndex;
290
                mapLayer.tileItem = "location";
291
                //mapLayer.data = layers.getName().split("]")[1];
292
                mapLayer.data=null;
293
                mapLayer.metadata.title = mapLayer.name;
294
                mapLayer.metadata.timeDefault = options[2];
295
                mapLayer.metadata.timeExtent = timeExtent;
296
                mapLayer.metadata.timeItem = "date";
297
                generateIndex(dataPath + "/" + fileIndex,sFiles,sTimes);
298
                return mapLayer;
299
        }
300

    
301

    
302

    
303
        private String getRasterFile(FLayer layer){
304
                RasterDriver driver = ((RasterDriver)((FLyrRaster)layer).getSource().getDriver());
305
                return driver.getFiles()[0].getName();
306
        }
307

    
308
        private void generateIndex(String fileIndex,String[] fNames, String[] times){
309
                String cmd = getGDalPath() + "gdaltindex";
310
                String params =  fileIndex;
311
                for (int i=0; i<fNames.length; i++)
312
                        params += " "+fNames[i];
313
                System.out.println("Generating index.shp ...");
314
                try {
315
                        deleteIndexFile(fileIndex);
316
                        System.out.println(cmd+" "+params);
317
                        Process p = Runtime.getRuntime().exec(cmd+" "+params);
318
                        p.waitFor();
319
                        InputStream is = p.getErrorStream();
320
                        BufferedReader br = new BufferedReader (new InputStreamReader(is));
321
                        String aux = br.readLine();
322
                        while (aux!=null){
323
                                System.out.println(aux);
324
                                aux = br.readLine();
325
                        }
326
                } catch (IOException e) {
327
                        // TODO Auto-generated catch block
328
                        e.printStackTrace();
329
                }catch (InterruptedException ex){
330
                        ex.printStackTrace();
331
                }
332
                if (times != null){
333
                        try {
334
                                Thread.sleep(500);
335
                        } catch (InterruptedException e) {
336
                                // TODO Auto-generated catch block
337
                                e.printStackTrace();
338
                        }
339
                        AddFieldToDBF dbfFile = new AddFieldToDBF();
340
                        String dbfFileName = fileIndex.substring(0,fileIndex.length()-4)+".dbf";
341
                        dbfFile.add(dbfFileName, "date", times);
342
                }
343
                System.out.println("done.");
344
        }
345

    
346
        private void deleteIndexFile(String fileIndex) {
347
                File f = new File(fileIndex);
348
                if (f.exists()) {
349
                        String root = fileIndex.substring(0,fileIndex.length()-4);
350
                        String [] exts = {"shp", "dbf", "shx"};
351
                        for (int i=0; i<exts.length; i++) {
352
                                f = new File(root+"."+exts[i]);
353
                                f.delete();
354
                        }
355
                }
356
        }
357

    
358
        private String getTime(String layerName){
359
                String time = layerName.split("]")[0];
360
                return StringUtilities.replace(time,"[","");
361
        }
362

    
363
        private ConfigFile getConfigFile(String path){
364
                ConfigFile map = new ConfigFile();
365
                map.mapName = "TEST_MAPSERVER";
366
                map.mapStatus = "ON";
367
                map.mapUnits = "METERS";
368
                map.mapShapePath = path;
369
                map.mapcrs = new CRS(getMapCtrl().getMapContext().getViewPort()
370
                                .getProjection().getAbrev(), true);
371
                map.setExtent(getMapCtrl().getMapContext().getViewPort().getAdjustedExtent());
372
                return map;
373
        }
374

    
375
        private WebMap getWebMapVect(String onlineResource,
376
                        String imagePath,
377
                        String imageURL){
378
                WebMap webMap = new WebMap();
379
                webMap.imagepath = imagePath;
380
                webMap.imageurl = imageURL;
381
                webMap.metadata = new MetadataWeb();
382
                webMap.metadata.crs = new CRS(getMapCtrl().getMapContext().getViewPort()
383
                                .getProjection().getAbrev(), false);
384
                webMap.metadata.title = "Published Layers";
385
                webMap.metadata.onlineresource = onlineResource;
386
                if (getService().compareTo(ServerData.SERVER_TYPE_WMS) == 0){
387
                        webMap.metadata.setServiceAsWMS();
388
                } else if(getService().compareTo(ServerData.SERVER_TYPE_WFS) == 0){
389
                        webMap.metadata.setServiceAsWFS();
390
                } else if(getService().compareTo(ServerData.SERVER_TYPE_WCS) == 0){
391
                        webMap.metadata.setServiceAsWCS();
392
                }
393
                return webMap;
394
        }
395

    
396
        private String getGDalPath(){
397
                PublishPersistence persistence = new PublishPersistence(this);
398
                return persistence.getGdalPath();
399
        }
400

    
401
        /*
402
         *  (non-Javadoc)
403
         * @see com.iver.cit.gvsig.publish.servers.PublishControler#getServiceInfo()
404
         */
405
        public ServiceInfo getServiceInfo() {
406
                if (serviceInfo == null) {
407
                        serviceInfo = ServiceInfoFactory.createServiceInfo(getService());
408
                        serviceInfo.setOws_name(map.mapName);
409
                        serviceInfo.setOws_SRS(map.www.metadata.crs.getCrs());
410
                        serviceInfo.setOws_extent(map.extent);
411
                        for (int i=0 ; i<map.layersCnt() ; i++){
412
                                MapLayer layer = map.getLayer(i);
413
                                LayerInfo layerInfo = LayerInfoFactory.createLayerInfo(getService());
414
                                layerInfo.setName(layer.name);
415
                                layerInfo.setTitle(layer.getTitle());
416
                                layerInfo.setSrs(layer.crs.getCrs());
417
                                layerInfo.setExtent(layer.metadata.extent);
418
                                serviceInfo.addLayer(layerInfo);
419
                        }
420
                }
421
                return serviceInfo;
422
        }
423

    
424
        /*
425
         *  (non-Javadoc)
426
         * @see com.iver.cit.gvsig.publish.servers.PublishControler#writeFile()
427
         */
428
        public void writeFile() {
429
                map.extent = serviceInfo.getOws_extent();
430
                map.www.metadata.crs.setCrs(serviceInfo.getOws_SRS());
431
                map.www.metadata.title = serviceInfo.getOws_title();
432
                map.www.metadata.abstrac = serviceInfo.getOws_abstract();
433
                for (int i=0 ; i<serviceInfo.getLayerList().size() ; i++){
434
                        LayerInfo layerInfo = serviceInfo.getLayer(i);
435
                        MapLayer layer = map.getLayer(i);
436
                        layer.name = layerInfo.getName();
437
                        layer.metadata.name = layerInfo.getName();
438
                        layer.metadata.title = layerInfo.getTitle();
439
                        layer.metadata.abstrac = layerInfo.getAbstrac();
440
                        layer.metadata.extent = layerInfo.getExtent();
441
                        layer.crs.setCrs(layerInfo.getSrs());
442
                }
443
                map.generate(mapFile);
444
        }
445

    
446
}
447