| /******************************************************************************* |
| * Copyright (c) 2001, 2007 Oracle Corporation and others. |
| * All rights reserved. This program and the accompanying materials |
| * are made available under the terms of the Eclipse Public License v1.0 |
| * which accompanies this distribution, and is available at |
| * http://www.eclipse.org/legal/epl-v10.html |
| * |
| * Contributors: |
| * Oracle Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.jst.jsf.common.util; |
| |
| import java.util.ArrayList; |
| import java.util.Iterator; |
| import java.util.List; |
| |
| import org.eclipse.jdt.core.IMethod; |
| import org.eclipse.jdt.core.IType; |
| import org.eclipse.jdt.core.JavaModelException; |
| import org.eclipse.jst.jsf.common.JSFCommonPlugin; |
| |
| /** |
| * A writable version of the JDTBeanProperty object |
| * |
| * @author cbateman |
| * |
| */ |
| public class JDTBeanPropertyWorkingCopy extends JDTBeanProperty |
| { |
| private final List _setters; |
| |
| /** |
| * the IMethod for the boolean "is" accessor method |
| */ |
| private IMethod _isGetter; |
| |
| /** |
| * Constructor |
| * @param type |
| */ |
| public JDTBeanPropertyWorkingCopy(IType type) |
| { |
| super(type); |
| _setters = new ArrayList(); |
| } |
| |
| /** |
| * @return the bean properties spawned from this working copy |
| * Normally, there is only one property in the array, however, |
| * since this working copy represents all properties with the same |
| * name, there could be multiple properties since setters can |
| * be overloaded by name and could result in zero or one readable |
| * properties plus zero or more write-only properties with the same |
| * name. I can't see anywhere in the spec that covers this |
| * boundary case |
| */ |
| public JDTBeanProperty toValueObject() |
| { |
| // if the isGetter is present that it takes precedence |
| // over the the normal getter |
| IMethod getter = getIsGetter() != null ? |
| getIsGetter() : getGetter(); |
| IMethod matchedSetter = null; |
| |
| if (getter != null) |
| { |
| matchedSetter = determineMatchedSetter(getter); |
| } |
| // if there's no getter than pick any setter: there |
| // are bigger problem when there's no getter than |
| // ambiguous setters |
| else if (_setters.size() > 0) |
| { |
| matchedSetter = (IMethod) _setters.get(0); |
| } |
| |
| JDTBeanProperty beanProp = new JDTBeanProperty(_type); |
| beanProp.setGetter(getter); |
| beanProp.setSetter(matchedSetter); |
| return beanProp; |
| } |
| |
| private IMethod determineMatchedSetter(IMethod getter) |
| { |
| IMethod matchedSetter = null; |
| |
| try |
| { |
| final String getterSig = |
| TypeUtil.resolveTypeSignature(_type, getter.getReturnType()); |
| |
| FIND_MATCHING_SETTER:for |
| (final Iterator it = _setters.iterator(); it.hasNext();) |
| { |
| final IMethod setter = (IMethod) it.next(); |
| if (setter.getNumberOfParameters() == 1) |
| { |
| final String paramSig = |
| TypeUtil.resolveTypeSignature |
| (_type,setter.getParameterTypes()[0]); |
| |
| if (paramSig.equals(getterSig)) |
| { |
| // we've found our match since only one |
| // setter with the same name as the getter |
| // can have the same matching type for a |
| // single arg method |
| matchedSetter = setter; |
| break FIND_MATCHING_SETTER; |
| } |
| } |
| } |
| } |
| catch (JavaModelException jme) |
| { |
| JSFCommonPlugin.log(jme, "Error determining getter return type, bean properties analysis may be inaccurate"); //$NON-NLS-1$ |
| } |
| |
| return matchedSetter; |
| } |
| |
| //@Override |
| public void setGetter(IMethod getter) { |
| super.setGetter(getter); |
| } |
| |
| /** |
| * @param isGetter |
| */ |
| public void setIsGetter(IMethod isGetter) { |
| _isGetter = isGetter; |
| } |
| |
| /** |
| * @param setter |
| */ |
| public void addSetter(IMethod setter) { |
| if (setter != null |
| && setter.getNumberOfParameters() == 1) |
| { |
| _setters.add(setter); |
| } |
| } |
| |
| /** |
| * Not supported on working copy. This is synthetically generated |
| * on toValueObject() |
| * @return nothing; throws exception |
| */ |
| public final IMethod getSetter() |
| { |
| throw new UnsupportedOperationException("Setter not calculated in working copy. Call toValueObject().getSetter()"); //$NON-NLS-1$ |
| } |
| |
| /** |
| * @return the "is" getter method or null if not found |
| */ |
| public IMethod getIsGetter() { |
| return _isGetter; |
| } |
| } |