Statistics
| Revision:

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

History | View | Annotate | Download (11 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.File;
45
import java.io.IOException;
46
import java.util.ArrayList;
47
import java.util.Hashtable;
48
import java.util.Iterator;
49
import java.util.SortedSet;
50
import java.util.TreeSet;
51

    
52
import org.gvsig.remoteservices.conf.mapserver.MapServer.CRS;
53
import org.gvsig.remoteservices.conf.mapserver.MapServer.ConfigFile;
54
import org.gvsig.remoteservices.conf.mapserver.MapServer.MapLayer;
55
import org.gvsig.remoteservices.conf.mapserver.MapServer.MetadataWeb;
56
import org.gvsig.remoteservices.conf.mapserver.MapServer.WebMap;
57
import org.gvsig.remoteservices.conf.mapserver.test.AddFieldToDBF;
58

    
59
import com.iver.cit.gvsig.fmap.DriverException;
60
import com.iver.cit.gvsig.fmap.drivers.RasterDriver;
61
import com.iver.cit.gvsig.fmap.layers.FLayer;
62
import com.iver.cit.gvsig.fmap.layers.FLayers;
63
import com.iver.cit.gvsig.fmap.layers.FLyrRaster;
64
import com.iver.cit.gvsig.publish.layers.LayerException;
65
import com.iver.cit.gvsig.publish.layers.LayerLoader;
66
import com.iver.cit.gvsig.publish.servers.GenericServer;
67
import com.iver.cit.gvsig.publish.servers.PublishControler;
68
import com.iver.utiles.StringUtilities;
69
import com.iver.utiles.swing.jcomboServer.ServerData;
70

    
71
/**
72
 * This class implements the mapserver publication. It has to 
73
 * retrieve the current layers from gvSIG and create the
74
 * map file 
75
 * 
76
 * @author jvhigon
77
 * 
78
 */
79
public class MapServerPublishControler extends PublishControler{
80
        private String dataPath = null; //"C:/ms4w/test/";
81
        private String fileIndex = null; //indexDir + "index.shp";
82
        private String gdalPath = "C:/Archivos de programa/FWTools1.0.5/bin/";
83
        private String cmd = "\""+gdalPath+"gdaltindex\"";
84
        private ConfigFile map = null;
85
        /**
86
         * Constructor
87
         */
88
        public MapServerPublishControler(String service) {
89
                super(service);
90
        }
91

    
92
        /*
93
         *  (non-Javadoc)
94
         * @see com.iver.cit.gvsig.publish.servers.PublishControler#publish(com.iver.utiles.swing.jcomboServer.ServerData)
95
         */
96
        public Object publish(ServerData serverData) {
97
                return publish(serverData.getServerAddress(),
98
                                serverData.getProperty(GenericServer.GENERIC_SERVER_PATH),
99
                                serverData.getProperty(MapServer.WMS_MAPFILE),
100
                                serverData.getProperty(MapServer.WMS_SYMBOLS),
101
                                serverData.getProperty(MapServer.WMS_FONTS),
102
                                serverData.getProperty(MapServer.WMS_IMAGEURL),
103
                                serverData.getProperty(MapServer.WMS_IMAGEPATH));
104
        }
105
        
106
        /**
107
         * 
108
         * @param url
109
         * @param path
110
         * @param mapFile
111
         * @param symbolsFile
112
         * @param fontsFile
113
         * @param ImageURL
114
         * @param imagePath
115
         * @throws LayerException 
116
         * @throws LayerException 
117
         */
118
        private ConfigFile publish(String onlineResource, String path, String mapFile,
119
                        String symbolsFile, String fontsFile, String ImageURL,
120
                        String imagePath) {
121
                dataPath = path;
122
                                
123
                map = getConfigFile(dataPath);                
124
                map.www = getWebMapVect(onlineResource,imagePath,ImageURL);
125

    
126
                for (int i = 0; i < getLayers().getLayersCount(); i++) {
127
                        FLayer lyr = getLayers().getLayer(i);
128
                        if (lyr.isVisible()){
129
                                try{
130
                                        if (lyr instanceof FLayers){
131
                                                ArrayList layers = publishGroupLayer(map,(FLayers)lyr);
132
                                                for (int j=0 ; j<layers.size() ; j++){
133
                                                        MapLayer mapLayer = (MapLayer)layers.get(j);
134
                                                        if (mapLayer != null){
135
                                                                map.layers.add(mapLayer);
136
                                                        }        
137
                                                }
138
                                        }else{
139
                                                MapLayer mapLayer = publishSimpleLayer(lyr);
140
                                                if (mapLayer != null){
141
                                                        map.layers.add(mapLayer);
142
                                                }
143
                                        }
144
                                }catch(LayerException e){                                        
145
                                        
146
                                }
147
                        }
148
                } 
149
                map.generate(mapFile);
150
                return map;
151
        }        
152
        
153
        private MapLayer publishSimpleLayer(FLayer layer) throws LayerException{
154
                MapLayer mapLayer = new MapServerLayerFactory().getMapLayer(layer);
155
                if (getService().compareTo(ServerData.SERVER_TYPE_WMS) == 0){
156
                        mapLayer.metadata.setServiceAsWMS();
157
                }else if(getService().compareTo(ServerData.SERVER_TYPE_WFS) == 0){
158
                        mapLayer.metadata.setServiceAsWFS();
159
                        mapLayer.metadata.gml_include_items = "all";
160
                        mapLayer.setDump(true);
161
                        mapLayer.classList = new ArrayList();
162
                }else if(getService().compareTo(ServerData.SERVER_TYPE_WCS) == 0){
163
                        mapLayer.metadata.setServiceAsWCS();
164
                }
165
                return mapLayer;
166
        }
167
        
168
        private ArrayList publishGroupLayer(ConfigFile config,FLayers layers) throws LayerException{
169
                ArrayList mapLayers = new ArrayList();
170
                if (layers.getName().startsWith("[")){
171
                        if (layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_TIME)){
172
                                mapLayers.add(publishTimeLayer(config,layers));
173
                        }else if(layers.getName().startsWith("[" + LayerLoader.GROUP_LAYER_MOSAIC)){
174
                                mapLayers.add(publishMosaicLayer(config,layers));
175
                        }else{
176
                                for (int i=0 ; i<layers.getLayersCount() ; i++){
177
                                        mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
178
                                }
179
                        }
180
                }else{
181
                        for (int i=0 ; i<layers.getLayersCount() ; i++){
182
                                mapLayers.add(publishSimpleLayer(layers.getLayer(i)));
183
                        }
184
                }
185
                return mapLayers;
186
        }
187
        
188
        private MapLayer publishMosaicLayer(ConfigFile config,FLayers layers) throws LayerException{
189
                fileIndex = layers.getName().split("]")[1] + "_index.shp";
190
                MapLayer mapLayer = publishSimpleLayer(layers.getLayer(0));
191
                String[] sFiles = new String[layers.getLayersCount()];
192
                for (int i=0 ; i<sFiles.length ; i++){
193
                        sFiles[i] = getRasterFile(layers.getLayer(i));
194
                }
195
                
196
                mapLayer.name = layers.getName().split("]")[1];
197
                mapLayer.tileIndex = fileIndex;
198
                mapLayer.tileItem = "location";
199
                mapLayer.data = null;
200
                mapLayer.metadata.title = mapLayer.name;
201
                Rectangle2D extent = map.extent;
202
                /*try {
203
                        extent = layers.getFullExtent();
204
                } catch (DriverException e) {
205
                        throw new LayerException(LayerException.EXC_NO_DETECTED_EXTENT,e.getMessage());
206
                }*/
207
                mapLayer.metadata.setExtent(extent);
208
                generateIndex(dataPath + "/" + fileIndex,sFiles,null);
209
                return mapLayer;                
210
        }
211
        
212
        private MapLayer publishTimeLayer(ConfigFile config,FLayers layers) throws LayerException{
213
                fileIndex = layers.getName().split("]")[1] + "_index.shp";
214
                MapLayer mapLayer = publishSimpleLayer(layers.getLayer(0));
215
                
216
                SortedSet times = new TreeSet();
217
                Hashtable files = new Hashtable();
218
                times.add(getTime(layers.getLayer(0).getName()));
219
                files.put(getTime(layers.getLayer(0).getName()),getRasterFile(layers.getLayer(0)));
220
                for (int i = 1; i < layers.getLayersCount(); i++) {
221
                        times.add(getTime(layers.getLayer(i).getName()));
222
                        files.put(getTime(layers.getLayer(i).getName()),getRasterFile(layers.getLayer(i)));
223
                }                        
224
                //Recuperar los files y los times en orden:
225
                Iterator it = times.iterator();
226
                String[] sFiles = new String[times.size()];
227
                String[] sTimes = new String[times.size()];
228
            int i = 0;
229
            String timeExtent = "";
230
                while (it.hasNext()) {
231
                        sTimes[i] = (String)it.next();
232
                        sFiles[i] = (String)files.get(sTimes[i]);
233
                timeExtent = timeExtent + sTimes[i];
234
                if (i < sTimes.length - 1){
235
                        timeExtent = timeExtent + ",";
236
                }
237
                i++;
238
            }            
239
                String sOptions = layers.getName().split("]")[0];
240
                String[] options = sOptions.split(",");
241
                mapLayer.name = layers.getName().split("]")[1];
242
                config.www.metadata.timeFormat = options[1];
243
                mapLayer.tileIndex = fileIndex;
244
                mapLayer.tileItem = "location";
245
                mapLayer.data = null;
246
                mapLayer.metadata.title = mapLayer.name;
247
                mapLayer.metadata.timeDefault = options[2];
248
                mapLayer.metadata.timeExtent = timeExtent;
249
                mapLayer.metadata.timeItem = "date";        
250
                generateIndex(dataPath + "/" + fileIndex,sFiles,sTimes);
251
                return mapLayer;
252
        }
253
        
254
        
255
        
256
        private String getRasterFile(FLayer layer){
257
                RasterDriver driver = ((RasterDriver)((FLyrRaster)layer).getSource().getDriver());
258
                return driver.getFiles()[0].getName();
259
        }
260
        
261
        private void generateIndex(String fileIndex,String[] fNames, String[] times){
262
                String params =  fileIndex;
263
                for (int i=0; i<fNames.length; i++)
264
                        params += " "+fNames[i];
265
                System.out.println("Generating index.shp ...");
266
                try {
267
                        deleteIndexFile(fileIndex);
268
                        System.out.println(cmd+" "+params);
269
                        Runtime.getRuntime().exec(cmd+" "+params);
270
                } catch (IOException e) {
271
                        // TODO Auto-generated catch block
272
                        e.printStackTrace();
273
                }
274
                if (times != null){
275
                        try {
276
                                Thread.sleep(200);
277
                        } catch (InterruptedException e) {
278
                                // TODO Auto-generated catch block
279
                                e.printStackTrace();
280
                        }
281
                        AddFieldToDBF dbfFile = new AddFieldToDBF();
282
                        String dbfFileName = fileIndex.substring(0,fileIndex.length()-4)+".dbf";
283
                        dbfFile.add(dbfFileName, "date", times);
284
                }
285
                System.out.println("done.");
286
        }
287
        
288
        private void deleteIndexFile(String fileIndex) {
289
                File f = new File(fileIndex);
290
                if (f.exists()) {
291
                        String root = fileIndex.substring(0,fileIndex.length()-4);
292
                        String [] exts = {"shp", "dbf", "shx"};
293
                        for (int i=0; i<exts.length; i++) {
294
                                f = new File(root+"."+exts[i]);
295
                                f.delete();
296
                        }
297
                }
298
        }        
299
        
300
        private String getTime(String layerName){
301
                String time = layerName.split("]")[0];
302
                return StringUtilities.replace(time,"[","");
303
        }
304
        
305
        private ConfigFile getConfigFile(String path){
306
                ConfigFile map = new ConfigFile();
307
                map.mapName = "TEST_MAPSERVER";
308
                map.mapStatus = "ON";
309
                map.mapUnits = "METERS";
310
                map.mapShapePath = path;
311
                map.mapcrs = new CRS(getMapCtrl().getMapContext().getViewPort()
312
                                .getProjection().getAbrev(), true);
313
                map.setExtent(getMapCtrl().getMapContext().getViewPort().getAdjustedExtent());
314
                return map;
315
        }
316
        
317
        private WebMap getWebMapVect(String onlineResource,
318
                        String imagePath,
319
                        String imageURL){
320
                WebMap webMap = new WebMap();
321
                webMap.imagepath = imagePath;
322
                webMap.imageurl = imageURL;
323
                webMap.metadata = new MetadataWeb();
324
                webMap.metadata.crs = new CRS(getMapCtrl().getMapContext().getViewPort()
325
                                .getProjection().getAbrev(), false);
326
                webMap.metadata.title = "Published Layers";
327
                webMap.metadata.onlineresource = onlineResource;
328
                if (getService().compareTo(ServerData.SERVER_TYPE_WMS) == 0){
329
                        webMap.metadata.setServiceAsWMS();
330
                }else if(getService().compareTo(ServerData.SERVER_TYPE_WFS) == 0){
331
                        webMap.metadata.setServiceAsWFS();
332
                }else if(getService().compareTo(ServerData.SERVER_TYPE_WCS) == 0){
333
                        webMap.metadata.setServiceAsWCS();
334
                }
335
                return webMap;
336
        }
337
        
338
        
339
        
340
        
341
}
342