package org.iplantc.phyloviewer.viewer.server.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import org.iplantc.phyloviewer.shared.layout.ILayoutData;
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.shared.model.ITree;
import org.postgis.LinearRing;
import org.postgis.Point;
import org.postgis.Polygon;
public class ImportLayout {
Connection connection;
PreparedStatement addNodeLayoutStmt = null;
public ImportLayout(Connection conn) throws SQLException {
this.connection = conn;
// Create our prepared statement.
// How to handle prepared statements with postgis (http://postgis.refractions.net/pipermail/postgis-users/2006-October/013484.html).
addNodeLayoutStmt = conn.prepareStatement("insert into node_layout(node_id,tree_id,layout_id,point,bounding_box) values (?,?,?,?::geometry,?::geometry)");
}
public void close() {
ConnectionUtil.close(addNodeLayoutStmt);
}
public void addLayout(String layoutID, ILayoutData layout, ITree tree) throws SQLException {
addNodeLayoutStmt.setString(3, layoutID);
this.addNode(layout,tree.getId(),tree.getRootNode());
}
private void addNode(ILayoutData layout, int treeId, INode node) throws SQLException {
addNodeLayoutStmt.setInt(1, node.getId());
addNodeLayoutStmt.setInt(2, treeId);
Vector2 position = layout.getPosition(node);
Box2D box = layout.getBoundingBox(node);
Point p = new Point(position.getX(), position.getY());
addNodeLayoutStmt.setString(4,"SRID=-1;" + p.toString());
Point points[] = new Point[5];
points[0] = new Point(box.getMin().getX(),box.getMin().getY());
points[1] = new Point(box.getMax().getX(),box.getMin().getY());
points[2] = new Point(box.getMax().getX(),box.getMax().getY());
points[3] = new Point(box.getMin().getX(),box.getMax().getY());
points[4] = points[0];
LinearRing boundary = new LinearRing(points);
LinearRing rings[] = new LinearRing[1];
rings[0] = boundary;
Polygon polygon = new Polygon(rings);
addNodeLayoutStmt.setString(5,"SRID=-1;" + polygon.toString());
addNodeLayoutStmt.executeUpdate();
for(int i=0; i<node.getNumberOfChildren(); ++i) {
addNode(layout,treeId,node.getChild(i));
}
}
}