View Javadoc

1   package org.apache.ojb.broker.util;
2   
3   /* Copyright 2003-2005 The Apache Software Foundation
4    *
5    * Licensed under the Apache License, Version 2.0 (the "License");
6    * you may not use this file except in compliance with the License.
7    * 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  
18  import java.lang.reflect.Constructor;
19  
20  import org.apache.ojb.broker.metadata.ClassNotPersistenceCapableException;
21  
22  /**
23   * This class helps us to construct new instances.
24   * We don't want to rely on public default constructors and
25   * have to try hard to also use private or protected constructors.
26   *
27   * @author Thomas Mahler
28   * @author Lance Eason
29   *
30   * @version $Id: ConstructorHelper.java,v 1.1 2007-08-24 22:17:36 ewestfal Exp $
31   */
32  public class ConstructorHelper
33  {
34      /**
35       * represents a zero sized parameter array
36       */
37      private static final Object[] NO_ARGS = {};
38  
39      /**
40       * no public constructor, please use the static method only.
41       */
42      private ConstructorHelper()
43      {
44      }
45  
46      /**
47       * create a new instance of class clazz.
48       * first use the public default constructor.
49       * If this fails also try to use protected an private constructors.
50       * @param clazz the class to instantiate
51       * @return the fresh instance of class clazz
52       * @throws InstantiationException
53       */
54      public static Object instantiate(Class clazz) throws InstantiationException
55      {
56          Object result = null;
57          try
58          {
59              result = ClassHelper.newInstance(clazz);
60          }
61          catch(IllegalAccessException e)
62          {
63              try
64              {
65                  result = ClassHelper.newInstance(clazz, true);
66              }
67              catch(Exception e1)
68              {
69                  throw new ClassNotPersistenceCapableException("Can't instantiate class '"
70                          + (clazz != null ? clazz.getName() : "null")
71                          + "', message was: " + e1.getMessage() + ")", e1);
72              }
73          }
74          return result;
75      }
76  
77      /**
78       * create a new instance of the class represented by the no-argument constructor provided
79       * @param constructor the zero argument constructor for the class
80       * @return a new instance of the class
81       * @throws InstantiationException
82       * @throws ClassNotPersistenceCapableException if the constructor is null or there is an
83       *   exception while trying to create a new instance
84       */
85      public static Object instantiate(Constructor constructor) throws InstantiationException
86      {
87          if(constructor == null)
88          {
89              throw new ClassNotPersistenceCapableException(
90                      "A zero argument constructor was not provided!");
91          }
92  
93          Object result = null;
94          try
95          {
96              result = constructor.newInstance(NO_ARGS);
97          }
98          catch(InstantiationException e)
99          {
100             throw e;
101         }
102         catch(Exception e)
103         {
104             throw new ClassNotPersistenceCapableException("Can't instantiate class '"
105                     + (constructor != null ? constructor.getDeclaringClass().getName() : "null")
106                     + "' with given constructor: " + e.getMessage(), e);
107         }
108         return result;
109     }
110 }