Revision 47579 trunk/org.gvsig.desktop/org.gvsig.desktop.plugin/org.gvsig.sqlite/org.gvsig.sqlite.provider/src/main/java/org/gvsig/sqlite/dal/SQLiteExplorer.java

View differences:

SQLiteExplorer.java
1 1
package org.gvsig.sqlite.dal;
2 2

  
3 3
import java.io.File;
4
import java.sql.Connection;
5
import java.sql.SQLException;
6
import java.sql.Statement;
7
import java.util.ArrayList;
8
import java.util.List;
9
import java.util.logging.Level;
10
import java.util.logging.Logger;
4 11
import org.apache.commons.lang3.StringUtils;
12
import org.cresques.cts.IProjection;
13
import org.gvsig.fmap.dal.DALLocator;
14
import org.gvsig.fmap.dal.DataManager;
5 15
import org.gvsig.fmap.dal.DataStore;
16
import org.gvsig.fmap.dal.DataStoreParameters;
6 17
import org.gvsig.fmap.dal.NewDataStoreParameters;
7 18
import org.gvsig.fmap.dal.exception.DataException;
8 19
import org.gvsig.fmap.dal.exception.InitializeException;
20
import org.gvsig.fmap.dal.exception.RemoveException;
21
import org.gvsig.fmap.dal.feature.EditableFeatureType;
22
import org.gvsig.fmap.dal.feature.FeatureAttributeDescriptor;
23
import org.gvsig.fmap.dal.resource.exception.AccessResourceException;
9 24
import org.gvsig.fmap.dal.spi.DataServerExplorerProviderServices;
25
import org.gvsig.fmap.dal.store.jdbc.JDBCNewStoreParameters;
10 26
import org.gvsig.fmap.dal.store.jdbc.JDBCServerExplorerParameters;
27
import org.gvsig.fmap.dal.store.jdbc.JDBCStoreParameters;
28
import org.gvsig.fmap.dal.store.jdbc.exception.JDBCSQLException;
29
import org.gvsig.fmap.dal.store.jdbc2.JDBCConnection;
11 30
import org.gvsig.fmap.dal.store.jdbc2.JDBCHelper;
31
import org.gvsig.fmap.dal.store.jdbc2.JDBCUtils;
32
import org.gvsig.fmap.dal.store.jdbc2.OperationsFactory;
12 33
import org.gvsig.fmap.dal.store.jdbc2.spi.JDBCServerExplorerBase;
34
import org.gvsig.fmap.dal.store.jdbc2.spi.operations.FetchFeatureTypeOperation;
35
import org.gvsig.fmap.geom.DataTypes;
36
import org.gvsig.sqlite.dal.geopackage.GeopackageGeometryColumns;
37
import org.gvsig.sqlite.dal.geopackage.GeopackageSpatialRefSys;
38
import org.gvsig.sqlite.dal.geopackage.GeopackageUtils;
39
import org.gvsig.sqlite.dal.geopackage.index.GeopackageIndexRTree;
40
import org.gvsig.sqlite.dal.operations.SQLiteOperationsFactory;
13 41
import org.gvsig.tools.resourcesstorage.ResourcesStorage;
14 42

  
15 43
/**
......
51 79

  
52 80
    @Override
53 81
    public boolean add(String providerName, NewDataStoreParameters theParams, boolean overwrite) throws DataException {
54
        // FIXME: probablemente aqui se deberia crear la tabla gpkg_spatial_ref_sys 
55
        // si no existe y llenarla con lo que toque antes de intentar
56
        // crear la tabla que se quiere a?adir a la BBDD (de llamar a super.add).
57
        //
58
        // En geopackage la tabla gpkg_spatial_ref_sys solo tiene las entradas
59
        // correspondientes a los CRS que se usan, y no todos como en pg o h2,
60
        // asi que antes de a?adir una tabla deberiamos cerciorarnos si esta dado
61
        // de alta su CRS y si no a?adirlo.
62
        // 
63
        // Para crear la tabla usar algo como:
64
        // CREATE TABLE "gpkg_spatial_ref_sys" (
65
        //	"srs_name"	TEXT NOT NULL,
66
        //	"srs_id"	INTEGER NOT NULL,
67
        //	"organization"	TEXT NOT NULL,
68
        //	"organization_coordsys_id"	INTEGER NOT NULL,
69
        //	"definition"	TEXT NOT NULL,
70
        //	"description"	TEXT,
71
        //	PRIMARY KEY("srs_id")
72
        // );        
73
        //
74
        // Si la tabla no existe, probablemente seria interesante crear a capon
75
        // una entrada en ella con:
76
        // INSERT INTO "main"."gpkg_spatial_ref_sys" ("srs_name", "srs_id", "organization", "organization_coordsys_id", "definition", "description") VALUES ('WGS 84 geodetic', '4326', 'EPSG', '4326', 'GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]]', 'longitude/latitude coordinates in decimal degrees on the WGS 84 spheroid');
77
        // 
78
        // Para asegurarse que los test funcionen ya que la libreria de proyecciones
79
        // usada en los test no tiene la capacidad de obtener el WKT de la proyeccion.
80
        // Es probable que tambien debamos a?adir la entrada para EPSG:25830 ya 
81
        // que los tests de ARENA2 lo usan, pero no me gusta.
82
        // Igual deberiamos tener una tabla en CSV con todas las proyecciones en el 
83
        // plugin y buscar en ella para no tener que dar de alta nada a capon. Tal vez
84
        // Pillarla de la base de datos oficial de EPSG directamente.
85
        //
82
        EditableFeatureType feat = ((JDBCNewStoreParameters)theParams).getDefaultFeatureType();
83
        if(feat != null){
84
            FeatureAttributeDescriptor geomAttr = feat.getDefaultGeometryAttribute();
85
            if(geomAttr != null){
86
                IProjection proj = geomAttr.getSRS();
87
                if(proj != null){
88
                    GeopackageSpatialRefSys refSys = GeopackageUtils.getSpatialRefSys(proj);
89
                    refSys.save(this.getHelper());
90
                }
91
            }
92
        }
86 93
        return super.add(providerName, theParams, overwrite);
87 94
    }
95

  
96
    @Override
97
    public void remove(DataStoreParameters theParams) throws RemoveException {
98

  
99
        DataManager dataManager = DALLocator.getDataManager();
100
        EditableFeatureType type = dataManager.createFeatureType();
101

  
102
        OperationsFactory operations = getHelper().getOperations();
103
        OperationsFactory.TableReference table = this.getHelper().getOperations().createTableReference(((JDBCStoreParameters) theParams));
104
        FetchFeatureTypeOperation operation = operations.createFetchFeatureType(type, table, null, null, null);
105
        operation.perform();
106

  
107
        List<String> sqls = new ArrayList<>();
108
        for (FeatureAttributeDescriptor attr : type) {
109
            if (attr.getDataType().getType() == DataTypes.GEOMETRY) {
110
                GeopackageIndexRTree index = new GeopackageIndexRTree();
111
                sqls.addAll(index.getRemoveIndexSQL(table.getTable(), attr.getName()));
112
            }
113
        }
114
        JDBCConnection conn = null;
115
        Statement st = null;
116
        try {
117
            conn = this.getHelper().getConnection();
118
            st = conn.createStatement();
119
            for (String sql : sqls) {
120
                JDBCUtils.execute(st, sql);
121
            }
122
        } catch (Exception ex) {
123
            throw new RemoveException(table.getTable(), ex);
124
        } finally {
125
            JDBCUtils.closeQuietly(st);
126
//            JDBCUtils.closeQuietly(conn.get());
127
        }
128
        super.remove(theParams); //To change body of generated methods, choose Tools | Templates.
129
    }
88 130
    
131
    
132
    
133
    
89 134
}

Also available in: Unified diff