task_24859 #13
|
@ -31,27 +31,25 @@ import lombok.extern.slf4j.Slf4j;
|
||||||
@ToString
|
@ToString
|
||||||
public class PostgisTable {
|
public class PostgisTable {
|
||||||
|
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public static enum GeometryType{
|
public static enum GeometryType {
|
||||||
MULTIPOINT("4326","geometry (MULTIPOINT,4326)","",""),
|
MULTIPOINT("4326", "geometry (MULTIPOINT,4326)", "", ""), POINT("4326", "geometry (POINT,4326)", "", ""),
|
||||||
POINT("4326","geometry (POINT,4326)","",""),
|
LINE("4326", "geometry (MULTILINESTRING,4326)", "", ""),
|
||||||
LINE("4326","geometry (MULTILINESTRING,4326)","",""),
|
POLYGON("4326", "geometry (MULTIPOLYGON,4326)", "", "");
|
||||||
POLYGON("4326","geometry (MULTIPOLYGON,4326)","","");
|
|
||||||
private final String SRID;
|
private final String SRID;
|
||||||
private final String definition;
|
private final String definition;
|
||||||
private final String InsertWKT;
|
private final String InsertWKT;
|
||||||
private final String insertWKB;
|
private final String insertWKB;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
@Setter
|
@Setter
|
||||||
@ToString
|
@ToString
|
||||||
public static class Field{
|
public static class Field {
|
||||||
@NonNull
|
@NonNull
|
||||||
private String name;
|
private String name;
|
||||||
@NonNull
|
@NonNull
|
||||||
|
@ -59,13 +57,13 @@ public class PostgisTable {
|
||||||
private Boolean isIndexed;
|
private Boolean isIndexed;
|
||||||
private Object constantValue;
|
private Object constantValue;
|
||||||
|
|
||||||
public static final Field fromMapping(MappingObject m){
|
public static final Field fromMapping(MappingObject m) {
|
||||||
return new PostgisTable.Field(m.getName(), PostgisTable.FieldType.valueOf(m.getType()));
|
return new PostgisTable.Field(m.getName(), PostgisTable.FieldType.valueOf(m.getType()));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static final List<Field> fromMappings (Collection<MappingObject> coll){
|
public static final List<Field> fromMappings(Collection<MappingObject> coll) {
|
||||||
ArrayList<Field> toReturn = new ArrayList<>();
|
ArrayList<Field> toReturn = new ArrayList<>();
|
||||||
if(coll!=null)
|
if (coll != null)
|
||||||
coll.forEach(m -> toReturn.add(fromMapping(m)));
|
coll.forEach(m -> toReturn.add(fromMapping(m)));
|
||||||
return toReturn;
|
return toReturn;
|
||||||
}
|
}
|
||||||
|
@ -73,42 +71,40 @@ public class PostgisTable {
|
||||||
|
|
||||||
@Getter
|
@Getter
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
public enum FieldType{
|
public enum FieldType {
|
||||||
INT("int",java.sql.Types.INTEGER),
|
INT("int", java.sql.Types.INTEGER), BOOLEAN("boolean", java.sql.Types.BOOLEAN),
|
||||||
BOOLEAN("boolean", java.sql.Types.BOOLEAN),
|
TEXT("text", java.sql.Types.LONGVARCHAR), FLOAT("float", java.sql.Types.FLOAT), GEOMETRY("", 0),
|
||||||
TEXT("text",java.sql.Types.LONGVARCHAR),
|
AUTOINCREMENT("BIGSERIAL PRIMARY KEY", java.sql.Types.BIGINT);
|
||||||
FLOAT("float",java.sql.Types.FLOAT),
|
|
||||||
GEOMETRY("",0),
|
|
||||||
AUTOINCREMENT("BIGSERIAL PRIMARY KEY",java.sql.Types.BIGINT);
|
|
||||||
|
|
||||||
private String definition;
|
private String definition;
|
||||||
private int sqlType;
|
private int sqlType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@RequiredArgsConstructor
|
@RequiredArgsConstructor
|
||||||
@Getter
|
@Getter
|
||||||
@ToString
|
@ToString
|
||||||
public static class POINT{
|
public static class POINT {
|
||||||
|
|
||||||
private static Pattern pattern = Pattern.compile("(?!=\\d\\.\\d\\.)([\\d.]+)");
|
private static Pattern pattern = Pattern.compile("(?!=\\d\\.\\d\\.)([\\d.]+)");
|
||||||
|
|
||||||
public static POINT parsePOINT(String point) throws DataParsingException {
|
public static POINT parsePOINT(String point) throws DataParsingException {
|
||||||
//POINT(8.30230113965909 44.8011688237011)
|
// POINT(8.30230113965909 44.8011688237011)
|
||||||
// x,y
|
// x,y
|
||||||
try {
|
try {
|
||||||
log.debug("Parsing POINT "+point);
|
log.debug("Parsing POINT " + point);
|
||||||
Matcher m=pattern.matcher(point);
|
Matcher m = pattern.matcher(point);
|
||||||
|
|
||||||
if(!m.find()) throw new DataParsingException("Unable to get x ");
|
if (!m.find())
|
||||||
Double x=Double.parseDouble(m.group(1));
|
throw new DataParsingException("Unable to get x ");
|
||||||
|
Double x = Double.parseDouble(m.group(1));
|
||||||
|
|
||||||
if(!m.find()) throw new DataParsingException("Unable to get y ");
|
if (!m.find())
|
||||||
Double y=Double.parseDouble(m.group(1));
|
throw new DataParsingException("Unable to get y ");
|
||||||
|
Double y = Double.parseDouble(m.group(1));
|
||||||
|
|
||||||
return new POINT(x,y);
|
return new POINT(x, y);
|
||||||
}catch(Throwable t) {
|
} catch (Throwable t) {
|
||||||
throw new DataParsingException("Invalid POINT "+point,t);
|
throw new DataParsingException("Invalid POINT " + point, t);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,17 +115,16 @@ public class PostgisTable {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static final NumberFormat DECIMAL_FORMAT = NumberFormat.getInstance(Locale.US);
|
||||||
private static final NumberFormat DECIMAL_FORMAT=NumberFormat.getInstance(Locale.US);
|
|
||||||
|
|
||||||
static {
|
static {
|
||||||
((DecimalFormat) DECIMAL_FORMAT).setGroupingUsed(false);
|
((DecimalFormat) DECIMAL_FORMAT).setGroupingUsed(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getGeometryColumn() {
|
public String getGeometryColumn() {
|
||||||
for(Field f:fields)
|
for (Field f : fields)
|
||||||
if(f.getType().equals(FieldType.GEOMETRY)) return f.getName();
|
if (f.getType().equals(FieldType.GEOMETRY))
|
||||||
|
return f.getName();
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,30 +134,29 @@ public class PostgisTable {
|
||||||
@NonNull
|
@NonNull
|
||||||
private List<Field> fields;
|
private List<Field> fields;
|
||||||
|
|
||||||
|
|
||||||
@NonNull
|
@NonNull
|
||||||
private GeometryType geometryColumnType;
|
private GeometryType geometryColumnType;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private BBOX boundingBox=null;
|
private BBOX boundingBox = null;
|
||||||
|
|
||||||
@Setter
|
@Setter
|
||||||
private POINT centroid=null;
|
private POINT centroid = null;
|
||||||
|
|
||||||
public void setTablename(String tablename) {
|
public void setTablename(String tablename) {
|
||||||
this.tablename = sanitizeFieldName(tablename);
|
this.tablename = sanitizeFieldName(tablename);
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getCreateStatement() {
|
public String getCreateStatement() {
|
||||||
StringBuilder stmt=new StringBuilder();
|
StringBuilder stmt = new StringBuilder();
|
||||||
stmt.append("CREATE TABLE IF NOT EXISTS "+tablename+"( ");
|
stmt.append("CREATE TABLE IF NOT EXISTS " + tablename + "( ");
|
||||||
for(Field field:fields){
|
for (Field field : fields) {
|
||||||
|
|
||||||
String fieldDefinition=field.getType().getDefinition();
|
String fieldDefinition = field.getType().getDefinition();
|
||||||
if(field.getType().equals(FieldType.GEOMETRY))
|
if (field.getType().equals(FieldType.GEOMETRY))
|
||||||
fieldDefinition=this.getGeometryColumnType().definition;
|
fieldDefinition = this.getGeometryColumnType().definition;
|
||||||
|
|
||||||
stmt.append(field.getName()+" "+fieldDefinition+",");
|
stmt.append(field.getName() + " " + fieldDefinition + ",");
|
||||||
}
|
}
|
||||||
stmt.deleteCharAt(stmt.lastIndexOf(","));
|
stmt.deleteCharAt(stmt.lastIndexOf(","));
|
||||||
stmt.append(")");
|
stmt.append(")");
|
||||||
|
@ -170,27 +164,27 @@ public class PostgisTable {
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getDeleteByFieldStatement(Field field) {
|
public String getDeleteByFieldStatement(Field field) {
|
||||||
return "DELETE FROM "+tablename+" WHERE "+field.getName()+" = ? ";
|
return "DELETE FROM " + tablename + " WHERE " + field.getName() + " = ? ";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public String getInsertionStatement(boolean geometryText) {
|
public String getInsertionStatement(boolean geometryText) {
|
||||||
StringBuilder fieldList=new StringBuilder();
|
StringBuilder fieldList = new StringBuilder();
|
||||||
StringBuilder fieldInsertion=new StringBuilder();
|
StringBuilder fieldInsertion = new StringBuilder();
|
||||||
|
|
||||||
for(Field field:fields) {
|
for (Field field : fields) {
|
||||||
switch(field.getType()) {
|
switch (field.getType()) {
|
||||||
case AUTOINCREMENT : break;
|
case AUTOINCREMENT:
|
||||||
case GEOMETRY : {
|
break;
|
||||||
fieldList.append(field.getName()+",");
|
case GEOMETRY: {
|
||||||
if(geometryText)
|
fieldList.append(field.getName() + ",");
|
||||||
|
if (geometryText)
|
||||||
fieldInsertion.append("ST_GeomFromText(?, 4326),");
|
fieldInsertion.append("ST_GeomFromText(?, 4326),");
|
||||||
else
|
else
|
||||||
fieldInsertion.append("ST_GeomFromWKB(?, 4326),");
|
fieldInsertion.append("ST_GeomFromWKB(?, 4326),");
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default : {
|
default: {
|
||||||
fieldList.append(field.getName()+",");
|
fieldList.append(field.getName() + ",");
|
||||||
fieldInsertion.append("?,");
|
fieldInsertion.append("?,");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,126 +193,137 @@ public class PostgisTable {
|
||||||
fieldList.deleteCharAt(fieldList.lastIndexOf(","));
|
fieldList.deleteCharAt(fieldList.lastIndexOf(","));
|
||||||
fieldInsertion.deleteCharAt(fieldInsertion.lastIndexOf(","));
|
fieldInsertion.deleteCharAt(fieldInsertion.lastIndexOf(","));
|
||||||
|
|
||||||
|
return "Insert into " + tablename + " (" + fieldList + ") VALUES (" + fieldInsertion + ")";
|
||||||
|
|
||||||
return "Insert into "+tablename+" ("+fieldList+") VALUES ("+fieldInsertion+")";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void fillObjectsPreparedStatement(Map<String, Object> row, PreparedStatement toFill) throws SQLException {
|
||||||
public void fillObjectsPreparedStatement(Map<String,Object> row, PreparedStatement toFill) throws SQLException {
|
int psFieldIndex = 0;
|
||||||
int psFieldIndex=0;
|
HashMap<String, Object> rowValues = new HashMap<String, Object>();
|
||||||
HashMap<String,Object> rowValues=new HashMap<String,Object>();
|
for (Map.Entry<String, Object> entry : row.entrySet())
|
||||||
for(Map.Entry<String,Object> entry:row.entrySet())
|
|
||||||
rowValues.put(sanitizeFieldName(entry.getKey()), entry.getValue());
|
rowValues.put(sanitizeFieldName(entry.getKey()), entry.getValue());
|
||||||
|
|
||||||
|
for (Field field : fields) {
|
||||||
for(Field field:fields) {
|
if (!field.getType().equals(FieldType.AUTOINCREMENT)) {
|
||||||
if(!field.getType().equals(FieldType.AUTOINCREMENT)) {
|
|
||||||
psFieldIndex++;
|
psFieldIndex++;
|
||||||
|
|
||||||
Object value=rowValues.get(field.getName());
|
Object value = rowValues.get(field.getName());
|
||||||
setObjectInPreparedStatement(field,value,toFill,psFieldIndex);
|
setObjectInPreparedStatement(field, value, toFill, psFieldIndex);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setObjectInPreparedStatement(Field field, Object value, PreparedStatement toFill, int psFieldIndex)
|
||||||
public void setObjectInPreparedStatement(Field field,Object value, PreparedStatement toFill, int psFieldIndex) throws SQLException {
|
throws SQLException {
|
||||||
if(value==null) {
|
if (value == null) {
|
||||||
try{
|
try {
|
||||||
toFill.setNull(psFieldIndex, field.getType().sqlType);
|
toFill.setNull(psFieldIndex, field.getType().sqlType);
|
||||||
}catch(SQLException e) {
|
} catch (SQLException e) {
|
||||||
log.error("Unable to set null for field "+field);
|
log.error("Unable to set null for field " + field);
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
switch (field.getType()) {
|
||||||
switch(field.getType()) {
|
case FLOAT: {
|
||||||
case FLOAT :{
|
toFill.setFloat(psFieldIndex, (Float) value);
|
||||||
toFill.setFloat(psFieldIndex, (Float)value);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case INT : {
|
case INT: {
|
||||||
toFill.setInt(psFieldIndex, (Integer)value);
|
toFill.setInt(psFieldIndex, (Integer) value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TEXT : {
|
case TEXT: {
|
||||||
toFill.setString(psFieldIndex, value.toString());
|
toFill.setString(psFieldIndex, value.toString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GEOMETRY : {
|
case GEOMETRY: {
|
||||||
if(value instanceof String)
|
if (value instanceof String)
|
||||||
toFill.setString(psFieldIndex, ((String) value));
|
toFill.setString(psFieldIndex, ((String) value));
|
||||||
else toFill.setBytes(psFieldIndex, (byte[])value);
|
else
|
||||||
|
toFill.setBytes(psFieldIndex, (byte[]) value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case BOOLEAN: {
|
case BOOLEAN: {
|
||||||
if(value instanceof String)
|
if (value instanceof String)
|
||||||
toFill.setBoolean(psFieldIndex,Boolean.parseBoolean(value.toString()));
|
toFill.setBoolean(psFieldIndex, Boolean.parseBoolean(value.toString()));
|
||||||
if(value instanceof Boolean)
|
if (value instanceof Boolean)
|
||||||
toFill.setBoolean(psFieldIndex,(Boolean) value);
|
toFill.setBoolean(psFieldIndex, (Boolean) value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
// Added by Francesco
|
||||||
|
default: {
|
||||||
|
if (value instanceof String) {
|
||||||
|
toFill.setString(psFieldIndex, ((String) value));
|
||||||
|
} else {
|
||||||
|
try {
|
||||||
|
String toStringValue = value.toString();
|
||||||
|
toFill.setString(psFieldIndex, toStringValue);
|
||||||
|
} catch (Exception e) {
|
||||||
|
// silence
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void fillCSVPreparedStatament(Map<String,String> row, PreparedStatement toFill,boolean explicitGeometry) throws SQLException {
|
}
|
||||||
int psFieldIndex=0;
|
}
|
||||||
|
}
|
||||||
|
|
||||||
HashMap<String,String> rowValues=new HashMap<String,String>();
|
public void fillCSVPreparedStatament(Map<String, String> row, PreparedStatement toFill, boolean explicitGeometry)
|
||||||
for(Map.Entry<String,String> entry:row.entrySet())
|
throws SQLException {
|
||||||
|
int psFieldIndex = 0;
|
||||||
|
|
||||||
|
HashMap<String, String> rowValues = new HashMap<String, String>();
|
||||||
|
for (Map.Entry<String, String> entry : row.entrySet())
|
||||||
rowValues.put(sanitizeFieldName(entry.getKey()), entry.getValue());
|
rowValues.put(sanitizeFieldName(entry.getKey()), entry.getValue());
|
||||||
|
|
||||||
for(Field field:fields) {
|
for (Field field : fields) {
|
||||||
|
|
||||||
|
if (!field.getType().equals(FieldType.AUTOINCREMENT)) {
|
||||||
if(!field.getType().equals(FieldType.AUTOINCREMENT)) {
|
|
||||||
psFieldIndex++;
|
psFieldIndex++;
|
||||||
|
|
||||||
String value=rowValues.get(field.getName());
|
String value = rowValues.get(field.getName());
|
||||||
|
|
||||||
// if(value==null||value.equalsIgnoreCase("null")) toFill.setNull(psFieldIndex, field.getType().sqlType);
|
// if(value==null||value.equalsIgnoreCase("null")) toFill.setNull(psFieldIndex, field.getType().sqlType);
|
||||||
// else
|
// else
|
||||||
switch(field.getType()) {
|
switch (field.getType()) {
|
||||||
case FLOAT :{
|
case FLOAT: {
|
||||||
try{
|
try {
|
||||||
toFill.setFloat(psFieldIndex, Float.parseFloat(value));
|
toFill.setFloat(psFieldIndex, Float.parseFloat(value));
|
||||||
}catch(NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
throw new SQLException(field+" cannot be null. CSV Row is "+rowValues,e);
|
throw new SQLException(field + " cannot be null. CSV Row is " + rowValues, e);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case INT : {
|
case INT: {
|
||||||
try{
|
try {
|
||||||
toFill.setInt(psFieldIndex, Integer.parseInt(value));
|
toFill.setInt(psFieldIndex, Integer.parseInt(value));
|
||||||
}catch(NumberFormatException e) {
|
} catch (NumberFormatException e) {
|
||||||
log.warn("Skipping value for "+field+" row was "+rowValues,e);
|
log.warn("Skipping value for " + field + " row was " + rowValues, e);
|
||||||
toFill.setNull(psFieldIndex, java.sql.Types.INTEGER);
|
toFill.setNull(psFieldIndex, java.sql.Types.INTEGER);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TEXT : {
|
case TEXT: {
|
||||||
toFill.setString(psFieldIndex, value.toString());
|
toFill.setString(psFieldIndex, value.toString());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case GEOMETRY : {
|
case GEOMETRY: {
|
||||||
if(explicitGeometry) {
|
if (explicitGeometry) {
|
||||||
toFill.setString(psFieldIndex,value);
|
toFill.setString(psFieldIndex, value);
|
||||||
}else {
|
} else {
|
||||||
switch(geometryColumnType){
|
switch (geometryColumnType) {
|
||||||
case POINT: {
|
case POINT: {
|
||||||
String xRepresentation=DECIMAL_FORMAT.format(Double.parseDouble(rowValues.get(DBConstants.Defaults.XCOORD_FIELD)));
|
String xRepresentation = DECIMAL_FORMAT
|
||||||
String yRepresentation=DECIMAL_FORMAT.format(Double.parseDouble(rowValues.get(DBConstants.Defaults.YCOORD_FIELD)));
|
.format(Double.parseDouble(rowValues.get(DBConstants.Defaults.XCOORD_FIELD)));
|
||||||
|
String yRepresentation = DECIMAL_FORMAT
|
||||||
|
.format(Double.parseDouble(rowValues.get(DBConstants.Defaults.YCOORD_FIELD)));
|
||||||
|
|
||||||
toFill.setString(psFieldIndex, "POINT("+xRepresentation+" "+
|
toFill.setString(psFieldIndex, "POINT(" + xRepresentation + " " + yRepresentation + ")");
|
||||||
yRepresentation+")");
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default :{
|
default: {
|
||||||
toFill.setString(psFieldIndex,rowValues.get("wkt"));
|
toFill.setString(psFieldIndex, rowValues.get("wkt"));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -328,9 +333,6 @@ public class PostgisTable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,7 +341,4 @@ public class PostgisTable {
|
||||||
return fieldName.toLowerCase().replaceAll("[^a-z0-9_\\\\]", "_");
|
return fieldName.toLowerCase().replaceAll("[^a-z0-9_\\\\]", "_");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,6 +118,7 @@ public class SDIIndexerPlugin extends SDIAbstractPlugin implements IndexerPlugin
|
||||||
centroidDoc.put(DBConstants.Defaults.PROJECT_ID, project.getId());
|
centroidDoc.put(DBConstants.Defaults.PROJECT_ID, project.getId());
|
||||||
centroidDoc.put(DBConstants.Defaults.DISPLAYED, true);
|
centroidDoc.put(DBConstants.Defaults.DISPLAYED, true);
|
||||||
|
|
||||||
|
//Added by Francesco. Creating Gis Viewer Link as public or private
|
||||||
Boolean isInternalIndex = null;
|
Boolean isInternalIndex = null;
|
||||||
try {
|
try {
|
||||||
isInternalIndex = requestArguments.getBoolean("flagInternalIndex");
|
isInternalIndex = requestArguments.getBoolean("flagInternalIndex");
|
||||||
|
|
Loading…
Reference in New Issue