PGpath.java
上传用户:blenddy
上传日期:2007-01-07
资源大小:6495k
文件大小:3k
源码类别:

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.geometric;
  2. import java.io.*;
  3. import java.sql.*;
  4. import postgresql.util.*;
  5. /**
  6.  * This implements a path (a multiple segmented line, which may be closed)
  7.  */
  8. public class PGpath extends PGobject implements Serializable,Cloneable
  9. {
  10.   /**
  11.    * True if the path is open, false if closed
  12.    */
  13.   public boolean open;
  14.   
  15.   /**
  16.    * The points defining this path
  17.    */
  18.   public PGpoint points[];
  19.   
  20.   /**
  21.    * @param points the PGpoints that define the path
  22.    * @param open True if the path is open, false if closed
  23.    */
  24.   public PGpath(PGpoint[] points,boolean open)
  25.   {
  26.     this();
  27.     this.points = points;
  28.     this.open = open;
  29.   }
  30.   
  31.   /**
  32.    * Required by the driver
  33.    */
  34.   public PGpath()
  35.   {
  36.     setType("path");
  37.   }
  38.   
  39.   /**
  40.    * @param s definition of the circle in PostgreSQL's syntax.
  41.    * @exception SQLException on conversion failure
  42.    */
  43.   public PGpath(String s) throws SQLException
  44.   {
  45.     this();
  46.     setValue(s);
  47.   }
  48.   
  49.   /**
  50.    * @param s Definition of the path in PostgreSQL's syntax
  51.    * @exception SQLException on conversion failure
  52.    */
  53.   public void setValue(String s) throws SQLException
  54.   {
  55.     // First test to see if were open
  56.     if(s.startsWith("[") && s.endsWith("]")) {
  57.       open = true;
  58.       s = PGtokenizer.removeBox(s);
  59.     } else if(s.startsWith("(") && s.endsWith(")")) {
  60.       open = false;
  61.       s = PGtokenizer.removePara(s);
  62.     } else
  63.       throw new PSQLException("postgresql.geo.path");
  64.     
  65.     PGtokenizer t = new PGtokenizer(s,',');
  66.     int npoints = t.getSize();
  67.     points = new PGpoint[npoints];
  68.     for(int p=0;p<npoints;p++)
  69.       points[p] = new PGpoint(t.getToken(p));
  70.   }
  71.   
  72.   /**
  73.    * @param obj Object to compare with
  74.    * @return true if the two boxes are identical
  75.    */
  76.   public boolean equals(Object obj)
  77.   {
  78.     if(obj instanceof PGpath) {
  79.       PGpath p = (PGpath)obj;
  80.       
  81.       if(p.points.length != points.length)
  82. return false;
  83.       
  84.       if(p.open != open)
  85. return false;
  86.       
  87.       for(int i=0;i<points.length;i++)
  88. if(!points[i].equals(p.points[i]))
  89.   return false;
  90.       
  91.       return true;
  92.     }
  93.     return false;
  94.   }
  95.   
  96.   /**
  97.    * This must be overidden to allow the object to be cloned
  98.    */
  99.   public Object clone()
  100.   {
  101.     PGpoint ary[] = new PGpoint[points.length];
  102.     for(int i=0;i<points.length;i++)
  103.       ary[i]=(PGpoint)points[i].clone();
  104.     return new PGpath(ary,open);
  105.   }
  106.   
  107.   /**
  108.    * This returns the polygon in the syntax expected by postgresql
  109.    */
  110.   public String getValue()
  111.   {
  112.     StringBuffer b = new StringBuffer(open?"[":"(");
  113.     
  114.     for(int p=0;p<points.length;p++) {
  115.       if(p>0) b.append(",");
  116.       b.append(points[p].toString());
  117.     }    
  118.     b.append(open?"]":")");
  119.     
  120.     return b.toString();
  121.   }
  122.   
  123.   public boolean isOpen()
  124.   {
  125.     return open;
  126.   }
  127.   
  128.   public boolean isClosed()
  129.   {
  130.     return !open;
  131.   }
  132.   
  133.   public void closePath()
  134.   {
  135.     open = false;
  136.   }
  137.   
  138.   public void openPath()
  139.   {
  140.     open = true;
  141.   }
  142.   
  143. }