A document has been updated:
http://cocoon.zones.apache.org/daisy/documentation/681.html
Document ID: 681
Branch: main
Language: default
Name: Creating a Reader (unchanged)
Document Type: Document (unchanged)
Updated on: 8/25/05 6:02:21 PM
Updated by: Berin Loritsch
A new version has been created, state: publish
Parts
=====
Content
-------
This part has been updated.
Mime type: text/xml (unchanged)
File name: (unchanged)
Size: 5976 bytes (previous version: 5967 bytes)
Content diff:
(3 equal lines skipped)
<h1>Creating a Reader</h1>
<p>Readers are the components that send you a stream without the XML
processing
--- that normally happens in a pipeline. Cocoon already comes with some
readers out
+++ that normally happens in a pipeline. Cocoon already comes with some readers
out
of the box such as your FileReader which serializes files from your webapp
--- context. What if you need something that doesn't come from the file
system?
--- What if you need to create content on the fly but the XML processing gets
in the
--- way? That's where the Reader comes to play. Even though there is a
--- DatabaseReader in the Cocoon's SQL block, we are going to go through the
process
--- of creating a cacheable database reader here.</p>
+++ context. What if you need something that doesn't come from the file system?
What
+++ if you need to create content on the fly but the XML processing gets in the
way?
+++ That's where the Reader comes to play. Even though there is a
DatabaseReader in
+++ the Cocoon's SQL block, we are going to go through the process of creating a
+++ cacheable database reader here.</p>
<p>In the sitemap we use the reader we are going to develop like this:</p>
(3 equal lines skipped)
</pre>
<p>The sitemap snippet above matches anything in the attachment path
followed by
--- the ID for the attachment. It then passes the ID into the <tt>src</tt>
--- attribute for our reader. Why not include the nice neat little extension
for
--- the file after the ID? We actually have a very good reason: Microsoft. If
you
--- recall from the <a href="daisy:674">SitemapOutputComponent Contracts</a>
page,
--- Internet Explorer likes to pretend its smarter than you are. If you have a
file
--- extension on the URL that IE knows, it will ignore your mime-type settings
that
--- you provide. However, if you don't provide any clues then IE has to fall
back
--- to respecting the standard.</p>
+++ the ID for the attachment. It then passes the ID into the <tt>src</tt>
+++ attribute for our reader. Why not include the nice neat little extension
for the
+++ file after the ID? We actually have a very good reason: Microsoft. If you
recall
+++ from the <a href="daisy:674">SitemapOutputComponent Contracts</a> page,
Internet
+++ Explorer likes to pretend its smarter than you are. If you have a file
extension
+++ on the URL that IE knows, it will ignore your mime-type settings that you
+++ provide. However, if you don't provide any clues then IE has to fall back to
+++ respecting the standard.</p>
<h2>How Does the Sitemap Treat a Reader?</h2>
--- <p>A Sitemap fills two of the core contracts with the Sitemap. It is both a
--- SitemapModelComponent and a SitemapOutputComponent. You <em>can</em> make
it a
+++ <p>A Sitemap fills two of the core contracts with the Sitemap. It is both a
+++ SitemapModelComponent and a SitemapOutputComponent. You <em>can</em> make
it a
CacheableProcessingComponent as well, which will help reduce the load on
your
--- database by avoiding the need to retrieve your attachments all the time. In
+++ database by avoiding the need to retrieve your attachments all the time. In
fact, unless you have a good reason not to, you should always make your
--- components cacheable just for the flexibility in deployment later. I
recommend
+++ components cacheable just for the flexibility in deployment later. I
recommend
you read the articles on the core contracts to understand where to find the
resources you need.</p>
--- <p>A sitemap will fulfill all its core contracts first. It will then query
the
--- reader using the <tt>getLastModified()</tt> method. The results of that
method
+++ <p>A sitemap will fulfill all its core contracts first. It will then query
the
+++ reader using the <tt>getLastModified()</tt> method. The results of that
method
will be added to the response header for browser caching purposes--although
it
--- is only done for the CachingPipeline. Lastly, the sitemap will call the
--- <tt>generate()</tt> method to create and send the results back to the
client.
+++ is only done for the CachingPipeline. Lastly, the sitemap will call the
+++ <tt>generate()</tt> method to create and send the results back to the
client.
It's a one stop shop, and because the Reader is both a
SitemapModelComponent and
a SitemapOutputComponent it is the beginning and the end of your
pipeline.</p>
(3 equal lines skipped)
<h2>ServiceableReader: A Good Start</h2>
<p>The ServiceableReader provides a good basis for building our database
bound
--- AttachmentReader. The ServiceableReader implements the Recyclable,
LogEnabled
+++ AttachmentReader. The ServiceableReader implements the Recyclable,
LogEnabled
and Serviceable interfaces and captures some of the information you will
need
--- for you. We will need these three interfaces to get a reference to the
--- DataSourceComponent, our Logger, and to clean up our request based
artifacts.
+++ for you. We will need these three interfaces to get a reference to the
+++ DataSourceComponent, our Logger, and to clean up our request based
artifacts.
You might want to implement the Parameterizable or Configurable interfaces
if
you want to decide which particular database we will be hitting in your own
--- code. For now, we are going to hard code the information.</p>
+++ code. For now, we are going to hard code the information.</p>
<h3>The Skeleton</h3>
(30 equal lines skipped)
// ... skip many methods covered later
public void setup( SourceResolver sourceResolver, Map model, String
src, Parameters params )
--- throws IOException, ProcessingException, SAXException
+++ throws IOException, ProcessingException, SAXException
{
// ... skip setup code for now
}
(5 equal lines skipped)
}
</pre>
--- <p>If you'll notice we added the Disposable interface to the contract as
well.
+++ <p>If you'll notice we added the Disposable interface to the contract as
well.
This is so that we can be good citizens and release our components when we
are
--- done with them. Anything pooled needs to be released. While it's probably
safe
--- to treat your DataSourceComponent and your ServiceManager as singletons in
the
--- system, we still want to be responsible. First things first, let's get our
--- DataSourceComponent and hold on to it as long as this Reader is around. To
do
--- this we will need to add two more class fields:</p>
+++ done with them. Anything pooled needs to be released.</p>
+++ <h3>Getting a Reference to Our DataSourceComponent</h3>
+++
+++ <p>While it's probably safe to treat your DataSourceComponent and your
+++ ServiceManager as singletons in the system, we still want to be responsible.
+++ First things first, let's get our DataSourceComponent and hold on to it as
long
+++ as this Reader is around. To do this we will need to add two more class
fields:
+++ </p>
+++
<pre> private DataSourceComponent datasource;
private ServiceSelector dbselector;
</pre>
(6 equal lines skipped)
Fields
======
no changes
Links
=====
no changes
Custom Fields
=============
no changes
Collections
===========
no changes