/* * Copyright (C) 2011 Christopher Probst * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * * Neither the name of the 'FoxNet RMI' nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ package com.indyforge.foxnet.rmi.binding; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.SortedMap; import java.util.TreeMap; /** * This class represents an abstract binding. * * @author Christopher Probst */ public abstract class Binding extends RemoteObject { /** * */ private static final long serialVersionUID = 1L; // All interface methods (ordered by name) private final List<Method> methods; /** * Creates a new binding. * * @param id * The id of this binding. * @param interfaces * The interface classes of this binding. */ public Binding(long id, Class<?>[] interfaces) { super(id, interfaces); // This class does not allow null! if (interfaces == null) { throw new NullPointerException("interfaces"); } // Tmp hash map for storing information about the methods SortedMap<String, Method> methodMap = new TreeMap<String, Method>(); // Collect all methods for (Class<?> interfaceClass : interfaces) { // For all methods of the interface for (Method method : interfaceClass.getMethods()) { // Get the string String signature = method.getName(); // Build the string signature for (Class<?> parameterType : method.getParameterTypes()) { signature += parameterType.getName(); } // Add method if different if (!methodMap.containsKey(signature)) { // Put into map methodMap.put(signature, method); } } } // Stop here... We need methods!! if (methodMap.isEmpty()) { throw new IllegalArgumentException("The given interfaces " + "do not have any methods"); } // Get array methods = Collections.unmodifiableList(new ArrayList<Method>(methodMap .values())); } /** * @return the list which contains all methods. */ public List<Method> methods() { return methods; } /** * Checks a given method id. * * @param methodId * The method id you want to check. * @return true if the id is valid, otherwise false. */ public boolean containsMethodId(int methodId) { return methodId >= 0 && methodId < methods.size(); } /** * @return true if this is a static binding, otherwise false. */ public boolean isStatic() { return !isDynamic(); } /** * @return true if this is a dynamic binding, otherwise false. */ public abstract boolean isDynamic(); }