Hi,
See my comments below
Ovidiu Predescu wrote:
> Hi Per-Olof,
>
> On Tuesday, September 3, 2002, at 02:08 AM, Per-Olof Nor�n wrote:
>
>> Hi cocooners,
>> I�d like to give a real-life scenario using flowscripts.
>> We are currently in the end phase of developing the base of an
>> enterprise system used for ordering/invoicing/crm tasks.
>> All of this is done in cocoon using the flowscript and Jakarta OJB,
>> Axis and torque.
>>
>> We decided to use the flowscript since its *the* way of creating web
>> based, data-intensive business systems. In theese scenarios the focus
>> are at error handling and usability. The gui is of course important
>> but not in the "flashy" sence, but rather that its possible to work
>> with the system for a whole work-day.
>>
>> Model: OJB
>> View: XSP�s
>> Controller: flowscript
>>
>> The Model:
>> Trying the axis wsdl2java tools to connect to SOAP services was as
>> easy as stealing candy from a child, not a single problem.
>> This inspired us to look for a similar approach when using a local
>> dbms for the other data. After some looking around we found OJB to be
>> perfect. We modified the Ant tasks that reads db metadata and creates
>> a file called repository.xml that is the database schema. The next ant
>> task is to create beans for each table in the repository.xml file.
>> This is done by velocity templates. Finally an "Operations" interface
>> is created by hand. This interface class is then used by the flowscript.
>> Its incredible easy to modify the database, we just run our ant build
>> that rebuilds all our beans. Using axis we can also wrap our
>> "Operations" interface as a web service for future integration.
>>
>> The views:
>> We created a sort of language for page definition that abstracted html
>> in xsp�s and this allows hard core coders to create pages that
>> are graphically pleasing. The concept of xsp as the source of the
>> pages is perfectly fine, since it allows for some rendering logic to
>> be applied. For example disabling buttons and parts of a page.
>> All data is provided in a java.util.Hashmap sent from the flowscript.
>>
>> The controller:
>> This is of course the flowscript.
>> In here we program the flow-logic and call the Model(Operations
>> interface) for retrieving / updating / creating data.
>> We�ve devided some common functions such as showing error messages and
>> delete confirms into "functions.js".
>>
>> To summarize:
>> Using flowscript, xsp and OJB is the *perfect* match for creating
>> web-based enterprise systems
>
>
> This is great stuff!
>
> I discovered OJB recently and I was investigating it to see how it
> compares with Castor JDO. I was planning to start building a similarly
> complex application using the flow and OJB or Castor.
>
> It would be really great if you can make a simple example out of your
> code, so it can be packaged with Cocoon as a demonstration of the
> control flow layer.
>
>> Since this is the dev list, i also have som dev questions:
>> I have problems putting things in a session variable from the
>> flowscript using this syntax: cocoon.session["user_id"] =
>> user.getUser_id();
>
>
> I've recently checked in some changes in the control flow which allows
> you to create sessions from the flow layer. The idea is to maintain the
> state of the global variables across different top-level function
> invocations. E.g. suppose you have two functions, login() and
> addToCart(), which look like this:
>
> var user;
>
> function login()
> {
> // send the appropriate pages to the user to have the user log in
> user = new Package.com.my.application.User(username, password, ...);
>
> // create a user session to preserve the value of the global variables
> cocoon.createSession();
> }
>
> function addToCart()
> {
> if (user == null)
> login();
>
> // make use of the 'user' global variable
> }
>
> In this example, both login() and addToCart() are functions that can be
> called from the sitemap using <map:call function="..."/>. The value of
> all the global variables is essentially preserved, once the
> createSession() function is called.
>
> I'll commit an example of this feature. Using this, you no longer have
> to maintain things in the servlet session object, just make your
> 'userId' a global variable in your flowscript, and make sure you call
> createSession() in one of the functions called earlier in the process.
>
>> Does anyone have any idea�s?
>>
>> I will soon send a little patch for jpath.xsl that fixes for-each
>> functionality that we use.
>
>
> Please do so. I also have some changes to the logicsheet to fix some
> compilation errors when the same expression is used multiple times
> throughout an XSP.
Attatched is our entire jpath.xsl, which fixes iterator problems and
also compile some of the compile problems.
There is another problem however:
jpath namespace declaration have to be the last one on the xsp:page
element, or otherwise there are compile problems. My guess is that there
is some missing apply-templates or something (haven�t had time to really
dig into xsp).
Will try to package an example of how we used xsp, javascript to create
really cool applications the extrem easy.
>
> I'll commit the changes described above and my little example soon.
Cool
<?xml version="1.0" encoding="utf-8"?>
<!--
Author: Ovidiu Predescu "[EMAIL PROTECTED]"
Date: February 15, 2002
-->
<xsl:stylesheet version="1.0" xmlns:xsp="http://apache.org/xsp" xmlns:jpath="http://apache.org/xsp/jpath/1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="xsp:page">
<xsp:page>
<xsl:apply-templates select="@*"/>
<xsp:structure>
<xsp:include>java.util.List</xsp:include>
<xsp:include>java.util.Iterator</xsp:include>
<xsp:include>java.util.Collection</xsp:include>
<xsp:include>java.util.Map</xsp:include>
<xsp:include>org.apache.commons.jxpath.CompiledExpression</xsp:include>
<xsp:include>org.apache.cocoon.environment.Environment</xsp:include>
<xsp:include>org.apache.cocoon.components.flow.WebContinuation</xsp:include>
<xsp:include>org.apache.commons.jxpath.JXPath</xsp:include>
<xsp:include>org.apache.commons.jxpath.JXPathContext</xsp:include>
<xsp:include>org.apache.commons.jxpath.CompiledExpression</xsp:include>
</xsp:structure>
<xsp:logic></xsp:logic>
<xsp:init-page>
Object bean = ((Environment)resolver).getAttribute("bean-dict");
WebContinuation kont = (WebContinuation)((Environment)resolver).getAttribute("kont");
JXPathContext jxpathContext = JXPathContext.newContext(bean);
// Generate the compiled representation of the JXPath
// expressions used by this page.
<xsl:apply-templates mode="compile"/>
</xsp:init-page>
<xsl:apply-templates/>
</xsp:page>
</xsl:template>
<xsl:template match="jpath:if | jpath:when" mode="compile">
<xsl:variable name="var-name">
<xsl:call-template name="get-var-name">
<xsl:with-param name="expr" select="@test"/>
</xsl:call-template>
</xsl:variable>
CompiledExpression <xsl:value-of select="$var-name"/> = jxpathContext.compile("<xsl:value-of select="@test"/>");
<xsl:apply-templates select="*" mode="compile"/>
</xsl:template>
<xsl:template match="jpath:for-each | jpath:value-of" mode="compile">
<xsl:variable name="var-name">
<xsl:call-template name="get-var-name">
<xsl:with-param name="expr" select="@select"/>
</xsl:call-template>
</xsl:variable>
CompiledExpression <xsl:value-of select="$var-name"/> = jxpathContext.compile("<xsl:value-of select="@select"/>");
<xsl:apply-templates select="*" mode="compile"/>
</xsl:template>
<xsl:template match="*|@*|text()|processing-instruction()" mode="compile">
<xsl:apply-templates mode="compile"/>
</xsl:template>
<xsl:template name="get-var-name">
<xsl:param name="expr"/>
<xsl:variable name="id" select="generate-id(.)"/>
jxpath_<xsl:value-of select="translate($expr, ' 	

~`!@%^*()-+=[]{}\|,./?><', '')"/>_<xsl:value-of select="$id"/>
</xsl:template>
<xsl:template match="jpath:if">
<xsl:choose>
<xsl:when test="@test">
<xsp:logic>
if (<xsl:call-template name="get-var-name">
<xsl:with-param name="expr" select="@test"/>
</xsl:call-template>.getValue(jxpathContext) != null) {
<xsl:apply-templates/>
}
</xsp:logic>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">
<xsl:text>Required 'test' attribute in <jpath:if> is missing!</xsl:text>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="jpath:choose">
<xsp:logic>
if (0) {
}
<xsl:apply-templates select="jpath:when|jpath:otherwise"/>
</xsp:logic>
</xsl:template>
<xsl:template match="jpath:when">
<xsp:logic>
else if (<xsl:call-template name="get-var-name">
<xsl:with-param name="expr" select="@test"/>
</xsl:call-template>.getValue(jxpathContext) != null) {
<xsl:apply-templates/>
}
</xsp:logic>
</xsl:template>
<xsl:template match="jpath:otherwise">
<xsp:logic>
else {
<xsl:apply-templates/>
}
</xsp:logic>
</xsl:template>
<xsl:template match="jpath:for-each">
<xsl:variable name="old-context">
oldJPathContext<xsl:value-of select="count(ancestor-or-self::*)"/>
</xsl:variable>
<xsl:choose>
<xsl:when test="@select">
<xsp:logic>
{
Iterator iter_<xsl:value-of select="generate-id(.)"/> = <xsl:call-template name="get-var-name"><xsl:with-param name="expr" select="@select"/></xsl:call-template>.iterate(jxpathContext);
JXPathContext <xsl:value-of select="$old-context"/> = jxpathContext;
while (iter_<xsl:value-of select="generate-id(.)"/>.hasNext()) {
Object current_<xsl:value-of select="generate-id(.)"/> = iter_<xsl:value-of select="generate-id(.)"/>.next();
jxpathContext = JXPathContext.newContext(current_<xsl:value-of select="generate-id(.)"/>);
</xsp:logic>
<xsl:apply-templates/>
<xsp:logic>
}
jxpathContext = <xsl:value-of select="$old-context"/>;
}
</xsp:logic>
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">
<xsl:text>Required 'select' attribute in <jpath:for-each> is missing!</xsl:text>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
<xsl:template match="jpath:value-of">
<xsp:expr>
<xsl:choose>
<xsl:when test="@select">
<xsl:call-template name="get-var-name">
<xsl:with-param name="expr" select="@select"/>
</xsl:call-template>.getValue(jxpathContext)
</xsl:when>
<xsl:otherwise>
<xsl:message terminate="yes">
<xsl:text>Required 'select' attribute in <jpath:value-of> is missing!</xsl:text>
</xsl:message>
</xsl:otherwise>
</xsl:choose>
</xsp:expr>
</xsl:template>
<xsl:template match="jpath:continuation">
<xsl:variable name="level">
<xsl:choose>
<xsl:when test="@select">
<xsl:value-of select="@select"/>
</xsl:when>
<xsl:otherwise>0</xsl:otherwise>
</xsl:choose>
</xsl:variable>
<xsp:expr>
kont.getContinuation(<xsl:value-of select="$level"/>).getId()
</xsp:expr>
</xsl:template>
<xsl:template match="@*|*|text()|processing-instruction()">
<!-- Catch all template.Just pass along unmodified everything we don't handle. -->
<xsl:copy>
<xsl:apply-templates select="@*|*|text()|processing-instruction()"/>
</xsl:copy>
</xsl:template>
</xsl:stylesheet>
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]