mirror of
https://github.com/postgres/postgres.git
synced 2025-09-03 15:22:11 +03:00
198 lines
4.8 KiB
Java
198 lines
4.8 KiB
Java
package postgresql.util;
|
|
|
|
import java.sql.*;
|
|
import java.util.*;
|
|
|
|
/**
|
|
* This class is used to tokenize the text output of postgres.
|
|
*
|
|
* <p>It's mainly used by the geometric classes, but is useful in parsing any
|
|
* output from custom data types output from postgresql.
|
|
*
|
|
* @see postgresql.geometric.PGbox
|
|
* @see postgresql.geometric.PGcircle
|
|
* @see postgresql.geometric.PGlseg
|
|
* @see postgresql.geometric.PGpath
|
|
* @see postgresql.geometric.PGpoint
|
|
* @see postgresql.geometric.PGpolygon
|
|
*/
|
|
public class PGtokenizer
|
|
{
|
|
// Our tokens
|
|
protected Vector tokens;
|
|
|
|
/**
|
|
* Create a tokeniser.
|
|
*
|
|
* <p>We could have used StringTokenizer to do this, however, we needed to
|
|
* handle nesting of '(' ')' '[' ']' '<' and '>' as these are used
|
|
* by the geometric data types.
|
|
*
|
|
* @param string containing tokens
|
|
* @param delim single character to split the tokens
|
|
*/
|
|
public PGtokenizer(String string,char delim)
|
|
{
|
|
tokenize(string,delim);
|
|
}
|
|
|
|
/**
|
|
* This resets this tokenizer with a new string and/or delimiter.
|
|
*
|
|
* @param string containing tokens
|
|
* @param delim single character to split the tokens
|
|
*/
|
|
public int tokenize(String string,char delim)
|
|
{
|
|
tokens = new Vector();
|
|
|
|
// nest holds how many levels we are in the current token.
|
|
// if this is > 0 then we don't split a token when delim is matched.
|
|
//
|
|
// The Geometric datatypes use this, because often a type may have others
|
|
// (usualls PGpoint) imbedded within a token.
|
|
//
|
|
// Peter 1998 Jan 6 - Added < and > to the nesting rules
|
|
int nest=0,p,s;
|
|
|
|
for(p=0,s=0;p<string.length();p++) {
|
|
char c = string.charAt(p);
|
|
|
|
// increase nesting if an open character is found
|
|
if(c == '(' || c == '[' || c == '<')
|
|
nest++;
|
|
|
|
// decrease nesting if a close character is found
|
|
if(c == ')' || c == ']' || c == '>')
|
|
nest--;
|
|
|
|
if(nest==0 && c==delim) {
|
|
tokens.addElement(string.substring(s,p));
|
|
s=p+1; // +1 to skip the delimiter
|
|
}
|
|
|
|
}
|
|
|
|
// Don't forget the last token ;-)
|
|
if(s<string.length())
|
|
tokens.addElement(string.substring(s));
|
|
|
|
return tokens.size();
|
|
}
|
|
|
|
/**
|
|
* @return the number of tokens available
|
|
*/
|
|
public int getSize()
|
|
{
|
|
return tokens.size();
|
|
}
|
|
|
|
/**
|
|
* @param n Token number ( 0 ... getSize()-1 )
|
|
* @return The token value
|
|
*/
|
|
public String getToken(int n)
|
|
{
|
|
return (String)tokens.elementAt(n);
|
|
}
|
|
|
|
/**
|
|
* This returns a new tokenizer based on one of our tokens.
|
|
*
|
|
* The geometric datatypes use this to process nested tokens (usually
|
|
* PGpoint).
|
|
*
|
|
* @param n Token number ( 0 ... getSize()-1 )
|
|
* @param delim The delimiter to use
|
|
* @return A new instance of PGtokenizer based on the token
|
|
*/
|
|
public PGtokenizer tokenizeToken(int n,char delim)
|
|
{
|
|
return new PGtokenizer(getToken(n),delim);
|
|
}
|
|
|
|
/**
|
|
* This removes the lead/trailing strings from a string
|
|
* @param s Source string
|
|
* @param l Leading string to remove
|
|
* @param t Trailing string to remove
|
|
* @return String without the lead/trailing strings
|
|
*/
|
|
public static String remove(String s,String l,String t)
|
|
{
|
|
if(s.startsWith(l)) s = s.substring(l.length());
|
|
if(s.endsWith(t)) s = s.substring(0,s.length()-t.length());
|
|
return s;
|
|
}
|
|
|
|
/**
|
|
* This removes the lead/trailing strings from all tokens
|
|
* @param l Leading string to remove
|
|
* @param t Trailing string to remove
|
|
*/
|
|
public void remove(String l,String t)
|
|
{
|
|
for(int i=0;i<tokens.size();i++) {
|
|
tokens.setElementAt(remove((String)tokens.elementAt(i),l,t),i);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Removes ( and ) from the beginning and end of a string
|
|
* @param s String to remove from
|
|
* @return String without the ( or )
|
|
*/
|
|
public static String removePara(String s)
|
|
{
|
|
return remove(s,"(",")");
|
|
}
|
|
|
|
/**
|
|
* Removes ( and ) from the beginning and end of all tokens
|
|
* @return String without the ( or )
|
|
*/
|
|
public void removePara()
|
|
{
|
|
remove("(",")");
|
|
}
|
|
|
|
/**
|
|
* Removes [ and ] from the beginning and end of a string
|
|
* @param s String to remove from
|
|
* @return String without the [ or ]
|
|
*/
|
|
public static String removeBox(String s)
|
|
{
|
|
return remove(s,"[","]");
|
|
}
|
|
|
|
/**
|
|
* Removes [ and ] from the beginning and end of all tokens
|
|
* @return String without the [ or ]
|
|
*/
|
|
public void removeBox()
|
|
{
|
|
remove("[","]");
|
|
}
|
|
|
|
/**
|
|
* Removes < and > from the beginning and end of a string
|
|
* @param s String to remove from
|
|
* @return String without the < or >
|
|
*/
|
|
public static String removeAngle(String s)
|
|
{
|
|
return remove(s,"<",">");
|
|
}
|
|
|
|
/**
|
|
* Removes < and > from the beginning and end of all tokens
|
|
* @return String without the < or >
|
|
*/
|
|
public void removeAngle()
|
|
{
|
|
remove("<",">");
|
|
}
|
|
}
|