/*
 * 
 * Copyright 2004 Sun Microsystems, Inc. All Rights Reserved.
 * 
 * The contents of this file are subject to the Sun Community Source
 * License v3.0/Jini Technology Specific Attachment v 1.0 (the
 * "License"). You may not use this file except in compliance with the
 * License. You may obtain a copy of the License at
 * http://wwws.sun.com/software/jini/licensing/SCSL3_JiniTSA1.html.
 * Software distributed under the License is distributed on an "AS IS"
 * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See
 * the License for the specific language governing rights and limitations
 * under the License.
 * 
 * The Reference Code is Jini Technology Core Platform code, v2.0. The
 * Developer of the Reference Code is Sun Microsystems, Inc.
 * 
 * Contributor(s): Sun Microsystems, Inc.
 * 
 */

package net.jini.core.constraint;

import java.lang.reflect.Method;
import java.util.Iterator;

/**
 * Defines an immutable mapping from {@link Method} to
 * {@link InvocationConstraints}, used to specify per-method constraints.
 * <p>
 * An instance of this interface must implement {@link Object#equals
 * Object.equals} to return <code>true</code> when passed a mapping that is
 * equivalent in trust, content, and function, and to return <code>false</code>
 * otherwise. That is, the <code>equals</code> method must be a sufficient
 * substitute for
 * {@link net.jini.security.proxytrust.TrustEquivalence#checkTrustEquivalence
 * TrustEquivalence.checkTrustEquivalence}.
 *
 * @author Sun Microsystems, Inc.
 * @since 2.0
 */
public interface MethodConstraints {
    /**
     * Returns the constraints for the specified method as a
     * non-<code>null</code> value. The same constraints are always returned
     * for any given <code>Method</code> instance and for any equivalent
     * <code>Method</code> instance. Note that no exception is thrown for
     * "unknown" methods; a constraints instance is always returned.
     *
     * @param method the method
     * @return the constraints for the specified method as a
     * non-<code>null</code> value
     * @throws NullPointerException if the argument is <code>null</code>
     */
    InvocationConstraints getConstraints(Method method);

    /**
     * Returns an iterator that yields all of the possible distinct
     * constraints that can be returned by {@link #getConstraints
     * getConstraints}, in arbitrary order and with duplicates permitted. The
     * iterator throws an {@link UnsupportedOperationException} on any
     * attempt to remove an element.
     *
     * @return an iterator that yields all of the possible distinct
     * constraints that can be returned by <code>getConstraints</code>,
     * in arbitrary order and with duplicates permitted
     */
    Iterator possibleConstraints();
}
