// Copyright (C) 2000 by Prevas AB. All rights reserved. package se.arexis.agdb.util; import java.util.*; import java.io.*; public class GqlScanner { private String m_gqlString = null; private String m_workingstring = null; private String m_nextToken = null; // Default constructor public GqlScanner() { m_nextToken = null; } // Constructs the class with working string set to sNewString public GqlScanner(String sNewString) { m_gqlString = new String(sNewString); // The trim() at the end of the row below is crucial in // setNextToken(). Without it we might run into an // ArrayOutOfBoundsException. m_workingstring = m_gqlString.toString().trim(); setNextToken(); } // Sets the working string public void setQGLString(String sNewString) { m_gqlString = new String(sNewString); m_workingstring = m_gqlString.toString(); setNextToken(); } // Returns the working string public String getGQLString() { return m_gqlString.toString(); } // Returns the next token if any, otherwise null public String getNextToken() { String temp = m_nextToken.toString(); setNextToken(); return temp; } public boolean hasMoreTokens() { if (m_nextToken != null) return true; else return false; } private void setNextToken() { // Check if there are no more tokens if (m_workingstring == null || m_workingstring.length() == 0) { m_workingstring = null; m_nextToken = null; return; } // skip white spaces in the beginning of tokens int i = 0; while(m_workingstring.charAt(i) == ' ') i++; m_workingstring = m_workingstring.substring(i); i = 0; // First we check for single char tokens char ch = m_workingstring.charAt(i); if (ch == '(' || ch == ')' || ch == '=' || ch == ' ' || ch == '<' || ch == '>' || ch == '\n' || ch == '\r' || ch == '\t' || ch == ',') { m_nextToken = m_workingstring.substring(0, 1); m_workingstring = m_workingstring.substring(1); } else if (ch == '!') { if(m_workingstring.charAt(i+1) == '=') { m_nextToken = m_workingstring.substring(0, 2); m_workingstring = m_workingstring.substring(2); } else { m_nextToken = m_workingstring.substring(0, 1); m_workingstring = m_workingstring.substring(1); } } else { // This token is composed by more than one char i++; boolean complete = false; while(!complete && i < m_workingstring.length()) { ch = m_workingstring.charAt(i); if (ch == '(' || ch == ')' || ch == '=' || ch == '!' || ch == ' ' || ch == '<' || ch == '>' || ch == '\n' || ch == '\r' || ch == '\t' || ch == ',') { complete = true; continue; } i++; } m_nextToken = m_workingstring.substring(0, i); m_workingstring = m_workingstring.substring(i); } } }