Statistics
| Revision:

gvsig-raster / org.gvsig.raster.tools / trunk / org.gvsig.raster.tools / org.gvsig.raster.tools.app.basic / src / main / java / org / gvsig / raster / tools / app / basic / tool / saveraster / operation / SaveRasterProcess.java @ 2480

History | View | Annotate | Download (10.4 KB)

1
/* gvSIG. Geographic Information System of the Valencian Government
2
*
3
* Copyright (C) 2007-2008 Infrastructures and Transports Department
4
* of the Valencian Government (CIT)
5
* 
6
* This program is free software; you can redistribute it and/or
7
* modify it under the terms of the GNU General Public License
8
* as published by the Free Software Foundation; either version 2
9
* of the License, or (at your option) any later version.
10
* 
11
* This program is distributed in the hope that it will be useful,
12
* but WITHOUT ANY WARRANTY; without even the implied warranty of
13
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
* GNU General Public License for more details.
15
* 
16
* You should have received a copy of the GNU General Public License
17
* along with this program; if not, write to the Free Software
18
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 
19
* MA  02110-1301, USA.
20
* 
21
*/
22
package org.gvsig.raster.tools.app.basic.tool.saveraster.operation;
23

    
24
import java.awt.Component;
25
import java.awt.Dimension;
26
import java.awt.geom.AffineTransform;
27
import java.io.File;
28
import java.io.IOException;
29
import java.util.ArrayList;
30
import java.util.Date;
31

    
32
import javax.swing.JOptionPane;
33

    
34
import org.gvsig.andami.PluginServices;
35
import org.gvsig.fmap.dal.coverage.RasterLocator;
36
import org.gvsig.fmap.dal.coverage.RasterManager;
37
import org.gvsig.fmap.dal.coverage.dataset.Buffer;
38
import org.gvsig.fmap.dal.coverage.datastruct.Extent;
39
import org.gvsig.fmap.dal.coverage.datastruct.Params;
40
import org.gvsig.fmap.dal.coverage.datastruct.ViewPortData;
41
import org.gvsig.fmap.dal.coverage.exception.NotSupportedExtensionException;
42
import org.gvsig.fmap.dal.coverage.exception.ProcessInterruptedException;
43
import org.gvsig.fmap.dal.coverage.exception.RasterDriverException;
44
import org.gvsig.fmap.dal.coverage.process.TaskEventManager;
45
import org.gvsig.fmap.dal.coverage.store.DataServerWriter;
46
import org.gvsig.fmap.dal.coverage.store.RasterWriter;
47
import org.gvsig.fmap.geom.primitive.Envelope;
48
import org.gvsig.fmap.mapcontext.ViewPort;
49
import org.gvsig.fmap.mapcontext.exceptions.LoadLayerException;
50
import org.gvsig.i18n.Messages;
51
import org.gvsig.raster.fmap.layers.FLyrRaster;
52
import org.gvsig.raster.swing.RasterSwingLibrary;
53
import org.gvsig.raster.tools.app.basic.RasterToolsUtil;
54
import org.gvsig.raster.tools.app.basic.raster.process.RasterProcess;
55
import org.slf4j.Logger;
56
import org.slf4j.LoggerFactory;
57

    
58
/**
59
 * Thread que se encarga de llamar a los writer para realizar la tarea de
60
 * salvado y/p compresi?n
61
 *
62
 * @author Nacho Brodin (nachobrodin@gmail.com)
63
 */
64
public class SaveRasterProcess extends RasterProcess {
65
        private ViewPort          viewPort          = null;
66
        private Dimension         dimension         = null;
67
        private RasterizerLayer   rasterizerLayer   = null;
68
        private String            fileName          = "";
69
        private Params            writerParams      = null;
70
        private CopyDataset       jp2Copy           = null;
71
        private boolean           supportImage      = false;
72
        private ArrayList<FLyrRaster>
73
                              layers            = null;
74
        private RasterManager     rManager          = RasterLocator.getManager();
75
        private Logger            logger            = LoggerFactory.getLogger(RasterProcess.class.toString());
76
        
77
        @SuppressWarnings("unchecked")
78
        public void init() {
79
                viewPort = (ViewPort) getParam("viewport");
80
                dimension = (Dimension) getParam("dimension");
81
                rasterizerLayer = (RasterizerLayer) getParam("rasterizerlayer");
82
                fileName = getStringParam("filename");
83
                writerParams = (Params) getParam("writerparams");
84
                supportImage = getBooleanParam("remotelayers") && fileName.endsWith(".jp2");
85
                layers = (ArrayList<FLyrRaster>) getParam("layers");
86
        }
87

    
88
        /**
89
         * Procesos de escritura de una porci?n de la vista.
90
         */
91
        public void process() throws ProcessInterruptedException {
92
                TaskEventManager task = rManager.getRasterTask();
93
                if(layers != null) {
94
                        for (int i = 0; i < layers.size(); i++) 
95
                                layers.get(i).setReadingData(Thread.currentThread().getId() + "");
96
                }
97
                
98
                jp2Copy = null;
99
                long t2;
100
                long t1 = new java.util.Date().getTime();
101
                
102
                //Creamos el driver
103
                Envelope env = viewPort.getAdjustedEnvelope();
104
                Extent ex = rManager.getDataStructFactory().createExtent(env.getMinimum(0), env.getMaximum(1), env.getMaximum(0), env.getMinimum(1));
105
                Dimension imgSz = viewPort.getImageSize();
106
                ViewPortData vpData = rManager.getDataStructFactory().createViewPortData(viewPort.getProjection(), ex, imgSz );
107
                AffineTransform at = new AffineTransform(vpData.getExtent().width() / imgSz.width,
108
                                                                                                 0, 0,
109
                                                                                                 -(vpData.getExtent().height() / imgSz.height),
110
                                                                                                 vpData.getExtent().getULX(),
111
                                                                                                 vpData.getExtent().getULY());
112
                String oldFileName = fileName;
113
                if(supportImage) {
114
                        fileName = fileName.substring(0, Math.min(fileName.lastIndexOf(File.separator) + 1, fileName.length() - 1));
115
                        fileName += rManager.getFileUtils().usesOnlyLayerName() + ".tif";
116
                        writerParams = getWriterParams(fileName);
117
                }
118

    
119
                //Ejecutamos el driver con los datos pasados
120
                try {
121
                        write(fileName, at, writerParams, rasterizerLayer);
122

    
123
                        if(task.getEvent() != null)
124
                                task.manageEvent(task.getEvent());
125
                        
126
                        if(supportImage) {
127
                                try {
128
                                        insertLineLog(Messages.getText("saving_jp2"));
129
                                        jp2Copy = new CopyDataset(fileName, oldFileName, incrementableTask);
130
                                        jp2Copy.copy();
131
                                        new File(fileName).delete();
132
                                        new File(rManager.getFileUtils().getRMFNameFromFileName(fileName)).delete();
133
                                } catch (LoadLayerException e) {
134
                                } catch (org.gvsig.raster.algorithm.process.ProcessException e) {
135
                                        logger.debug(RasterLocator.getManager().getRasterUtils().getTrace(e));
136
                                        RasterSwingLibrary.messageBoxError("error_processing", this, e);
137
                                }
138
                                jp2Copy = null;
139
                        } 
140
                        t2 = new Date().getTime();
141
                        try {
142
                                saveRasterFinalize(oldFileName, (t2 - t1));
143
                        } catch(ArrayIndexOutOfBoundsException exc) {
144
                                //Si la ventana se ha cerrado ya es porque ha sido cancelada por lo que
145
                                //producir? esta excepci?n. En este caso no se lanza la ventana de informaci?n
146
                                //de finalizaci?n.
147
                        }
148

    
149
                } catch(IOException ev) {
150
                        if (incrementableTask != null) {
151
                                incrementableTask.processFinalize();
152
                                incrementableTask = null;
153
                        }
154
                        RasterSwingLibrary.messageBoxError("error_processing", this, ev);
155
                        return;
156
                } catch(OutOfMemoryError ev) {
157
                        if (incrementableTask != null) {
158
                                incrementableTask.processFinalize();
159
                                incrementableTask = null;
160
                        }
161
                        RasterSwingLibrary.messageBoxError("memoria_excedida", this, new IOException("Out of memory en salvar a raster"));
162
                } finally {
163
                        if(layers != null) {
164
                                for (int i = 0; i < layers.size(); i++) 
165
                                        layers.get(i).setReadingData(null);
166
                        }
167
                }
168
        }
169
        
170
        /**
171
         * 
172
         * @param name
173
         * @param at
174
         * @throws IOException
175
         * @throws InterruptedException
176
         */
177
        private void write(String name, AffineTransform at, Params writerParams, DataServerWriter rasterizerLayer) throws IOException, ProcessInterruptedException {
178
                TaskEventManager task = rManager.getRasterTask();
179
                RasterWriter geoRasterWriter = null;
180
                try {
181
                        //TODO: FUNCIONALIDAD: Poner los gerWriter con la proyecci?n de la vista
182
                        geoRasterWriter = rManager.createWriter(rasterizerLayer, name,
183
                                                                                                3, at, dimension.width,
184
                                                                                                dimension.height, Buffer.TYPE_IMAGE, writerParams, null);
185
                } catch (NotSupportedExtensionException e) {
186
                        RasterSwingLibrary.messageBoxError("extension_no_soportada", (Component)PluginServices.getMainFrame(), e);
187
                } catch (RasterDriverException e) {
188
                        RasterSwingLibrary.messageBoxError("no_driver_escritura", (Component)PluginServices.getMainFrame(), e);
189
                }
190
                
191
                if(task.getEvent() != null)
192
                        task.manageEvent(task.getEvent());
193
                
194
                geoRasterWriter.setCancellableRasterDriver(new ExternalCancellable(incrementableTask));
195
                geoRasterWriter.dataWrite();
196
                geoRasterWriter.writeClose();
197
        }
198
        
199
        /**
200
         * Obtiene los par?metros del driver de escritura. Si el driver no se ha creado a?n se obtienen
201
         * unos par?metros con la inicializaci?n por defecto. Si se ha creado ya y se han modificado se
202
         * devuelven los par?metros con las modificaciones. Si se cambia de driver se devolver? un WriterParams
203
         * como si fuera la primera vez que se abre.
204
         * @param name Nombre del fichero sobre el que se salva.
205
         * @return WriterParams
206
         */
207
        private Params getWriterParams(String name) {
208
                RasterWriter writer = null;
209
                String ext = rManager.getFileUtils().getExtensionFromFileName(name);
210
                try {
211
                        if(writer == null) //La primera vez que se obtiene el driver
212
                                writer = rManager.createWriter(name);
213
                        else {
214
                                String newType = rManager.getProviderServices().getWriteDriverType(ext);
215
                                String oldType = writer.getDriverName();
216
                                if(!newType.equals(oldType))  //Cambio de driver despu?s de haber seleccionado y modificado las propiedades de uno
217
                                        writer = rManager.createWriter(name);
218
                        }
219

    
220
                        if(writer == null)
221
                                JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
222

    
223
                        return writer.getParams();
224

    
225
                } catch (NotSupportedExtensionException e1) {
226
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
227
                        return null;
228
                } catch (RasterDriverException e1) {
229
                        JOptionPane.showMessageDialog((Component)PluginServices.getMainFrame(), PluginServices.getText(this, "no_driver_escritura"));
230
                        return null;
231
                }
232
        }
233

    
234
        /**
235
         * Acciones que se realizan al finalizar de salvar a raster.
236
         * @param fileName Nombre del fichero
237
         * @param milis Tiempo que ha tardado en ejecutarse
238
         */
239
        private void saveRasterFinalize(String fileName, long milis) {
240
                if (incrementableTask != null)
241
                        incrementableTask.hideWindow();
242
                externalActions.end(new Object[]{fileName, new Long(milis)});
243
        }
244

    
245
        /*
246
         * (non-Javadoc)
247
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getPercent()
248
         */
249
        public int getPercent() {
250
                if(rasterizerLayer != null)
251
                        return rasterizerLayer.getPercent();
252
                return 0;
253
        }
254

    
255
        /*
256
         * (non-Javadoc)
257
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getTitle()
258
         */
259
        public String getTitle() {
260
                if(rasterizerLayer != null)
261
                        return rasterizerLayer.getTitle();
262
                return null;
263
        }
264
        
265
        /*
266
         * (non-Javadoc)
267
         * @see org.gvsig.rastertools.RasterProcess#getLog()
268
         */
269
        public String getLog() {
270
                if(rasterizerLayer != null)
271
                        return rasterizerLayer.getLog();
272
                return null;
273
        }
274
        
275
        /*
276
         * (non-Javadoc)
277
         * @see org.gvsig.gui.beans.incrementabletask.IIncrementable#getLabel()
278
         */
279
        public String getLabel() {
280
                if(rasterizerLayer != null)
281
                        return rasterizerLayer.getLabel();
282
                return null;
283
        }
284
}