1 package org.hibernate.engine.query;
2
3 import org.hibernate.type.Type;
4 import org.hibernate.HibernateException;
5
6 import java.io.Serializable;
7 import java.util.Map;
8 import java.util.Set;
9 import java.util.HashMap;
10
11 /**
12 * Encapsulates metadata about parameters encountered within a query.
13 *
14 * @author <a href="mailto:steve@hibernate.org">Steve Ebersole </a>
15 */
16 public class ParameterMetadata implements Serializable {
17
18 private static final OrdinalParameterDescriptor[] EMPTY_ORDINALS = new OrdinalParameterDescriptor[0];
19
20 private final OrdinalParameterDescriptor[] ordinalDescriptors;
21 private final Map namedDescriptorMap;
22
23 /**
24 * Instantiates a ParameterMetadata container.
25 *
26 * @param ordinalDescriptors
27 * @param namedDescriptorMap
28 */
29 public ParameterMetadata(OrdinalParameterDescriptor[] ordinalDescriptors, Map namedDescriptorMap) {
30 if ( ordinalDescriptors == null ) {
31 this.ordinalDescriptors = EMPTY_ORDINALS;
32 }
33 else {
34 OrdinalParameterDescriptor[] copy = new OrdinalParameterDescriptor[ ordinalDescriptors.length ];
35 System.arraycopy( ordinalDescriptors, 0, copy, 0, ordinalDescriptors.length );
36 this.ordinalDescriptors = copy;
37 }
38 if ( namedDescriptorMap == null ) {
39 this.namedDescriptorMap = java.util.Collections.EMPTY_MAP;
40 }
41 else {
42 int size = ( int ) ( ( namedDescriptorMap.size() / .75 ) + 1 );
43 Map copy = new HashMap( size );
44 copy.putAll( namedDescriptorMap );
45 this.namedDescriptorMap = java.util.Collections.unmodifiableMap( copy );
46 }
47 }
48
49 public int getOrdinalParameterCount() {
50 return ordinalDescriptors.length;
51 }
52
53 public OrdinalParameterDescriptor getOrdinalParameterDescriptor(int position) {
54 if ( position < 1 || position > ordinalDescriptors.length ) {
55 throw new IndexOutOfBoundsException( "Remember that ordinal parameters are 1-based!" );
56 }
57 return ordinalDescriptors[position - 1];
58 }
59
60 public Type getOrdinalParameterExpectedType(int position) {
61 return getOrdinalParameterDescriptor( position ).getExpectedType();
62 }
63
64 public int getOrdinalParameterSourceLocation(int position) {
65 return getOrdinalParameterDescriptor( position ).getSourceLocation();
66 }
67
68 public Set getNamedParameterNames() {
69 return namedDescriptorMap.keySet();
70 }
71
72 public NamedParameterDescriptor getNamedParameterDescriptor(String name) {
73 NamedParameterDescriptor meta = ( NamedParameterDescriptor ) namedDescriptorMap.get( name );
74 if ( meta == null ) {
75 throw new HibernateException( "could not locate named parameter [" + name + "]" );
76 }
77 return meta;
78 }
79
80 public Type getNamedParameterExpectedType(String name) {
81 return getNamedParameterDescriptor( name ).getExpectedType();
82 }
83
84 public int[] getNamedParameterSourceLocations(String name) {
85 return getNamedParameterDescriptor( name ).getSourceLocations();
86 }
87
88 }