/*
* 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.lookup;
import net.jini.core.lookup.ServiceItem;
/**
* The <code>ServiceItemFilter</code> interface defines the methods used by
* an object such as the {@link net.jini.lookup.ServiceDiscoveryManager
* ServiceDiscoveryManager} or the {@link net.jini.lookup.LookupCache
* LookupCache} to apply additional selection criteria when searching for
* services in which an entity has registered interest. It is the
* responsibility of the entity requesting the application of additional
* criteria to construct an implementation of this interface that defines
* the additional criteria, and to pass the resulting object (referred to
* as a <i>filter</i>) into the object that will apply it.
* <p>
* The filtering mechanism provided by implementations of this interface is
* particularly useful to entities that wish to extend the capabilities of
* the standard template matching scheme. For example, because template
* matching does not allow one to search for services based on a range of
* attribute values, this additional matching mechanism can be exploited by
* the entity to ask the managing object to find all registered printer
* services that have a resolution attribute between say, 300 dpi and
* 1200 dpi.
* <p>
* In addition to (or instead of) applying additional matching criteria to
* candidate service proxies initially found through template matching, this
* filtering mechanism can also be used to extend the selection process so
* that only proxies that are <i>safe</i> to use are returned to the entity.
* To do this, the entity would use this interface to supply the
* {@link net.jini.lookup.ServiceDiscoveryManager ServiceDiscoveryManager}
* or {@link net.jini.lookup.LookupCache LookupCache} with a filter that,
* when applied to a candidate proxy, performs a set of operations that
* is referred to as <i>proxy preparation</i>. As described in the
* documentation for {@link net.jini.security.ProxyPreparer}, proxy
* preparation typically includes operations such as, verifying trust
* in the proxy, specifying client constraints, and dynamically granting
* necessary permissions to the proxy.
*
* @author Sun Microsystems, Inc.
*
* @see ServiceDiscoveryManager
*/
public interface ServiceItemFilter {
/**
* This method defines the implementation of the additional selection
* criteria (additional matching and/or proxy preparation) to apply to a
* {@link net.jini.core.lookup.ServiceItem ServiceItem} object found
* through standard template matching. This method takes one argument:
* the {@link net.jini.core.lookup.ServiceItem ServiceItem} object to
* test against the additional criteria.
* <p>
* Neither a <code>null</code> reference nor a
* {@link net.jini.core.lookup.ServiceItem ServiceItem} object containing
* <code>null</code> fields will be passed to this method by the
* {@link net.jini.lookup.ServiceDiscoveryManager ServiceDiscoveryManager}
* or the {@link net.jini.lookup.LookupCache LookupCache}.
* <p>
* If the parameter passed to this method is a
* {@link net.jini.core.lookup.ServiceItem ServiceItem} object that has
* non-<code>null</code> fields but is associated with attribute sets
* containing <code>null</code> entries, then this method must process
* that parameter in a reasonable manner.
* <p>
* Note that although this method returns a <code>boolean</code>, there
* are actually three possible return states that can occur. Those states
* are classified by the value of the returned <code>boolean</code> in
* combination with the (possibly modified) contents of the
* {@link net.jini.core.lookup.ServiceItem ServiceItem} object that was
* input to this method. The three possible return states can be
* summarized as follows:
* <p>
* <ul>
* <li> If the input object satisfies any additional matching criteria
* that are specified, and if the proxy is successfully prepared
* (when requested), then this method returns <code>true</code>
* and the service field of the
* {@link net.jini.core.lookup.ServiceItem ServiceItem} parameter
* is either left unchanged (when proxy preparation is not
* requested) or is <b><i>replaced</b></i> with the prepared proxy.
* When this state is returned by this method, it is said that the
* object <i>passed</i> (the <code>check</code> method of) the
* filter; or that the filter returned a <i>pass</i> condition.
* <li> If either the input object does not satisfy any additional
* matching criteria that are specified, or if proxy preparation
* is requested but fails because of a <i>definite exception</i>
* (such as a {@link java.lang.SecurityException SecurityException},
* then this method returns <code>false</code>. When this state is
* returned by this method, it is said that the object
* <i>failed</i> (the <code>check</code> method of) the filter;
* or that the filter returned a <i>failure</i> condition.
* <li> If the input object satisfies any additional matching criteria
* that are specified, and proxy preparation is requested but
* fails because of an <i>indefinite exception</i> (such as a
* {@link java.rmi.RemoteException RemoteException}), then this
* method returns <code>true</code> and the service field of the
* {@link net.jini.core.lookup.ServiceItem ServiceItem} parameter
* is <b><i>replaced</b></i> with <code>null</code>. In this case,
* the object has neither passed nor failed the filter. Thus, when
* this state is returned by this method, it is said that the
* results of the filtering process are <i>indefinite</i>.
* </ul>
* <p>
* With respect to a remote operation such as proxy preparation, the
* term <i>indefinite exception</i> refers to a class of exception where
* any such exception does not allow assertions to be made about the
* probability of success (or failure) of future attempts to prepare the
* proxy. A {@link java.rmi.RemoteException RemoteException} caused by a
* transient communciation failure is one such example of an exception
* that can be classified as an indefinite exception. Thus, whenever
* this method returns an indefinite result, the object that invoked
* this method (either {@link net.jini.lookup.ServiceDiscoveryManager
* ServiceDiscoveryManager} or {@link net.jini.lookup.LookupCache
* LookupCache}) will retry the filter by calling this method again,
* at a later time, when success may be possible.
* <p>
* Alternatively, the term <i>definite exception</i> refers to a
* class of exception where any such exception is indicative of a
* <b><i>permanent</i></b> failure. That is, when an operation fails
* as a result of an exception that can be classified as a definite
* exception, that exception allows one to assert that any future
* attempts to perform the failed operation will also be met with failure.
* A {@link java.lang.SecurityException SecurityException} is an example
* of a definite exception in the case of proxy preparation. Thus, when
* this method results in failure, that failure occurs either because
* the object being filtered does not currently match the given
* criteria, or a definite exception occurs as a result of proxy
* preparation (or both). In either case, because it is a virtual
* certainty that failure will again result on all future attempts to
* filter the object (that is, perform matching and/or proxy preparation),
* no attempt is made to retry the operation.
* <p>
* Except for the modifications that may result from filtering as
* described above, this method must not modify any other aspect
* of the contents of the input {@link net.jini.core.lookup.ServiceItem
* ServiceItem} object because doing so can result in unpredictable and
* undesirable effects on future processing by the
* {@link net.jini.lookup.ServiceDiscoveryManager ServiceDiscoveryManager}.
* Therefore, the effects of such modifications are undefined.
*
* @param item the <code>ServiceItem</code> object to test against the
* additional criteria.
*
* @return <code>false</code> if the input object fails the filter;
* <code>true</code> otherwise (see the method description above).
*/
boolean check(ServiceItem item);
}