| <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> |
| <html> |
| <head> |
| <META http-equiv="Content-Type" content="text/html; charset=UTF-8"> |
| <meta content="Apache Forrest" name="Generator"> |
| <meta name="Forrest-version" content="0.9-dev"> |
| <meta name="Forrest-skin-name" content="pelt"> |
| <title>The Usecase Framework</title> |
| <link type="text/css" href="../../../../skin/basic.css" rel="stylesheet"> |
| <link media="screen" type="text/css" href="../../../../skin/screen.css" rel="stylesheet"> |
| <link media="print" type="text/css" href="../../../../skin/print.css" rel="stylesheet"> |
| <link type="text/css" href="../../../../skin/profile.css" rel="stylesheet"> |
| <script src="../../../../skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="../../../../skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="../../../../skin/fontsize.js" language="javascript" type="text/javascript"></script> |
| <link rel="shortcut icon" href="../../../../favicon.ico"> |
| </head> |
| <body onload="init()"> |
| <script type="text/javascript">ndeSetTextSize();</script> |
| <div id="top"> |
| <!--+ |
| |breadtrail |
| +--> |
| <div class="breadtrail"> |
| <a href="http://www.apache.org/">apache</a> > <a href="http://lenya.apache.org/">lenya</a><script src="../../../../skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script> |
| </div> |
| <!--+ |
| |header |
| +--> |
| <div class="header"> |
| <!--+ |
| |start group logo |
| +--> |
| <div class="grouplogo"> |
| <a href=""><img class="logoImage" alt="Lenya" src="../../../../images/apache-lenya-light.png" title=""></a> |
| </div> |
| <!--+ |
| |end group logo |
| +--> |
| <!--+ |
| |start Project Logo |
| +--> |
| <div class="projectlogo"> |
| <a href=""></a> |
| </div> |
| <!--+ |
| |end Project Logo |
| +--> |
| <!--+ |
| |start Search |
| +--> |
| <div class="searchbox"> |
| <form action="http://www.google.com/search" method="get" class="roundtopsmall"> |
| <input value="lenya.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with ');" size="25" name="q" id="query" type="text" value="Search the site with "> |
| <input name="Search" value="Search" type="submit"> |
| </form> |
| </div> |
| <!--+ |
| |end search |
| +--> |
| <!--+ |
| |start Tabs |
| +--> |
| <ul id="tabs"> |
| <li> |
| <a class="unselected" href="../../../../index.html">Project</a> |
| </li> |
| <li> |
| <a class="unselected" href="../../../../docs/index.html">Developer</a> |
| </li> |
| <li> |
| <a class="unselected" href="../../../../community/index.html">Community</a> |
| </li> |
| <li class="current"> |
| <a class="selected" href="../../../../docs/2_0_x/index.html">Version 2.0</a> |
| </li> |
| <li> |
| <a class="unselected" href="../../../../docs/1_2_x/index.html">Version 1.2</a> |
| </li> |
| </ul> |
| <!--+ |
| |end Tabs |
| +--> |
| </div> |
| </div> |
| <div id="main"> |
| <div id="publishedStrip"> |
| <!--+ |
| |start Subtabs |
| +--> |
| <div id="level2tabs"></div> |
| <!--+ |
| |end Endtabs |
| +--> |
| <script type="text/javascript"><!-- |
| document.write("Last Published: " + document.lastModified); |
| // --></script> |
| </div> |
| <!--+ |
| |breadtrail |
| +--> |
| <div class="breadtrail"> |
| |
| |
| </div> |
| <!--+ |
| |start Menu, mainarea |
| +--> |
| <!--+ |
| |start Menu |
| +--> |
| <div id="menu"> |
| <div onclick="SwitchMenu('menu_selected_1.1', '../../../../skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('../../../../skin/images/chapter_open.gif');">Version 2.0</div> |
| <div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/index.html">Index</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/faq.html">FAQs</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.3', '../../../../skin/')" id="menu_1.1.3Title" class="menutitle">Installation</div> |
| <div id="menu_1.1.3" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/installation/index.html">Download</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/installation/subversion.html">Subversion Access</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/installation/source_version.html">Install Instructions</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.4', '../../../../skin/')" id="menu_1.1.4Title" class="menutitle">Tutorials</div> |
| <div id="menu_1.1.4" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/newpublication/index.html">Create a Publication</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.4.2', '../../../../skin/')" id="menu_1.1.4.2Title" class="menutitle">Create a Resource Type</div> |
| <div id="menu_1.1.4.2" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/resourcetype/part1.html">Declaration</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/resourcetype/part2.html">Creation</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/resourcetype/part3.html">Presentation</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/resourcetype/part4.html">Editing (One-Form)</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/resourcetype/part5.html">Editing (BXE)</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.4.3', '../../../../skin/')" id="menu_1.1.4.3Title" class="menutitle">Implement a Usecase</div> |
| <div id="menu_1.1.4.3" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/usecase/part1.html">Prerequisites</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/usecase/part2.html">The Usecase</a> |
| </div> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/setupide/index.html">Setting up Eclipse</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.4.5', '../../../../skin/')" id="menu_1.1.4.5Title" class="menutitle">Proxying</div> |
| <div id="menu_1.1.4.5" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/proxy/proxying.html">Proxying</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/proxy/proxy.html">mod_proxy</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/proxy/mod_proxy_ajp.html">mod_proxy_ajp</a> |
| </div> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/bestpractises.html">Best Practises</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/production.html">Production Checklist</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/tutorials/tests.html">Writing Tests</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.5', '../../../../skin/')" id="menu_1.1.5Title" class="menutitle">Concepts</div> |
| <div id="menu_1.1.5" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/concepts/publication.html">Publication</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/concepts/documents.html">Working with Documents</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/concepts/authoring_live.html">Authoring and Live mode</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/concepts/wysiwyg.html">WYSIWYG</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_selected_1.1.6', '../../../../skin/')" id="menu_selected_1.1.6Title" class="menutitle" style="background-image: url('../../../../skin/images/chapter_open.gif');">Technical Reference</div> |
| <div id="menu_selected_1.1.6" class="selectedmenuitemgroup" style="display: block;"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/lenya-sitemaps.html">Overview of Lenya Sitemaps</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/repository/index.html">Repository</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/ac.html">Access Control Specification</a> |
| </div> |
| <div onclick="SwitchMenu('menu_selected_1.1.6.4', '../../../../skin/')" id="menu_selected_1.1.6.4Title" class="menutitle" style="background-image: url('../../../../skin/images/chapter_open.gif');">Usecase Framework</div> |
| <div id="menu_selected_1.1.6.4" class="selectedmenuitemgroup" style="display: block;"> |
| <div class="menupage"> |
| <div class="menupagetitle">Overview</div> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/usecase-framework/abstractusecase.html">AbstractUsecase</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.6.5', '../../../../skin/')" id="menu_1.1.6.5Title" class="menutitle">Publications</div> |
| <div id="menu_1.1.6.5" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/publication/configuration.html">Configuration</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/publication/publication-templating/index.html">Publication Templating</a> |
| </div> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/resource-types.html">Resource Types</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/modules/index.html">Modules</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/metadata.html">Meta data</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.6.9', '../../../../skin/')" id="menu_1.1.6.9Title" class="menutitle">Protocols</div> |
| <div id="menu_1.1.6.9" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/protocols/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/protocols/lenya.html">lenya Protocol</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/protocols/lenya-document.html">lenya-document Protocol</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/protocols/site.html">site Protocol</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/protocols/lenyadoc.html">lenyadoc Protocol</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.6.10', '../../../../skin/')" id="menu_1.1.6.10Title" class="menutitle">URLs and Links</div> |
| <div id="menu_1.1.6.10" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/urlMapping.html">URL Mapping</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/2_0_x/reference/link-management.html">Link Management</a> |
| </div> |
| </div> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../apidocs/2.0/index.html">Core API</a> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8', '../../../../skin/')" id="menu_1.1.8Title" class="menutitle">Core Modules</div> |
| <div id="menu_1.1.8" class="menuitemgroup"> |
| <div onclick="SwitchMenu('menu_1.1.8.1', '../../../../skin/')" id="menu_1.1.8.1Title" class="menutitle">ac</div> |
| <div id="menu_1.1.8.1" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/ac/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/ac/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.2', '../../../../skin/')" id="menu_1.1.8.2Title" class="menutitle">acusecases</div> |
| <div id="menu_1.1.8.2" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/acusecases/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/acusecases/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.3', '../../../../skin/')" id="menu_1.1.8.3Title" class="menutitle">administration</div> |
| <div id="menu_1.1.8.3" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/administration/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/administration/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.4', '../../../../skin/')" id="menu_1.1.8.4Title" class="menutitle">cache</div> |
| <div id="menu_1.1.8.4" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/cache/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/cache/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.5', '../../../../skin/')" id="menu_1.1.8.5Title" class="menutitle">janitor</div> |
| <div id="menu_1.1.8.5" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/janitor/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/janitor/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.6', '../../../../skin/')" id="menu_1.1.8.6Title" class="menutitle">ldap</div> |
| <div id="menu_1.1.8.6" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/ldap/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/ldap/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.7', '../../../../skin/')" id="menu_1.1.8.7Title" class="menutitle">linking</div> |
| <div id="menu_1.1.8.7" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/linking/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/linking/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.8', '../../../../skin/')" id="menu_1.1.8.8Title" class="menutitle">observation</div> |
| <div id="menu_1.1.8.8" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/observation/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/observation/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.9', '../../../../skin/')" id="menu_1.1.8.9Title" class="menutitle">properties</div> |
| <div id="menu_1.1.8.9" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/properties/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/properties/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.10', '../../../../skin/')" id="menu_1.1.8.10Title" class="menutitle">sitemanagement</div> |
| <div id="menu_1.1.8.10" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/sitemanagement/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/sitemanagement/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.11', '../../../../skin/')" id="menu_1.1.8.11Title" class="menutitle">templating</div> |
| <div id="menu_1.1.8.11" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/templating/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/templating/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.12', '../../../../skin/')" id="menu_1.1.8.12Title" class="menutitle">usecase</div> |
| <div id="menu_1.1.8.12" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/usecase/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/usecase/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.8.13', '../../../../skin/')" id="menu_1.1.8.13Title" class="menutitle">workflow</div> |
| <div id="menu_1.1.8.13" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/workflow/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/workflow/index.html">API</a> |
| </div> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9', '../../../../skin/')" id="menu_1.1.9Title" class="menutitle">Standard Modules</div> |
| <div id="menu_1.1.9" class="menuitemgroup"> |
| <div onclick="SwitchMenu('menu_1.1.9.1', '../../../../skin/')" id="menu_1.1.9.1Title" class="menutitle">blog</div> |
| <div id="menu_1.1.9.1" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/blog/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/blog/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.2', '../../../../skin/')" id="menu_1.1.9.2Title" class="menutitle">bxe</div> |
| <div id="menu_1.1.9.2" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/bxe/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/bxe/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.3', '../../../../skin/')" id="menu_1.1.9.3Title" class="menutitle">cforms</div> |
| <div id="menu_1.1.9.3" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/cforms/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/cforms/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.4', '../../../../skin/')" id="menu_1.1.9.4Title" class="menutitle">collection</div> |
| <div id="menu_1.1.9.4" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/collection/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/collection/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.5', '../../../../skin/')" id="menu_1.1.9.5Title" class="menutitle">contactform</div> |
| <div id="menu_1.1.9.5" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/contactform/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/contactform/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.6', '../../../../skin/')" id="menu_1.1.9.6Title" class="menutitle">development</div> |
| <div id="menu_1.1.9.6" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/development/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/development/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.7', '../../../../skin/')" id="menu_1.1.9.7Title" class="menutitle">editors</div> |
| <div id="menu_1.1.9.7" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/editors/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/editors/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.8', '../../../../skin/')" id="menu_1.1.9.8Title" class="menutitle">export</div> |
| <div id="menu_1.1.9.8" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/export/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/export/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.9', '../../../../skin/')" id="menu_1.1.9.9Title" class="menutitle">fckeditor</div> |
| <div id="menu_1.1.9.9" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/fckeditor/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/fckeditor/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.10', '../../../../skin/')" id="menu_1.1.9.10Title" class="menutitle">kupu</div> |
| <div id="menu_1.1.9.10" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/kupu/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/kupu/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.11', '../../../../skin/')" id="menu_1.1.9.11Title" class="menutitle">languageselector</div> |
| <div id="menu_1.1.9.11" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/languageselector/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/languageselector/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.12', '../../../../skin/')" id="menu_1.1.9.12Title" class="menutitle">lenyadoc</div> |
| <div id="menu_1.1.9.12" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/lenyadoc/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/lenyadoc/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.13', '../../../../skin/')" id="menu_1.1.9.13Title" class="menutitle">linkcheck</div> |
| <div id="menu_1.1.9.13" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/linkcheck/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/linkcheck/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.14', '../../../../skin/')" id="menu_1.1.9.14Title" class="menutitle">links</div> |
| <div id="menu_1.1.9.14" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/links/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/links/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.15', '../../../../skin/')" id="menu_1.1.9.15Title" class="menutitle">lucene</div> |
| <div id="menu_1.1.9.15" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/lucene/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/lucene/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.16', '../../../../skin/')" id="menu_1.1.9.16Title" class="menutitle">migration</div> |
| <div id="menu_1.1.9.16" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/migration/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/migration/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.17', '../../../../skin/')" id="menu_1.1.9.17Title" class="menutitle">neutron</div> |
| <div id="menu_1.1.9.17" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/neutron/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/neutron/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.18', '../../../../skin/')" id="menu_1.1.9.18Title" class="menutitle">news</div> |
| <div id="menu_1.1.9.18" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/news/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/news/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.19', '../../../../skin/')" id="menu_1.1.9.19Title" class="menutitle">notification</div> |
| <div id="menu_1.1.9.19" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/notification/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/notification/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.20', '../../../../skin/')" id="menu_1.1.9.20Title" class="menutitle">opendocument</div> |
| <div id="menu_1.1.9.20" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/opendocument/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/opendocument/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.21', '../../../../skin/')" id="menu_1.1.9.21Title" class="menutitle">prettyprinting</div> |
| <div id="menu_1.1.9.21" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/prettyprinting/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/prettyprinting/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.22', '../../../../skin/')" id="menu_1.1.9.22Title" class="menutitle">profiling</div> |
| <div id="menu_1.1.9.22" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/profiling/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/profiling/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.23', '../../../../skin/')" id="menu_1.1.9.23Title" class="menutitle">resource</div> |
| <div id="menu_1.1.9.23" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/resource/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/resource/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.24', '../../../../skin/')" id="menu_1.1.9.24Title" class="menutitle">simplesite</div> |
| <div id="menu_1.1.9.24" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/simplesite/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/simplesite/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.25', '../../../../skin/')" id="menu_1.1.9.25Title" class="menutitle">sitetree</div> |
| <div id="menu_1.1.9.25" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/sitetree/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/sitetree/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.26', '../../../../skin/')" id="menu_1.1.9.26Title" class="menutitle">sourcerepository</div> |
| <div id="menu_1.1.9.26" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/sourcerepository/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/sourcerepository/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.27', '../../../../skin/')" id="menu_1.1.9.27Title" class="menutitle">svg</div> |
| <div id="menu_1.1.9.27" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/svg/roundedcorners.html">Rounded Corners</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/svg/resizeimages.html">Resizing Images</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/svg/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.28', '../../../../skin/')" id="menu_1.1.9.28Title" class="menutitle">tinymce</div> |
| <div id="menu_1.1.9.28" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/tinymce/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/tinymce/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.29', '../../../../skin/')" id="menu_1.1.9.29Title" class="menutitle">usecasedocument</div> |
| <div id="menu_1.1.9.29" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/usecasedocument/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/usecasedocument/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.30', '../../../../skin/')" id="menu_1.1.9.30Title" class="menutitle">webdav</div> |
| <div id="menu_1.1.9.30" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/webdav/index.html">Getting started</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/webdav/monitoring.html">Monitoring</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/webdav/webdav.html">WebDAV Servers</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/webdav/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.31', '../../../../skin/')" id="menu_1.1.9.31Title" class="menutitle">xhtml</div> |
| <div id="menu_1.1.9.31" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/xhtml/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/xhtml/index.html">API</a> |
| </div> |
| </div> |
| <div onclick="SwitchMenu('menu_1.1.9.32', '../../../../skin/')" id="menu_1.1.9.32Title" class="menutitle">xopus</div> |
| <div id="menu_1.1.9.32" class="menuitemgroup"> |
| <div class="menuitem"> |
| <a href="../../../../docs/modules/xopus/index.html">Overview</a> |
| </div> |
| <div class="menuitem"> |
| <a href="../../../../../apidocs/2.0/modules/xopus/index.html">API</a> |
| </div> |
| </div> |
| </div> |
| </div> |
| <div id="credit"> |
| <hr> |
| <a href="http://forrest.apache.org/"><img border="0" title="Built with Apache Forrest" alt="Built with Apache Forrest - logo" src="../../../../images/built-with-forrest-button.png" style="width: 88px;height: 31px;"></a> |
| </div> |
| <div id="roundbottom"> |
| <img style="display: none" class="corner" height="15" width="15" alt="" src="../../../../skin/images/rc-b-l-15-1body-2menu-3menu.png"></div> |
| <!--+ |
| |alternative credits |
| +--> |
| <div id="credit2"> |
| <a href="http://wiki.apache.org/lenya/MeetingFreiburg2008"><img border="0" title="Meeting Freiburg 2008" alt="Meeting Freiburg 2008 - logo" src="../../../../images/apache-lenya-meeting-freiburg-2008.png" style="width: 160px;height: 40px;"></a> |
| </div> |
| </div> |
| <!--+ |
| |end Menu |
| +--> |
| <!--+ |
| |start content |
| +--> |
| <div id="content"> |
| <div title="Portable Document Format" class="pdflink"> |
| <a class="dida" href="index.pdf"><img alt="PDF -icon" src="../../../../skin/images/pdfdoc.gif" class="skin"><br> |
| PDF</a> |
| </div> |
| <h1>The Usecase Framework</h1> |
| <div id="front-matter"> |
| <div id="minitoc-area"> |
| <ul class="minitoc"> |
| <li> |
| <a href="#Introduction">Introduction</a> |
| </li> |
| <li> |
| <a href="#Directory+Structure">Directory Structure</a> |
| <ul class="minitoc"> |
| <li> |
| <a href="#The+Lenya+Core">The Lenya Core</a> |
| </li> |
| <li> |
| <a href="#Your+Publication">Your Publication</a> |
| </li> |
| </ul> |
| </li> |
| <li> |
| <a href="#Architecture">Architecture</a> |
| </li> |
| <li> |
| <a href="#The+Contract+Between+Flowscript+And+Usecase+Handler">The Contract Between Flowscript And Usecase Handler</a> |
| </li> |
| <li> |
| <a href="#Implementing+a+Custom+Usecase">Implementing a Custom Usecase</a> |
| <ul class="minitoc"> |
| <li> |
| <a href="#Prerequisites">Prerequisites</a> |
| </li> |
| <li> |
| <a href="#Add+a+Menu+Item">Add a Menu Item</a> |
| </li> |
| <li> |
| <a href="#Implement+the+Usecase+Handler+Class">Implement the Usecase Handler Class</a> |
| </li> |
| <li> |
| <a href="#Implement+the+View">Implement the View</a> |
| </li> |
| <li> |
| <a href="#Displaying+Usecases+in+Tabs">Displaying Usecases in Tabs</a> |
| </li> |
| <li> |
| <a href="#dyn_exit">Dynamically Setting the Exit URL</a> |
| </li> |
| </ul> |
| </li> |
| <li> |
| <a href="#Overriding+Core+Usecases+in+Publications">Overriding Core Usecases in Publications</a> |
| <ul class="minitoc"> |
| <li> |
| <a href="#Overriding+Usecase+Handler+Classes">Overriding Usecase Handler Classes</a> |
| </li> |
| <li> |
| <a href="#Overriding+JX+Templates">Overriding JX Templates</a> |
| </li> |
| </ul> |
| </li> |
| </ul> |
| </div> |
| </div> |
| |
| |
| <a name="N1000D"></a><a name="Introduction"></a> |
| <h2 class="h3">Introduction</h2> |
| <div class="section"> |
| <p>A usecase in Lenya means a user triggered action. In most cases, a usecase is triggered by a CMS menu option on |
| a specific document of the publication. This document is the object of the usecases' action (such as edit, delete, publish, ...).</p> |
| <p>There are usecases which are independent of a specific document, such as the <span class="codefrag">ac.logout</span> usecase. In that case it does |
| not matter on what document the usecase is triggered. The part of the request which specifies the document is simply ignored |
| by usecases that are document independent.</p> |
| <p>The CMS menus trigger usecases by setting the <span class="codefrag">lenya.usecase</span> request parameter on the current document. If for example |
| the user selects the <em>Publish</em> option from the <em>Workflow</em> menu, a request will be triggered such as: |
| |
| <span class="codefrag"> |
| GET http://www.server.com/lenya/default/authoring/tutorial.html?&lenya.usecase=publish |
| </span> |
| </p> |
| <p>The Lenya <span class="codefrag">global-sitemap.xmap</span> will redirect requests with a <span class="codefrag">lenya.usecase</span> request parameter to the |
| <span class="codefrag">$LENYA_WEBAPP/lenya/usecase.xmap</span> |
| sub-sitemap. From version 2.0 on, the following pipeline in this sitemap is used to recognonize usecases which are implemented |
| in Java using the new 2.0 usecase framework:</p> |
| <pre class="code"> |
| <map:pipeline> |
| <map:match type="registered-usecase"> |
| <map:mount src="usecases/usecase.xmap" uri-prefix="" check-reload="yes" reload-method="synchron"/> |
| </map:match> |
| </map:pipeline> |
| </pre> |
| <p>The <span class="codefrag">registered-usecase</span> matcher's default implementation |
| (<span class="codefrag">org.apache.lenya.cms.cocoon.matching.UsecaseRegistrationMatcher</span>) will use the Avalon |
| component resolver mechanism to resolve the name of the usecase to a an Avalon component. In case it cannot |
| resolve the usecase to an Avalon component, sitemap processing will continue and the usecase is treated in the |
| traditional way using the <span class="codefrag">usecase</span> and <span class="codefrag">step</span> matchers |
| (<span class="codefrag">org.apache.cocoon.matching.WildcardRequestParameterMatcher</span>). In order for this to work |
| correctly, there should be a <span class="codefrag">lenya.step</span> parameter in the request.</p> |
| <p>If the usecase could be resolved successfully into an Avalon component, processing will continue in the |
| <span class="codefrag">$LENYA_WEBAPP/lenya/usecases/usecase.xmap</span> (as opposed to <span class="codefrag">$LENYA_WEBAPP/lenya/usecase.xmap</span>) with |
| the new JX and Java based 2.0 usecase framework.</p> |
| <p> |
| The <em>usecase framework</em> in Lenya 2.0 is a simple framework to implement usecases using JX templates and Java. |
| This approach is an "85% solution". It enables the user to implement a big range of common usecases. |
| </p> |
| <div class="note"> |
| <div class="label">Note</div> |
| <div class="content"> |
| Some special complex usecases might require a custom flowscript, in this case you can't use this framework. |
| </div> |
| </div> |
| </div> |
| |
| |
| <a name="N10062"></a><a name="Directory+Structure"></a> |
| <h2 class="h3">Directory Structure</h2> |
| <div class="section"> |
| <a name="N10068"></a><a name="The+Lenya+Core"></a> |
| <h3 class="h4">The Lenya Core</h3> |
| <pre class="code"> |
| $LENYA_WEBAPP |
| /lenya/usecases usecase-related files |
| /usecase.xmap usecase dispatching sitemap |
| /usecases.js flowscript for usecase control flow |
| /admin Lenya admin usecases |
| /addUser.jx JX templates for usecase views |
| ... more Lenya core usecases |
| </pre> |
| <a name="N10073"></a><a name="Your+Publication"></a> |
| <h3 class="h4">Your Publication</h3> |
| <pre class="code"> |
| $PUB_HOME |
| /lenya/usecases usecase-related files |
| /editHeadline.jx JX templates for usecase views |
| /java/src/... usecase handler classes |
| </pre> |
| </div> |
| |
| |
| |
| <a name="N1007F"></a><a name="Architecture"></a> |
| <h2 class="h3">Architecture</h2> |
| <div class="section"> |
| <p> |
| A usecase request - denoted by the request parameter <span class="codefrag">lenya.usecase</span> - is dispatched by <span class="codefrag">$LENYA_WEBAPP/lenya/usecases/usecase.xmap</span>. |
| All usecases are handled by a single flowscript <span class="codefrag">$LENYA_WEBAPP/lenya/usecases/usecases.js</span>. This keeps javascript maintenance costs at a minimum. |
| </p> |
| <p> |
| The flowscript <span class="codefrag">usecases.js</span> determines the usecase handler class using the <span class="codefrag">org.apache.lenya.cms.usecase.UsecaseResolver</span>. |
| All business code operations are delegated to the usecase handler class. |
| </p> |
| <div id="" style="text-align: center;"> |
| <img id="" class="figure" alt="Usecase framework architecture" src="../../../../images/live/usecase-framework-architecture.png"></div> |
| </div> |
| |
| |
| <a name="N1009F"></a><a name="The+Contract+Between+Flowscript+And+Usecase+Handler"></a> |
| <h2 class="h3">The Contract Between Flowscript And Usecase Handler</h2> |
| <div class="section"> |
| <p> |
| The usecase handler class has to implement the interface <span class="codefrag">org.apache.lenya.cms.usecase.Usecase</span>. |
| The methods of this interface are called in a certain order when the usecase is invoked: |
| </p> |
| <ol> |
| |
| <li> |
| <span class="codefrag">setSourceURL(String sourceUrl)</span> |
| |
| <br> |
| |
| <span class="codefrag">setName(String)</span> |
| |
| <p>Initialize the handler.</p> |
| |
| <br> |
| |
| </li> |
| |
| <li> |
| <span class="codefrag">Passing request parameters</span> |
| |
| <br> |
| |
| <p> |
| In the next step, all request parameters are passed as parameters to the usecase, |
| except the following reserved parameters: |
| </p> |
| |
| <ul> |
| |
| <li> |
| <span class="codefrag">lenya.usecase</span> |
| </li> |
| |
| <li> |
| <span class="codefrag">lenya.continutation</span> |
| </li> |
| |
| <li> |
| <span class="codefrag">submit</span> |
| </li> |
| |
| </ul> |
| |
| <p> |
| If the request parameter value is a string, the value can be accessed inside the usecase |
| handler using <span class="codefrag">getParameterAsString(name)</span>. If the request parameter |
| is a part of a multipart request, e.g., in a file upload form, it will be available |
| using <span class="codefrag">getPart(name)</span>. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| <li> |
| <span class="codefrag">checkPreconditions()</span> |
| |
| <p> |
| This method is called to check the pre-conditions of the usecase. The pre-conditions |
| are checked before the usecase is started, i.e., before the first screen is presented |
| to the user. To denote that a condition does not comply, add an appropriate error message |
| using <span class="codefrag">addErrorMessage(String)</span>. If an error message was added, the usecase |
| is not started. Alternatively, you can provide information to the user using |
| <span class="codefrag">addInfoMessage(String)</span>. This doesn't prevent the usecase from being executed. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| <li> |
| <span class="codefrag">lockInvolvedObjects()</span> |
| |
| <p> |
| This method is called to lock all objects which could be changed during the usecase. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| </ol> |
| <p> |
| The following methods are called in a loop while the user interacts with the usecase, |
| until a request parameter with the name <span class="codefrag">submit</span> was sent. |
| </p> |
| <ol> |
| |
| <li> |
| <span class="codefrag">getView()</span> |
| |
| <p> |
| Requests the next view to be displayed. The view may be <span class="codefrag">null</span> if no |
| screen should be presented to the user. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| <li> |
| <span class="codefrag">advance()</span> |
| |
| <p> |
| This method is called to advance the usecase after the a user interaction. |
| In contrast to <span class="codefrag">execute()</span>, this method is not called when the |
| <span class="codefrag"><input type="submit" name="submit"></span> was pressed, but for every |
| other submitting of the form. A typical usecase is the <em>multiple forms editor</em> where |
| <span class="codefrag">advance()</span> is used to update the document when the user switched to |
| another element. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| </ol> |
| <p> |
| When the form is submitted using the <span class="codefrag"><input type="submit" name="submit"></span> |
| button, the usecase is finished: |
| </p> |
| <ol> |
| |
| <li> |
| <span class="codefrag">checkExecutionConditions()</span> |
| |
| <p> |
| This method is called before the usecase is actually executed. A typical example |
| is the validation of form data. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| <li> |
| <span class="codefrag">execute()</span> |
| |
| <p> |
| This method actually executes the final step of the usecase. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| </ol> |
| <p> |
| When the form is submitted using the <span class="codefrag"><input type="submit" name="cancel"></span> |
| button, the usecase is cancelled: |
| </p> |
| <ol> |
| |
| <li> |
| <span class="codefrag">cancel()</span> |
| |
| <p> |
| This method cancels the usecase. The transaction is rolled back. |
| </p> |
| |
| <br> |
| |
| </li> |
| |
| </ol> |
| </div> |
| |
| |
| <a name="N10158"></a><a name="Implementing+a+Custom+Usecase"></a> |
| <h2 class="h3">Implementing a Custom Usecase</h2> |
| <div class="section"> |
| <a name="N1015E"></a><a name="Prerequisites"></a> |
| <h3 class="h4">Prerequisites</h3> |
| <ol> |
| |
| <li>Choose a name to identify the usecase, e.g. editHeadline. It is possible to group usecases |
| using "." as delimiter, for instance <span class="codefrag">article.editHeadline</span>. |
| </li> |
| |
| </ol> |
| <a name="N1016E"></a><a name="Add+a+Menu+Item"></a> |
| <h3 class="h4">Add a Menu Item</h3> |
| <div class="note"> |
| <div class="label">Note</div> |
| <div class="content"> |
| This step is necessary if you want to call the usecase from the Lenya menubar. |
| </div> |
| </div> |
| <ol> |
| |
| <li>Add the corresponding menu item: |
| <pre class="code"><item uc:usecase="article.editHeadline">Edit Headline</item></pre> |
| |
| </li> |
| |
| </ol> |
| <a name="N10182"></a><a name="Implement+the+Usecase+Handler+Class"></a> |
| <h3 class="h4">Implement the Usecase Handler Class</h3> |
| <ol> |
| |
| <li>Choose a name for your business logic class, e.g. <span class="codefrag">org.myproject.lenya.usecases.EditHeadline</span>.</li> |
| |
| <li>The class must implement the interface <span class="codefrag">org.apache.lenya.cms.usecase.Usecase</span>.</li> |
| |
| <li> |
| To simplify development, you can extend one of the following classes: |
| <ul> |
| |
| <li> |
| <span class="codefrag">org.apache.lenya.cms.usecase.AbstractUsecase</span> |
| </li> |
| |
| <li> |
| <span class="codefrag">org.apache.lenya.cms.usecase.DocumentUsecase</span> (only for usecases invoked on document pages)</li> |
| |
| <li> |
| <span class="codefrag">org.apache.lenya.cms.usecase.SiteUsecase</span> |
| </li> |
| |
| </ul> |
| They have built-in support for the unit-of-work pattern (which will evolve into |
| an ACID transaction someday) as well as functionality specific to the area they are |
| supposed to be used with, e.g. the site area. |
| </li> |
| |
| <li> |
| Add the usecase handler class declaration to an XPatch file, e.g. |
| <span class="codefrag">$PUB_HOME/config/cocoon-xconf/usecases.xconf</span>: |
| <pre class="code"><xconf xpath="/cocoon/usecases" |
| unless="/cocoon/usecases/component-instance[@name = 'article.editHeadline']"> |
| <component-instance name="article.editHeadline" |
| logger="lenya.usecases.editHeadline" |
| class="org.myproject.lenya.usecases.EditHeadline"/> |
| </xconf></pre> |
| |
| </li> |
| |
| </ol> |
| <a name="N101B5"></a><a name="Implement+the+View"></a> |
| <h3 class="h4">Implement the View</h3> |
| <p> |
| The view of a usecase is optional. If you omit the view declaration, no screen is presented |
| to the user. The view is declared in the usecase configuration: |
| </p> |
| <pre class="code"> <component-instance ...> |
| <view template="usecases/article/editHeadline.jx" menu="false"> |
| <parameter name="title" value="Edit Headline"/> |
| <parameter name="..." value="..."/> |
| </view> |
| </component-instance></pre> |
| <p> |
| The <span class="codefrag"><view></span> element takes an optional <span class="codefrag">menu</span> attribute |
| which denotes if the menubar should be visible when the usecase screen is presented. |
| If omitted, it defaults to <span class="codefrag">false</span>. |
| </p> |
| <p> |
| The <span class="codefrag"><view></span> element can contain an arbitrary number of <span class="codefrag"><parameter></span> |
| elements, each containing a <span class="codefrag">name</span> and <span class="codefrag">value</span> attribute. These |
| parameters can be accessed in the JX template using |
| <span class="codefrag">${usecase.getView().getParameter('...')}</span>. |
| </p> |
| <p> |
| One option is to implement view for a usecase as a JX template. The location of the |
| JX template is defined using the <span class="codefrag"><view></span> element's <span class="codefrag">template</span> |
| attribute (relatively to the <span class="codefrag">context://lenya</span> directory). |
| The output of the template has to be a Lenya page: |
| </p> |
| <pre class="code"><page:page |
| xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" |
| xmlns:page="http://apache.org/cocoon/lenya/cms-page/1.0" |
| xmlns="http://www.w3.org/1999/xhtml" |
| xmlns:i18n="http://apache.org/cocoon/i18n/2.1" |
| > |
| |
| <page:title> |
| <i18n:text><jx:out value="${usecase.getView().getParameter('title')}"/></i18n:text> |
| </page:title> |
| <page:body> |
| |
| <form> |
| <input type="hidden" name="lenya.continuation" value="${continuation.id}"/> |
| <input type="hidden" name="lenya.usecase" value="${usecase.getName()}"/> |
| |
| ... |
| |
| </form> |
| |
| </page:body> |
| </page:page></pre> |
| <p> |
| Take care of adding the hidden <span class="codefrag">lenya.usecase</span> and <span class="codefrag">lenya.continuation</span> fields as shown above. |
| </p> |
| <p> |
| If you don't want to display a form, but output arbitrary XML, text, an SVG-generated image |
| or something like that, you can use a <span class="codefrag">uri</span> attribute instead of the <span class="codefrag">template</span> |
| attribute. In this case, the <span class="codefrag">menu</span> attribute can be omitted. |
| </p> |
| <pre class="code"> <component-instance ...> |
| <view uri="cocoon://modules/reports/generateReport.pdf" /> |
| </component-instance></pre> |
| <a name="N1020A"></a><a name="Displaying+Usecases+in+Tabs"></a> |
| <h3 class="h4">Displaying Usecases in Tabs</h3> |
| <p> |
| It is possible to use a tab-based layout to assemble a set of usecases. |
| The admin and site areas are displayed using this style. |
| To add a tab-based usecase to a tab set, two steps are required: |
| </p> |
| <ol> |
| |
| <li> |
| Add the tab to the GUI manager configuration: |
| <pre class="code"><xconf xpath="/cocoon/gui-manager/tab-group[@name = 'admin']" |
| unless="/cocoon/gui-manager/tab-group[@name = 'admin']/tab[@name = 'search']"> |
| |
| <tab name="search" label="Search" usecase="admin.search"/> |
| |
| </xconf></pre> |
| |
| </li> |
| |
| <li> |
| Add the tab configuration to the usecase view declaration: |
| <pre class="code"><component-instance name="admin.search" logger="lenya.admin" class="org.apache.lenya.cms.usecase.DummyUsecase"> |
| <view template="usecases/admin/search.jx" menu="true"> |
| <tab group="admin" name="search"/> |
| </view> |
| <exit usecase="admin.search"/> |
| </component-instance></pre> |
| |
| </li> |
| |
| </ol> |
| <a name="N10225"></a><a name="dyn_exit"></a> |
| <h3 class="h4">Dynamically Setting the Exit URL</h3> |
| <p> Like you see above you can specify the "exit" URL of the |
| usecase via the component configuration, however this is |
| sometimes not enough because you may need to set the exit URL |
| of a usecase dynamically.</p> |
| <p>Consider the use case is that you have a form and you need two |
| possibilities to exit the usecase. </p> |
| <ol> |
| |
| <li>Pressing on "submit" will save and exit to the same page in |
| the authoring area. </li> |
| |
| <li>The other exit point could be a dynamic link based on a <span class="codefrag"><a href=""/></span> |
| where the user get redirected after submitting the form (e.g. to edit the linked document |
| with the <a href="../../../../docs/1_2_x/components/editors/bxe.html">BXE</a> editor).</li> |
| |
| </ol> |
| <p>First you need to add another request parameter (e.g., |
| <span class="codefrag">TRANSFER_FIELD</span>) denoting that the user clicked the link. This |
| could be e.g. a hidden field which contains the URL to transfer |
| the request. Further you need to override |
| <span class="codefrag">Usecase.getTargetURL()</span> to return the BXE usecase URL if the |
| <span class="codefrag">TRANSFER_FIELD</span> parameter is set, and <span class="codefrag">super.getTargetURL()</span> |
| otherwise.</p> |
| <pre class="code">public String getTargetURL(boolean success) { |
| String tmpTransfer = getParameterAsString("TRANSFER_FIELD", null); |
| if (!tmpTransfer.equals("") & tmpTransfer != null) |
| return tmpTransfer; |
| else |
| return super.getTargetURL(success); |
| }</pre> |
| </div> |
| |
| |
| <a name="N10256"></a><a name="Overriding+Core+Usecases+in+Publications"></a> |
| <h2 class="h3">Overriding Core Usecases in Publications</h2> |
| <div class="section"> |
| <a name="N1025C"></a><a name="Overriding+Usecase+Handler+Classes"></a> |
| <h3 class="h4">Overriding Usecase Handler Classes</h3> |
| <p> |
| The usecase resolver, which is responsible for obtaining the handler class for a usecase, |
| looks first if the current publication overrides the core usecase handler. |
| This can be done by declaring a usecase called <span class="codefrag"><pub-id>/<usecase-name></span>, |
| for instance <span class="codefrag">mypub/admin.addUser</span>. To implement a core usecase using a custom |
| handler class, you need to |
| </p> |
| <ol> |
| |
| <li>Implement the handler class and put it in <span class="codefrag">$PUB_HOME/java/src</span>. |
| In most cases, you will extend the core usecase handler class to inherit the basic functionality.</li> |
| |
| <li> |
| Declare it in an <em>xpatch</em> file, for instance |
| <span class="codefrag">$PUB_HOME/config/cocoon-xconf/usecases.xconf</span>: |
| <pre class="code"><xconf xpath="/cocoon/usecases" unless="/cocoon/usecases/component-instance[@name = 'mypub/admin.addUser']"> |
| <component-instance name="mypub/admin.addUser" |
| logger="lenya.usecases.editHeadline" |
| class="org.myproject.lenya.usecases.AddUser"/> |
| </xconf></pre> |
| |
| </li> |
| |
| </ol> |
| <p> |
| Now, when the usecase is invoked from inside the publication mypub, the custom |
| handler class will be used. |
| </p> |
| <a name="N10285"></a><a name="Overriding+JX+Templates"></a> |
| <h3 class="h4">Overriding JX Templates</h3> |
| <p> |
| Overriding the JX template of a usecase follows the |
| <a href="../../../../docs/2_0_x/reference/publication/publication-templating/index.html">publication templating</a> principle. |
| You just have to put a JX template with the same name in <span class="codefrag">$PUB_HOME/lenya/usecases</span>, |
| for instance <span class="codefrag">$PUB_HOME/lenya/usecases/admin/addUser.jx</span>. |
| </p> |
| </div> |
| |
| |
| </div> |
| <!--+ |
| |end content |
| +--> |
| <div class="clearboth"> </div> |
| </div> |
| <div id="footer"> |
| <!--+ |
| |start bottomstrip |
| +--> |
| <div class="lastmodified"> |
| <script type="text/javascript"><!-- |
| document.write("Last Published: " + document.lastModified); |
| // --></script> |
| </div> |
| <div class="copyright"> |
| Copyright © |
| 2002-2007 <a href="http://www.apache.org/licenses/LICENSE-2.0">The Apache Software Foundation.</a> |
| </div> |
| <div id="logos"></div> |
| <div id="feedback"> |
| Send feedback about the website to: |
| <a id="feedbackto" href="mailto:dev@lenya.apache.org?subject=Feedback%C2%A0for%C2%A0docs/2_0_x/reference/usecase-framework/index.html">dev@lenya.apache.org</a> |
| </div> |
| <!--+ |
| |end bottomstrip |
| +--> |
| </div> |
| </body> |
| </html> |