Hello, again.
Neeme Praks wrote:
> Have you ever had a look at Apache Cocoon project? That achieves all the
Yes.
> benefits you outlined in your paper plus more.
Here are a few items BOX addresses that Cocoon does not (as far as I can
discern; please correct my errors):
o doesn't provide an inherent state-based architecture (it's an aside,
not focus)
o doesn't automatically apply a different view of logic based on the
domain
o extremely complex; it mixes multiple languages and odd syntax (e.g.,
&connectDatabase)
o makes it easy to couple presentation and logic (see below)
o lacks an integrated expression parser
o doesn't expose a consistent syntax for doing tasks such as:
- file I/O
- sending XML to remote servers
- calling native code (Java, C, Perl, etc.)
- SQL statements
o cookies, FORM parameters, and URL encoded variables are not treated
uniformly
o doesn't use plain XML (i.e., embeds other language source directly)
If there's interest, I would be more than happy to illustrate a full
cycle of data acquisition (via HTML FORM) to SQL deposit, retrieval, and
final HTML page. For those who enjoy gory details, I've made a brief
comparison of Cocoon and BOX for two very simple examples. The first is
a little counter program, the second shows how to do SQL in both
tongues.
Sincerely,
Dave Jarvis
-=( First Example )=-
]] Cocoon's Logic (18 lines of code; tied to Java) [[
<?xml version="1.0"?>
<?cocoon-process type="xsp"?>
<?cocoon-process type="xslt"?>
<?xml-stylesheet href="page-html.xsl" type="text/xsl"?>
<xsp:page language="java"
xmlns:xsp="http://www.apache.org/1999/XSP/Core">
<xsp:logic>
static private int counter = 0;
private synchronized int count() {
return counter++;
}
</xsp:logic>
<page>
<p>I've been requested <xsp:expr>count()</xsp:expr> times.</p>
</page>
</xsp:page>
]] Cocoon's XSP (6 lines of generated code) [[
<?xml version="1.0"?>
<?cocoon-process type="xslt"?>
<?xml-stylesheet href="page-html.xsl" type="text/xsl"?>
<page>
<p>I've been requested 0 times.</p>
</page>
]] Cocoon's XSL (10 lines of code) [[
<?xml version="1.0"?>
<xsl:stylesheet>
<xsl:output method="html" encoding="US-ASCII"/>
<xsl:template match="page">
<xsl:apply-templates/>
</xsl:template>
<xsl:template match="p">
<xsl:apply-templates/>
</xsl:template>
</xsl:stylesheet>
BOX code, in my opinion, is much simpler and straightforward, as there
is no intermediary XSP page:
]] BOX's Logic (7 lines of code; tied to XML) [[
<?xml version="1.0"?>
<businessLogic>
<main>
<session name="count" expr="#count + 1"/>
<tag name="count" expr="#count"/>
</main>
</businessLogic>
]] BOX's XML (4 lines of generated code) [[
<?xml version="1.0"?>
<document>
<count>0</count>
</document>
]] BOX's XSL (7 lines of code) [[
<?xml version="1.0"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="html" encoding="US-ASCII"/>
<xsl:template match="document">
<P>I've been requested <xsl:value-of select="count"/> times.</P>
</xsl:template>
</xsl:stylesheet>
By adding "<babel>" tags around the English text, you automatically get
a stylesheet that is in the viewer's language (based on their browser's
Accept-Language). This is part of the architecture; no extra futzing is
required. BOX makes it difficult to couple logic and presentation. For
example, to write a "<p>" tag with logic, you must write <tag
name="p"/>. XSL is where the <p> tag belongs; not snuggled in with
logic.
Let's look at a slightly more complex example, involving SQL. First
Cocoon, then BOX.
-=( Second Example )=-
]] Cocoon Logic (20 lines of code) [[
<?xml version="1.0" encoding='ISO-8859-1' standalone="no"?>
<?xml-stylesheet href="../xsl/wic_fournisseursListe.xsl"
type="text/xsl"?>
<?cocoon-process type="xsp"?>
<?cocoon-process type="xslt"?>
<!DOCTYPE page SYSTEM "./librairies/entity.dtd">
<xsp:page
language="java"
xmlns:xsp="http://www.apache.org/1999/XSP/Core"
xmlns:session="http://www.apache.org/1999/XSP/Session"
xmlns:request="http://www.apache.org/1999/XSP/Request"
xmlns:response="http://www.apache.org/1999/XSP/Response"
xmlns:sql="http://www.apache.org/1999/SQL"
xmlns:log="http://www.arctis.com/2000/XSP/Log"
create-session="true">
<page title="Liste des fournisseurs">
<xsp:logic>
try {
<sql:execute-query>
&connectDatabase;
<sql:doc-element>FOURNISSEURS</sql:doc-element>
<sql:row-element>FOURNISSEUR</sql:row-element>
<sql:query>
SELECT * FROM WIC.FOURNIS
WHERE COD_CLIENT = '<session:get-value> name="WIC_CLIENT"/>'
ORDER BY NOM_FOURNIS
</sql:query>
</sql:execute-query>
}
catch (Exception e) {
<response:send-redirect location="wic_erreur.xml?Langue=FR"/>
}
</xsp:logic>
</page>
</xsp:page>
]] Cocoon XSL (43 lines of code) [[
<?xml version="1.0" encoding='ISO-8859-1'?>
<?cocoon-format type="text/xsl"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns="http://www.w3.org/TR/xhtml1/strict">
<xsl:import href="./librairies/mainhtml.xsl"/>
<xsl:import href="./librairies/lib_listes.xsl"/>
<xsl:template match="/">
<xsl:call-template name="main"/>
</xsl:template>
<xsl:template match="page">
<xsl:apply-templates select="@title"/>
<P align="center">
<xsl:call-template name="tableauFournisseurs">
<xsl:with-param name="actions">true</xsl:with-param>
</xsl:call-template>
</P>
</xsl:template>
<xsl:template name="tableauFournisseurs">
<table border="1" width="100%" align ="center">
<tr align="center">
<th>Nom</th>
<th>Adresse</th>
<th>Banque</th>
<xsl:apply-templates select=".//FOURNISSEUR">
<xsl:with-param name="actions"><xsl:value-of
select="$actions"/></xsl:with-param>
</xsl:apply-templates>
</table>
</xsl:template>
<xsl:template match="FOURNISSEUR">
<tr align="left">
<td>
<xsl:apply-templates select="NOM_FOURNIS"/>
</td>
<td>
<xsl:apply-templates select="ADR_FOURNIS_1"/><BR/>
<xsl:apply-templates select="ADR_FOURNIS_2"/><BR/>
<xsl:apply-templates select="ADR_FOURNIS_3"/>
</td>
<td>
<xsl:apply-templates select="BQE_FOURNIS"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
]] BOX Logic (28 lines of code) [[
<?xml version="1.0"?>
<businessLogic>
<main>
<var name="title" expr="'Liste des fournisseurs'"/>
<sql>
<select>
* FROM WIC.FOURNIS
WHERE COD_CLIENT=?
ORDER BY NOM_FOURNIS
</select>
<using>
<value-of expr="#WIC_CLIENT"/>
</using>
<container name="results"/>
</sql>
<if test="!$RowCount">
<var name="Phase" expr="'erreur'"/>
<stop/>
</if>
<enumerate container="@results">
<tag name="fournis"/>
<tag name="cod_client" expr="@results.cod_client"/>
<tag name="nom_fournis" expr="@results.nom_fournis"/>
<tag name="adr_fournis_1" expr="@results.adr_fournis_1"/>
<tag name="adr_fournis_2" expr="@results.adr_fournis_2"/>
<tag name="adr_fournis_3" expr="@results.adr_fournis_3"/>
<tag name="bqe_fournis" expr="@results.bqe_fournis"/>
<tag name="/fournis"/>
</enumerate>
</main>
</businessLogic>
]] BOX XSL (29 lines of code) [[
<?xml version="1.0" encoding='ISO-8859-1'?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:import href="/common/header.xsl"/>
<xsl:template name="content">
<table border="1" width="100%" align ="center">
<tr align="center">
<th>Nom</th>
<th>Adresse</th>
<th>Banque</th>
</tr>
<xsl:apply-templates/>
</table>
</xsl:template>
<xsl:template match="fournis">
<tr align="left">
<td>
<xsl:apply-templates select="nom_fournis"/>
</td>
<td>
<xsl:apply-templates select="adr_fournis_1"/><BR/>
<xsl:apply-templates select="adr_fournis_2"/><BR/>
<xsl:apply-templates select="adr_fournis_3"/>
</td>
<td>
<xsl:apply-templates select="bqe_fournis"/>
</td>
</tr>
</xsl:template>
</xsl:stylesheet>
-fin-
---------------------------------------------------------------------
In case of troubles, e-mail: [EMAIL PROTECTED]
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]