ecological-engine-geospatia.../src/main/java/org/gcube/dataanalysis/geo/algorithms/ShapefilePublisher.java

205 lines
9.1 KiB
Java

package org.gcube.dataanalysis.geo.algorithms;
import java.io.File;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.List;
import java.util.UUID;
import org.gcube.dataanalysis.ecoengine.configuration.AlgorithmConfiguration;
import org.gcube.dataanalysis.ecoengine.datatypes.PrimitiveType;
import org.gcube.dataanalysis.ecoengine.datatypes.PrimitiveTypesList;
import org.gcube.dataanalysis.ecoengine.datatypes.ServiceType;
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.PrimitiveTypes;
import org.gcube.dataanalysis.ecoengine.datatypes.enumtypes.ServiceParameters;
import org.gcube.dataanalysis.ecoengine.interfaces.StandardLocalInfraAlgorithm;
import org.gcube.dataanalysis.ecoengine.utils.ZipTools;
import org.gcube.dataanalysis.geo.meta.PolyMapMetadata;
import org.gcube.dataanalysis.geo.utils.GdalConverter;
import org.gcube.dataanalysis.geo.utils.GeospatialDataPublicationLevel;
import org.gcube.spatial.data.gis.model.report.PublishResponse;
public class ShapefilePublisher extends StandardLocalInfraAlgorithm{
private static String layerTitleParam = "MapTitle";
private static String layerAbstractParam = "MapAbstract";
private static String FileParam = "ShapeFileZip";
private static String ShapeFileParam = "ShapeFileName";
private static String TopicsParam = "Topics";
private static String DBUserParam = "DBUser";
private static String DBPasswordParam = "DBPassword";
private static String DBUrlParameter = "DBUrl";
static String publicationLevel= "PublicationLevel";
@Override
public void init() throws Exception {
log("ShapefilePublisher->initialised");
}
@Override
public String getDescription() {
String description = "An algorithm to publish shapefiles under WMS and WFS standards in the e-Infrastructure. The produced WMS, WFS links are reported as output of this process. The map will be available in the VRE for consultation.";
return description;
}
//static String shapeImporting = "shp2pgsql -g the_geom -d shapefile2.shp | PGPASSWORD=d4science2 psql -h geoserver-test.d4science-ii.research-infrastructures.eu -p 5432 -U postgres timeseriesgisdb";
//static String shapeImporting = "shp2pgsql -g the_geom -d %1$s | PGPASSWORD=%2$s psql -h %3$s -p 5432 -U %4$s %5$s";
static String shapeImporting = "shp2pgsql -s 4326 -g the_geom -d %1$s public.%6$s | PGPASSWORD=%2$s psql -h %3$s -p 5432 -U %4$s %5$s";
@Override
protected void process() throws Exception {
status = 10;
//collect information
String databaseJdbc = getInputParameter(DBUrlParameter);
String databaseUser = getInputParameter(DBUserParam);
String databasePwd = getInputParameter(DBPasswordParam);
//get the shapefile and extract the zip file
String zipFile = getInputParameter(FileParam);
String shapeFileName = getInputParameter(ShapeFileParam);
String layerName = getInputParameter(layerTitleParam);
String layerAbstract = getInputParameter(layerAbstractParam);
String topics = getInputParameter(TopicsParam);
String username = getInputParameter("ServiceUserName");
String publicationLevelValue = getInputParameter(publicationLevel);
log("ShapefilePublisher->"+databasePwd);
log("ShapefilePublisher->Parameters:");
log("ShapefilePublisher->zipFile:"+zipFile);
log("ShapefilePublisher->shapeFileName:"+shapeFileName);
log("ShapefilePublisher->layerName:"+layerName);
log("ShapefilePublisher->layerAbstract:"+layerAbstract);
log("ShapefilePublisher->topics:"+topics);
log("ShapefilePublisher->databaseJdbc:"+databaseJdbc);
log("ShapefilePublisher->databaseUser:"+databaseUser);
log("ShapefilePublisher->service user name:"+username);
if (topics == null || topics.trim().length()==0)
throw new Exception("Error topics missing!");
File tempFolder = new File(config.getConfigPath(),""+UUID.randomUUID());
log("ShapefilePublisher->Creating temp folder "+tempFolder);
boolean created = tempFolder.mkdir();
log("ShapefilePublisher->Temp Folder creation check "+created);
log("ShapefilePublisher->unzipping file :"+zipFile+" in folder "+tempFolder.getAbsolutePath());
ZipTools.unZip(zipFile, tempFolder.getAbsolutePath());
// parse a string like this:
// jdbc:postgresql://geoserver-test.d4science-ii.research-infrastructures.eu:5432/timeseriesgisdb
String databaseName = databaseJdbc.substring(databaseJdbc.lastIndexOf("/")+1);
String databaseAddress = databaseJdbc.substring(databaseJdbc.indexOf("//")+2,databaseJdbc.lastIndexOf(":"));
log("ShapefilePublisher->Parsed database Info:"+databaseName+" ["+databaseAddress+"]");
String shapefile = new File (tempFolder,shapeFileName).getAbsolutePath();
log("ShapefilePublisher->Shape file to search for:"+shapefile);
String gisTableName = shapeFileName;
String gisRandomTableName = ("shp_"+UUID.randomUUID()).replace("-", "");
try{
gisTableName = shapeFileName.substring(0,shapeFileName.lastIndexOf("."));
}catch(Exception e){
throw new Exception("Error - Wrong file name "+shapeFileName);
}
log("ShapefilePublisher->Original table name :"+gisTableName);
log("ShapefilePublisher->Table name to produce :"+gisRandomTableName);
String shapeImportCommand = String.format(shapeImporting, shapefile, databasePwd, databaseAddress, databaseUser, databaseName,gisRandomTableName);
log("ShapefilePublisher->Shape file command:"+shapeImportCommand);
//run the importer
status = 50;
List<String> commandsExecuted = GdalConverter.command(shapeImportCommand, tempFolder.getAbsolutePath());
String commandExecuted = commandsExecuted.toString();
log("ShapefilePublisher->Command executed output:"+commandExecuted);
//check for the import to be success
if (!commandExecuted.contains("COMMIT")){
throw new Exception("An error occurred when importing the file "+commandExecuted);
}
log("ShapefilePublisher->Publishing the table "+gisRandomTableName);
String scope = config.getGcubeScope();
double resolution = 0;
String datastore = "timeseriesws";
String defaultStyle = "polygon";
String workspace = "aquamaps";
String purpose = "To Publish Geometric Layers for user-provided Vector Maps";
String credits = "Generated via the DataMiner Service";
String keywords = topics.replace(AlgorithmConfiguration.listSeparator, ",");
boolean isprivate = false;
if (GeospatialDataPublicationLevel.valueOf(publicationLevelValue)==GeospatialDataPublicationLevel.PRIVATE)
isprivate=true;
PublishResponse response = null;
try{
response = PolyMapMetadata.publishTable(scope, gisRandomTableName, resolution, username, layerName, defaultStyle, workspace, datastore, purpose, credits, keywords, isprivate);
}catch(Exception e){
e.printStackTrace();
log ("ShapefilePublisher->Error during table publication: "+e.getLocalizedMessage());
throw new Exception("Error during the publication of the shapefile on the SDI");
}
log("ShapefilePublisher->Finished publishing the table");
if (response == null) {
log("ShapefilePublisher->Error in generating map");
throw new Exception("Impossible to publish on GeoNetwork or GeoServer this table: " + gisRandomTableName+" possibly it is already present!");
} else {
//writing output
addOutputString("GIS map title", layerName);
addOutputString("GIS map UUID", "" + response.getPublishedMetadata().getFileIdentifier());
addOutputString("GIS Table ", gisRandomTableName);
addOutputString("Generated by ", username);
addOutputString("Resolution", "" + resolution);
addOutputString("Style", "" + defaultStyle);
addOutputString("Keyword", "" + topics);
}
log("ShapefilePublisher->Output produced:"+outputParameters);
log("ShapefilePublisher->All done!");
status = 100;
}
@Override
protected void setInputParameters() {
try {
PrimitiveType e = new PrimitiveType(Enum.class.getName(), GeospatialDataPublicationLevel.values(), PrimitiveTypes.ENUMERATED, publicationLevel, "The visibility level of the produced map",""+GeospatialDataPublicationLevel.PRIVATE);
inputs.add(e);
addStringInput(layerTitleParam, "Title of the geospatial dataset to be shown on GeoExplorer", "Generic Vector Layer");
addStringInput(ShapeFileParam, "Name of the shape file inside the zip", "shapefile.shp");
addStringInput(layerAbstractParam, "Abstract defining the content, the references and usage policies", "Abstract");
inputs.add(new PrimitiveType(File.class.getName(), null, PrimitiveTypes.FILE, FileParam, "Shapefile zip file to process"));
inputs.add(new PrimitiveTypesList(String.class.getName(), PrimitiveTypes.STRING, TopicsParam, "Topics to be attached to the published dataset. E.g. Biodiversity, D4Science, Environment, Weather", false));
inputs.add(new ServiceType(ServiceParameters.USERNAME,"ServiceUserName","The final user Name"));
addRemoteDatabaseInput("UsersGisTablesDB", DBUrlParameter,DBUserParam,DBPasswordParam, "driver", "dialect");
} catch (Throwable e) {
e.printStackTrace();
}
}
@Override
public void shutdown() {
}
}