All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jgrasstools.gears.io.geopaparazzi.geopap4.DaoImages Maven / Gradle / Ivy

The newest version!
/*
 * This file is part of JGrasstools (http://www.jgrasstools.org)
 * (C) HydroloGIS - www.hydrologis.com
 *
 * JGrasstools is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see .
 */
package org.jgrasstools.gears.io.geopaparazzi.geopap4;

import static org.jgrasstools.gears.io.geopaparazzi.geopap4.TableDescriptions.TABLE_IMAGES;
import static org.jgrasstools.gears.io.geopaparazzi.geopap4.TableDescriptions.TABLE_IMAGE_DATA;

import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import org.geotools.geometry.jts.ReferencedEnvelope;
import org.geotools.referencing.crs.DefaultGeographicCRS;
import org.jgrasstools.dbs.compat.IJGTConnection;
import org.jgrasstools.dbs.compat.IJGTResultSet;
import org.jgrasstools.dbs.compat.IJGTStatement;
import org.jgrasstools.gears.io.geopaparazzi.geopap4.TableDescriptions.ImageDataTableFields;
import org.jgrasstools.gears.io.geopaparazzi.geopap4.TableDescriptions.ImageTableFields;

/**
 * Data access object for images.
 *
 * @author Andrea Antonello (www.hydrologis.com)
 */
@SuppressWarnings("nls")
public class DaoImages {

    /**
     * Create the image tables.
     *
     * @throws IOException if something goes wrong.
     */
    public static void createTables( Connection connection ) throws IOException, SQLException {
        StringBuilder sB = new StringBuilder();
        sB.append("CREATE TABLE ");
        sB.append(TABLE_IMAGES);
        sB.append(" (");
        sB.append(ImageTableFields.COLUMN_ID.getFieldName());
        sB.append(" INTEGER PRIMARY KEY, ");
        sB.append(ImageTableFields.COLUMN_LON.getFieldName()).append(" REAL NOT NULL, ");
        sB.append(ImageTableFields.COLUMN_LAT.getFieldName()).append(" REAL NOT NULL,");
        sB.append(ImageTableFields.COLUMN_ALTIM.getFieldName()).append(" REAL NOT NULL,");
        sB.append(ImageTableFields.COLUMN_AZIM.getFieldName()).append(" REAL NOT NULL,");
        sB.append(ImageTableFields.COLUMN_IMAGEDATA_ID.getFieldName());
        sB.append(" INTEGER NOT NULL ");
        sB.append("CONSTRAINT " + ImageTableFields.COLUMN_IMAGEDATA_ID.getFieldName() + " REFERENCES ");
        sB.append(TABLE_IMAGE_DATA);
        sB.append("(");
        sB.append(ImageDataTableFields.COLUMN_ID);
        sB.append(") ON DELETE CASCADE,");
        sB.append(ImageTableFields.COLUMN_TS.getFieldName()).append(" DATE NOT NULL,");
        sB.append(ImageTableFields.COLUMN_TEXT.getFieldName()).append(" TEXT NOT NULL,");
        sB.append(ImageTableFields.COLUMN_NOTE_ID.getFieldName()).append(" INTEGER,");
        sB.append(ImageTableFields.COLUMN_ISDIRTY.getFieldName()).append(" INTEGER NOT NULL");
        sB.append(");");
        String CREATE_TABLE_IMAGES = sB.toString();

        sB = new StringBuilder();
        sB.append("CREATE INDEX images_ts_idx ON ");
        sB.append(TABLE_IMAGES);
        sB.append(" ( ");
        sB.append(ImageTableFields.COLUMN_TS.getFieldName());
        sB.append(" );");
        String CREATE_INDEX_IMAGES_TS = sB.toString();

        sB = new StringBuilder();
        sB.append("CREATE INDEX images_x_by_y_idx ON ");
        sB.append(TABLE_IMAGES);
        sB.append(" ( ");
        sB.append(ImageTableFields.COLUMN_LON.getFieldName());
        sB.append(", ");
        sB.append(ImageTableFields.COLUMN_LAT.getFieldName());
        sB.append(" );");
        String CREATE_INDEX_IMAGES_X_BY_Y = sB.toString();

        sB = new StringBuilder();
        sB.append("CREATE INDEX images_noteid_idx ON ");
        sB.append(TABLE_IMAGES);
        sB.append(" ( ");
        sB.append(ImageTableFields.COLUMN_NOTE_ID.getFieldName());
        sB.append(" );");
        String CREATE_INDEX_IMAGES_NOTEID = sB.toString();

        sB = new StringBuilder();
        sB.append("CREATE INDEX images_isdirty_idx ON ");
        sB.append(TABLE_IMAGES);
        sB.append(" ( ");
        sB.append(ImageTableFields.COLUMN_ISDIRTY.getFieldName());
        sB.append(" );");
        String CREATE_INDEX_IMAGES_ISDIRTY = sB.toString();

        sB = new StringBuilder();
        sB.append("CREATE TABLE ");
        sB.append(TABLE_IMAGE_DATA);
        sB.append(" (");
        sB.append(ImageDataTableFields.COLUMN_ID.getFieldName());
        sB.append(" INTEGER PRIMARY KEY, ");
        sB.append(ImageDataTableFields.COLUMN_IMAGE.getFieldName()).append(" BLOB NOT NULL,");
        sB.append(ImageDataTableFields.COLUMN_THUMBNAIL.getFieldName()).append(" BLOB NOT NULL");
        sB.append(");");
        String CREATE_TABLE_IMAGEDATA = sB.toString();

        try (Statement statement = connection.createStatement()) {
            statement.setQueryTimeout(30); // set timeout to 30 sec.

            statement.executeUpdate(CREATE_TABLE_IMAGES);
            statement.executeUpdate(CREATE_INDEX_IMAGES_TS);
            statement.executeUpdate(CREATE_INDEX_IMAGES_X_BY_Y);
            statement.executeUpdate(CREATE_INDEX_IMAGES_NOTEID);
            statement.executeUpdate(CREATE_INDEX_IMAGES_ISDIRTY);
            statement.executeUpdate(CREATE_TABLE_IMAGEDATA);
        } catch (Exception e) {
            throw new IOException(e.getLocalizedMessage());
        }
    }

    public static void addImage( Connection connection, long id, double lon, double lat, double altim, double azim,
            long timestamp, String text, byte[] image, byte[] thumb, long noteId ) throws IOException, SQLException {

        String insertSQL1 = "INSERT INTO " + TableDescriptions.TABLE_IMAGE_DATA + "(" + //
                ImageDataTableFields.COLUMN_ID.getFieldName() + ", " + //
                ImageDataTableFields.COLUMN_IMAGE.getFieldName() + ", " + //
                ImageDataTableFields.COLUMN_THUMBNAIL.getFieldName() + //
                ") VALUES" + "(?,?,?)";
        try (PreparedStatement writeImageDataStatement = connection.prepareStatement(insertSQL1)) {
            writeImageDataStatement.setLong(1, id);
            writeImageDataStatement.setBytes(2, image);
            writeImageDataStatement.setBytes(3, thumb);

            writeImageDataStatement.executeUpdate();
        }

        String insertSQL2 = "INSERT INTO " + TableDescriptions.TABLE_IMAGES + "(" + //
                ImageTableFields.COLUMN_ID.getFieldName() + ", " + //
                ImageTableFields.COLUMN_LON.getFieldName() + ", " + //
                ImageTableFields.COLUMN_LAT.getFieldName() + ", " + //
                ImageTableFields.COLUMN_ALTIM.getFieldName() + ", " + //
                ImageTableFields.COLUMN_TS.getFieldName() + ", " + //
                ImageTableFields.COLUMN_AZIM.getFieldName() + ", " + //
                ImageTableFields.COLUMN_TEXT.getFieldName() + ", " + //
                ImageTableFields.COLUMN_ISDIRTY.getFieldName() + ", " + //
                ImageTableFields.COLUMN_NOTE_ID.getFieldName() + ", " + //
                ImageTableFields.COLUMN_IMAGEDATA_ID.getFieldName() + //
                ") VALUES" + "(?,?,?,?,?,?,?,?,?,?)";
        try (PreparedStatement writeImageStatement = connection.prepareStatement(insertSQL2)) {
            writeImageStatement.setLong(1, id);
            writeImageStatement.setDouble(2, lon);
            writeImageStatement.setDouble(3, lat);
            writeImageStatement.setDouble(4, altim);
            writeImageStatement.setLong(5, timestamp);
            writeImageStatement.setDouble(6, azim);
            writeImageStatement.setString(7, text);
            writeImageStatement.setInt(8, 1);
            writeImageStatement.setLong(9, noteId);
            writeImageStatement.setLong(10, id);

            writeImageStatement.executeUpdate();
        }
    }

    public static String getImageName( IJGTConnection connection, long imageId ) throws Exception {
        String sql = "select " + ImageTableFields.COLUMN_TEXT.getFieldName() + //
                " from " + TABLE_IMAGES + //
                " where " + ImageTableFields.COLUMN_ID.getFieldName() + " = " + imageId;

        try (IJGTStatement statement = connection.createStatement(); IJGTResultSet rs = statement.executeQuery(sql);) {
            statement.setQueryTimeout(30); // set timeout to 30 sec.

            if (rs.next()) {
                String text = rs.getString(ImageTableFields.COLUMN_TEXT.getFieldName());
                if (text != null && text.trim().length() != 0) {
                    return text;
                }
            }
            return null;
        }
    }

    /**
     * Get the list of Images from the db.
     *
     * @return list of notes.
     *
     * @throws IOException if something goes wrong.
     */
    public static List getImagesList( IJGTConnection connection ) throws Exception {
        List images = new ArrayList();
        String sql = "select " + //
                ImageTableFields.COLUMN_ID.getFieldName() + "," + //
                ImageTableFields.COLUMN_LON.getFieldName() + "," + //
                ImageTableFields.COLUMN_LAT.getFieldName() + "," + //
                ImageTableFields.COLUMN_ALTIM.getFieldName() + "," + //
                ImageTableFields.COLUMN_TS.getFieldName() + "," + //
                ImageTableFields.COLUMN_AZIM.getFieldName() + "," + //
                ImageTableFields.COLUMN_TEXT.getFieldName() + "," + //
                ImageTableFields.COLUMN_NOTE_ID.getFieldName() + "," + //
                ImageTableFields.COLUMN_IMAGEDATA_ID.getFieldName() + //
                " from " + TABLE_IMAGES;

        try (IJGTStatement statement = connection.createStatement(); IJGTResultSet rs = statement.executeQuery(sql);) {
            statement.setQueryTimeout(30); // set timeout to 30 sec.
            
            while( rs.next() ) {
                long id = rs.getLong(1);
                double lon = rs.getDouble(2);
                double lat = rs.getDouble(3);
                double altim = rs.getDouble(4);
                long ts = rs.getLong(5);
                double azim = rs.getDouble(6);
                String text = rs.getString(7);
                long noteId = rs.getLong(8);
                long imageDataId = rs.getLong(9);

                Image image = new Image(id, text, lon, lat, altim, azim, imageDataId, noteId, ts);
                images.add(image);
            }
        }
        return images;
    }

    /**
     * Get Image data from data id.
     *
     * @param connection
     * @param imageDataId
     * @return
     * @throws Exception
     */
    public static byte[] getImageData( IJGTConnection connection, long imageDataId ) throws Exception {
        String sql = "select " + //
                ImageDataTableFields.COLUMN_IMAGE.getFieldName() + //
                " from " + TABLE_IMAGE_DATA + " where " + //
                ImageDataTableFields.COLUMN_ID.getFieldName() + " = " + imageDataId;

        try (IJGTStatement statement = connection.createStatement(); IJGTResultSet rs = statement.executeQuery(sql);) {
            statement.setQueryTimeout(30); // set timeout to 30 sec.

            if (rs.next()) {
                byte[] bytes = rs.getBytes(1);
                return bytes;
            }
        }
        return null;
    }
    
    /**
     * Get the current data envelope.
     * 
     * @param connection the db connection.
     * @return the envelope.
     * @throws Exception
     */
    public static ReferencedEnvelope getEnvelope( IJGTConnection connection ) throws Exception {
        String query = "SELECT min(" + //
                ImageTableFields.COLUMN_LON.getFieldName() + "), max(" + //
                ImageTableFields.COLUMN_LON.getFieldName() + "), min(" + //
                ImageTableFields.COLUMN_LAT.getFieldName() + "), max(" + //
                ImageTableFields.COLUMN_LAT.getFieldName() + ") " + //
                " FROM " + TABLE_IMAGES;
        try (IJGTStatement statement = connection.createStatement(); IJGTResultSet rs = statement.executeQuery(query);) {
            if (rs.next()) {
                double minX = rs.getDouble(1);
                double maxX = rs.getDouble(2);
                double minY = rs.getDouble(3);
                double maxY = rs.getDouble(4);

                ReferencedEnvelope env = new ReferencedEnvelope(minX, maxX, minY, maxY, DefaultGeographicCRS.WGS84);
                return env;
            }
        }

        return null;
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy