Statistics
| Revision:

root / trunk / extensions / extCAD / src / com / iver / cit / gvsig / SaveAs.java @ 4850

History | View | Annotate | Download (7.45 KB)

1
package com.iver.cit.gvsig;
2

    
3
import java.awt.Component;
4
import java.io.File;
5
import java.sql.Connection;
6
import java.sql.DriverManager;
7
import java.sql.SQLException;
8

    
9
import javax.swing.JFileChooser;
10
import javax.swing.JOptionPane;
11

    
12
import com.hardcode.driverManager.DriverLoadException;
13
import com.iver.andami.PluginServices;
14
import com.iver.andami.messages.NotificationManager;
15
import com.iver.andami.plugins.Extension;
16
import com.iver.cit.gvsig.fmap.DriverException;
17
import com.iver.cit.gvsig.fmap.FMap;
18
import com.iver.cit.gvsig.fmap.core.IFeature;
19
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
20
import com.iver.cit.gvsig.fmap.drivers.DriverIOException;
21
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
22
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
23
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
24
import com.iver.cit.gvsig.fmap.edition.DefaultRowEdited;
25
import com.iver.cit.gvsig.fmap.edition.EditionException;
26
import com.iver.cit.gvsig.fmap.edition.IWriter;
27
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
28
import com.iver.cit.gvsig.fmap.layers.FBitSet;
29
import com.iver.cit.gvsig.fmap.layers.FLayer;
30
import com.iver.cit.gvsig.fmap.layers.FLayers;
31
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
32
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
33
import com.iver.cit.gvsig.fmap.layers.ReadableVectorial;
34
import com.iver.cit.gvsig.fmap.layers.SelectableDataSource;
35
import com.iver.cit.gvsig.gui.View;
36
import com.iver.cit.gvsig.jdbc_spatial.DlgConnection;
37
import com.iver.cit.gvsig.jdbc_spatial.gui.jdbcwizard.ConnectionSettings;
38
import com.iver.cit.gvsig.project.ProjectView;
39
import com.iver.utiles.SimpleFileFilter;
40

    
41
public class SaveAs implements Extension {
42

    
43
        /**
44
         * @see com.iver.andami.plugins.Extension#inicializar()
45
         */
46
        public void inicializar() {
47
        }
48

    
49
        /**
50
         * @see com.iver.andami.plugins.Extension#execute(java.lang.String)
51
         */
52
        public void execute(String actionCommand) {
53
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
54
                                .getActiveView();
55

    
56
                if (f instanceof View) {
57
                        View vista = (View) f;
58
                        ProjectView model = vista.getModel();
59
                        FMap mapa = model.getMapContext();
60
                        FLayers layers = mapa.getLayers();
61
                        FLayer[] actives = layers.getActives();
62
                        try {
63
                                // NOTA: SI HAY UNA SELECCI?N, SOLO SE SALVAN LOS SELECCIONADOS
64
                                for (int i = 0; i < actives.length; i++) {
65
                                        if (actives[i] instanceof FLyrVect) {
66
                                                FLyrVect lv = (FLyrVect) actives[i];
67

    
68
                                                if (actionCommand.equals("SHP")) {
69

    
70
                                                        saveToShp(lv);
71
                                                }
72
                                                if (actionCommand.equals("DXF")) {
73
                                                        saveToDxf(lv);
74
                                                }
75
                                                if (actionCommand.equals("POSTGIS")) {
76
                                                        saveToPostGIS(lv);
77
                                                }
78
                                        } // actives[i]
79
                                } // for
80
                        } catch (EditionException e) {
81
                                e.printStackTrace();
82
                                NotificationManager.addError(e.getMessage(), e);
83
                        }
84

    
85
                }
86
        }
87

    
88
        public void saveToPostGIS(FLyrVect layer) throws EditionException {
89
                try {
90
                        String tableName = JOptionPane.showInputDialog(PluginServices
91
                                        .getText(this, "intro_tablename"));
92
                        if (tableName == null)
93
                                return;
94
                        DlgConnection dlg = new DlgConnection();
95
                        dlg.setModal(true);
96
                        dlg.setVisible(true);
97
                        ConnectionSettings cs = dlg.getConnSettings();
98
                        if (cs == null)
99
                                return;
100
                        Connection conex = DriverManager.getConnection(cs
101
                                        .getConnectionString(), cs.getUser(), cs.getPassw());
102

    
103
                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
104
                        dbLayerDef.setCatalogName(cs.getDb());
105
                        dbLayerDef.setTableName(tableName);
106
                        dbLayerDef.setShapeType(layer.getShapeType());
107
                        FieldDescription[] fieldsDescrip = EditionUtilities.getFieldsDescription(layer);
108
                        dbLayerDef.setFieldsDesc(fieldsDescrip);
109
                        dbLayerDef.setFieldGeometry("the_geom");
110
                        dbLayerDef.setFieldID("gid");
111

    
112
                        dbLayerDef.setWhereClause("");
113
                        String strSRID = layer.getProjection().getAbrev().substring(5);
114
                        dbLayerDef.setSRID_EPSG(strSRID);
115
                        dbLayerDef.setConnection(conex);
116

    
117
                        PostGISWriter writer = new PostGISWriter(); // (PostGISWriter)LayerFactory.getWM().getWriter("PostGIS
118
                                                                                                                // Writer");
119
                        writer.setWriteAll(true);
120
                        writer.setCreateTable(true);
121
                        writer.initialize(dbLayerDef);
122
                        writeFeatures(layer, writer);
123

    
124
                } catch (DriverException e) {
125
                        e.printStackTrace();
126
                        throw new EditionException(e);
127
                } catch (DriverLoadException e) {
128
                        throw new EditionException(e);
129
                } catch (SQLException e) {
130
                        throw new EditionException(e);
131
                } catch (DriverIOException e) {
132
                        throw new EditionException(e);
133
                }
134

    
135
        }
136

    
137
        /**
138
         * @param layer FLyrVect to obtain features. If selection, only selected features will be precessed.
139
         * @param writer (Must be already initialized)
140
         * @throws EditionException
141
         * @throws DriverException
142
         * @throws DriverIOException
143
         */
144
        public void writeFeatures(FLyrVect layer, IWriter writer) throws EditionException, DriverException, DriverIOException {
145
                ReadableVectorial va = layer.getSource();
146
                
147
                // Creamos la tabla.
148
                writer.preProcess();
149

    
150
                int rowCount;
151
                FBitSet bitSet = layer.getRecordset().getSelection(); 
152
                if (bitSet.cardinality() == 0)
153
                {
154
                        rowCount = va.getShapeCount();
155
                        for (int i = 0; i < rowCount; i++) {
156
                                IFeature feat = va.getFeature(i);
157

    
158
                                if (feat != null) {
159
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
160
                                                        DefaultRowEdited.STATUS_ADDED, i);
161
                                        writer.process(edRow);
162
                                }
163
                        }
164
                }
165
                else
166
                {
167
                        for(int i=bitSet.nextSetBit(0); i>=0; i=bitSet.nextSetBit(i+1)) {
168
                                IFeature feat = va.getFeature(i);
169

    
170
                                if (feat != null) {
171
                                        DefaultRowEdited edRow = new DefaultRowEdited(feat,
172
                                                        DefaultRowEdited.STATUS_ADDED, i);
173
                                        writer.process(edRow);
174
                                }
175
                        }
176
                        
177
                }
178

    
179
                writer.postProcess();
180
        }
181

    
182
        public void saveToDxf(FLyrVect lv) {
183
                // TODO Auto-generated method stub
184
                System.err.println("Not implemented yet");
185

    
186
        }
187

    
188
        public void saveToShp(FLyrVect layer) throws EditionException {
189
                try {
190
                        JFileChooser jfc = new JFileChooser();
191
                        SimpleFileFilter filterShp = new SimpleFileFilter("shp",
192
                                        PluginServices.getText(this, "shp_files"));
193
                        jfc.setFileFilter(filterShp);
194
                        if (jfc.showSaveDialog((Component) PluginServices.getMainFrame()) == JFileChooser.APPROVE_OPTION) {
195
                                File newFile = jfc.getSelectedFile();
196
                                String path = newFile.getAbsolutePath();
197
                                if (!(path.toLowerCase().endsWith(".shp"))) {
198
                                        path = path + ".shp";
199
                                }
200
                                newFile = new File(path);
201

    
202
                                ShpWriter writer = (ShpWriter) LayerFactory.getWM().getWriter(
203
                                                "Shape Writer");
204
                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
205
                        FieldDescription[] fieldsDescrip = EditionUtilities.getFieldsDescription(layer);
206
                        lyrDef.setFieldsDesc(fieldsDescrip);
207
                        lyrDef.setFile(newFile);
208
                        lyrDef.setName(newFile.getName());
209
                        lyrDef.setShapeType(layer.getShapeType());
210
                            writer.setFile(newFile);
211
                            writer.initialize(lyrDef);
212
                                
213
                                writeFeatures(layer, writer);
214

    
215
                        }
216
                } catch (DriverIOException e) {
217
                        e.printStackTrace();
218
                        throw new EditionException(e);
219
                } catch (DriverException e) {
220
                        e.printStackTrace();
221
                        throw new EditionException(e);
222
                }
223

    
224
        }
225

    
226
        /**
227
         * @see com.iver.andami.plugins.Extension#isEnabled()
228
         */
229
        public boolean isEnabled() {
230
                View f = (View) PluginServices.getMDIManager().getActiveView();
231

    
232
                if (f == null) {
233
                        return false;
234
                } else
235
                        return true;
236
        }
237

    
238
        /**
239
         * @see com.iver.andami.plugins.Extension#isVisible()
240
         */
241
        public boolean isVisible() {
242
                com.iver.andami.ui.mdiManager.View f = PluginServices.getMDIManager()
243
                                .getActiveView();
244

    
245
                if (f == null) {
246
                        return false;
247
                }
248

    
249
                if (f.getClass() == View.class) {
250
                        return true;
251
                } else {
252
                        return false;
253
                }
254

    
255
        }
256
}