package org.osgi.service.indexer;
import java.util.List;
import org.osgi.annotation.versioning.ConsumerType;
/**
* <p>
* A resource analyzer is responsible for analyzing a resource for some specific
* purpose, and discovering requirements and capabilities that may not be
* discovered by the basic Bundle Analyzer.
* </p>
* <p>
* Clients may implement this interface and register instances as services.
* </p>
*
* @author Neil Bartlett <njbartlett@gmail.com>
*/
@ConsumerType
public interface ResourceAnalyzer {
/**
* The service property used to declare a resource filter, so that the
* analyzer is only invoked on a subset of resources. Example:
* <code>(&(|(name=foo.jar)(name=*.ear))(lastmodified>=1262217600753))</
* code>
*/
static final String FILTER = "filter";
/**
* <p>
* This method is invoked for each resource that the analyzer is requested
* to analyze. Implementations add zero or more capabilities and/or
* requirements to the supplied lists.
* </p>
* <p>
* Analyzers <b>may</b> examine the lists of already-discovered requirements
* and capabilities; for example they may wish to add a certain capability
* if (and only if) it has not already been added.
* </p>
* <p>
* However, analyzers <b>should not</b> rely on being invoked in any
* particular order, i.e. either before or after any other analyzer.
* </p>
* <p>
* Analyzers <b>MUST NOT</b> attempt to remove or replace any capability or
* requirement from the supplied list. Clients of this method may enforce
* this by passing List implementations that throw
* {@link UnsupportedOperationException} upon any attempt to call
* {@link List#remove(int)}, etc.
* </p>
*
* @param resource The current resource.
* @param capabilities The list of capabilities.
* @param requirements The list of requirements.
* @throws Exception If something goes wrong. The error will be logged to
* the OSGi Log Service (if available) and the next
* ResourceAnalyzer (if any) will be asked to analyze the
* resource.
*/
void analyzeResource(Resource resource, List<Capability> capabilities, List<Requirement> requirements)
throws Exception;
}