001 /*
002 * Copyright 2002-2004 The Apache Software Foundation
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016 package org.apache.commons.clazz.reflect.standard;
017
018 import java.lang.reflect.Method;
019 import java.util.HashMap;
020 import java.util.Iterator;
021 import java.util.Map;
022
023 import org.apache.commons.clazz.reflect.ReflectedClazz;
024 import org.apache.commons.clazz.reflect.common.*;
025
026 /**
027 * A ReflectedPropertyIntrospector that discovers list (aka indexed) properties.
028 *
029 * @author <a href="mailto:dmitri@apache.org">Dmitri Plotnikov</a>
030 * @version $Id: StandardReflectedListPropertyIntrospector.java 155436 2005-02-26 13:17:48Z dirkv $
031 */
032 public class StandardReflectedListPropertyIntrospector
033 extends ReflectedListPropertyIntrospectorSupport
034 {
035 public void introspectProperties(
036 ReflectedClazz clazz,
037 Class javaClass,
038 Map parseResultMap)
039 {
040 HashMap parseResultMapSingular = new HashMap();
041 Method methods[] = javaClass.getMethods();
042 ReflectedListPropertyParseResults parseResults;
043 AccessorMethodParseResults results;
044 for (int i = 0; i < methods.length; i++) {
045 Method method = methods[i];
046
047 results = getReadAccessMethodParser().parse(method);
048 if (results != null) {
049 parseResults =
050 getParseResults(
051 clazz,
052 parseResultMap,
053 results.getPropertyName());
054 parseResults.setReadMethodParseResults(results);
055 continue;
056 }
057
058 results = getWriteAccessMethodParser().parse(method);
059 if (results != null) {
060 parseResults =
061 getParseResults(
062 clazz,
063 parseResultMap,
064 results.getPropertyName());
065 parseResults.setWriteMethodParseResults(results);
066 continue;
067 }
068
069 results = getGetAccessMethodParser().parse(method);
070 if (results != null) {
071 parseResults =
072 getParseResults(
073 clazz,
074 parseResultMapSingular,
075 results.getPropertyName());
076 parseResults.setGetMethodParseResults(results);
077 continue;
078 }
079
080 results = getSetAccessMethodParser().parse(method);
081 if (results != null) {
082 parseResults =
083 getParseResults(
084 clazz,
085 parseResultMapSingular,
086 results.getPropertyName());
087 parseResults.setSetMethodParseResults(results);
088 continue;
089 }
090 }
091
092 Iterator iter = parseResultMap.entrySet().iterator();
093 while (iter.hasNext()) {
094 Map.Entry entry = (Map.Entry) iter.next();
095 ReflectedListPropertyParseResults result =
096 (ReflectedListPropertyParseResults) entry.getValue();
097
098 Class propertyType = result.getPropertyType();
099 Class componentType = result.getContentType();
100
101 if (propertyType != null
102 && (!propertyType.isArray()
103 || (componentType != null
104 && propertyType.getComponentType() != componentType))) {
105 iter.remove(); // @todo verify that this actually works
106 }
107 }
108
109 mergeSingularMethods(parseResultMap, parseResultMapSingular);
110 }
111
112 /**
113 * With the standard JavaBean indexed properties the plural form is the same
114 * as the singular form.
115 */
116 protected boolean isCorrectPluralForm(String singular, String plural) {
117 return singular.equals(plural);
118 }
119 }