1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one or more
3    * contributor license agreements.  See the NOTICE file distributed with
4    * this work for additional information regarding copyright ownership.
5    * The ASF licenses this file to You under the Apache License, Version 2.0
6    * (the "License"); you may not use this file except in compliance with
7    * the License.  You may obtain a copy of the License at
8    *
9    *      http://www.apache.org/licenses/LICENSE-2.0
10   *
11   * Unless required by applicable law or agreed to in writing, software
12   * distributed under the License is distributed on an "AS IS" BASIS,
13   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14   * See the License for the specific language governing permissions and
15   * limitations under the License.
16   */
17  package org.apache.commons.dbutils;
18  
19  import java.lang.reflect.InvocationHandler;
20  import java.lang.reflect.Method;
21  import java.sql.ResultSetMetaData;
22  
23  /**
24   * MockResultSetMetaData dynamically implements the ResultSetMetaData 
25   * interface.
26   */
27  public class MockResultSetMetaData implements InvocationHandler {
28  
29      private String[] columnNames = null;
30  
31      /**
32       * Create a <code>MockResultSetMetaData</code> proxy object.  This is 
33       * equivalent to:
34       * <pre>
35       * ProxyFactory.instance().createResultSetMetaData(new MockResultSetMetaData(columnNames));
36       * </pre>
37       * 
38       * @param columnNames
39       * @return the proxy object
40       */
41      public static ResultSetMetaData create(String[] columnNames) {
42          return ProxyFactory.instance().createResultSetMetaData(
43              new MockResultSetMetaData(columnNames));
44      }
45  
46      public MockResultSetMetaData(String[] columnNames) {
47          super();
48          this.columnNames = columnNames;
49  
50      }
51  
52      public Object invoke(Object proxy, Method method, Object[] args)
53          throws Throwable {
54  
55          String methodName = method.getName();
56  
57          if (methodName.equals("getColumnCount")) {
58              return new Integer(this.columnNames.length);
59  
60          } else if (
61              methodName.equals("getColumnName")
62                  || methodName.equals("getColumnLabel")) {
63  
64              int col = ((Integer) args[0]).intValue() - 1;
65              return this.columnNames[col];
66  
67          } else if (methodName.equals("hashCode")) {
68              return new Integer(System.identityHashCode(proxy));
69  
70          } else if (methodName.equals("toString")) {
71              return "MockResultSetMetaData " + System.identityHashCode(proxy);
72  
73          } else if (methodName.equals("equals")) { 
74              return new Boolean(proxy == args[0]); 
75  
76          } else {
77              throw new UnsupportedOperationException("Unsupported method: " + methodName);
78          }
79      }
80  }