Howard -

 

Thanks for all your input and patience.

 

Here is another shot at this problem.  Whenever a page is requested that is not defined by the application file, then I want to dynamically load the specification of the page.  To do this, I decorated the PageSource.  For my engine class, I added the following method...

 

public class StudyServerEngine extends SimpleEngine

{

   ...

 

   protected IPageSource createPageSource()

   {

      return new DynamicPageSource(getResourceResolver());

   }

 

   ...

}

 

My DynamicPageSource decorates the page source.  Basically, its job is to intercept getPage requests and dynamically load the page when it is needed.

 

public class DynamicPageSource

implements IPageSource, IRenderDescription

{

   public DynamicPageSource(IResourceResolver resolver)

   {

      super();

      _delegate = new PageSource(resolver);

   }

 

   public IPage getPage(IEngine engine, String pageName, IMonitor monitor)

      throws PageLoaderException

   {

      // check if page exists before trying to instantiate page

      ApplicationSpecification applicationSpec = engine.getSpecification();

      PageSpecification spec = applicationSpec.getPageSpecification(pageName);

      if (spec == null) {

         _log.debug("Page not found="+pageName);

         spec = _parser.getFactory().createPageSpecification(pageName);

         _log.debug("   found spec="+spec);

         applicationSpec.setPageSpecification(pageName, spec);

      }

 

      // instantiate the page

      IPage page = _delegate.getPage(engine, pageName, monitor);

      return page;

   }

 

   public void releasePage(IPage page)

   {

      _delegate.releasePage(page);

   }

 

   public void reset()

   {

      _delegate.reset();

   }

 

   public IBinding getFieldBinding(String fieldName)

   {

      return _delegate.getFieldBinding(fieldName);

   }

 

   public IBinding getStaticBinding(String value)

   {

      return _delegate.getStaticBinding(value);

   }

 

   public IAsset getExternalAsset(String URL)

   {

      return _delegate.getExternalAsset(URL);

   }

 

   public IAsset getContextAsset(String assetPath)

   {

      return _delegate.getContextAsset(assetPath);

   }

 

   public IAsset getPrivateAsset(String resourcePath)

   {

      return _delegate.getPrivateAsset(resourcePath);

   }

  

   public void renderDescription(IResponseWriter writer)

   {

      _delegate.renderDescription(writer);

   }

  

   // private stuff

   private static final SpecificationParser _parser = new SpecificationParser();

   private static final Logger _log = Logger.getLogger(DynamicPageSource.class);

 

   private PageSource _delegate;

}

 

What I am still trying to figure out is how to integrate the DefaultSpecificationSource decoration.

 

Thanks...

Dorothy

Reply via email to