View Javadoc
1   /**
2    * Redistribution and use of this software and associated documentation ("Software"), with or
3    * without modification, are permitted provided that the following conditions are met:
4    *
5    * 1. Redistributions of source code must retain copyright statements and notices. Redistributions
6    * must also contain a copy of this document.
7    *
8    * 2. Redistributions in binary form must reproduce the above copyright notice, this list of
9    * conditions and the following disclaimer in the documentation and/or other materials provided with
10   * the distribution.
11   *
12   * 3. The name "Exolab" must not be used to endorse or promote products derived from this Software
13   * without prior written permission of Intalio, Inc. For written permission, please contact
14   * info@exolab.org.
15   *
16   * 4. Products derived from this Software may not be called "Exolab" nor may "Exolab" appear in
17   * their names without prior written permission of Intalio, Inc. Exolab is a registered trademark of
18   * Intalio, Inc.
19   *
20   * 5. Due credit should be given to the Exolab Project (http://www.exolab.org/).
21   *
22   * THIS SOFTWARE IS PROVIDED BY INTALIO, INC. AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESSED OR
23   * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
24   * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INTALIO, INC. OR ITS
25   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26   * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
27   * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
28   * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY
29   * WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30   *
31   * Copyright 1999-2003 (C) Intalio, Inc. All Rights Reserved.
32   *
33   * $Id: MappingTool.java 6026 2006-06-28 07:24:40Z wguttmn $
34   */
35  package org.exolab.castor.tools;
36  
37  import java.lang.reflect.Array;
38  
39  import org.castor.xml.JavaNaming;
40  import org.exolab.castor.mapping.loader.AbstractMappingLoader;
41  
42  /**
43   * Extend mapping loader to give us access to the findAccessor method.
44   */
45  public final class MappingToolMappingLoader {
46    /**
47     * The {@link JavaNaming} implementation to use.
48     * 
49     * @since 1.1.3
50     */
51    private JavaNaming _javaNaming;
52  
53    /**
54     * A MappingToolMappingLoader needs a javaNaming to be set.
55     * 
56     * @param javaNaming the {@link JavaNaming} implementation to use
57     */
58    public MappingToolMappingLoader(final JavaNaming javaNaming) {
59      _javaNaming = javaNaming;
60    }
61  
62    /**
63     * Returns true if the get method returns an array. This method is used for greater compatability
64     * with generated descriptors.
65     * 
66     * @param clazz the Class to find an accessor in
67     * @param fieldName the field for which an accessor is sought
68     * @param type the returning type of the accessor
69     * @return if get method returns an array.
70     **/
71    public boolean returnsArray(final Class clazz, final String fieldName, final Class type) {
72      try {
73        Class array = null;
74        if (type.isArray()) {
75          array = type;
76        } else {
77          array = Array.newInstance(type, 0).getClass();
78        }
79        // -- getMethod
80        String method = _javaNaming.getGetMethodNameForField(fieldName);
81        boolean isGet = true;
82        if (AbstractMappingLoader.findAccessor(clazz, method, array, isGet) != null) {
83          return true;
84        }
85      } catch (Exception ex) {
86        // nothing to do
87      }
88      return false;
89    }
90  
91    /**
92     * Checks if any accessor for a certain field exists.
93     * 
94     * @param clazz the Class to search in
95     * @param fieldName the field to search an accessor for
96     * @param type the return type the accessor should have
97     * @return true if a matching accessor could be found
98     */
99    public boolean canFindAccessors(final Class clazz, final String fieldName, final Class type) {
100     try {
101       String methodName = null;
102 
103       // -- getMethod
104       methodName = _javaNaming.getGetMethodNameForField(fieldName);
105       boolean isGet = true;
106       if (AbstractMappingLoader.findAccessor(clazz, methodName, type, isGet) != null) {
107         return true;
108       }
109 
110       // -- setMethod and/or addMethod
111       isGet = false;
112       methodName = _javaNaming.getSetMethodNameForField(fieldName);
113       if (AbstractMappingLoader.findAccessor(clazz, methodName, type, isGet) != null) {
114         return true;
115       }
116       methodName = _javaNaming.getAddMethodNameForField(fieldName);
117       if (AbstractMappingLoader.findAccessor(clazz, methodName, type, isGet) != null) {
118         return true;
119       }
120     } catch (Exception ex) {
121       // nothing to do
122     }
123     return false;
124   }
125 }