<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN">
<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=Windows-1252">
<META NAME="Generator" CONTENT="MS Exchange Server version 6.0.4417.0">
<TITLE>AW: [opencms-dev] On how to integrate OpenCMS and velocity:</TITLE>
</HEAD>
<BODY>
<!-- Converted from text/plain format -->

<P><FONT SIZE=2>Actually the OpenCMSResourceLoader is called from the Velocity engine internally,</FONT>

<BR><FONT SIZE=2>somehwere in the Velocity code there is a factory pattern which calls the resource loaders.</FONT>

<BR><FONT SIZE=2>(ResourceLoaderFactory as far as I can remember). The glue between this class and the </FONT>

<BR><FONT SIZE=2>ResourceLoaderFactory is done in the properties file where the standard file loader is replaced</FONT>

<BR><FONT SIZE=2>with the OpenCMSResourceLoader (I have sent to Alex a corrected version of my explanation with a new section describing the necessary property entries, which now can be found in the readme. It should go online later today).</FONT></P>

<P><FONT SIZE=2>The resource Loader then loads the Velocity page which later has to be parsed and merged.</FONT>

<BR><FONT SIZE=2>Therefore the CmsObject has to be passed down to that class before the Velocity engine</FONT>

<BR><FONT SIZE=2>calls the loading method of the resource loader, otherwise no access to the VFS is possible.</FONT>
</P>

<P><FONT SIZE=2>You have to see the resource loader as some kind of low level driver to access different file systems. Theoretically you could hook every file based infrastructure into Velocity this way, like HTTP access or XMLRPC even ftp connections would be possible. The problem I had to do it that way was because there currently is no way to pass down special parameters into the resource loader so I had to access it outside of the Velocity code before I called the Velocity engine afterwards to do the rest of the work (therefore also the synchronized to make the whole thing thread safe).</FONT></P>

<P><FONT SIZE=2>The Velocity object itself is the standard access object to the Velocity engine suggested by</FONT>

<BR><FONT SIZE=2>the Velocity people in their programmers doc. You can see the LC_VelocityOpencms as a simplification of access</FONT>

<BR><FONT SIZE=2>and a standard access point towards the Velocity classes (I prefer tiny apis or interfaces between different parts of a system it makes the handling and changing of the underlying infrastructure much easier) </FONT></P>

<P><FONT SIZE=2>This way I think I can alter the underlying access infrastructure without breaking existing code in future versions. If you have further questions feel free to ask.</FONT></P>
<BR>

<P><FONT SIZE=2>Werner Punz Labor_C</FONT>

<BR><FONT SIZE=2><A HREF="http://www.labor-c.net">http://www.labor-c.net</A></FONT>
</P>
<BR>

<P><FONT SIZE=2>-----Ursprüngliche Nachricht-----</FONT>

<BR><FONT SIZE=2>Von: owner-opencms-dev@www.opencms.com</FONT>

<BR><FONT SIZE=2>[<A HREF="mailto:owner-opencms-dev@www.opencms.com">mailto:owner-opencms-dev@www.opencms.com</A>]Im Auftrag von Michael</FONT>

<BR><FONT SIZE=2>Emmerich</FONT>

<BR><FONT SIZE=2>Gesendet: Dienstag, 2. April 2002 10:45</FONT>

<BR><FONT SIZE=2>An: 'opencms-dev@www.opencms.com'</FONT>

<BR><FONT SIZE=2>Betreff: AW: [opencms-dev] On how to integrate OpenCMS and velocity:</FONT>
</P>
<BR>

<P><FONT SIZE=2>Alex,</FONT>
</P>

<P><FONT SIZE=2>>> Sure, the ResourceLoader cannot be accessed directly from </FONT>

<BR><FONT SIZE=2>>> outside of Velocity. But you do not need that, and you do not </FONT>

<BR><FONT SIZE=2>>> need to inititalize it form within an OpenCms Launcher since </FONT>

<BR><FONT SIZE=2>>> the ResourceLoader is some kind of driver to access the </FONT>

<BR><FONT SIZE=2>>> normal filesystem or to hook into something else (like </FONT>

<BR><FONT SIZE=2>>> Werners OpenCMSResourceLoader accesses the OpenCms VFS). </FONT>

<BR><FONT SIZE=2>></FONT>

<BR><FONT SIZE=2>>Sorry, but this is wrong. Currently, you need to pass the CmsObject to</FONT>

<BR><FONT SIZE=2>>the resource launcher. Otherwise the ResouceLoader can not access the</FONT>

<BR><FONT SIZE=2>>VFS. Again, look at the code.</FONT>
</P>

<P><FONT SIZE=2>I have looked at the code - you can be sure about that - and the only place</FONT>

<BR><FONT SIZE=2>where the ResourceLoader is accessed is the LC_Velocity_OpenCMS class where</FONT>

<BR><FONT SIZE=2>you pass the CmsObject to it, OpenCMSResourceLoader.setCmsObject(cms). Since</FONT>

<BR><FONT SIZE=2>I count the LC_Velocity_OpenCMS as the mediator between OpenCms and</FONT>

<BR><FONT SIZE=2>Velocity, I said that you do not need to access the OpenCMSResourceLoader</FONT>

<BR><FONT SIZE=2>>from the outside. </FONT>
</P>
<BR>
<BR>
<BR>
<BR>

<P><FONT SIZE=2>>> 1) Read the requested file header, its a Velocity recource, </FONT>

<BR><FONT SIZE=2>>> so use the Velocity Launcher</FONT>

<BR><FONT SIZE=2>>> 2) Get an instance of the LC_Velocity_OpenCMS class</FONT>

<BR><FONT SIZE=2>>> 3) call the parseTemplate method of the LC_Velocity_OpenCMS </FONT>

<BR><FONT SIZE=2>>> class and forward the requested URI, the current parameters </FONT>

<BR><FONT SIZE=2>>> and the current CmsObject to it (similar to Werners code, </FONT>

<BR><FONT SIZE=2>>> except the template name would be the URI)</FONT>

<BR><FONT SIZE=2>>> 4) the parseTemplate method will update the CmsObject in the </FONT>

<BR><FONT SIZE=2>>> OpenCMSResourceLoader, load the requested template via the </FONT>

<BR><FONT SIZE=2>>> OpenCMSResourceLoader and parse it (see Werners code).</FONT>

<BR><FONT SIZE=2>>> 5) fetch the created output and send it to the response stream.</FONT>

<BR><FONT SIZE=2>></FONT>

<BR><FONT SIZE=2>>There's something missing here between 2) and 3). If I have the VTL</FONT>

<BR><FONT SIZE=2>>resource and even an instance of the LC_Velocity_OpenCMS, I could start</FONT>

<BR><FONT SIZE=2>>a VTL. But what for? Velocity requires a VTL _and_ a class belonging to</FONT>

<BR><FONT SIZE=2>>this Template. This is not the LC_Velocity_OpenCMS class, since this</FONT>

<BR><FONT SIZE=2>>just handles the synchronization issue right now. This "Velocity Servlet</FONT>

<BR><FONT SIZE=2>>class" must be initialized and called before 3). </FONT>
</P>

<P><FONT SIZE=2>I was a bit wondering about this as well, since you mentioned it in your</FONT>

<BR><FONT SIZE=2>mail from Saturday evening and I did not find the connection to the</FONT>

<BR><FONT SIZE=2>"Velocity Servlet class" in the the code example. </FONT>

<BR><FONT SIZE=2>So please tell me where this tell me if this "Velocity Servlet class" is</FONT>

<BR><FONT SIZE=2>used in the code example. We have four elements, the LC_Velocity_OpenCMS</FONT>

<BR><FONT SIZE=2>class, the OpenCMSResourceLoader, the Velocity sample template and the Cms</FONT>

<BR><FONT SIZE=2>Template class. The only component that gets not totaly clear by the example</FONT>

<BR><FONT SIZE=2>is the "Velocity" object in the LC_Velocity_OpenCMS class - is this the</FONT>

<BR><FONT SIZE=2>"Velocity Servlet class" to be used?</FONT>
</P>

<P><FONT SIZE=2>Bye,</FONT>

<BR>        <FONT SIZE=2>Michael</FONT>
</P>

</BODY>
</HTML>