/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership. The ASF licenses this file
 * to you under the Apache License, Version 2.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://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

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}.
 *
 * 
 * @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();
}
