146 lines
2.9 KiB
Java
146 lines
2.9 KiB
Java
package postgresql.geometric;
|
|
|
|
import java.io.*;
|
|
import java.sql.*;
|
|
import postgresql.util.*;
|
|
|
|
/**
|
|
* This implements a path (a multiple segmented line, which may be closed)
|
|
*/
|
|
public class PGpath extends PGobject implements Serializable,Cloneable
|
|
{
|
|
/**
|
|
* True if the path is open, false if closed
|
|
*/
|
|
public boolean open;
|
|
|
|
/**
|
|
* The points defining this path
|
|
*/
|
|
public PGpoint points[];
|
|
|
|
/**
|
|
* @param points the PGpoints that define the path
|
|
* @param open True if the path is open, false if closed
|
|
*/
|
|
public PGpath(PGpoint[] points,boolean open)
|
|
{
|
|
this();
|
|
this.points = points;
|
|
this.open = open;
|
|
}
|
|
|
|
/**
|
|
* Required by the driver
|
|
*/
|
|
public PGpath()
|
|
{
|
|
setType("path");
|
|
}
|
|
|
|
/**
|
|
* @param s definition of the circle in PostgreSQL's syntax.
|
|
* @exception SQLException on conversion failure
|
|
*/
|
|
public PGpath(String s) throws SQLException
|
|
{
|
|
this();
|
|
setValue(s);
|
|
}
|
|
|
|
/**
|
|
* @param s Definition of the path in PostgreSQL's syntax
|
|
* @exception SQLException on conversion failure
|
|
*/
|
|
public void setValue(String s) throws SQLException
|
|
{
|
|
// First test to see if were open
|
|
if(s.startsWith("[") && s.endsWith("]")) {
|
|
open = true;
|
|
s = PGtokenizer.removeBox(s);
|
|
} else if(s.startsWith("(") && s.endsWith(")")) {
|
|
open = false;
|
|
s = PGtokenizer.removePara(s);
|
|
} else
|
|
throw new PSQLException("postgresql.geo.path");
|
|
|
|
PGtokenizer t = new PGtokenizer(s,',');
|
|
int npoints = t.getSize();
|
|
points = new PGpoint[npoints];
|
|
for(int p=0;p<npoints;p++)
|
|
points[p] = new PGpoint(t.getToken(p));
|
|
}
|
|
|
|
/**
|
|
* @param obj Object to compare with
|
|
* @return true if the two boxes are identical
|
|
*/
|
|
public boolean equals(Object obj)
|
|
{
|
|
if(obj instanceof PGpath) {
|
|
PGpath p = (PGpath)obj;
|
|
|
|
if(p.points.length != points.length)
|
|
return false;
|
|
|
|
if(p.open != open)
|
|
return false;
|
|
|
|
for(int i=0;i<points.length;i++)
|
|
if(!points[i].equals(p.points[i]))
|
|
return false;
|
|
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
/**
|
|
* This must be overidden to allow the object to be cloned
|
|
*/
|
|
public Object clone()
|
|
{
|
|
PGpoint ary[] = new PGpoint[points.length];
|
|
for(int i=0;i<points.length;i++)
|
|
ary[i]=(PGpoint)points[i].clone();
|
|
return new PGpath(ary,open);
|
|
}
|
|
|
|
/**
|
|
* This returns the polygon in the syntax expected by postgresql
|
|
*/
|
|
public String getValue()
|
|
{
|
|
StringBuffer b = new StringBuffer(open?"[":"(");
|
|
|
|
for(int p=0;p<points.length;p++) {
|
|
if(p>0) b.append(",");
|
|
b.append(points[p].toString());
|
|
}
|
|
b.append(open?"]":")");
|
|
|
|
return b.toString();
|
|
}
|
|
|
|
public boolean isOpen()
|
|
{
|
|
return open;
|
|
}
|
|
|
|
public boolean isClosed()
|
|
{
|
|
return !open;
|
|
}
|
|
|
|
public void closePath()
|
|
{
|
|
open = false;
|
|
}
|
|
|
|
public void openPath()
|
|
{
|
|
open = true;
|
|
}
|
|
|
|
}
|