Open Source Repository

Home /hibernate/hibernate-3.2.6.ga | Repository Home


org/hibernate/hql/classic/PreprocessingParser.java
//$Id: PreprocessingParser.java 5063 2004-12-24 03:51:20Z pgmjsd $
package org.hibernate.hql.classic;

import org.hibernate.QueryException;
import org.hibernate.hql.CollectionProperties;
import org.hibernate.util.StringHelper;

import java.util.HashSet;
import java.util.Map;
import java.util.Set;

/**
 *
 */
public class PreprocessingParser implements Parser {

  private static final Set HQL_OPERATORS;

  static {
    HQL_OPERATORS = new HashSet();
    HQL_OPERATORS.add"<=" );
    HQL_OPERATORS.add">=" );
    HQL_OPERATORS.add"=>" );
    HQL_OPERATORS.add"=<" );
    HQL_OPERATORS.add"!=" );
    HQL_OPERATORS.add"<>" );
    HQL_OPERATORS.add"!#" );
    HQL_OPERATORS.add"!~" );
    HQL_OPERATORS.add"!<" );
    HQL_OPERATORS.add"!>" );
    HQL_OPERATORS.add"is not" );
    HQL_OPERATORS.add"not like" );
    HQL_OPERATORS.add"not in" );
    HQL_OPERATORS.add"not between" );
    HQL_OPERATORS.add"not exists" );
  }

  private Map replacements;
  private boolean quoted;
  private StringBuffer quotedString;
  private ClauseParser parser = new ClauseParser();
  private String lastToken;
  private String currentCollectionProp;

  public PreprocessingParser(Map replacements) {
    this.replacements = replacements;
  }

  public void token(String token, QueryTranslatorImpl qthrows QueryException {

    //handle quoted strings
    if quoted ) {
      quotedString.appendtoken );
    }
    if "'".equalstoken ) ) {
      if quoted ) {
        token = quotedString.toString();
      }
      else {
        quotedString = new StringBuffer20 ).appendtoken );
      }
      quoted = !quoted;
    }
    if quoted return;

    //ignore whitespace
    if ParserHelper.isWhitespacetoken ) ) return;

    //do replacements
    String substoken = String replacements.gettoken );
    token = substoken == null ? token : substoken;

    //handle HQL2 collection syntax
    if currentCollectionProp != null ) {
      if "(".equalstoken ) ) {
        return;
      }
      else if ")".equalstoken ) ) {
        currentCollectionProp = null;
        return;
      }
      else {
        token = StringHelper.qualifytoken, currentCollectionProp );
      }
    }
    else {
      String prop = CollectionProperties.getNormalizedPropertyNametoken.toLowerCase() );
      if prop != null ) {
        currentCollectionProp = prop;
        return;
      }
    }


    //handle <=, >=, !=, is not, not between, not in
    if lastToken == null ) {
      lastToken = token;
    }
    else {
      String doubleToken = token.length() ?
          lastToken + ' ' + token :
          lastToken + token;
      if HQL_OPERATORS.containsdoubleToken.toLowerCase() ) ) {
        parser.tokendoubleToken, q );
        lastToken = null;
      }
      else {
        parser.tokenlastToken, q );
        lastToken = token;
      }
    }

  }

  public void start(QueryTranslatorImpl qthrows QueryException {
    quoted = false;
    parser.start);
  }

  public void end(QueryTranslatorImpl qthrows QueryException {
    if lastToken != null parser.tokenlastToken, q );
    parser.end);
    lastToken = null;
    currentCollectionProp = null;
  }

}