package org.iplantc.phyloviewer.viewer.server;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.sql.DataSource;
import org.iplantc.phyloviewer.shared.math.Box2D;
import org.iplantc.phyloviewer.shared.math.Vector2;
import org.iplantc.phyloviewer.shared.model.INode;
import org.iplantc.phyloviewer.viewer.client.services.CombinedService.LayoutResponse;
import org.iplantc.phyloviewer.viewer.server.db.ConnectionUtil;
import org.postgis.PGgeometry;
import org.postgis.Point;
import org.postgis.Polygon;
public class DatabaseLayoutData implements ILayoutData {
private DataSource pool;
public DatabaseLayoutData(DataSource pool) {
this.pool = pool;
}
public LayoutResponse getLayout(INode node) throws Exception {
LayoutResponse response = new LayoutResponse();
response.nodeID = node.getId();
Connection connection = null;
PreparedStatement statement = null;
ResultSet rs = null;
try {
connection = pool.getConnection();
statement = connection.prepareStatement("Select ST_AsText(point), ST_AsText(bounding_box) from node_layout where node_id=?");
statement.setInt(1, node.getId());
rs = statement.executeQuery();
if(rs.next()) {
Point point = (Point) PGgeometry.geomFromString(rs.getString(1));
Vector2 p = convertPoint(point);
Polygon polygon = (Polygon) PGgeometry.geomFromString(rs.getString(2));
Vector2 min = convertPoint(polygon.getPoint(0));
Vector2 max = convertPoint(polygon.getPoint(2));
response.position = p;
response.boundingBox = new Box2D(min,max);
}
ConnectionUtil.close(connection);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
ConnectionUtil.close(rs);
ConnectionUtil.close(statement);
ConnectionUtil.close(connection);
}
return response;
}
private Vector2 convertPoint(Point point) {
double positionX = point.getX();
double positionY = point.getY();
Vector2 p = new Vector2(positionX,positionY);
return p;
}
}