/*
* Hibernate, Relational Persistence for Idiomatic Java
*
* Copyright (c) 2008, Red Hat Middleware LLC or third-party contributors as
* indicated by the @author tags or express copyright attribution
* statements applied by the authors. All third-party contributions are
* distributed under license by Red Hat Middleware LLC.
*
* This copyrighted material is made available to anyone wishing to use, modify,
* copy, or redistribute it subject to the terms and conditions of the GNU
* Lesser General Public License, as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License
* for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this distribution; if not, write to:
* Free Software Foundation, Inc.
* 51 Franklin Street, Fifth Floor
* Boston, MA 02110-1301 USA
*
*/
package org.hibernate.engine.query.spi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.hibernate.internal.util.collections.ArrayHelper;
Implements a parameter parser recognizer specifically for the purpose
of journaling parameter locations.
Author: Steve Ebersole
/**
* Implements a parameter parser recognizer specifically for the purpose
* of journaling parameter locations.
*
* @author Steve Ebersole
*/
public class ParamLocationRecognizer implements ParameterParser.Recognizer {
Internal representation of a recognized named parameter
/**
* Internal representation of a recognized named parameter
*/
public static class NamedParameterDescription {
private final boolean jpaStyle;
private final List<Integer> positions = new ArrayList<Integer>();
NamedParameterDescription(boolean jpaStyle) {
this.jpaStyle = jpaStyle;
}
public boolean isJpaStyle() {
return jpaStyle;
}
private void add(int position) {
positions.add( position );
}
public int[] buildPositionsArray() {
return ArrayHelper.toIntArray( positions );
}
}
private Map<String, NamedParameterDescription> namedParameterDescriptions = new HashMap<String, NamedParameterDescription>();
private List<Integer> ordinalParameterLocationList = new ArrayList<Integer>();
Convenience method for creating a param location recognizer and
initiating the parse.
Params: - query – The query to be parsed for parameter locations.
Returns: The generated recognizer, with journaled location info.
/**
* 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) {
final ParamLocationRecognizer recognizer = new ParamLocationRecognizer();
ParameterParser.parse( query, recognizer );
return recognizer;
}
Returns the map of named parameter locations. The map is keyed by
parameter name; the corresponding value is a (@link NamedParameterDescription}.
Returns: The map of named parameter locations.
/**
* 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<String, NamedParameterDescription> getNamedParameterDescriptionMap() {
return namedParameterDescriptions;
}
Returns the list of ordinal parameter locations. The list elements are Integers, representing the location for that given ordinal. Thus calling getOrdinalParameterLocationList().elementAt(n)
represents the location for the nth parameter. Returns: The list of ordinal parameter locations.
/**
* Returns the list of ordinal parameter locations. The list elements
* are Integers, representing the location for that given ordinal. Thus calling
* {@code getOrdinalParameterLocationList().elementAt(n)} represents the
* location for the nth parameter.
*
* @return The list of ordinal parameter locations.
*/
public List<Integer> getOrdinalParameterLocationList() {
return ordinalParameterLocationList;
}
// Recognition code ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@Override
public void ordinalParameter(int position) {
ordinalParameterLocationList.add( position );
}
@Override
public void namedParameter(String name, int position) {
getOrBuildNamedParameterDescription( name, false ).add( position );
}
@Override
public void jpaPositionalParameter(String name, int position) {
getOrBuildNamedParameterDescription( name, true ).add( position );
}
private NamedParameterDescription getOrBuildNamedParameterDescription(String name, boolean jpa) {
NamedParameterDescription desc = namedParameterDescriptions.get( name );
if ( desc == null ) {
desc = new NamedParameterDescription( jpa );
namedParameterDescriptions.put( name, desc );
}
return desc;
}
@Override
public void other(char character) {
// don't care...
}
@Override
public void outParameter(int position) {
// don't care...
}
}