/******************************************************************************* * Copyright (c) 2001, 2005 IBM 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: * IBM Corporation - initial API and implementation *******************************************************************************/ package org.eclipse.jem.internal.beaninfo.vm; /* */ import java.beans.*; import java.util.*; /** * Equality tester for MethodDescriptors */ public class MethodDescriptorEquality extends FeatureDescriptorEquality { static void INIT() { try { MAP_EQUALITY.put(MethodDescriptor.class, (MethodDescriptorEquality.class).getConstructor(new Class[] {MethodDescriptor.class})); } catch (NoSuchMethodException e) { } } private ArrayList fParameterDescriptors; // Array of ParameterDescriptorEquality's. public MethodDescriptorEquality() { } public MethodDescriptorEquality(MethodDescriptor descr) { super(descr); } /** * A new feature is being set into this object, * clear any cache members so that they can be reconstructed. * * NOTE: Subclasses - remember to call super.clearFeature(); */ protected void clearFeature() { super.clearFeature(); fParameterDescriptors = null; } protected ArrayList parameterDescriptors() { if (fParameterDescriptors == null) { ParameterDescriptor[] pds = ((MethodDescriptor) fFeature).getParameterDescriptors(); if (pds != null) { fParameterDescriptors = new ArrayList(pds.length); for (int i=0; i<pds.length; i++) fParameterDescriptors.add(new ParameterDescriptorEquality(pds[i])); } } return fParameterDescriptors; } /** * Calculate the hashcode for the current feature, add this * to the hashcode received from super.calculateHashCode * and return the new value. * * NOTE: for subclasses, it is MANDITORY that the first line be: * int hashcode = super.calculateHashCode(); * and the last line be: * return hashcode*31 + (your calculated hashcode for just this subclass); */ protected int calculateHashCode() { int hashcode = super.calculateHashCode(); MethodDescriptor bd = (MethodDescriptor) fFeature; int hc = bd.getMethod().hashCode(); if (parameterDescriptors() != null) hc += parameterDescriptors().hashCode(); return hashcode*31 + hc; } public boolean equals(Object obj) { if (identityTest(obj)) return true; if (!super.equals(obj)) return false; MethodDescriptorEquality oem = (MethodDescriptorEquality) obj; MethodDescriptor om = (MethodDescriptor) oem.fFeature; MethodDescriptor fm = (MethodDescriptor) fFeature; if (fm.getMethod() != om.getMethod()) return false; if (fParameterDescriptors != null || oem.fParameterDescriptors != null) { // We are in a Map lookup situation, so one side has listener method equalities, so we will compare that way. if (parameterDescriptors() == null) if (((MethodDescriptorEquality) obj).parameterDescriptors() != null) return false; else ; else if (!parameterDescriptors().equals(((MethodDescriptorEquality) obj).parameterDescriptors())) return false; } else { // We are in the building the list phases, don't waste space building entire list. ParameterDescriptor[] ours = fm.getParameterDescriptors(); ParameterDescriptor[] theirs = om.getParameterDescriptors(); if (ours == theirs) return true; else if (ours == null) if (theirs != null) return false; else ; else if (theirs == null) return false; else if (ours.length != theirs.length) return false; else if (ours.length > 0) { ParameterDescriptorEquality workingOurs = new ParameterDescriptorEquality(); ParameterDescriptorEquality workingThiers = new ParameterDescriptorEquality(); for (int i = 0; i < ours.length; i++) { workingOurs.setFeature(ours[i]); workingThiers.setFeature(theirs[i]); if (!workingOurs.equals(workingThiers)) return false; } } } return true; } }