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

数据库系统

开发平台:

Unix_Linux

  1. package postgresql.util;
  2. import java.sql.*;
  3. import java.util.*;
  4. /**
  5.  * This class is used to tokenize the text output of postgres.
  6.  *
  7.  * <p>It's mainly used by the geometric classes, but is useful in parsing any
  8.  * output from custom data types output from postgresql.
  9.  *
  10.  * @see postgresql.geometric.PGbox
  11.  * @see postgresql.geometric.PGcircle
  12.  * @see postgresql.geometric.PGlseg
  13.  * @see postgresql.geometric.PGpath
  14.  * @see postgresql.geometric.PGpoint
  15.  * @see postgresql.geometric.PGpolygon
  16.  */
  17. public class PGtokenizer
  18. {
  19.   // Our tokens
  20.   protected Vector tokens;
  21.   
  22.   /**
  23.    * Create a tokeniser.
  24.    *
  25.    * <p>We could have used StringTokenizer to do this, however, we needed to
  26.    * handle nesting of '(' ')' '[' ']' '&lt;' and '&gt;' as these are used
  27.    * by the geometric data types.
  28.    *
  29.    * @param string containing tokens
  30.    * @param delim single character to split the tokens
  31.    */
  32.   public PGtokenizer(String string,char delim)
  33.   {
  34.     tokenize(string,delim);
  35.   }
  36.   
  37.   /**
  38.    * This resets this tokenizer with a new string and/or delimiter.
  39.    *
  40.    * @param string containing tokens
  41.    * @param delim single character to split the tokens
  42.    */
  43.   public int tokenize(String string,char delim)
  44.   {
  45.     tokens = new Vector();
  46.     
  47.     // nest holds how many levels we are in the current token.
  48.     // if this is > 0 then we don't split a token when delim is matched.
  49.     //
  50.     // The Geometric datatypes use this, because often a type may have others
  51.     // (usualls PGpoint) imbedded within a token.
  52.     //
  53.     // Peter 1998 Jan 6 - Added < and > to the nesting rules
  54.     int nest=0,p,s;
  55.     
  56.     for(p=0,s=0;p<string.length();p++) {
  57.       char c = string.charAt(p);
  58.       
  59.       // increase nesting if an open character is found
  60.       if(c == '(' || c == '[' || c == '<')
  61. nest++;
  62.       
  63.       // decrease nesting if a close character is found
  64.       if(c == ')' || c == ']' || c == '>')
  65. nest--;
  66.       
  67.       if(nest==0 && c==delim) {
  68. tokens.addElement(string.substring(s,p));
  69. s=p+1; // +1 to skip the delimiter
  70.       }
  71.       
  72.     }
  73.     
  74.     // Don't forget the last token ;-)
  75.     if(s<string.length())
  76.       tokens.addElement(string.substring(s));
  77.     
  78.     return tokens.size();
  79.   }
  80.   
  81.   /**
  82.    * @return the number of tokens available
  83.    */
  84.   public int getSize()
  85.   {
  86.     return tokens.size();
  87.   }
  88.   
  89.   /**
  90.    * @param n Token number ( 0 ... getSize()-1 )
  91.    * @return The token value
  92.    */
  93.   public String getToken(int n)
  94.   {
  95.     return (String)tokens.elementAt(n);
  96.   }
  97.   
  98.   /**
  99.    * This returns a new tokenizer based on one of our tokens.
  100.    *
  101.    * The geometric datatypes use this to process nested tokens (usually
  102.    * PGpoint).
  103.    *
  104.    * @param n Token number ( 0 ... getSize()-1 )
  105.    * @param delim The delimiter to use
  106.    * @return A new instance of PGtokenizer based on the token
  107.    */
  108.   public PGtokenizer tokenizeToken(int n,char delim)
  109.   {
  110.     return new PGtokenizer(getToken(n),delim);
  111.   }
  112.   
  113.   /**
  114.    * This removes the lead/trailing strings from a string
  115.    * @param s Source string
  116.    * @param l Leading string to remove
  117.    * @param t Trailing string to remove
  118.    * @return String without the lead/trailing strings
  119.    */
  120.   public static String remove(String s,String l,String t)
  121.   {
  122.     if(s.startsWith(l)) s = s.substring(l.length());
  123.     if(s.endsWith(t)) s = s.substring(0,s.length()-t.length());
  124.     return s;
  125.   }
  126.   
  127.   /**
  128.    * This removes the lead/trailing strings from all tokens
  129.    * @param l Leading string to remove
  130.    * @param t Trailing string to remove
  131.    */
  132.   public void remove(String l,String t)
  133.   {
  134.     for(int i=0;i<tokens.size();i++) {
  135.       tokens.setElementAt(remove((String)tokens.elementAt(i),l,t),i);
  136.     }
  137.   }
  138.   
  139.   /**
  140.    * Removes ( and ) from the beginning and end of a string
  141.    * @param s String to remove from
  142.    * @return String without the ( or )
  143.    */
  144.   public static String removePara(String s)
  145.   {
  146.     return remove(s,"(",")");
  147.   }
  148.   
  149.   /**
  150.    * Removes ( and ) from the beginning and end of all tokens
  151.    * @return String without the ( or )
  152.    */
  153.   public void removePara()
  154.   {
  155.     remove("(",")");
  156.   }
  157.   
  158.   /**
  159.    * Removes [ and ] from the beginning and end of a string
  160.    * @param s String to remove from
  161.    * @return String without the [ or ]
  162.    */
  163.   public static String removeBox(String s)
  164.   {
  165.     return remove(s,"[","]");
  166.   }
  167.   
  168.   /**
  169.    * Removes [ and ] from the beginning and end of all tokens
  170.    * @return String without the [ or ]
  171.    */
  172.   public void removeBox()
  173.   {
  174.     remove("[","]");
  175.   }
  176.   
  177.   /**
  178.    * Removes &lt; and &gt; from the beginning and end of a string
  179.    * @param s String to remove from
  180.    * @return String without the &lt; or &gt;
  181.    */
  182.   public static String removeAngle(String s)
  183.   {
  184.     return remove(s,"<",">");
  185.   }
  186.   
  187.   /**
  188.    * Removes &lt; and &gt; from the beginning and end of all tokens
  189.    * @return String without the &lt; or &gt;
  190.    */
  191.   public void removeAngle()
  192.   {
  193.     remove("<",">");
  194.   }
  195. }