postgresql-jdbc.git / summary / log / commit / refs

commit    e84c976d73e6589211ee04fff4249298c2c8277d
Author:   Kris Jurka <books@ejurka.com>
Date:     Mon Jul 16 15:02:53 2007 +0000

    Change how PGobject and children support clone(), to get more
    reasonable behavior when extending these classes.  Don't implement
    clone by calling the constructor because you get the wrong class
    when cloning a subclass.
    
    Russell Francis


org/postgresql/geometric/PGbox.java | 14 +++++++++++--- org/postgresql/geometric/PGcircle.java | 9 ++++++--- org/postgresql/geometric/PGline.java | 14 +++++++++++--- org/postgresql/geometric/PGlseg.java | 14 +++++++++++--- org/postgresql/geometric/PGpath.java | 16 ++++++++++------ org/postgresql/geometric/PGpoint.java | 7 +------ org/postgresql/geometric/PGpolygon.java | 17 +++++++++++------ org/postgresql/util/PGInterval.java | 12 +----------- org/postgresql/util/PGmoney.java | 10 +--------- org/postgresql/util/PGobject.java | 9 +++------ 10 files changed, 66 insertions(+), 56 deletions(-) diff --git a/org/postgresql/geometric/PGbox.java b/org/postgresql/geometric/PGbox.java index 07434d6f..ea66c8b4 100644 --- a/org/postgresql/geometric/PGbox.java +++ b/org/postgresql/geometric/PGbox.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGbox.java,v 1.12 2004/12/22 09:23:56 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGbox.java,v 1.13 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -130,9 +130,17 @@ public class PGbox extends PGobject implements Serializable, Cloneable return point[0].hashCode() ^ point[1].hashCode(); } - public Object clone() + public Object clone() throws CloneNotSupportedException { - return new PGbox((PGpoint)point[0].clone(), (PGpoint)point[1].clone()); + PGbox newPGbox = (PGbox) super.clone(); + if( newPGbox.point != null ) + { + newPGbox.point = (PGpoint[]) newPGbox.point.clone(); + for( int i = 0; i < newPGbox.point.length; ++i ) + if( newPGbox.point[i] != null ) + newPGbox.point[i] = (PGpoint) newPGbox.point[i].clone(); + } + return newPGbox; } /** diff --git a/org/postgresql/geometric/PGcircle.java b/org/postgresql/geometric/PGcircle.java index 25d17010..0749e651 100644 --- a/org/postgresql/geometric/PGcircle.java +++ b/org/postgresql/geometric/PGcircle.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGcircle.java,v 1.14 2004/12/22 09:23:56 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGcircle.java,v 1.15 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -114,9 +114,12 @@ public class PGcircle extends PGobject implements Serializable, Cloneable return (int) (center.hashCode() ^ v ^ (v >>> 32)); } - public Object clone() + public Object clone() throws CloneNotSupportedException { - return new PGcircle((PGpoint)center.clone(), radius); + PGcircle newPGcircle = (PGcircle) super.clone(); + if( newPGcircle.center != null ) + newPGcircle.center = (PGpoint) newPGcircle.center.clone(); + return newPGcircle; } /** diff --git a/org/postgresql/geometric/PGline.java b/org/postgresql/geometric/PGline.java index e58ac3fb..663b3b9d 100644 --- a/org/postgresql/geometric/PGline.java +++ b/org/postgresql/geometric/PGline.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGline.java,v 1.12 2004/12/22 09:23:57 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGline.java,v 1.13 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -104,9 +104,17 @@ public class PGline extends PGobject implements Serializable, Cloneable return point[0].hashCode() ^ point[1].hashCode(); } - public Object clone() + public Object clone() throws CloneNotSupportedException { - return new PGline((PGpoint)point[0].clone(), (PGpoint)point[1].clone()); + PGline newPGline = (PGline) super.clone(); + if( newPGline.point != null ) + { + newPGline.point = (PGpoint[]) newPGline.point.clone(); + for( int i = 0; i < newPGline.point.length; ++i ) + if( newPGline.point[i] != null ) + newPGline.point[i] = (PGpoint) newPGline.point[i].clone(); + } + return newPGline; } /** diff --git a/org/postgresql/geometric/PGlseg.java b/org/postgresql/geometric/PGlseg.java index 57e2659d..33c65ca4 100644 --- a/org/postgresql/geometric/PGlseg.java +++ b/org/postgresql/geometric/PGlseg.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGlseg.java,v 1.12 2004/12/22 09:23:57 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGlseg.java,v 1.13 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -102,9 +102,17 @@ public class PGlseg extends PGobject implements Serializable, Cloneable return point[0].hashCode() ^ point[1].hashCode(); } - public Object clone() + public Object clone() throws CloneNotSupportedException { - return new PGlseg((PGpoint)point[0].clone(), (PGpoint)point[1].clone()); + PGlseg newPGlseg = (PGlseg) super.clone(); + if( newPGlseg.point != null ) + { + newPGlseg.point = (PGpoint[]) newPGlseg.point.clone(); + for( int i = 0; i < newPGlseg.point.length; ++i ) + if( newPGlseg.point[i] != null ) + newPGlseg.point[i] = (PGpoint) newPGlseg.point[i].clone(); + } + return newPGlseg; } /** diff --git a/org/postgresql/geometric/PGpath.java b/org/postgresql/geometric/PGpath.java index 660ef7d6..35e3f007 100644 --- a/org/postgresql/geometric/PGpath.java +++ b/org/postgresql/geometric/PGpath.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpath.java,v 1.12 2004/11/09 08:48:01 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpath.java,v 1.13 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -124,12 +124,16 @@ public class PGpath extends PGobject implements Serializable, Cloneable return hash; } - public Object clone() + public Object clone() throws CloneNotSupportedException { - 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); + PGpath newPGpath = (PGpath) super.clone(); + if( newPGpath.points != null ) + { + newPGpath.points = (PGpoint[]) newPGpath.points.clone(); + for( int i = 0; i < newPGpath.points.length; ++i ) + newPGpath.points[i] = (PGpoint) newPGpath.points[i].clone(); + } + return newPGpath; } /** diff --git a/org/postgresql/geometric/PGpoint.java b/org/postgresql/geometric/PGpoint.java index 2bfc5c4a..95d21092 100644 --- a/org/postgresql/geometric/PGpoint.java +++ b/org/postgresql/geometric/PGpoint.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpoint.java,v 1.13 2004/12/22 09:23:57 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpoint.java,v 1.14 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -107,11 +107,6 @@ public class PGpoint extends PGobject implements Serializable, Cloneable return (int) (v1 ^ v2 ^ (v1 >>> 32) ^ (v2 >>> 32)); } - public Object clone() - { - return new PGpoint(x, y); - } - /** * @return the PGpoint in the syntax expected by org.postgresql */ diff --git a/org/postgresql/geometric/PGpolygon.java b/org/postgresql/geometric/PGpolygon.java index 729032f3..b5c122f5 100644 --- a/org/postgresql/geometric/PGpolygon.java +++ b/org/postgresql/geometric/PGpolygon.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpolygon.java,v 1.10 2004/11/09 08:48:04 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/geometric/PGpolygon.java,v 1.11 2005/01/11 08:25:45 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -98,12 +98,17 @@ public class PGpolygon extends PGobject implements Serializable, Cloneable return hash; } - public Object clone() + public Object clone() throws CloneNotSupportedException { - PGpoint ary[] = new PGpoint[points.length]; - for (int i = 0;i < points.length;i++) - ary[i] = (PGpoint)points[i].clone(); - return new PGpolygon(ary); + PGpolygon newPGpolygon = (PGpolygon) super.clone(); + if( newPGpolygon.points != null ) + { + newPGpolygon.points = (PGpoint[]) newPGpolygon.points.clone(); + for( int i = 0; i < newPGpolygon.points.length; ++i ) + if( newPGpolygon.points[i] != null ) + newPGpolygon.points[i] = (PGpoint) newPGpolygon.points[i].clone(); + } + return newPGpolygon; } /** diff --git a/org/postgresql/util/PGInterval.java b/org/postgresql/util/PGInterval.java index f3056719..71294af7 100644 --- a/org/postgresql/util/PGInterval.java +++ b/org/postgresql/util/PGInterval.java @@ -3,7 +3,7 @@ * Copyright (c) 2004-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/util/PGInterval.java,v 1.11 2007/04/11 06:54:38 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/util/PGInterval.java,v 1.12 2007/04/11 08:31:51 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -437,14 +437,4 @@ public class PGInterval extends PGobject implements Serializable, Cloneable years) * 31; } - /** - * This clones the interval - * - * @return Cloned interval - */ - public Object clone() - { - return new PGInterval(years, months, days, hours, minutes, seconds); - } - } diff --git a/org/postgresql/util/PGmoney.java b/org/postgresql/util/PGmoney.java index bc1a873e..cbd2b508 100644 --- a/org/postgresql/util/PGmoney.java +++ b/org/postgresql/util/PGmoney.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/util/PGmoney.java,v 1.10 2004/11/09 08:57:30 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/util/PGmoney.java,v 1.11 2005/01/11 08:25:49 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -86,14 +86,6 @@ public class PGmoney extends PGobject implements Serializable, Cloneable return false; } - /* - * This must be overidden to allow the object to be cloned - */ - public Object clone() - { - return new PGmoney(val); - } - public String getValue() { if (val < 0) diff --git a/org/postgresql/util/PGobject.java b/org/postgresql/util/PGobject.java index 69aab354..b0fbbac7 100644 --- a/org/postgresql/util/PGobject.java +++ b/org/postgresql/util/PGobject.java @@ -3,7 +3,7 @@ * Copyright (c) 2003-2005, PostgreSQL Global Development Group * * IDENTIFICATION -* $PostgreSQL: pgjdbc/org/postgresql/util/PGobject.java,v 1.8 2004/11/09 08:57:30 jurka Exp $ +* $PostgreSQL: pgjdbc/org/postgresql/util/PGobject.java,v 1.9 2005/01/11 08:25:49 jurka Exp $ * *------------------------------------------------------------------------- */ @@ -86,12 +86,9 @@ public class PGobject implements Serializable, Cloneable /** * This must be overidden to allow the object to be cloned */ - public Object clone() + public Object clone() throws CloneNotSupportedException { - PGobject obj = new PGobject(); - obj.type = type; - obj.value = value; - return obj; + return super.clone(); } /** [parent: 85a709e98b8f]