blob: 56a2ce0007b530270c9adbfdbc804b0b4653d99f [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en" dir="ltr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta name="keywords" content="SMILA/Documentation/Pipelets and ProcessingServices,SMILA/Development Guidelines/How to write a Pipelet,SMILA/Development Guidelines/How to write a ProcessingService,SMILA/Documentation/SimpleMimeTypeIdentifier,SMILA/Glossary" />
<link rel="shortcut icon" href="http://wiki.eclipse.org/SMILA/Documentation/favicon.ico" />
<link rel="search" type="application/opensearchdescription+xml" href="http://wiki.eclipse.org/opensearch_desc.php" title="Eclipsepedia (English)" />
<link rel="alternate" type="application/rss+xml" title="Eclipsepedia RSS Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=rss" />
<link rel="alternate" type="application/atom+xml" title="Eclipsepedia Atom Feed" href="http://wiki.eclipse.org/index.php?title=Special:Recentchanges&amp;feed=atom" />
<title>SMILA/Documentation/Pipelets and ProcessingServices - Eclipsepedia</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "/skins/eclipsenova/novaWide.css?116"; /*]]>*/</style>
<link rel="stylesheet" type="text/css" media="print" href="http://wiki.eclipse.org/skins/eclipsenova/eclipsenovaPrint.css?116" />
<link rel="stylesheet" type="text/css" media="handheld" href="http://wiki.eclipse.org/skins/eclipsenova/handheld.css?116" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/header.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/tabs.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/visual.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/layout.css" media="screen" />
<link rel="stylesheet" type="text/css" href="http://wiki.eclipse.org/skins/eclipsenova/Nova/css/footer.css" media="screen" />
<!--[if IE]><link rel="stylesheet" type="text/css" href="/skins/eclipsenova/IEpngfix.css" media="screen" /><![endif]-->
<!--[if lt IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE50Fixes.css?116";</style> <![endif]-->
<!--[if IE 5.5000]><style type="text/css">@import "/skins/eclipsenova/IE55Fixes.css?116";</style><![endif]-->
<!--[if IE 6]><style type="text/css">@import "/skins/eclipsenova/IE60Fixes.css?116";</style><![endif]-->
<!--[if IE 7]><style type="text/css">@import "/skins/eclipsenova/IE70Fixes.css?116";</style><![endif]-->
<!--[if lt IE 7]><script type="text/javascript" src="/skins/common/IEFixes.js?116"></script>
<meta http-equiv="imagetoolbar" content="no" /><![endif]-->
<script type= "text/javascript">/*<![CDATA[*/
var skin = "eclipsenova";
var stylepath = "/skins";
var wgArticlePath = "/$1";
var wgScriptPath = "";
var wgScript = "/index.php";
var wgServer = "http://wiki.eclipse.org";
var wgCanonicalNamespace = "";
var wgCanonicalSpecialPageName = false;
var wgNamespaceNumber = 0;
var wgPageName = "SMILA/Documentation/Pipelets_and_ProcessingServices";
var wgTitle = "SMILA/Documentation/Pipelets and ProcessingServices";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "16087";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "154068";
var wgVersion = "1.12.0";
var wgEnableAPI = true;
var wgEnableWriteAPI = false;
/*]]>*/</script>
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/wikibits.js?116"><!-- wikibits js --></script>
<!-- Performance mods similar to those for bug 166401 -->
<script type="text/javascript" src="http://wiki.eclipse.org/index.php?title=-&amp;action=raw&amp;gen=js&amp;useskin=eclipsenova"><!-- site js --></script>
<!-- Head Scripts -->
<script type="text/javascript" src="http://wiki.eclipse.org/skins/common/ajax.js?116"></script>
<link rel="stylesheet" type="text/css" href="Pipelets_and_ProcessingServices.html" /> </head>
<body class="mediawiki ns-0 ltr page-SMILA_Documentation_Pipelets_and_ProcessingServices">
<div id="globalWrapper">
<div id="column-one">
<!-- Eclipse Additions for the Top Nav start here M. Ward-->
<div id="header">
<div id="header-graphic">
<img src="http://wiki.eclipse.org/skins/eclipsenova/eclipse.png" alt="Eclipse Wiki">
</div>
<!-- Pulled 101409 Mward -->
<div class="portlet" id="p-personal">
<div class="pBody">
<ul>
<li id="pt-login"><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Pipelets_and_ProcessingServices">Log in</a></li>
</ul>
</div>
</div>
<div id="header-icons">
<div id="sites">
<ul id="sitesUL">
<li><a href="http://www.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/eclipseIcon.png" width="28" height="28" alt="Eclipse Foundation" title="Eclipse Foundation" /><div>Eclipse Foundation</div></a></li>
<li><a href="http://marketplace.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/marketplace.png" width="28" height="28" alt="Eclipse Marketplace" title="Eclipse Marketplace" /><div>Eclipse Marketplace</div></a></li>
<li><a href="https://bugs.eclipse.org/bugs"><img src="http://dev.eclipse.org/custom_icons/system-search-bw.png" width="28" height="28" alt="Bugzilla" title="Bugzilla" /><div>Bugzilla</div></a></li>
<li><a href="http://live.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/audio-input-microphone-bw.png" width="28" height="28" alt="Live" title="Live" /><div>Eclipse Live</div></a></li>
<li><a href="http://planeteclipse.org"><img src="http://dev.eclipse.org/large_icons/devices/audio-card.png" width="28" height="28" alt="PlanetEclipse" title="Planet" /><div>Planet Eclipse</div></a></li>
<li><a href="http://portal.eclipse.org"><img src="http://dev.eclipse.org/custom_icons/preferences-system-network-proxy-bw.png" width="28" height="28" alt="Portal" title="Portal" /><div>My Foundation Portal</div></a></li>
</ul>
</div>
</div>
</div>
<!-- NEW HEADER STUFF HERE -->
<div id="header-menu">
<div id="header-nav">
<ul> <li><a class="first_one" href="http://wiki.eclipse.org/" target="_self">Home</a></li> <li><a href="http://www.eclipse.org/downloads/" target="_self">Downloads</a></li>
<li><a href="http://www.eclipse.org/users/" target="_self">Users</a></li>
<li><a href="http://www.eclipse.org/membership/" target="_self">Members</a></li>
<li><a href="http://wiki.eclipse.org/index.php/Development_Resources" target="_self">Committers</a></li>
<li><a href="http://www.eclipse.org/resources/" target="_self">Resources</a></li>
<li><a href="http://www.eclipse.org/projects/" target="_self">Projects</a></li>
<li><a href="http://www.eclipse.org/org/" target="_self">About Us</a></li>
</ul>
</div>
<div id="header-utils">
<!-- moved the search window here -->
<form action="http://wiki.eclipse.org/Special:Search" >
<input class="input" name="search" type="text" accesskey="f" value="" />
<input type='submit' onclick="this.submit();" name="go" id="searchGoButton" class="button" title="Go to a page with this exact name if one exists" value="Go" />&nbsp;
<input type='submit' onclick="this.submit();" name="fulltext" class="button" id="mw-searchButton" title="Search Eclipsepedia for this text" value="Search" />
</form>
</div>
</div>
<!-- Eclipse Additions for the Header stop here -->
<!-- Additions and mods for leftside nav Start here -->
<!--Started nav rip here-->
<!-- these are the nav controls main page, changes etc -->
<div id="novaContent" class="faux">
<div id="leftcol">
<ul id="leftnav">
<!-- these are the page controls, edit history etc -->
<li class="separator"><a class="separator">Navigation &#160;&#160;</li>
<li id="n-mainpage"><a href="http://wiki.eclipse.org/Main_Page">Main Page</a></li>
<li id="n-portal"><a href="http://wiki.eclipse.org/Eclipsepedia:Community_Portal">Community portal</a></li>
<li id="n-currentevents"><a href="http://wiki.eclipse.org/Eclipsepedia:Current_events">Current events</a></li>
<li id="n-recentchanges"><a href="http://wiki.eclipse.org/Special:Recentchanges">Recent changes</a></li>
<li id="n-randompage"><a href="http://wiki.eclipse.org/Special:Random">Random page</a></li>
<li id="n-help"><a href="http://wiki.eclipse.org/Help:Contents">Help</a></li>
<li class="separator"><a class="separator">Toolbox &#160;&#160;</a></li>
<li id="t-whatlinkshere"><a href="http://wiki.eclipse.org/Special:Whatlinkshere/SMILA/Documentation/Pipelets_and_ProcessingServices">What links here</a></li>
<li id="t-recentchangeslinked"><a href="http://wiki.eclipse.org/Special:Recentchangeslinked/SMILA/Documentation/Pipelets_and_ProcessingServices">Related changes</a></li>
<!-- This is the toolbox section -->
<li id="t-upload"><a href="http://wiki.eclipse.org/Special:Upload">Upload file</a></li>
<li id="t-specialpages"><a href="http://wiki.eclipse.org/Special:Specialpages">Special pages</a></li>
<li id="t-print"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Pipelets_and_ProcessingServices&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Pipelets_and_ProcessingServices&amp;oldid=154068">Permanent link</a></li> </ul>
</div>
<!-- Additions and mods for leftside nav End here -->
<div id="column-content">
<div id="content">
<a name="top" id="top"></a>
<div id="tabs">
<ul class="primary">
<li class="active"><a href="Pipelets_and_ProcessingServices.html"><span class="tab">Page</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Talk:SMILA/Documentation/Pipelets_and_ProcessingServices&amp;action=edit"><span class="tab">Discussion</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Pipelets_and_ProcessingServices&amp;action=edit"><span class="tab">View source</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Documentation/Pipelets_and_ProcessingServices&amp;action=history"><span class="tab">History</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Special:Userlogin&amp;returnto=SMILA/Documentation/Pipelets%20and%20ProcessingServices"><span class="tab">Edit</span></a></li>
</ul>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<h1 class="firstHeading">SMILA/Documentation/Pipelets and ProcessingServices</h1>
<div id="bodyContent">
<h3 id="siteSub">From Eclipsepedia</h3>
<div id="contentSub"><span class="subpages">&lt; <a href="../../SMILA.html" title="SMILA">SMILA</a> | <a href="../Documentation.html" title="SMILA/Documentation">Documentation</a></span></div>
<div id="jump-to-nav">Jump to: <a href="Pipelets_and_ProcessingServices.html#column-one">navigation</a>, <a href="Pipelets_and_ProcessingServices.html#searchInput">search</a></div> <!-- start content -->
<p>This page describes Pipelets, ProcessingServices and their lifecycle.
</p>
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="Pipelets_and_ProcessingServices.html#Definition"><span class="tocnumber">1</span> <span class="toctext">Definition</span></a>
<ul>
<li class="toclevel-2"><a href="Pipelets_and_ProcessingServices.html#Pipelets"><span class="tocnumber">1.1</span> <span class="toctext">Pipelets</span></a></li>
<li class="toclevel-2"><a href="Pipelets_and_ProcessingServices.html#ProcessingServices"><span class="tocnumber">1.2</span> <span class="toctext">ProcessingServices</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="Pipelets_and_ProcessingServices.html#Lifecycle"><span class="tocnumber">2</span> <span class="toctext">Lifecycle</span></a>
<ul>
<li class="toclevel-2"><a href="Pipelets_and_ProcessingServices.html#Pipelet_Lifecycle"><span class="tocnumber">2.1</span> <span class="toctext">Pipelet Lifecycle</span></a></li>
<li class="toclevel-2"><a href="Pipelets_and_ProcessingServices.html#ProcessingService_Lifecycle"><span class="tocnumber">2.2</span> <span class="toctext">ProcessingService Lifecycle</span></a></li>
<li class="toclevel-2"><a href="Pipelets_and_ProcessingServices.html#Combined_Lifecycle"><span class="tocnumber">2.3</span> <span class="toctext">Combined Lifecycle</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="Pipelets_and_ProcessingServices.html#When_to_use_a_ProcessingService"><span class="tocnumber">3</span> <span class="toctext">When to use a ProcessingService</span></a></li>
</ul>
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Definition"></a><h2> <span class="mw-headline"> Definition </span></h2>
<p>Pipelets and ProcessingServices are reusable Java Components in a BPEL workflow and can be orchestrated like any regular BPEL Service. Both are used to process the data contained in <a href="../Glossary.html#R" title="SMILA/Glossary">Records</a>.
</p>
<a name="Pipelets"></a><h3> <span class="mw-headline"> Pipelets </span></h3>
<p>A Pipelet is a POJO that implements the interface <tt>org.eclipse.smila.processing.SimplePipelet</tt>. It's lifecycle and configuration are managed by the workflow engine. An instance of a Pipelet is not shared by multiple Pipelines (workflows), even multiple invocations of a Pipelet in the same Pipeleline do not share the same instance. Each <tt>&lt;invokePipelet&gt;</tt> Pipeline has it's own instance. An instance may still be accessed by multiple threads, for example if the same Pipeline is executed in parallel. The configuration of each Pipelet instance is included in the <tt>&lt;invokePipelet&gt;</tt> call in the BPEL pipeline. Technical details on Pipelet development can be found in the tutorial <a href="../Development_Guidelines/How_to_write_a_Pipelet.html" title="SMILA/Development Guidelines/How to write a Pipelet">How to write a Pipelet</a>.
</p><p><br />
</p>
<a name="ProcessingServices"></a><h3> <span class="mw-headline"> ProcessingServices </span></h3>
<p>A ProcessingService is an OSGi service (preferably a Declarative Service) that implements the interface <tt>org.eclipse.smila.processing.ProcessingService</tt>. It's lifecycle and configuration are NOT managed by the workflow engine, but by the OSGi runtime. An instance of a ProcessingService can be shared between multiple Pipelines and so is frequently accessed by multiple threads. The configuration for a ProcessingServices is not contained within the <tt>&lt;invokeService&gt;</tt> call. Each ProcessingService can have it's own configuration file(s). Typically these are located in a folder equal to the ProcessingServices bundle name within the global configuration folder. For simple configuration options a ProcessingService can use the same XML format used to configure Pipelets. There are ready to use classes for reading and parsing such configuration files available. Technical details on ProcessingServices development can be found in the tutorial <a href="../Development_Guidelines/How_to_write_a_ProcessingService.html" title="SMILA/Development Guidelines/How to write a ProcessingService">How to write a ProcessingService</a>.
</p>
<a name="Lifecycle"></a><h2> <span class="mw-headline"> Lifecycle </span></h2>
<a name="Pipelet_Lifecycle"></a><h3> <span class="mw-headline"> Pipelet Lifecycle </span></h3>
<p>The following diagram shows the lifecycle of Pipelets.<br />
</p><p><a href="http://wiki.eclipse.org/Image:Lifecycle_of_Pipelets.png" class="image" title="Image:Lifecycle_of_Pipelets.png"><img alt="Image:Lifecycle_of_Pipelets.png" src="http://wiki.eclipse.org/images/5/53/Lifecycle_of_Pipelets.png" width="943" height="519" border="0" /></a>
</p><p>Pipelets live inside the workflow engine. When the engine starts, it reads the pipeline definitions (i.e. BPEL workflows) from the ConfigurationHelper. The pipelines are introspected for pipelet invocations (invokePipelet extension activities) and the pipelet configurations that are contained in the invocation XML elements. For each invocation it creates an instance of the specified pipelet class, parses the configuration from the BPEL document and injects it into the pipelet instance. The pipelet instance is stored in the workflow engine as long as the engine is not stopped (and as long as the bundle providing the pipelet is available, of course). So for each single pipelet invocation occurring in the pipelines a different pipelet instance exists with a single configuration.
</p><p><br />
</p>
<a name="ProcessingService_Lifecycle"></a><h3> <span class="mw-headline"> ProcessingService Lifecycle </span></h3>
<p>The following diagram shows the lifecycle of ProcessingServices.<br />
</p><p><a href="http://wiki.eclipse.org/Image:Lifecycle_of_ProcessingServices.png" class="image" title="Image:Lifecycle_of_ProcessingServices.png"><img alt="Image:Lifecycle_of_ProcessingServices.png" src="http://wiki.eclipse.org/images/1/1e/Lifecycle_of_ProcessingServices.png" width="960" height="720" border="0" /></a>
</p><p>ProcessingServices live independent from the workflow engine. They are created, activated and registered by the OSGi Declarative Services runtime just like the engine itself (of course, they can also be started and registered using bundle activators or other code, if declaring them as a DS is not appropriate for some reason). They read their configuration by themselves, e.g. by using the ConfigurationHelper. Eventually, the DS runtime binds all correctly registered ProcessingServices to the workflow engine so that it can invoke them when it reaches an invokeService extension activity during execution of a pipeline.
</p>
<a name="Combined_Lifecycle"></a><h3> <span class="mw-headline"> Combined Lifecycle </span></h3>
<p>The following diagram shows the lifecycle of both Pipelets and ProcessingServices.<br />
</p><p><a href="http://wiki.eclipse.org/Image:Lifecycle_of_Pipelets_and_ProcessingServices.png" class="image" title="Image:Lifecycle_of_Pipelets_and_ProcessingServices.png"><img alt="Image:Lifecycle_of_Pipelets_and_ProcessingServices.png" src="http://wiki.eclipse.org/images/1/1d/Lifecycle_of_Pipelets_and_ProcessingServices.png" width="941" height="523" border="0" /></a>
</p><p>Of course, pipelines can combine the use of Pipelets and ProcessingServices. The main purpose of this figure is to emphasize the main difference between Pipelets and ProcessingServices: Pipelets live inside the workflow engine and their instances are not shared, even if they have the same class and configuration. ProcessingServices live independent from the engine, manage their configuration on their own and instances can be shared by multiple pipelines. This makes them the more appropriate integration model if functionality to be integrated needs a complex internal model and uses a lot of memory during runtime, or if resources should not be duplicated if used in multiple pipelines.
</p>
<a name="When_to_use_a_ProcessingService"></a><h2> <span class="mw-headline"> When to use a ProcessingService </span></h2>
<p>Technically there are no limitations on Pipelets compared to ProcessingServices. The same functionality can be implemented using both approaches. There are no strict rules when to use which technology. However, ProcessingServices offer some benefits you may want to make use of. Here are some rules of thumb when to implement functionality as a ProcessingService instead as a Pipelet:
</p>
<ul><li> <b>Lower Memory Usage</b>: a shared ProcessingService uses less memory than multiple instances of Pipelets. If your functionality needs lots of memory you should implement it as a ProcessingService
</li><li> <b>Preserve Internal State</b>: if your component has an internal state that should be preserved independently from the lifecycle of the workflow engine then implement it as a ProcessingService
</li><li> <b>Reuse Functionality</b>: if your functionality should not only be used inside of a pipeline but also from other services, then you should implement it as a ProcessingService. Being an OSGi service it offers the possibility to provide not only the <tt>ProcessingService</tt> interface but any other interface you like. For example this feature is used in the <a href="SimpleMimeTypeIdentifier.html" title="SMILA/Documentation/SimpleMimeTypeIdentifier">SimpleMimeTypeIdentifier</a>.
</li><li> <b>Not sharable Resources</b>: if your components accesses resources that cannot be shared among multiple clients implement it as a ProcessingService as then only one instance exists and can be reused in multiple pipelines
</li><li> <b>Flexible/Complex Configuration</b>: if your component needs configuration options that are not supported by the simple PipeletConfiguration options implement it as a ProcessingService
</li><li> <b>Use of OSGi Services</b>: if your component wants to use one or more OSGi services than it's easier to implement it as a ProcessingService. References to other OSGi services can be easily configured on the component description of the ProcessingService. Otherwise you have to make use of the ServiceTracker to find references to services.
</li></ul>
<!--
NewPP limit report
Preprocessor node count: 24/1000000
Post-expand include size: 0/2097152 bytes
Template argument size: 0/2097152 bytes
#ifexist count: 0/100
-->
<!-- Saved in parser cache with key wikidb:pcache:idhash:16087-0!1!0!!en!2!edit=0 and timestamp 20110329115720 -->
<div class="printfooter">
Retrieved from "<a href="Pipelets_and_ProcessingServices.html">http://wiki.eclipse.org/SMILA/Documentation/Pipelets_and_ProcessingServices</a>"</div>
<div id="catlinks"><p class='catlinks'><a href="http://wiki.eclipse.org/Special:Categories" title="Special:Categories">Category</a>: <span dir='ltr'><a href="http://wiki.eclipse.org/Category:SMILA" title="Category:SMILA">SMILA</a></span></p></div> <!-- end content -->
<div class="visualClear"></div>
</div>
</div>
</div>
<!-- Yoink of toolbox for phoenix moved up -->
</div>
</div>
<div id="clearFooter"/>
<div id="footer" >
<ul id="footernav">
<li class="first"><a href="http://www.eclipse.org/">Home</a></li>
<li><a href="http://www.eclipse.org/legal/privacy.php">Privacy Policy</a></li>
<li><a href="http://www.eclipse.org/legal/termsofuse.php">Terms of Use</a></li>
<li><a href="http://www.eclipse.org/legal/copyright.php">Copyright Agent</a></li>
<li><a href="http://www.eclipse.org/org/foundation/contact.php">Contact</a></li>
<li><a href="http://wiki.eclipse.org/Eclipsepedia:About" title="Eclipsepedia:About">About Eclipsepedia</a></li>
</ul>
<span id="copyright">Copyright &copy; 2011 The Eclipse Foundation. All Rights Reserved</span>
<p id="footercredit">This page was last modified 09:50, 19 May 2009 by <a href="http://wiki.eclipse.org/User:Igor.novakovic.empolis.com" title="User:Igor.novakovic.empolis.com">Igor Novakovic</a>. Based on work by <a href="http://wiki.eclipse.org/User:Daniel.stucky.empolis.com" title="User:Daniel.stucky.empolis.com">Daniel Stucky</a> and <a href="http://wiki.eclipse.org/User:Juergen.schumacher.empolis.com" title="User:Juergen.schumacher.empolis.com">Juergen Schumacher</a>.</p>
<p id="footerviews">This page has been accessed 2,442 times.</p>
</div>
<script type="text/javascript">
var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www.");
document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));
</script>
<script type="text/javascript">
var pageTracker = _gat._getTracker("UA-910670-4");
pageTracker._trackPageview();
</script>
<!-- <div class="visualClear"></div> -->
<script type="text/javascript">if (window.runOnloadHook) runOnloadHook();</script>
</div>
<!-- Served in 0.087 secs. --></body></html>