/*
* Copyright (c) 2003, PostgreSQL Global Development Group
* See the LICENSE file in the project root for more information.
*/
package org.postgresql.geometric;
import org.postgresql.util.
GT;
import org.postgresql.util.
PGobject;
import org.postgresql.util.
PGtokenizer;
import org.postgresql.util.
PSQLException;
import org.postgresql.util.
PSQLState;
import java.io.
Serializable;
import java.sql.
SQLException;
/**
* This represents org.postgresql's circle datatype, consisting of a point and a radius.
*/
public class
PGcircle extends
PGobject implements
Serializable,
Cloneable {
/**
* This is the center point.
*/
public
PGpoint center;
/**
* This is the radius.
*/
public double
radius;
/**
* @param x coordinate of center
* @param y coordinate of center
* @param r radius of circle
*/
public
PGcircle(double
x, double
y, double
r) {
this(new
PGpoint(
x,
y),
r);
}
/**
* @param c PGpoint describing the circle's center
* @param r radius of circle
*/
public
PGcircle(
PGpoint c, double
r) {
this();
this.
center =
c;
this.
radius =
r;
}
/**
* @param s definition of the circle in PostgreSQL's syntax.
* @throws SQLException on conversion failure
*/
public
PGcircle(
String s) throws
SQLException {
this();
setValue(
s);
}
/**
* This constructor is used by the driver.
*/
public
PGcircle() {
setType("circle");
}
/**
* @param s definition of the circle in PostgreSQL's syntax.
* @throws SQLException on conversion failure
*/
@
Override
public void
setValue(
String s) throws
SQLException {
PGtokenizer t = new
PGtokenizer(
PGtokenizer.
removeAngle(
s), ',');
if (
t.
getSize() != 2) {
throw new
PSQLException(
GT.
tr("Conversion to type {0} failed: {1}.",
type,
s),
PSQLState.
DATA_TYPE_MISMATCH);
}
try {
center = new
PGpoint(
t.
getToken(0));
radius =
Double.
parseDouble(
t.
getToken(1));
} catch (
NumberFormatException e) {
throw new
PSQLException(
GT.
tr("Conversion to type {0} failed: {1}.",
type,
s),
PSQLState.
DATA_TYPE_MISMATCH,
e);
}
}
/**
* @param obj Object to compare with
* @return true if the two circles are identical
*/
public boolean
equals(
Object obj) {
if (
obj instanceof
PGcircle) {
PGcircle p = (
PGcircle)
obj;
return
p.
center.
equals(
center) &&
p.
radius ==
radius;
}
return false;
}
public int
hashCode() {
long
v =
Double.
doubleToLongBits(
radius);
return (int) (
center.
hashCode() ^
v ^ (
v >>> 32));
}
public
Object clone() throws
CloneNotSupportedException {
PGcircle newPGcircle = (
PGcircle) super.clone();
if (
newPGcircle.
center != null) {
newPGcircle.
center = (
PGpoint)
newPGcircle.
center.
clone();
}
return
newPGcircle;
}
/**
* @return the PGcircle in the syntax expected by org.postgresql
*/
public
String getValue() {
return "<" +
center + "," +
radius + ">";
}
}