Statistics
| Revision:

svn-gvsig-desktop / trunk / extensions / extCAD / src / com / iver / cit / gvsig / gui / cad / MyFinishAction.java @ 33185

History | View | Annotate | Download (13 KB)

1
package com.iver.cit.gvsig.gui.cad;
2

    
3
import java.awt.Component;
4
import java.io.File;
5
import java.nio.charset.Charset;
6
import java.sql.ResultSet;
7
import java.sql.SQLException;
8
import java.sql.Statement;
9
import java.sql.Types;
10
import java.util.prefs.Preferences;
11

    
12
import javax.swing.JOptionPane;
13

    
14
import jwizardcomponent.FinishAction;
15
import jwizardcomponent.JWizardComponents;
16

    
17
import org.cresques.cts.IProjection;
18

    
19
import com.hardcode.driverManager.Driver;
20
import com.hardcode.gdbms.driver.exceptions.ReadDriverException;
21
import com.iver.andami.PluginServices;
22
import com.iver.andami.messages.NotificationManager;
23
import com.iver.cit.gvsig.CADExtension;
24
import com.iver.cit.gvsig.StartEditing;
25
import com.iver.cit.gvsig.exceptions.layers.StartEditionLayerException;
26
import com.iver.cit.gvsig.fmap.MapControl;
27
import com.iver.cit.gvsig.fmap.core.FShape;
28
import com.iver.cit.gvsig.fmap.core.ICanReproject;
29
import com.iver.cit.gvsig.fmap.crs.CRSFactory;
30
import com.iver.cit.gvsig.fmap.drivers.ConnectionFactory;
31
import com.iver.cit.gvsig.fmap.drivers.ConnectionJDBC;
32
import com.iver.cit.gvsig.fmap.drivers.DBLayerDefinition;
33
import com.iver.cit.gvsig.fmap.drivers.DXFLayerDefinition;
34
import com.iver.cit.gvsig.fmap.drivers.FieldDescription;
35
import com.iver.cit.gvsig.fmap.drivers.IConnection;
36
import com.iver.cit.gvsig.fmap.drivers.ITableDefinition;
37
import com.iver.cit.gvsig.fmap.drivers.IVectorialJDBCDriver;
38
import com.iver.cit.gvsig.fmap.drivers.SHPLayerDefinition;
39
import com.iver.cit.gvsig.fmap.drivers.VectorialFileDriver;
40
import com.iver.cit.gvsig.fmap.drivers.dbf.DbaseFile;
41
import com.iver.cit.gvsig.fmap.drivers.jdbc.postgis.PostGISWriter;
42
import com.iver.cit.gvsig.fmap.edition.VectorialEditableAdapter;
43
import com.iver.cit.gvsig.fmap.edition.rules.IRule;
44
import com.iver.cit.gvsig.fmap.edition.rules.RulePolygon;
45
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfFieldsMapping;
46
import com.iver.cit.gvsig.fmap.edition.writers.dxf.DxfWriter;
47
import com.iver.cit.gvsig.fmap.edition.writers.shp.ShpWriter;
48
import com.iver.cit.gvsig.fmap.layers.FLyrVect;
49
import com.iver.cit.gvsig.fmap.layers.LayerFactory;
50
import com.iver.cit.gvsig.gui.cad.panels.ChooseGeometryType;
51
import com.iver.cit.gvsig.gui.cad.panels.FileBasedPanel;
52
import com.iver.cit.gvsig.gui.cad.panels.JPanelFieldDefinition;
53
import com.iver.cit.gvsig.gui.cad.panels.PostGISpanel;
54
import com.iver.cit.gvsig.project.documents.view.gui.View;
55
import com.iver.cit.gvsig.vectorialdb.ConnectionSettings;
56

    
57
public class MyFinishAction extends FinishAction
58
{
59
        private static Preferences prefs = Preferences.userRoot().node( "gvSIG.encoding.dbf" );
60
        JWizardComponents myWizardComponents;
61
        FinishAction oldAction;
62
        ITableDefinition lyrDef = null;
63
        View view;
64
        String actionComand;
65
        public MyFinishAction(JWizardComponents wizardComponents, View view, String actionComand) {
66
                super(wizardComponents);
67
                oldAction = wizardComponents.getFinishAction();
68
                myWizardComponents = wizardComponents;
69
                this.view = view;
70
                this.actionComand = actionComand;
71
                // TODO Auto-generated constructor stub
72
        }
73

    
74
        public void performAction() {
75
                FLyrVect lyr = null;
76
                MapControl mapCtrl = view.getMapControl();
77
                try {
78
                        // ChooseWriteDriver driverPanel = (ChooseWriteDriver) myWizardComponents.getWizardPanel(0);
79
                        mapCtrl.getMapContext().beginAtomicEvent();
80
                        if (actionComand.equals("SHP"))
81
                        {
82
                                FileBasedPanel shpPanel = (FileBasedPanel) myWizardComponents.getWizardPanel(2);
83
                                String path=shpPanel.getPath();
84
                                if (!path.toLowerCase().endsWith(".shp")){
85
                                        path+=".shp";
86
                                }
87
                                File newFile = new File(path);
88
                                if( newFile.exists()){
89
                                        int resp = JOptionPane.showConfirmDialog(
90
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
91
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
92
                                        if (resp != JOptionPane.YES_OPTION) {
93
                                                return;
94
                                        }
95
                                }
96
                                ChooseGeometryType geometryTypePanel = (ChooseGeometryType) myWizardComponents.getWizardPanel(0);
97
                                JPanelFieldDefinition fieldDefinitionPanel = (JPanelFieldDefinition) myWizardComponents.getWizardPanel(1);
98

    
99

    
100
                                String layerName = geometryTypePanel.getLayerName();
101
                                String selectedDriver = geometryTypePanel.getSelectedDriver();
102
                                int geometryType = geometryTypePanel.getSelectedGeometryType();
103
                                FieldDescription[] fieldsDesc = fieldDefinitionPanel.getFieldsDescription();
104

    
105
                                Driver drv = LayerFactory.getDM().getDriver(selectedDriver);
106

    
107

    
108

    
109
                        SHPLayerDefinition lyrDef = new SHPLayerDefinition();
110
                        lyrDef.setFieldsDesc(fieldsDesc);
111
                        lyrDef.setFile(newFile);
112
                        lyrDef.setName(layerName);
113
                        lyrDef.setShapeType(geometryType);
114
                            ShpWriter writer= (ShpWriter)LayerFactory.getWM().getWriter("Shape Writer");
115
                            String charSetName = prefs.get("dbf_encoding", DbaseFile.getDefaultCharset().toString());
116
                            writer.loadDbfEncoding(newFile.getAbsolutePath(), Charset.forName(charSetName));
117
                            writer.setCharset(Charset.forName(charSetName));
118
                            writer.setFile(newFile);
119
                            writer.initialize(lyrDef);
120
                            writer.preProcess();
121
                            writer.postProcess();
122

    
123

    
124
                lyr = (FLyrVect) LayerFactory.createLayer(layerName,
125
                        (VectorialFileDriver) drv, newFile, mapCtrl.getProjection());
126

    
127
                        }
128
                        else if (actionComand.equals("DXF"))
129
                        {
130
                            FileBasedPanel dxfPanel = (FileBasedPanel) myWizardComponents.getWizardPanel(0);
131
                            String path=dxfPanel.getPath();
132
                                if (!path.toLowerCase().endsWith(".dxf")){
133
                                        path+=".dxf";
134
                                }
135
                            File newFile = new File(path);
136
                        if( newFile.exists()){
137
                                        int resp = JOptionPane.showConfirmDialog(
138
                                                        (Component) PluginServices.getMainFrame(),PluginServices.getText(this,"fichero_ya_existe_seguro_desea_guardarlo"),
139
                                                        PluginServices.getText(this,"guardar"), JOptionPane.YES_NO_OPTION);
140
                                        if (resp != JOptionPane.YES_OPTION) {
141
                                                return;
142
                                        }
143
                                }
144
                        DXFLayerDefinition lyrDef = new DXFLayerDefinition();
145
                        lyrDef.setFile(newFile);
146
                        String layerName = newFile.getName();
147
                        lyrDef.setName(layerName);
148
                            DxfWriter writer= (DxfWriter)LayerFactory.getWM().getWriter("DXF Writer");
149
                            writer.setFile(newFile);
150
                            DxfFieldsMapping fieldsMapping = new DxfFieldsMapping();
151
                            fieldsMapping.setLayerField("Layer");
152
                            fieldsMapping.setColorField("Color");
153
                            fieldsMapping.setElevationField("Elevation");
154
                            fieldsMapping.setThicknessField("Thickness");
155
                            fieldsMapping.setTextField("Text");
156
                            fieldsMapping.setHeightText("HeightText");
157
                            fieldsMapping.setRotationText("RotationText");
158
                            writer.setFieldMapping(fieldsMapping);
159
                            writer.setProjection(mapCtrl.getProjection());
160
                            writer.initialize(lyrDef);
161
                            writer.preProcess();
162
                            writer.postProcess();
163
                            Driver drv = LayerFactory.getDM().getDriver("gvSIG DXF Memory Driver");
164

    
165
                lyr = (FLyrVect) LayerFactory.createLayer(layerName,
166
                        (VectorialFileDriver) drv, newFile, mapCtrl.getProjection());
167

    
168
                        }
169
                        else if (actionComand.equals("POSTGIS"))
170
                        {
171
                                ChooseGeometryType geometryTypePanel = (ChooseGeometryType) myWizardComponents.getWizardPanel(0);
172
                                JPanelFieldDefinition fieldDefinitionPanel = (JPanelFieldDefinition) myWizardComponents.getWizardPanel(1);
173

    
174

    
175
                                String layerName = geometryTypePanel.getLayerName();
176
                                String selectedDriver = geometryTypePanel.getSelectedDriver();
177
                                int geometryType = geometryTypePanel.getSelectedGeometryType();
178
                                FieldDescription[] fieldsDesc = fieldDefinitionPanel.getFieldsDescription();
179

    
180
                                Driver drv = LayerFactory.getDM().getDriver(selectedDriver);
181

    
182
                                IVectorialJDBCDriver dbDriver = (IVectorialJDBCDriver) drv;
183
                            PostGISpanel postgisPanel = (PostGISpanel) myWizardComponents.getWizardPanel(2);
184
                                ConnectionSettings cs = postgisPanel.getConnSettings();
185
                                if (cs == null)
186
                                        return;
187
                                IConnection conex = ConnectionFactory.createConnection(cs.getConnectionString(),
188
                                                cs.getUser(), cs.getPassw());
189

    
190
                                PostGISWriter writer= new PostGISWriter(); //(PostGISWriter)LayerFactory.getWM().getWriter("PostGIS Writer");
191
                                if(!existTable(conex,cs.getSchema(), layerName)){
192
                                
193
                                        DBLayerDefinition dbLayerDef = new DBLayerDefinition();
194
                                        dbLayerDef.setCatalogName(cs.getDb());
195
                                        dbLayerDef.setSchema(cs.getSchema());
196
                                        dbLayerDef.setTableName(layerName);
197
                                        dbLayerDef.setShapeType(geometryType);
198
                                        dbLayerDef.setFieldsDesc(fieldsDesc);
199
                                        dbLayerDef.setFieldGeometry("the_geom");
200
                                        dbLayerDef.setFieldID("gid");
201
        
202
                                        dbLayerDef.setWhereClause("");
203
                                        String strSRID = mapCtrl.getProjection().getAbrev()
204
                                                        .substring(5);
205
                                        dbLayerDef.setSRID_EPSG(strSRID);
206
                                        dbLayerDef.setConnection(conex);
207
        
208
                                    
209
                                    writer.setWriteAll(true);
210
                                    writer.setCreateTable(true);
211
                                    writer.initialize(dbLayerDef);
212
        
213
                                    // Creamos la tabla.
214
                                    writer.preProcess();
215
                                    writer.postProcess();
216
        
217
                            if (dbDriver instanceof ICanReproject)
218
                            {
219
                                ((ICanReproject)dbDriver).setDestProjection(strSRID);
220
                            }
221
        
222
                            // Creamos el driver. OJO: Hay que a?adir el campo ID a la
223
                            // definici?n de campos.
224
        
225
                            boolean bFound = false;
226
                            for (int i=0; i < dbLayerDef.getFieldsDesc().length; i++)
227
                            {
228
                                    FieldDescription f = dbLayerDef.getFieldsDesc()[i];
229
                                    if (f.getFieldName().equalsIgnoreCase(dbLayerDef.getFieldID()))
230
                                    {
231
                                            bFound = true;
232
                                            break;
233
                                    }
234
                            }
235
                            // Si no est?, lo a?adimos
236
                            if (!bFound)
237
                            {
238
                                    int numFieldsAnt = dbLayerDef.getFieldsDesc().length;
239
                                    FieldDescription[] newFields = new FieldDescription[dbLayerDef.getFieldsDesc().length + 1];
240
                                for (int i=0; i < numFieldsAnt; i++)
241
                                {
242
                                        newFields[i] = dbLayerDef.getFieldsDesc()[i];
243
                                }
244
                                newFields[numFieldsAnt] = new FieldDescription();
245
                                newFields[numFieldsAnt].setFieldDecimalCount(0);
246
                                newFields[numFieldsAnt].setFieldType(Types.INTEGER);
247
                                newFields[numFieldsAnt].setFieldLength(7);
248
                                newFields[numFieldsAnt].setFieldName(dbLayerDef.getFieldID());
249
                                dbLayerDef.setFieldsDesc(newFields);
250
        
251
                            }
252
        
253
                        // all fields to lowerCase
254
                                 FieldDescription field;
255
                                 for (int i=0;i<dbLayerDef.getFieldsDesc().length;i++){
256
                                         field = dbLayerDef.getFieldsDesc()[i];
257
                                         field.setFieldName(field.getFieldName().toLowerCase());
258
                                 }
259
                                 dbLayerDef.setFieldID(dbLayerDef.getFieldID().toLowerCase());
260
                                 dbLayerDef.setFieldGeometry(dbLayerDef.getFieldGeometry().toLowerCase());
261
        
262
                            dbDriver.setData(conex, dbLayerDef);
263
                            IProjection proj = null;
264
                            if (drv instanceof ICanReproject)
265
                            {
266
                                     proj = CRSFactory.getCRS("EPSG:" + ((ICanReproject)dbDriver).getSourceProjection(null,null));
267
                            }
268
        
269
                                    lyr = (FLyrVect) LayerFactory.createDBLayer(dbDriver, layerName, proj);
270
                                    postgisPanel.saveConnectionSettings();
271
                            
272
                                }
273
                                else {
274
                                        JOptionPane.showMessageDialog(null,PluginServices.getText(this,"table_already_exists_in_database"),PluginServices.getText(this,"warning_title"),JOptionPane.WARNING_MESSAGE);
275
                                        return;
276
                                }
277

    
278
                        }
279
                        else // Si no es ni lo uno ni lo otro,
280
                        {
281

    
282

    
283
                        }
284
                } catch (Exception e) {
285
                        NotificationManager.showMessageError(e.getLocalizedMessage(),e);
286
                        return;
287
                }
288
        lyr.setVisible(true);
289

    
290
                mapCtrl.getMapContext().getLayers().addLayer(lyr);
291

    
292
                mapCtrl.getMapContext().endAtomicEvent();
293
                lyr.addLayerListener(CADExtension.getEditionManager());
294
                lyr.setActive(true);
295

    
296
                try {
297
                        lyr.setEditing(true);
298
                VectorialEditableAdapter vea = (VectorialEditableAdapter) lyr.getSource();
299
                        vea.getRules().clear();
300
                        // TODO: ESTO ES PROVISIONAL, DESCOMENTAR LUEGO
301
                        if (vea.getShapeType() == FShape.POLYGON)
302
                        {
303
                                IRule rulePol = new RulePolygon();
304
                                vea.getRules().add(rulePol);
305
                        }
306
                        StartEditing.startCommandsApplicable(view,lyr);
307
                vea.getCommandRecord().addCommandListener(mapCtrl);
308
                view.showConsole();
309

    
310
                        // Para cerrar el cuadro de di?logo.
311
                        oldAction.performAction();
312
                } catch (ReadDriverException e) {
313
                        NotificationManager.addError(e);
314
                } catch (StartEditionLayerException e) {
315
                        NotificationManager.addError(e);
316
                }
317

    
318

    
319
        }
320
        
321
        private boolean existTable(IConnection conex,String schema, String tableName) throws SQLException{
322
                
323
                Statement st = null;
324
                boolean exists =false;
325
                
326
                if (schema == null || schema.equals("")){
327
                        schema = " current_schema()::Varchar ";
328
                } else {
329
                        schema = "'" + schema + "'";
330
                }
331

    
332
                String sql = "select relname,nspname " +
333
                        "from pg_class inner join pg_namespace " +
334
                        "on relnamespace = pg_namespace.oid where "+
335
                        " relkind = 'r' and relname = '" + tableName +"' and nspname = " + schema;
336

    
337
                st = ((ConnectionJDBC)conex).getConnection().createStatement();
338
                ResultSet rs = st.executeQuery(sql);
339
                if (rs.next()){
340
                        exists = true;
341
                }
342
                rs.close();
343
                st.close();
344

    
345
                return exists;
346
        }
347

    
348
}
349