Open Source Repository

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



org/hibernate/engine/query/ParamLocationRecognizer.java
package org.hibernate.engine.query;

import org.hibernate.util.ArrayHelper;

import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;

/**
 * Implements a parameter parser recognizer specifically for the purpose
 * of journaling parameter locations.
 *
 @author Steve Ebersole
 */
public class ParamLocationRecognizer implements ParameterParser.Recognizer {

  public static class NamedParameterDescription {
    private final boolean jpaStyle;
    private final List positions = new ArrayList();

    public NamedParameterDescription(boolean jpaStyle) {
      this.jpaStyle = jpaStyle;
    }

    public boolean isJpaStyle() {
      return jpaStyle;
    }

    private void add(int position) {
      positions.addnew Integerposition ) );
    }

    public int[] buildPositionsArray() {
      return ArrayHelper.toIntArraypositions );
    }
  }

  private Map namedParameterDescriptions = new HashMap();
  private List ordinalParameterLocationList = new ArrayList();

  /**
   * Convenience method for creating a param location recognizer and
   * initiating the parse.
   *
   @param query The query to be parsed for parameter locations.
   @return The generated recognizer, with journaled location info.
   */
  public static ParamLocationRecognizer parseLocations(String query) {
    ParamLocationRecognizer recognizer = new ParamLocationRecognizer();
    ParameterParser.parsequery, recognizer );
    return recognizer;
  }

  /**
   * Returns the map of named parameter locations.  The map is keyed by
   * parameter name; the corresponding value is a (@link NamedParameterDescription}.
   *
   @return The map of named parameter locations.
   */
  public Map getNamedParameterDescriptionMap() {
    return namedParameterDescriptions;
  }

  /**
   * Returns the list of ordinal parameter locations.  The list elements
   * are Integers, representing the location for that given ordinal.  Thus
   {@link #getOrdinalParameterLocationList()}.elementAt(n) represents the
   * location for the nth parameter.
   *
   @return The list of ordinal parameter locations.
   */
  public List getOrdinalParameterLocationList() {
    return ordinalParameterLocationList;
  }


  // Recognition code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

  public void ordinalParameter(int position) {
    ordinalParameterLocationList.addnew Integerposition ) );
  }

  public void namedParameter(String name, int position) {
    getOrBuildNamedParameterDescriptionname, false ).addposition );
  }

  public void jpaPositionalParameter(String name, int position) {
    getOrBuildNamedParameterDescriptionname, true ).addposition );
  }

  private NamedParameterDescription getOrBuildNamedParameterDescription(String name, boolean jpa) {
    NamedParameterDescription desc = NamedParameterDescription namedParameterDescriptions.getname );
    if desc == null ) {
      desc = new NamedParameterDescriptionjpa );
      namedParameterDescriptions.putname, desc );
    }
    return desc;
  }

  public void other(char character) {
    // don't care...
  }

  public void outParameter(int position) {
    // don't care...
  }
}