You are viewing a plain text version of this content. The canonical link for it is here.
Posted to svn@forrest.apache.org by cr...@apache.org on 2006/02/09 01:26:32 UTC
svn commit: r376128 [11/34] - in /forrest/site: ./ docs_0_60/
docs_0_60/howto/ docs_0_60/howto/bugzilla-patch/ docs_0_60/howto/multi/
docs_0_70/ docs_0_70/howto/ docs_0_70/howto/cvs-ssh/ docs_0_70/howto/multi/
docs_0_80/ docs_0_80/howto/ docs_0_80/howt...
Added: forrest/site/docs_0_70/howto/sitemap.xmap.source.xml
URL: http://svn.apache.org/viewcvs/forrest/site/docs_0_70/howto/sitemap.xmap.source.xml?rev=376128&view=auto
==============================================================================
--- forrest/site/docs_0_70/howto/sitemap.xmap.source.xml (added)
+++ forrest/site/docs_0_70/howto/sitemap.xmap.source.xml Wed Feb 8 16:26:20 2006
@@ -0,0 +1,633 @@
+<?xml version="1.0" encoding="ISO-8859-1"?><document><header> <!-- <meta content="HTML Tidy, see www.w3.org" name="generator"/> --> <title>Annotated core sitemap.xmap</title></header><body><section><title>sitemap.xmap</title><pre>
+<?xml version="1.0"?>
+<!-- ===============================================
+Default Forrest sitemap, defining the whole site.
+Delegates to the other *.xmap files. See
+http://forrest.apache.org/docs/sitemap-ref.html
+
+$Revision: 1.12 $
+==================================================== -->
+</pre><section><title>Start of Sitemap</title><pre>
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+ <map:components>
+ <map:generators default="file">
+ <map:generator name="file" src="org.apache.cocoon.generation.FileGenerator" />
+ <map:generator name="html"
+ src="org.apache.cocoon.generation.HTMLGenerator">
+ <jtidy-config>WEB-INF/jtidy.properties</jtidy-config>
+ </map:generator>
+ <map:generator name="exception"
+ src="org.apache.cocoon.generation.ParseExceptionGenerator"/>
+ <!--
+ <map:generator name="html" src="org.apache.cocoon.generation.HTMLGenerator">
+ <jtidy-config>jtidy.properties</jtidy-config>
+ </map:generator>
+ <map:generator name="directory" src="org.apache.cocoon.generation.DirectoryGenerator" />
+ -->
+ <map:generator name="notifier" src="org.apache.cocoon.sitemap.NotifyingGenerator" />
+
+ <map:generator name="text2xml" logger="sitemap.generator.textgenerator"
+ src="org.apache.cocoon.generation.TextGenerator">
+ <parameter name="localizable" value="true"/>
+ </map:generator>
+
+ </map:generators>
+
+ <map:transformers default="xslt">
+
+ <!-- Add values to skinconf that need extra processing like the color shades -->
+ <map:transformer name="skinconf" src="org.apache.forrest.conf.SkinconfTransformer"/>
+
+ <!-- Generates @id attributes from <title> strings -->
+ <map:transformer name="idgen" src="org.apache.forrest.util.IdGeneratorTransformer">
+ <element>//*[local-name() = 'section']</element>
+ <id>title/text()</id>
+ </map:transformer>
+
+ <!-- Rewrites links, e.g. transforming href="site:index" to href="../index.html" -->
+ <!-- See http://forrest.apache.org/docs/sitemap-ref.html#linkrewriting_impl -->
+ <map:transformer name="linkrewriter" logger="sitemap.transformer.linkrewriter" src="org.apache.cocoon.transformation.LinkRewriterTransformer">
+ <link-attrs>href src</link-attrs>
+ <schemes>site ext</schemes>
+
+ <input-module name="site">
+ <input-module name="linkmap">
+ <file src="{src}" reloadable="true" />
+ </input-module>
+ <prefix>/site//</prefix>
+ <suffix>/@href</suffix>
+ </input-module>
+ <input-module name="ext">
+ <input-module name="linkmap">
+ <file src="{src}" reloadable="true" />
+ </input-module>
+ <prefix>/site/external-refs//</prefix>
+ <suffix>/@href</suffix>
+ </input-module>
+ </map:transformer>
+
+ <map:transformer name="xpath" logger="sitemap.transformer.xpath" src="org.apache.forrest.util.XPathTransformer" />
+
+ <map:transformer name="xslt" src="org.apache.cocoon.transformation.TraxTransformer" logger="sitemap.transformer.xslt" pool-max="32" pool-min="8" pool-grow="2">
+ <use-request-parameters>false</use-request-parameters>
+ <use-browser-capabilities-db>false</use-browser-capabilities-db>
+ <use-deli>false</use-deli>
+ <transformer-factory>org.apache.xalan.processor.TransformerFactoryImpl</transformer-factory>
+ <!--<transformer-factory>net.sf.saxon.TransformerFactoryImpl</transformer-factory>-->
+ <!--<transformer-factory>com.icl.saxon.TransformerFactoryImpl</transformer-factory>-->
+ <!--<transformer-factory>org.apache.xalan.xsltc.trax.TransformerFactoryImpl</transformer-factory>-->
+ </map:transformer>
+
+ <map:transformer name="xsltc" src="org.apache.cocoon.transformation.TraxTransformer" logger="sitemap.transformer.xslt" pool-max="32" pool-min="8" pool-grow="2">
+ <use-request-parameters>false</use-request-parameters>
+ <use-browser-capabilities-db>false</use-browser-capabilities-db>
+ <use-deli>false</use-deli>
+ <transformer-factory>org.apache.xalan.xsltc.trax.TransformerFactoryImpl</transformer-factory>
+ </map:transformer>
+
+ <map:transformer name="xslt-saxon"
+ pool-grow="2" pool-max="32" pool-min="8"
+ src="org.apache.cocoon.transformation.TraxTransformer">
+ <use-request-parameters>false</use-request-parameters>
+ <use-browser-capabilities-db>false</use-browser-capabilities-db>
+ <xslt-processor-role>saxon</xslt-processor-role>
+ </map:transformer>
+
+ <map:transformer name="xinclude" src="org.apache.cocoon.transformation.XIncludeTransformer" logger="sitemap.transformer.xinclude" pool-grow="2" pool-max="16" pool-min="2" />
+
+ <map:transformer name="cinclude" pool-grow="2" pool-max="16" pool-min="2" src="org.apache.cocoon.transformation.CIncludeTransformer" logger="sitemap.transformer.cinclude"/>
+ <map:transformer name="pattern"
+ src="org.apache.cocoon.transformation.PatternTransformer"
+ logger="sitemap.transformer.pattern">
+ <parameter name="groups" value="true"/>
+ </map:transformer>
+ <map:transformer name="lexer"
+ src="org.apache.cocoon.transformation.LexicalTransformer"
+ logger="sitemap.transformer.lexer">
+ <parameter name="localizable" value="true"/>
+ </map:transformer>
+ <map:transformer name="parser"
+ src="org.apache.cocoon.transformation.ParserTransformer"
+ logger="sitemap.transformer.parser">
+ <parameter name="flatten" value="true"/>
+ <parameter name="recovery" value="true"/>
+ <parameter name="localizable" value="true"/>
+ </map:transformer>
+ </map:transformers>
+
+ <map:readers default="resource">
+ <map:reader name="resource" src="org.apache.cocoon.reading.ResourceReader"/>
+ </map:readers>
+
+ <map:serializers default="html">
+ <map:serializer name="html" mime-type="text/html" src="org.apache.cocoon.serialization.HTMLSerializer">
+ <doctype-public>-//W3C//DTD HTML 4.01 Transitional//EN</doctype-public>
+ <doctype-system>http://www.w3.org/TR/html4/loose.dtd</doctype-system>
+ <encoding>UTF-8</encoding>
+ </map:serializer>
+
+ <map:serializer name="xml" mime-type="text/xml" src="org.apache.cocoon.serialization.XMLSerializer"/>
+
+ <map:serializer name="xml-document" mime-type="text/xml" src="org.apache.cocoon.serialization.XMLSerializer">
+ <cdata-section-elements>source</cdata-section-elements>
+ <doctype-public>-//APACHE//DTD Documentation V1.3//EN</doctype-public>
+ <doctype-system>document-v13.dtd</doctype-system>
+ </map:serializer>
+
+ <map:serializer name="links" src="org.apache.cocoon.serialization.LinkSerializer">
+ <encoding>ISO-8859-1</encoding>
+ </map:serializer>
+
+ <map:serializer name="svgxml" src="org.apache.cocoon.serialization.XMLSerializer" mime-type="image/svg+xml">
+ <doctype-public>-//W3C//DTD SVG 1.0//EN</doctype-public>
+ <doctype-system>http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd</doctype-system>
+ </map:serializer>
+ <map:serializer logger="sitemap.serializer.text" mime-type="text/plain" name="text" src="org.apache.cocoon.serialization.TextSerializer">
+ <encoding>UTF-8</encoding>
+ </map:serializer>
+
+ <!--
+ <map:serializer mime-type="application/x-shockwave-flash" name="swf" src="org.apache.cocoon.serialization.SWFSerializer"/>
+ <map:serializer mime-type="application/msword" name="fo2rtf" src="org.apache.cocoon.serialization.RTFSerializer"/>
+ -->
+ </map:serializers>
+
+ <map:matchers default="wildcard">
+ <map:matcher name="wildcard" src="org.apache.cocoon.matching.WildcardURIMatcher"/>
+ <map:matcher name="regexp" src="org.apache.cocoon.matching.RegexpURIMatcher"/>
+ </map:matchers>
+
+ <map:selectors>
+ <map:selector logger="sitemap.selector.exists" name="exists" src="org.apache.forrest.sourceexists.SourceExistsSelector" />
+ <map:selector logger="sitemap.selector.exception" name="exception"
+ src="org.apache.cocoon.selection.ExceptionSelector">
+ <exception name="syntax" class="net.sourceforge.chaperon.process.ParseException"/>
+ <exception class="java.lang.Throwable" unroll="true"/>
+ </map:selector>
+ </map:selectors>
+
+ <map:pipes default="caching">
+ <map:pipe name="caching" src="org.apache.cocoon.components.pipeline.impl.CachingProcessingPipeline"/>
+ <!--
+ <map:pipe name="noncaching" src="org.apache.cocoon.components.pipeline.impl.NonCachingProcessingPipeline"/>
+ <map:pipe name="profile-caching" src="org.apache.cocoon.components.profiler.ProfilingCachingProcessingPipeline"/>
+ <map:pipe name="profile-noncaching" src="org.apache.cocoon.components.profiler.ProfilingNonCachingProcessingPipeline"/>
+ -->
+ </map:pipes>
+ </map:components>
+
+ <!-- NOTE: the 'links view' is no longer used to discover a page's links.
+ Instead of filterlinks.xsl, use cli.xconf include/exclude nodes to define which pages to render.
+ <map:views>
+ <map:view name="links" from-position="last">
+ <map:transform src="{forrest:stylesheets}/filterlinks.xsl">
+ <map:parameter name="ctxbasedir" value="{realpath:.}/"/>
+ </map:transform>
+ <map:serialize type="links"/>
+ </map:view>
+ </map:views>
+ -->
+
+ <map:resources>
+ <map:resource name="skinit">
+ <map:select type="exists">
+ <map:when test="{project:skins-dir}{forrest:skin}/xslt/html/{type}.xsl">
+ <map:transform src="{project:skins-dir}{forrest:skin}/xslt/html/{type}.xsl">
+ <map:parameter name="notoc" value="{notoc}"/>
+ <!-- For backwards-compat with 0.2 - 0.4 skins -->
+ <map:parameter name="isfaq" value="{notoc}"/>
+ <map:parameter name="nopdf" value="{nopdf}"/>
+ <map:parameter name="path" value="{path}"/>
+ <map:parameter name="config-file" value="{project:skinconf}"/>
+ </map:transform>
+ </map:when>
+ <map:otherwise>
+ <map:transform src="{forrest:context}/skins/{forrest:skin}/xslt/html/{type}.xsl">
+ <map:parameter name="notoc" value="{notoc}"/>
+ <!-- For backwards-compat with 0.2 - 0.4 skins -->
+ <map:parameter name="isfaq" value="{notoc}"/>
+ <map:parameter name="nopdf" value="{nopdf}"/>
+ <map:parameter name="path" value="{path}"/>
+ <map:parameter name="config-file" value="{project:skinconf}"/>
+ </map:transform>
+ </map:otherwise>
+ </map:select>
+ <map:serialize/>
+ </map:resource>
+
+ </map:resources>
+</pre></section><section><title>Start of Pipelines</title><pre>
+ <!-- =========================== Pipelines ================================= -->
+ <map:pipelines>
+
+ <map:pipeline type="caching" internal-only="true">
+</pre></section><section><title>Test for First Pipeline</title><pre>
+ <map:match pattern="*.xlex">
+ <map:select type="exists">
+ <map:when test="resources/chaperon/grammars/{1}.xlex">
+ <map:read src="resources/chaperon/grammars/{1}.xlex"/>
+ </map:when>
+ <map:otherwise>
+ <map:generate type="text2xml" src="{forrest:context}/resources/chaperon/grammars/{1}.grm"/>
+ <map:transform type="lexer" src="{forrest:context}/resources/chaperon/grammars/grm.xlex"/>
+ <map:transform type="parser" src="{forrest:context}/resources/chaperon/grammars/grm.xgrm"/>
+ <map:transform src="{forrest:context}/resources/chaperon/stylesheets/text4regex.xsl"/>
+ <map:transform type="lexer" src="{forrest:context}/resources/chaperon/grammars/regex.xlex"/>
+ <map:transform type="parser" src="{forrest:context}/resources/chaperon/grammars/regex.xgrm"/>
+ <map:transform src="{forrest:context}/resources/chaperon/stylesheets/grm2xlex.xsl"/>
+ <map:serialize type="xml"/>
+ </map:otherwise>
+ </map:select>
+ </map:match>
+ </map:pipeline>
+</pre></section><section><title>Insertion Point for Project Sitemap</title><pre>
+ <!--
+ This is the user pipeline, that can answer requests instead
+ of the Forrest one, or let requests pass through.
+ To take over the rendering of a file it must match the file name and path.
+ To take over the generation of the intermediate format, it must give
+ Forrest the same filename but ending with xml, and a DTD that Forrest
+ recognizes.
+ -->
+ <map:pipeline internal-only="false">
+ <map:select type="exists">
+ <map:when test="{project:sitemap}">
+ <map:mount uri-prefix=""
+ src="{project:sitemap}"
+ check-reload="yes"
+ pass-through="true"/>
+ </map:when>
+ </map:select>
+ </map:pipeline>
+
+ <map:pipeline internal-only="false">
+ <map:select type="exists">
+ <map:when test="{project:temp-dir}/internal.xmap">
+ <map:mount uri-prefix="" src="{project:temp-dir}/internal.xmap" check-reload="yes" pass-through="true"/>
+ </map:when>
+ </map:select>
+ </map:pipeline>
+
+ <map:pipeline internal-only="false">
+ <map:match pattern="skinconf.xml">
+ <map:generate src="{project:skinconf}" />
+ <map:transform src="{forrest:stylesheets}/strip-doctype.xsl"/>
+ <map:transform src="{forrest:stylesheets}/upgrade-skinconf.xsl"/>
+ <map:select type="exists">
+ <map:when test="{project:skins-dir}{forrest:skin}/skinconf.xsl">
+ <map:transform src="{project:skins-dir}{forrest:skin}/skinconf.xsl"/>
+ </map:when>
+ </map:select>
+ <map:select type="exists">
+ <map:when test="{forrest:context}/skins/{forrest:skin}/skinconf.xsl">
+ <map:transform src="{forrest:context}/skins/{forrest:skin}/skinconf.xsl"/>
+ </map:when>
+ </map:select>
+ <map:transform src="{forrest:context}/skins/common/skinconf.xsl"/>
+ <map:transform type="skinconf"/>
+ <map:serialize type="xml" />
+ </map:match>
+
+ <!-- Add some build information, which is added to the html head -->
+ <map:match pattern="build-info">
+ <map:generate src="{project:temp-dir}/build-info.xml"/>
+ <map:serialize type="xml"/>
+ </map:match>
+ </map:pipeline>
+
+ <map:pipeline internal-only="false">
+ <!-- ============================================================ -->
+ <!-- SOURCE FORMATS -->
+ <!-- Raw XML sources, typically doc-v12 format -->
+ <!-- ============================================================ -->
+ <!-- http://forrest.apache.org/docs/sitemap-ref.html#source_pipelines -->
+</pre></section><section><title>First Match for '**.xml'</title><pre>
+ <!-- Body content -->
+ <map:match pattern="**.xml">
+
+ <map:match pattern="linkmap.xml">
+ <map:mount uri-prefix="" src="linkmap.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="changes.xml">
+ <map:mount uri-prefix="" src="status.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="todo.xml">
+ <map:mount uri-prefix="" src="status.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**dtdx.xml">
+ <map:mount uri-prefix="" src="dtd.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="forrest-issues.xml">
+ <map:mount uri-prefix="" src="issues.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**faq.xml">
+ <map:mount uri-prefix="" src="faq.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="community/**index.xml">
+ <map:mount uri-prefix="" src="forrest.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="community/*/**.xml">
+ <map:mount uri-prefix="" src="revisions.xmap" check-reload="yes" />
+ </map:match>
+
+ <!-- wholesite is preferred; site is here for compatibility -->
+ <map:match pattern="wholesite.xml">
+ <map:mount uri-prefix="" src="aggregate.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="site.xml">
+ <map:mount uri-prefix="" src="aggregate.xmap" check-reload="yes" />
+ </map:match>
+
+ <!-- Lucene index update and search -->
+ <map:match pattern="lucene-*.xml">
+ <map:mount uri-prefix="" src="search.xmap" check-reload="yes"/>
+ </map:match>
+
+ <!-- Default source types -->
+ <map:mount uri-prefix="" src="forrest.xmap" check-reload="yes" />
+
+ </map:match>
+
+ <!-- Menu content -->
+ <map:match pattern="abs-menulinks">
+ <map:mount uri-prefix="" src="menu.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**menulinks-*">
+ <map:mount uri-prefix="" src="menu.xmap" check-reload="yes" />
+ </map:match>
+
+ <!-- Link maps -->
+ <map:match pattern="abs-linkmap">
+ <map:mount uri-prefix="" src="linkmap.xmap"/>
+ </map:match>
+
+ <map:match pattern="**linkmap-*">
+ <map:match pattern="linkmap-wholesite.*">
+ <map:mount uri-prefix="" src="aggregate.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="linkmap-site.*">
+ <map:mount uri-prefix="" src="aggregate.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:mount uri-prefix="" src="linkmap.xmap" check-reload="yes" />
+ </map:match>
+
+ </map:pipeline>
+
+
+ <!-- ============================================================ -->
+ <!-- INTERMEDIATE FORMATS -->
+ <!-- Tabs, menus and body HTML. -->
+ <!-- Called from output format pipelines -->
+ <!-- ============================================================ -->
+ <!-- http://forrest.apache.org/docs/sitemap-ref.html#intermediate_pipelines -->
+
+ <map:pipeline internal-only="false">
+
+ <!-- External matches -->
+ <!-- (HTML rendered directly from special formats) -->
+ <map:match pattern="**body-faq.html">
+ <map:mount uri-prefix="" src="faq.xmap" check-reload="yes" />
+ </map:match>
+</pre></section><section><title>First Match for '**body-*.html'</title><pre>
+ <map:match pattern="**body-*.html">
+ <map:select type="exists">
+ <map:when test="{project:content.xdocs}{1}{2}.ehtml">
+ <map:generate src="{project:content.xdocs}{1}{2}.ehtml" />
+ <map:transform src="{forrest:stylesheets}/html2htmlbody.xsl" />
+ <map:transform type="linkrewriter" src="cocoon:/{1}linkmap-{2}.html"/>
+ <map:transform src="resources/stylesheets/declare-broken-site-links.xsl" />
+ <map:serialize type="xml" />
+ </map:when>
+ </map:select>
+ </map:match>
+</pre></section><section><title>Second Match for '**body-*.html'</title><pre>
+ <!-- Default matches -->
+ <!-- (HTML rendered from doc-v11 intermediate format -->
+ <map:match pattern="**body-*.html">
+ <map:generate src="cocoon:/{1}{2}.xml"/>
+</pre></section><section><title>Returning to the '**body-*.html' Pipeline</title><pre>
+ <map:transform type="idgen"/>
+ <map:transform type="xinclude"/>
+ <map:transform type="linkrewriter" src="cocoon:/{1}linkmap-{2}.html"/>
+ <map:transform src="resources/stylesheets/declare-broken-site-links.xsl" />
+ <map:call resource="skinit">
+ <map:parameter name="type" value="document2html"/>
+ <map:parameter name="path" value="{1}{2}.html"/>
+ <map:parameter name="notoc" value="false"/>
+ </map:call>
+ </map:match>
+
+ <map:match pattern="**menu-*.html">
+ <map:generate src="cocoon:/{1}book-{2}.html"/>
+ <map:transform type="linkrewriter" src="cocoon:/{1}linkmap-{2}.html"/>
+ <map:transform src="resources/stylesheets/declare-broken-site-links.xsl" />
+ <map:call resource="skinit">
+ <map:parameter name="type" value="book2menu"/>
+ <map:parameter name="path" value="{1}{2}.html"/>
+ </map:call>
+ </map:match>
+
+ <map:match pattern="**tab-*.html">
+ <map:mount uri-prefix="" src="tabs.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**i18n-*.html">
+ <map:mount uri-prefix="" src="i18n.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**book-*.html">
+ <map:mount uri-prefix="" src="menu.xmap" check-reload="yes" />
+ </map:match>
+
+ </map:pipeline>
+
+ <!-- ============================================================ -->
+ <!-- OUTPUT FORMATS -->
+ <!-- Serves content directly to the user -->
+ <!-- +==========================================================+ -->
+ <!-- http://forrest.apache.org/docs/sitemap-ref.html#output_pipelines -->
+
+ <map:pipeline internal-only="false">
+ <map:select type="exists">
+ <map:when test="{project:temp-dir}/output.xmap">
+ <map:mount uri-prefix="" src="{project:temp-dir}/output.xmap" check-reload="yes" pass-through="true"/>
+ </map:when>
+ </map:select>
+ </map:pipeline>
+
+ <map:pipeline internal-only="false">
+
+ <map:match pattern="*.html">
+ <map:aggregate element="site">
+ <map:part src="cocoon:/skinconf.xml"/>
+ <map:part src="cocoon:/build-info"/>
+ <map:part src="cocoon:/tab-{0}"/>
+ <map:part src="cocoon:/menu-{0}"/>
+ <map:part src="cocoon:/body-{0}"/>
+ </map:aggregate>
+ <map:call resource="skinit">
+ <map:parameter name="type" value="site2xhtml"/>
+ <map:parameter name="path" value="{0}"/>
+ </map:call>
+ </map:match>
+</pre></section><section><title>First Match for "**/*.html"</title><pre>
+ <map:match pattern="**/*.html">
+ <map:aggregate element="site">
+ <map:part src="cocoon:/skinconf.xml"/>
+ <map:part src="cocoon:/build-info"/>
+ <map:part src="cocoon:/{1}/tab-{2}.html"/>
+ <map:part src="cocoon:/{1}/menu-{2}.html"/>
+ <map:part src="cocoon:/{1}/body-{2}.html"/>
+ </map:aggregate>
+ <map:call resource="skinit">
+ <map:parameter name="type" value="site2xhtml"/>
+ <map:parameter name="path" value="{0}"/>
+ </map:call>
+ </map:match>
+
+ <map:match type="regexp" pattern="^.+$">
+ <map:select type="exists">
+ <map:when test="{project:content.xdocs}/{0}">
+ <map:mount uri-prefix="" src="raw.xmap" check-reload="yes" />
+ </map:when>
+ </map:select>
+ </map:match>
+
+ <!-- generate faq.fo specially -->
+ <map:match pattern="**faq.fo">
+ <map:mount uri-prefix="" src="faq.xmap" check-reload="yes" />
+ </map:match>
+
+ <!-- generate .fo from .xml -->
+ <map:match type="regexp" pattern="^(.*?)([^/]*).fo$">
+ <map:select type="exists">
+ <map:when test="{project:content.xdocs}{1}{2}.fo">
+ <map:generate src="{project:content.xdocs}{1}{2}.fo"/>
+ </map:when>
+ <map:otherwise>
+ <map:aggregate element="site">
+ <map:part src="cocoon:/skinconf.xml"/>
+ <map:part src="cocoon:/{1}{2}.xml"/>
+ </map:aggregate>
+ <!-- <map:transform type="idgen"/> -->
+ <map:transform type="xinclude"/>
+ <map:transform type="linkrewriter" src="cocoon://{1}linkmap-{2}.fo"/>
+ <map:select type="exists">
+ <map:when test="{project:skins-dir}{forrest:skin}/xslt/fo/document2fo.xsl">
+ <map:transform src="{project:skins-dir}{forrest:skin}/xslt/fo/document2fo.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:when>
+ <map:when test="{forrest:context}/skins/{forrest:skin}/xslt/fo/document2fo.xsl">
+ <map:transform src="{forrest:context}/skins/{forrest:skin}/xslt/fo/document2fo.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:when>
+ <map:otherwise>
+ <map:transform src="{forrest:context}/skins/common/xslt/fo/document2fo.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:otherwise>
+ </map:select>
+ </map:otherwise>
+ </map:select>
+ <map:serialize type="xml"/>
+ </map:match>
+
+ <map:match type="regexp" pattern="^(.*?)([^/]*).svg$">
+ <map:generate src="cocoon:/{1}{2}.xml"/>
+ <!-- <map:transform type="idgen"/> -->
+ <map:transform type="xinclude"/>
+ <map:transform type="linkrewriter" src="cocoon://{1}linkmap-{2}.svg"/>
+ <map:transform src="resources/stylesheets/declare-broken-site-links.xsl" />
+ <map:select type="exists">
+ <map:when test="{project:skins-dir}{forrest:skin}/xslt/svg/document2svg.xsl">
+ <map:transform src="{project:skins-dir}{forrest:skin}/xslt/svg/document2svg.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:when>
+ <map:when test="{forrest:context}/skins/{forrest:skin}/xslt/svg/document2svg.xsl">
+ <map:transform src="{forrest:context}/skins/{forrest:skin}/xslt/svg/document2svg.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:when>
+ <map:otherwise>
+ <map:transform src="{forrest:context}/skins/common/xslt/svg/document2svg.xsl">
+ <map:parameter name="imagesdir" value="{project:resources.images}/"/>
+ <map:parameter name="xmlbasedir" value="{project:content.xdocs}{1}"/>
+ </map:transform>
+ </map:otherwise>
+ </map:select>
+ <map:serialize type="svgxml"/>
+ </map:match>
+
+ <map:match pattern="**changes.rss">
+ <map:mount uri-prefix="" src="status.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="profiler">
+ <map:mount uri-prefix="" src="profiler.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:match pattern="**.lucene">
+ <map:mount uri-prefix="" src="search.xmap" check-reload="yes" />
+ </map:match>
+
+ <map:select type="exists">
+ <map:when test="{project:temp-dir}/resources.xmap">
+ <map:mount uri-prefix=""
+ src="{project:temp-dir}/resources.xmap"
+ check-reload="yes"
+ pass-through="true"/>
+ </map:when>
+ </map:select>
+
+ <map:match pattern="**.js">
+ <map:mount uri-prefix="" src="resources.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="**.css">
+ <map:mount uri-prefix="" src="resources.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="**images**">
+ <map:mount uri-prefix="" src="resources.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="**.png">
+ <map:mount uri-prefix="" src="resources.xmap" check-reload="yes" />
+ </map:match>
+ <map:match pattern="**.ico">
+ <map:mount uri-prefix="" src="resources.xmap" check-reload="yes" />
+ </map:match>
+ </map:pipeline>
+
+
+
+ <!-- ============================================================ -->
+ <!-- REDIRECTS -->
+ <!-- ============================================================ -->
+ <map:pipeline internal-only="false">
+
+ <map:match pattern="">
+ <map:redirect-to uri="index.html" />
+ </map:match>
+ <map:match type="regexp" pattern="^.+/$">
+ <map:redirect-to uri="index.html"/>
+ </map:match>
+ </map:pipeline>
+
+ </map:pipelines>
+</map:sitemap>
+</pre></section></section></body></document>
\ No newline at end of file
Propchange: forrest/site/docs_0_70/howto/sitemap.xmap.source.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: forrest/site/docs_0_70/index.source.xml
URL: http://svn.apache.org/viewcvs/forrest/site/docs_0_70/index.source.xml?rev=376128&view=auto
==============================================================================
--- forrest/site/docs_0_70/index.source.xml (added)
+++ forrest/site/docs_0_70/index.source.xml Wed Feb 8 16:26:20 2006
@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="ISO-8859-1"?><!--
+ Copyright 2002-2005 The Apache Software Foundation or its licensors,
+ as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--><document>
+ <header>
+ <title>Apache Forrest documentation</title>
+ </header>
+ <body>
+ <section id="project">
+ <title>Project-level documentation</title>
+ <p>
+ See the <link href="../">Apache Forrest Project</link> website for
+ the main project-level documents.
+ </p>
+ </section>
+ <section id="docs">
+ <title>Product documentation</title>
+ <p>
+ For the local docs for the version of Forrest that you are using,
+ see the menu at the left and the tabs above for
+ <link href="site:v0.70//documentation/index">Docs</link> and
+ <link href="site:v0.70//howto/overview">How-To</link> and
+ <link href="site:plugins/index">Plugins</link>.
+ </p>
+ <p>
+ See links to
+ <link href="site:versions/overview">other versions</link>
+ of documentation.
+ </p>
+ </section>
+ </body>
+</document>
\ No newline at end of file
Propchange: forrest/site/docs_0_70/index.source.xml
------------------------------------------------------------------------------
svn:eol-style = native
Added: forrest/site/docs_0_70/libre-intro.source.xml
URL: http://svn.apache.org/viewcvs/forrest/site/docs_0_70/libre-intro.source.xml?rev=376128&view=auto
==============================================================================
--- forrest/site/docs_0_70/libre-intro.source.xml (added)
+++ forrest/site/docs_0_70/libre-intro.source.xml Wed Feb 8 16:26:20 2006
@@ -0,0 +1,584 @@
+<?xml version="1.0" encoding="ISO-8859-1"?><!--
+ Copyright 2002-2005 The Apache Software Foundation or its licensors,
+ as applicable.
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
+--><!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.2//EN" "http://forrest.apache.org/dtd/document-v12.dtd">
+<document>
+ <header>
+ <title>Libre QuickStart</title>
+ <abstract>This document is the current full documentation on the "libre"
+ generator that was implanted into xml-forrest.</abstract>
+ </header>
+ <body>
+ <section>
+ <title>Intro</title>
+ <warning>This document is still relevant for ideas and potential
+ solutions. However, the experimental code for Libre was removed from
+ the scratchpad on 2003-04-18 during spring cleaning. If you want to
+ resurrect it, then use the cvs tag "before_libre_departure".
+ </warning>
+ <p>The libre idea was born out of the cocoon book.xml itch. The actual
+ need to start scratching was introduced by the higher volume of
+ book.xml-editing-work that came along with the cocoon documentation and
+ xml-forrest efforts.</p>
+ <p>The single idea behind it in fact is trying to automatically generate
+ part of the navigation tree which is held now in the different book.xml 's.
+ This automation effort however is held back by the lack of meta-data you can
+ extract from the filesystem itself. This is why the libre approach still
+ requires you to add this extra metadata using some libre.xml file. This
+ libre.xml however has the following main advantages over the book.xml:</p>
+ <ul>
+ <li>The settings are 'inherited' down the directory tree, so you do not
+ need a libre.xml on each directory level. You only need it to change
+ the subdir traversing strategy from its parent dir.</li>
+ <li>It combines some 'filesystem-introspection'-like declarations
+ that are used in run-time filtering, sorting and attributing decisions.
+ Introspection strategies are currently based on either (1) reading properties
+ of the java.io.File object at hand, or (2) executing xpath expressions on the
+ pointed at XML file. </li>
+ </ul>
+ </section>
+ <section>
+ <title>Using Libre now (0.0 alfa)</title>
+ <warning>Disclaimer: most of what you read below is 'how it was intended'
+ . To what extent that matches the actual execution process is largely dependent
+ on my programming skills and thoroughness of testing. <br/>In other words:
+ don't expect a thing unless you've seen it work. (at this time)</warning>
+ <section>
+ <title>Generated Output</title>
+ <p>The XML output that comes out of the generator largely follows this
+ example:</p>
+ <source xml:space="preserve"><?xml version="1.0" encoding="UTF-8"?>
+<collection xmlns="http://outerx.org/yer/hierarchy/0.1">
+ <collection label="content">
+ <collection label="xdocs">
+ <item label="dreams.xml"
+ href="src/documentation/content/xdocs/dreams.xml"
+ title="Forrest dream list"/>
+ <item label="faq.xml"
+ href="src/documentation/content/xdocs/faq.xml"/>
+ <item label="book.xml"
+ href="src/documentation/content/xdocs/book.xml"/>
+ <item label="contrib.xml"
+ href="src/documentation/content/xdocs/contrib.xml"
+ title="Contribution to Forrest"/>
+ <item label="mail-archives.xml"
+ href="src/documentation/content/xdocs/mail-archives.xml"
+ title="Mail Archives"/>
+ <item label="mail-lists.xml"
+ href="src/documentation/content/xdocs/mail-lists.xml"
+ title="Mailing Lists"/>
+ <item label="license.xml"
+ href="src/documentation/content/xdocs/license.xml"
+ title="The Apache Software License"/>
+ <item label="index.xml"
+ href="src/documentation/content/xdocs/index.xml"
+ title="Welcome to Forrest"/>
+ <item label="who.xml"
+ href="src/documentation/content/xdocs/who.xml"
+ title="Who we are"/>
+ </collection>
+ </collection>
+</collection></source>
+ <p>And it's not getting any harder in fact: only 2 elements,
+ <code><collection></code> and <code><item></code> and that should
+ do. The first maps to a menu-group in the navigation, guess what the second
+ maps to?</p>
+ <p>The number and value (and its meaning) of the attributes on these
+ elements are specified in the libre.xml file.</p>
+ </section>
+ <section>
+ <title><code>libre.xml</code> Contents</title>
+ <p>That libre.xml file follows the
+ src/resources/schema/dtd/libre-v10.dtd. In fact the current release allows for
+ some extra elements (I'll explain where) and some unrestricted attribute CDATA
+ types that cause some extensible xml output resp. some java-introspection to be
+ triggered. So basically the DTD will be limiting you more than the runtime
+ interpretation. (future versions will try to narrow this down seriously, main
+ reason is that a more elaborate DTD allows for more XML-editor assistance in
+ editing the files.)</p>
+ <p>The dtd:</p>
+ <source xml:space="preserve"><!ELEMENT libre (entry | auto)*>
+<!ELEMENT entry (label?, href?)>
+<!ATTLIST entry
+ location CDATA #REQUIRED
+>
+<!ELEMENT auto (filter?, sorter?, label?, href?)>
+<!ELEMENT label (xpath | property)>
+<!ELEMENT href (xpath | property)>
+<!ELEMENT filter (xpath | property)>
+<!ATTLIST filter
+ logic (inverse | normal) "normal"
+ clear (yes | no) "no"
+>
+<!ELEMENT sorter (xpath | property)>
+<!ATTLIST sorter
+ order (ascending | descending) "ascending"
+ clear (yes | no) "no"
+>
+<!ELEMENT xpath EMPTY>
+<!ATTLIST xpath
+ expression CDATA #REQUIRED
+>
+<!ELEMENT property EMPTY>
+<!ATTLIST property
+ name CDATA #REQUIRED
+ mask CDATA #IMPLIED
+ regex CDATA #IMPLIED
+ substitute CDATA #IMPLIED
+></source>
+ <section>
+ <title>Building Blocks</title>
+ <p>The following elements get the following meaning when interpreted
+ by the LibreConfigBuilder</p>
+ <source xml:space="preserve"><libre xmlns="http://outerx.org/libre/config/0.1"></source>
+ <ul>
+ <li>This is one of those libre.xml files, that will configure how
+ items are filteres, sorted and attributed</li>
+ </ul>
+ <source xml:space="preserve"><entry location="[relative location path]" /></source>
+ <ul>
+ <li>Allows to manually sort out specific files or directories.</li>
+
+ <li>Comparable to standard book.xml behaviour, except for the fact
+ that </li>
+ <ul>
+ <li>libre doesn't yet support external hrefs (should be easy
+ though)</li>
+ <li>there is no difference between <code><menu></code> and
+ <code><menu-item></code>, there just is <code><entry></code>. It
+ will become a <code><collection></code> or <code><item></code> in
+ the output based on the fact if the location points to a directory resp. a
+ file.</li>
+ <li>For locations that point to a filter it doesn't make sense, but
+ when it points to a directory it is nested <code><filter></code> and
+ <code><sort></code> elements get inherited down to the next level. </li>
+ </ul>
+ </ul>
+ <fixme author="mpo">This last remarks actually means (1) I need to
+ update the DTD to reflect this and (2) check the code for actually doing
+ this.</fixme>
+ <source xml:space="preserve"><auto></source>
+ <ul>
+ <li>Automatically generates more <code><collection></code>
+ and <code><item></code> elements in the output, based on the
+ specifications of the nested elements: <code><filter></code> (which
+ resources?) and <code><sort></code> (in which order?).</li>
+ </ul>
+ <source xml:space="preserve"><filter logic="inverse" clear="no"></source>
+ <ul>
+ <li>This element wraps a so-called AttributeReader (there are
+ currently two of them: <code><xpath></code> and
+ <code><property></code>)</li>
+ <li>The AttributeReader is going to specify which
+ information-element is going to be retrieved from the file or directory it is
+ pointing at. Depending on which one is used this wrapping filter will test for
+ presence or regex match of the resource being read. Based on the outcome of
+ this test (true or false) the passed file will be accepted or not in the
+ list.</li>
+ <li>This wrapping filter element allows to inverse the
+ acceptance-logic (accept what normally should be rejected and vice versa).</li>
+
+ <li>Using the <code>clear="yes"</code> attribute stops the
+ inheritance of the used filter strategy from the parent directory. Instead the
+ default filter strategy (which is to accept all files) is slided in at this
+ level.</li>
+ </ul>
+ <source xml:space="preserve"><sort order="descending" clear="no"></source>
+ <ul>
+ <li>This element wraps a so called AttributeReader (there are
+ currently two of them: <code><xpath></code> and
+ <code><property></code>).</li>
+ <li>The AttributeReader is going to specify which
+ information-element is going to be retrieved from the file or directory it is
+ pointing at. This information element will be considered to be a simple
+ Key-String and <code><collection></code> and <code><item></code>
+ elements in the output will appear in the order defined by the alphabetic
+ sorting of these keys.</li>
+ <li>This wrapping sort element allows to reverse the order.
+ (z->a instead of a->z)</li>
+ <li>Using the <code>clear="yes"</code> attribute stops the
+ inheritance of the used sort strategy from the parent directory. Instead the
+ default sort strategy (which is to use default filesystem sorting, alphabetic
+ on filename) is slided in at this level.</li>
+ </ul>
+ <source xml:space="preserve"><label>, <href>, <YOURTAG>.... {AttributeDefinitions}</source>
+ <ul>
+ <li>The remainder of the elements inside the
+ <code><auto></code> tag specify the attributes that need to be applied to
+ the generated <code><collection></code> and <code><item></code>
+ elements in the output: <code><item label=".." href=".." YOURTAG=".."
+ /></code></li>
+ <li>There is currently only support for adding attributes, not
+ nested elements.</li>
+ <li>These elements all wrap a so called AttributeReader (there are
+ currently two of them: <xpath> and <property>)</li>
+ <li>In these cases the wrapped AttributeReader is going to specify
+ which information-element is going to be retrieved from the file or directory
+ it is pointing at. This information element will be considered to be a simple
+ String-value that gets slided in as the corresponding output attribute
+ value.</li>
+ </ul>
+ <source xml:space="preserve"><xpath expression="/document/header/title/text()"></source>
+ <ul>
+ <li>This element specifies an xpath AttributeReader to use inside
+ <code><filter></code>, <code><sort></code> or
+ {AttributeDefinitions}.</li>
+ <li>It allows to specify an xpath expression that should result in
+ one single text node to be returned when applied to the root node of the xml
+ file at the location of any given entry. The contents of this text-node is the
+ string value to sort (<code><sort></code> usage) or to fill in the
+ specified attribute (<code><label></code>, <code><href></code>...
+ use). When inside a <code><filter></code>: the presence of the node
+ results in passing the test.</li>
+ </ul>
+ <warning>This currently breaks for non xml (<code>*.gif</code>)
+ files, so get your filter right please, and in the mean time: sorry for not
+ being able to use it in the filter yet <code>:-(</code>.</warning>
+ <source xml:space="preserve"><property name="path" regex="(\.[\\/])*(.*)" substitute="$2"/>
+<property name="name" mask="CVS"/></source>
+ <ul>
+ <li>This element specifies an xpath AttributeReader to use inside
+ <code><filter></code>, <code><sort></code> or
+ {AttributeDefinitions}.</li>
+ <li>It allows to specify a JavaBean-like property to read (this
+ introspection behavior will probably not survive the future release) on the
+ file at the 'location' of any given entry. The (object-)value of this property
+ is automatically converted to a String (toString()) that becomes the value to
+ sort (<code><sort></code> usage) or to fill in the specified attribute
+ (<code><label></code>, <code><href></code>... use). When inside a
+ <code><filter></code>, the test passes if the read property is not null
+ or "".</li>
+ <li>Furthermore this element allows to express more elaborate
+ true-false tests (filter use) or regex substitution (other use)
+ attributes:</li>
+ <ul>
+ <li>combination of @regex with @substitute accounts for a
+ s/{regex}/{substitute}/ kind of operation on the string property.</li>
+ <li>while @mask or @regex by their own (filter use) allow for a
+ glob-mask or regex test to be applied on the read property.</li>
+ </ul>
+ </ul>
+ </section>
+ </section>
+ <section>
+ <title>Important Side Effects</title>
+ <p>There are some things that libre is doing that you should be aware of.</p>
+ <section>
+ <title>No libre.xml</title>
+ <p>When using an <code><auto> </code>section, the filter will
+ NEVER accept the <code>libre.xml</code> file to be in the generated output. You
+ can however include a manual <code><entry></code> to point to the
+ <code>libre.xml</code> file if needed.</p>
+ </section>
+ <section>
+ <title>No Duplicates</title>
+ <p>You can combine multiple <code><entry></code> and
+ <code><auto></code> elements after each other. The system will make sure
+ that the resulting list of <code><collection></code> and
+ <code><item></code> will not contain duplicates. So the filters in
+ <code><auto></code> sections lower down the <code>libre.xml</code> file
+ can include already accepted files or directories, they will only show up once
+ in the output.</p>
+ </section>
+ </section>
+ <section>
+ <title>Example Constructs</title>
+ <p>Adding sorting and filtering to the filesystem with libre becomes a
+ subtle play with editable filesystem properties, smart XML content and
+ <code>libre.xml</code> configs. This should be considered as the 'extended'
+ contract between the following roles in the documentation system: the one
+ choosing (or creating) the DTDs, the one applying those to create content and
+ give the resulting files a name, the one that sets up the directories to store
+ those files and writes the <code>libre.xml</code> files.</p>
+ <section>
+ <title>Sorting your files or your menu entries?</title>
+ <p>In every case the very pragmatic approach can become something
+ like this:</p>
+ <source xml:space="preserve">+ content
+ + xdocs
+ + 010Topic
+ + 010Foo
+ + 111Bar
+ + 050Aspect
+ + NotInList</source>
+ <p>In combination with something that lives by the introduced
+ alphabetic order, but yet hides the ugly number-prefixes:</p>
+ <source xml:space="preserve"><?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE libre PUBLIC "-//Outerthought//DTD Libre Configuration V0.1//EN" "libre-v01.dtd" >
+<libre xmlns="http://outerx.org/libre/config/0.1">
+ <auto>
+ <filter logic="normal">
+ <property name="name" regex="\d{3}(.*)"/>
+ </filter>
+ <label>
+ <property name="name" regex="\d{3}(.*)" substitute="$1"/>
+ </label>
+ </auto>
+</libre></source>
+ <p>Will produce an automatic list of entries (collections and items
+ in the output) that </p>
+ <ul>
+ <li><code><filter></code>: only resources which name starts
+ with a 3-digit pattern</li>
+ <li>No <code><sort></code>: in their natural filesystem order
+ assured by the digit-prefix</li>
+ <li><code><label></code>: hold a label attribute that strips
+ of the ugly number prefix</li>
+ </ul>
+ <p>Of course the advantage over book.xml only comes when more menu
+ items should be easily slided in later on, and/or deeply nested directory
+ structures can all benefit from this same filenaming/sorting strategy.</p>
+ </section>
+ <section>
+ <title>Naming your files or asking them their name?</title>
+ <p>Given the poor expressiveness of the filesystem, the labels that
+ need to show up in the menu can hardly remain the filenames they are now
+ (specially if we're adding these ugly number prefixes). Instead we can sign a
+ contract with the content writer to also provide the navigation system with a
+ sensible name for his entry using XML metadata that the system will pick up
+ using an xpath expression.</p>
+ <source xml:space="preserve"><?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE libre PUBLIC "-//Outerthought//DTD Libre Configuration V0.1//EN" "libre-v01.dtd" >
+<libre xmlns="http://outerx.org/libre/config/0.1">
+ <entry location="dreams.xml" >
+ <label>
+ <xpath expression="/document/header/title/text()"/>
+ </label>
+ </entry>
+ <auto>
+ <filter>
+ <property name="name" regex="\.xml$" />
+ </filter>
+ <sorter>
+ <xpath expression="/document/header/title/text()"/>
+ </sorter>
+ <label>
+ <xpath expression="/document/header/title/text()"/>
+ </label>
+ </auto>
+</libre></source>
+ </section>
+ </section>
+ </section>
+ <section>
+ <title>Next Libre (0.1)</title>
+ <note>Next libre is in fact largely in your hands... just drop
+ the forrest-dev <link href="site:mail-lists">mail list</link>
+ a line, and see what happens...</note>
+ <section>
+ <title>Itches</title>
+ <p>There is quite a number of fast code patches that can/need to
+ happen</p>
+ <ul>
+ <li>package renaming and restructuring (ideas welcome, but not top of
+ mind)</li>
+ <li>on same level: possible xmlns and/or elms/atts renaming on the
+ generated output and the libre.xml file</li>
+ <li>when compiling you currently get 4 stupid deprecation warnings
+ that should be removed, in fact:</li>
+ <li>LibreConfigHelper has a silly test in it to switch to own parser
+ and resolver if there is no avalon component manager in the neighborhoud
+ (historical reason is the testing outside cocoon with the command line util,
+ which should become some kind of avalon based junit task: if you have a clue
+ how to start this, throw it at us please.)</li>
+ <li>xpath property reader needs to survive working on a non-xml
+ document (by returning nothing rather then breaking on the exception)</li>
+ <li>general robustness and resilience towards
+ mis-configurations</li>
+ <li>filestreams need to get closed and avalon resources need to be
+ released properly</li>
+ <li>caching at the level of the generator needs to be set up</li>
+ <li>in fact general performance has not been subject to loads of
+ early optimizations :-P</li>
+ </ul>
+ </section>
+ <section>
+ <title>Upcoming Features</title>
+ <p>More importantly however there is a major set of new features that
+ is waiting to get in there. It all boils down in fact to having a more
+ expressive libre.xml file... some of the thoughts:</p>
+ <section>
+ <title>Combinations of filter logic</title>
+ <p>Some itching stuff:</p>
+ <ul>
+ <li>logic="inverse" on the <filter> element seems a bit
+ awkward</li>
+ <li><em>n</em>th degree of slickness in the regexes will only bring
+ us so far, combinatory filter logic seems to be the way to go...:</li>
+ </ul>
+ <source xml:space="preserve"><!ELEMENT filter (xpath | property | and | or | not)>
+<!ELEMENT not (xpath | property | and | or | not)>
+<!ELEMENT and (xpath | property | and | or | not)+>
+<!ELEMENT or (xpath | property | and | or | not)+></source>
+ <p>So we can make up some richer:</p>
+ <source xml:space="preserve">
+<filter>
+ <not>
+ <and>
+ <xpath .../>
+ <not><property ..../></not>
+ <or>
+ ...
+ </or>
+ </and>
+ </not>
+</filter>
+ </source>
+ </section>
+ <section>
+ <title>Separating property-retrieval from formatting and
+ testing</title>
+ <p>Playing around with the attributes in
+ <code><property></code>:</p>
+ <ul>
+ <li>poses hard to explain combinatory effects (@regex with
+ @substitute vs without, @regex can't be combined with @mask, different
+ behaviour inside <filter>== test or <sort>==formatting)</li>
+ <li>which in fact are hard (if not impossible) to rule out by
+ modifying the DTD</li>
+ <li>makes you wonder why it's not available on the <xpath>
+ ?</li>
+ </ul>
+ <p>So maybe an example more down the lines of the following would be
+ easier to use:</p>
+ <source xml:space="preserve"><label><!-- same applies for the sort context -->
+ <regexformatter exp="..." substitute="....">
+ <property name="absoluteLocation" />
+ </regexformatter>
+</label></source>
+ <p>Allowing the formatter to be used around the xpath reader as well.
+ And opening up the possibility to maybe format other stuff than Strings:
+ <code><dateformat format="dd/mmm/yy"> </code></p>
+ <p>It would also clearly distinguish the semantical difference of
+ applying a test in the <code><filter></code> context:</p>
+ <source xml:space="preserve"><filter>
+ <regextest match="...">
+ <property ... />
+ </regextest>
+</filter></source>
+ <p>And more logically introduce other tests like <code><globtest
+ match="..."></code> or <code><availabletest></code> or...</p>
+ </section>
+ <section>
+ <title>Replace the introspection with semantically richer named
+ properties to read.</title>
+ <p>Currently the <code><property
+ name="someJavaBeanProp"></code> is applied in a java introspection for the
+ <code>getSomeJavaBeanProp()</code> on the <code>java.io.File</code> object that
+ is actually representing the node in the hierarchy at any given time. The DTD
+ declares the attribute as of type CDATA. These decisions however:</p>
+ <ul>
+ <li>lead to a lesser user guidance for the libre.xml writer using
+ an XML (and DTD) savvy editor </li>
+ <li>leads to assuming the <code>libre.xml</code> editor has access
+ to and knows how to interpret jdk javadoc</li>
+ <li>leads to poor semantical support and thus more possible RUNTIME
+ errors for those just filling in some valid CDATA value that is not mapping any
+ getter.</li>
+ <li>leads to confusion for all, since who actually knows the subtle
+ difference between all the get*Path methods on java.io.File?</li>
+ </ul>
+ <p>So the big idea here would be to go for an upfront declared list
+ of sensible and clearly defined properties that we would like to
+ read... Today's ideas about that list:</p>
+ <ul>
+ <li>name</li>
+ <li>isDirectory (isCollection?)</li>
+ <li>abs and relPath (or abs/rel Location? why would we need
+ abs?)</li>
+ <li>canRead</li>
+ <li>canWrite</li>
+ <li>lastModified</li>
+ <li>length</li>
+ </ul>
+ <p>The DTD would then list the possible attributeValues.</p>
+ </section>
+ </section>
+ <section>
+ <title>Avalonising</title>
+ <p>There are a number of perceived opportunities in taking up a
+ stronger dependecy towards Avalon. Some of the possibilities become clear when
+ looking into the current design...</p>
+ <ul>
+ <li>Currently the EntryFactory is a abstract factory, the factory
+ part could be done by an Avalon Component manager. Which would also allow the
+ EntryFactory to become a cleaner component interface then it is now.</li>
+ <li>Some investigation/feedback on the current hacker-way of using
+ the Composables could be nice</li>
+ <li>The current cli part in the package is only there for testing
+ (avoiding the cocoon webapp cycle when developing/testing) it should be
+ replaced by a more formal test class that actually would take up the role
+ (probably delegate to ECM or the like) of the componentmanager to give the
+ HierarchyReader the (avalon) environment he needs.</li>
+ </ul>
+ </section>
+ <section>
+ <title>Unresolved Discussions</title>
+ <ul>
+ <li>do we need support for nested elements inside
+ <code><item></code> output (retrieved by e.g. xpath expressions)?</li>
+ <li>do we need an extra <code><constant></code> like
+ attributereader that would allow like book.xml to add fixed values for
+ expressed attributes</li>
+ <li>clear set out inheritance rules, just doing 'something' now
+ :-(</li>
+ <li>votes on needed file properties to replace the current (limiting
+ and semantically poor) Java-introspection</li>
+ </ul>
+ </section>
+ </section>
+ <section>
+ <title>Libre Design</title>
+ <p> So why is that silly 'yer' package name in there? Yer originally was
+ some all-hierarchy-structures to SAX event thing, and since some of that is in
+ here as well, we kind of picked that idea up out of the dustbin.</p>
+ <p>So reflecting the current packagenames we kind of have these sets of
+ responsibilities</p>
+ <ul>
+ <li><em>*.yer.hierarchy</em>: describe in a formal way how hierarchies
+ should be built up in order to have them dumped to XML using the
+ HierarchyReader.</li>
+ <li><em>*.yer.use.cocoon</em>:house of the generator. It basically just
+ gets a reader and subscribes the next ContentHandler in the cocoon pipeline to
+ the HierarchyReader that it is using.</li>
+ <li><em>*.yer.impl</em>: hold the different implementations of the
+ *.yer.hierarchy API </li>
+ <li><em>*.yer.impl.fs</em>: (only current impl) Build the described
+ filesystem oriented implementation of the hierarchy. It is using the libre
+ configuration strategy.</li>
+ <li><em>*.yer.libre</em>: provide a generic strategy for adding
+ filtering, sorting and attributing information to a hierarchy through the use
+ of XML config files (in an XML configuration/declarative manner)</li>
+ </ul>
+ <p>... hope this somewhat clarifies how things have been setup for
+ now.</p>
+ <section>
+ <title>Dependencies</title>
+ <ul>
+ <li>The regex stuff inside libre adds the dependency upon the oro
+ package. Basically I failed to find substitution support inside the regex
+ package (which is already in cocoon) in a timeframe comparable to just get on
+ with this using oro.</li>
+ <li>The HierarchyGenerator is the first one in the chain (and the
+ last in fact) that actually needs the cocoon package (at least it was intended
+ this way, could be that there are some glitches on this statement)</li>
+ <li>There is a sort of false dependency on Avalon right now (some
+ Composables in there, no real container stuff though). As expressed higher
+ there are some plans to stronger benefit from this dependency. </li>
+ </ul>
+ </section>
+ </section>
+ </body>
+</document>
\ No newline at end of file
Propchange: forrest/site/docs_0_70/libre-intro.source.xml
------------------------------------------------------------------------------
svn:eol-style = native