The org.apache.avalon.excalibur.resolver
package contains interfaces and classes
for resolving objects, components, and services. The design is sufficiently flexible to handle all
lookup needs. Below is an example component that demonstrates how the package can be used.
public class SampleComponent implements Parameterizable, Resolveable, Sample { private final Query m_query; private Resolver m_resolver; private Parameters m_params; public SampleComponent() { m_query = new Query(); m_query.addKey( Query.COMPONENT, DataSourceComponent.ROLE ); m_query.addKey( Query.COMPONENT, Parser.ROLE ); m_query.addKey( Query.COMPONENT, EntityResolver.ROLE ); } /** * Add parameters to specialize the query. */ public void parameterize( Parameters params ) throws ParameterException { m_params = params; m_query.addAttribute("database", m_params.getParameter( "dbname", "default" )); } /** * Ensure a valid working space */ public void resolver( Resolver resolver ) throws ResolverException { m_resolver = resolver; boolean[] isReferenced resolver.hasReferences( m_query ); // test if the optional reference to the resolver exists if ( ! isReferenced[2] ) { // if not remove the lookup (it will cause resolver to throw an exception m_query.removeKey( EntityResolver.ROLE ); } // test if the required references are available if ( ! isReferenced[0] || ! isReferenced[1] ) { throw new ResolverException("Required references not available"); } } /** * Perform the work from the Sample interface */ public Object doWork() { Token values = null; try { values = m_resolver.lookup( m_query ); Object[] refs = values.references(); DataSourceComponent datasource = (DataSourceComponent) refs[0]; Parser parser = (Parser) refs[1]; // ... do stuff with the datasource to get input stream if (refs.length > 2) { parser.setEntityResolver( (EntityResolver)refs[2] ); } SampleContentHandler handler = getContentHandler(); parser.parse(handler); return handler().getObject(); } catch (Exception e) { // handle the exception } finally { if ( null != values ) { values.release(); } } } /** * The ContentHandler for the parser. */ SampleContentHandler getContentHandler() { //defined elsewhere return new SampleContentHandler(); } }