package org.gcube.application.cms.sdi.engine; import it.geosolutions.geoserver.rest.encoder.GSLayerEncoder; import it.geosolutions.geoserver.rest.encoder.feature.GSFeatureTypeEncoder; import lombok.Data; import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.bson.Document; import org.gcube.application.cms.sdi.faults.SDIInteractionException; import org.gcube.application.geoportal.common.model.profile.Profile; import org.gcube.application.geoportal.common.model.rest.DatabaseConnection; import org.gcube.application.geoportal.common.utils.Files; import java.net.MalformedURLException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; @Slf4j public class PostgisIndexer { public static void init() throws ClassNotFoundException { Class.forName("org.postgresql.Driver"); Class.forName("org.postgis.DriverWrapper"); }; @NonNull SDIManagerWrapper manager; @NonNull Profile profile; @NonNull DatabaseConnection connectionParameters; PostgisDBManagerI dbManager=null; public PostgisIndexer(SDIManagerWrapper manager, Profile profile, DatabaseConnection postgisConnection) throws SQLException { log.info("POSTGIS Index for {} Connecting to {} ",profile.getId(),postgisConnection); this.connectionParameters=postgisConnection; dbManager=new PostgisDBManager(DriverManager. getConnection(connectionParameters.getUrl(), connectionParameters.getUser(), connectionParameters.getPwd())); this.manager=manager; this.profile = profile; } PostgisTable table = null; public void initIndex(String indexName, List fields, String workspace,String storeName) throws SQLException, SDIInteractionException { log.info("Check/init index for {} ",profile.getId()); table = new PostgisTable(indexName,fields, PostgisTable.GeometryType.POINT); log.trace("Index Postgis Table is {} ",table); log.debug("Create if missing.."); // Check if table exists dbManager.create(table); log.debug("Checking/ registering index layer in GS "); manager.configureCentroidLayer(indexName,workspace,storeName,table,connectionParameters); // TODO Additional layers // Create layer // Publish cross related layers } public void insert(Document toInsertRecord)throws SDIInteractionException { log.info("Inserting {} in index {}",toInsertRecord,table.getTablename()); try { PreparedStatement ps = dbManager.prepareInsertStatement(table, false, true); table.fillObjectsPreparedStatement(toInsertRecord, ps); ps.execute(); }catch (Throwable t ){ log.error("Unable to insert {} into {} ",toInsertRecord,table.getTablename(),t); throw new SDIInteractionException("Unable to insert record in postgis index "+table.getTablename(),t); } } public void deleteByStringValue(PostgisTable.Field field, String id) throws SDIInteractionException { log.info("Deleting {}={} from index {}",field.getName(), id,table.getTablename()); try { dbManager.deleteByFieldValue(table,field,id); }catch (Throwable t ){ log.error("Unable to delete {}={} from index {}",field.getName(), id,table.getTablename(),t); throw new SDIInteractionException("Unable to delete record in postgis index "+table.getTablename(),t); } } }