A flexible Object resolver mechanism.

[Introduction]

Introduction

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();

          }

      }