blob: 1d3e453d7a901cad3358be0070951c3a09b62d19 [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/Project Concepts/Exceptions configurations and processing,Daniel.stucky.empolis.com,Juergen.schumacher.empolis.com,S.voigt.brox.de" />
<link rel="shortcut icon" href="http://wiki.eclipse.org/SMILA/Project_Concepts/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/Project Concepts/Exceptions configurations and processing - Eclipsepedia</title>
<style type="text/css" media="screen,projection">/*<![CDATA[*/ @import "http://wiki.eclipse.org/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/Project_Concepts/Exceptions_configurations_and_processing";
var wgTitle = "SMILA/Project Concepts/Exceptions configurations and processing";
var wgAction = "view";
var wgRestrictionEdit = [];
var wgRestrictionMove = [];
var wgArticleId = "15308";
var wgIsArticle = true;
var wgUserName = null;
var wgUserGroups = null;
var wgUserLanguage = "en";
var wgContentLanguage = "en";
var wgBreakFrames = false;
var wgCurRevisionId = "113737";
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>
<style type="text/css">/*<![CDATA[*/
.source-java {line-height: normal; font-size: medium;}
.source-java li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for java
* CSS class: source-java, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-java .de1, .source-java .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-java {}
.source-java .head {}
.source-java .foot {}
.source-java .imp {font-weight: bold; color: red;}
.source-java .ln-xtra {color: #cc0; background-color: #ffc;}
.source-java li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-java li.li2 {font-weight: bold;}
.source-java .kw1 {color: #7F0055; font-weight: bold;}
.source-java .kw2 {color: #7F0055; font-weight: bold;}
.source-java .kw3 {color: #000000; font-weight: normal}
.source-java .kw4 {color: #7F0055; font-weight: bold;}
.source-java .co1 {color: #3F7F5F; font-style: italic;}
.source-java .co2 {color: #3F7F5F;}
.source-java .co3 {color: #3F7F5F; font-style: italic; font-weight: bold;}
.source-java .coMULTI {color: #3F5FBF; font-style: italic;}
.source-java .es0 {color: #000000;}
.source-java .br0 {color: #000000;}
.source-java .st0 {color: #2A00ff;}
.source-java .nu0 {color: #000000;}
.source-java .me1 {color: #000000;}
.source-java .me2 {color: #000000;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "http://wiki.eclipse.org/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><style type="text/css">/*<![CDATA[*/
.source-xml {line-height: normal; font-size: medium;}
.source-xml li {line-height: normal;}
/**
* GeSHi Dynamically Generated Stylesheet
* --------------------------------------
* Dynamically generated stylesheet for xml
* CSS class: source-xml, CSS id:
* GeSHi (C) 2004 - 2007 Nigel McNie (http://qbnz.com/highlighter)
*/
.source-xml .de1, .source-xml .de2 {font-family: 'Courier New', Courier, monospace; font-weight: normal;}
.source-xml {}
.source-xml .head {}
.source-xml .foot {}
.source-xml .imp {font-weight: bold; color: red;}
.source-xml .ln-xtra {color: #cc0; background-color: #ffc;}
.source-xml li {font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;}
.source-xml li.li2 {font-weight: bold;}
.source-xml .coMULTI {color: #808080; font-style: italic;}
.source-xml .es0 {color: #000099; font-weight: bold;}
.source-xml .br0 {color: #66cc66;}
.source-xml .st0 {color: #ff0000;}
.source-xml .nu0 {color: #cc66cc;}
.source-xml .sc0 {color: #00bbdd;}
.source-xml .sc1 {color: #ddbb00;}
.source-xml .sc2 {color: #339933;}
.source-xml .sc3 {color: #009900;}
.source-xml .re0 {color: #000066;}
.source-xml .re1 {font-weight: bold; color: black;}
.source-xml .re2 {font-weight: bold; color: black;}
/*]]>*/
</style>
<style type="text/css">/*<![CDATA[*/
@import "http://wiki.eclipse.org/index.php?title=MediaWiki:Geshi.css&usemsgcache=yes&action=raw&ctype=text/css&smaxage=18000";
/*]]>*/
</style><link rel="stylesheet" type="text/css" href="Exceptions_configurations_and_processing.html" /> </head>
<body class="mediawiki ns-0 ltr page-SMILA_Project_Concepts_Exceptions_configurations_and_processing">
<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/Project_Concepts/Exceptions_configurations_and_processing">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/Project_Concepts/Exceptions_configurations_and_processing">What links here</a></li>
<li id="t-recentchangeslinked"><a href="http://wiki.eclipse.org/Special:Recentchangeslinked/SMILA/Project_Concepts/Exceptions_configurations_and_processing">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/Project_Concepts/Exceptions_configurations_and_processing&amp;printable=yes">Printable version</a></li> <li id="t-permalink"><a href="http://wiki.eclipse.org/index.php?title=SMILA/Project_Concepts/Exceptions_configurations_and_processing&amp;oldid=113737">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="Exceptions_configurations_and_processing.html"><span class="tab">Page</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=Talk:SMILA/Project_Concepts/Exceptions_configurations_and_processing&amp;action=edit"><span class="tab">Discussion</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Project_Concepts/Exceptions_configurations_and_processing&amp;action=edit"><span class="tab">View source</span></a></li>
<li><a href="http://wiki.eclipse.org/index.php?title=SMILA/Project_Concepts/Exceptions_configurations_and_processing&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/Project&#32;Concepts/Exceptions&#32;configurations&#32;and&#32;processing"><span class="tab">Edit</span></a></li>
</ul>
</div>
<script type="text/javascript"> if (window.isMSIE55) fixalpha(); </script>
<h1 class="firstHeading">SMILA/Project Concepts/Exceptions configurations and processing</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="../Project_Concepts.1.html" title="SMILA/Project Concepts">Project Concepts</a></span></div>
<div id="jump-to-nav">Jump to: <a href="Exceptions_configurations_and_processing.html#column-one">navigation</a>, <a href="Exceptions_configurations_and_processing.html#searchInput">search</a></div> <!-- start content -->
<table id="toc" class="toc" summary="Contents"><tr><td><div id="toctitle"><h2>Contents</h2></div>
<ul>
<li class="toclevel-1"><a href="Exceptions_configurations_and_processing.html#Description"><span class="tocnumber">1</span> <span class="toctext">Description</span></a></li>
<li class="toclevel-1"><a href="Exceptions_configurations_and_processing.html#Discussion"><span class="tocnumber">2</span> <span class="toctext">Discussion</span></a>
<ul>
<li class="toclevel-2"><a href="Exceptions_configurations_and_processing.html#Resulting_Rules_for_SMILA"><span class="tocnumber">2.1</span> <span class="toctext">Resulting Rules for SMILA</span></a></li>
</ul>
</li>
<li class="toclevel-1"><a href="Exceptions_configurations_and_processing.html#Technical_proposal"><span class="tocnumber">3</span> <span class="toctext">Technical proposal</span></a>
<ul>
<li class="toclevel-2"><a href="Exceptions_configurations_and_processing.html#First_problem_.22producer-consumer.22"><span class="tocnumber">3.1</span> <span class="toctext">First problem "producer-consumer"</span></a></li>
<li class="toclevel-2"><a href="Exceptions_configurations_and_processing.html#Second_problem_.22is_critical.3F.22"><span class="tocnumber">3.2</span> <span class="toctext">Second problem "is critical?"</span></a>
<ul>
<li class="toclevel-3"><a href="Exceptions_configurations_and_processing.html#.22let_crawler_developer_choose_it_byself.22"><span class="tocnumber">3.2.1</span> <span class="toctext">"let crawler developer choose it byself"</span></a></li>
<li class="toclevel-3"><a href="Exceptions_configurations_and_processing.html#Configurable_SMILAException"><span class="tocnumber">3.2.2</span> <span class="toctext">Configurable SMILAException</span></a></li>
</ul>
</li>
</ul>
</li>
<li class="toclevel-1"><a href="Exceptions_configurations_and_processing.html#Resulting_Rules_for_SMILA_.28suggestion.29"><span class="tocnumber">4</span> <span class="toctext">Resulting Rules for SMILA (suggestion)</span></a></li>
</ul>
</li>
</ul>
</li>
</ul>
</td></tr></table><script type="text/javascript"> if (window.showTocToggle) { var tocShowText = "show"; var tocHideText = "hide"; showTocToggle(); } </script>
<a name="Description"></a><h2> <span class="mw-headline"> Description </span></h2>
<p>Please have a look at the "Exception handling" of crawlers.
</p><p>Atm the Crawler can have an internal problem and crawling is not stopped
</p><p>Therefore we need a concept for the framework that Crawlers send information about problems that are only small problems and crawling can be continued und
greater problems on which the crawlercontroller should be stopped (if delta indexing is executed, the whole index information would be lost because all entries in the index will be deleted.
</p><p>Please have a look at the current code of the crawlers and the crawlercontroller and write a concept to solve this
Crawlercontroller should be aware of small problems (warning?) and greater problems(errors?)
</p><p>Crawler is supposed to be 3rd party developed component and described only as interface.
</p><p>There are at least two problems:
</p>
<ol><li> Both currently implemented crawlers filesystem and web based on producer-consumer java-pattern. Crawler controller thread interacts as consumer but exceptions may occurs also on producer level.
</li><li> Who will decide that problem is critical and process should be stopped or problem is not critical and process may be continued?
</li></ol>
<a name="Discussion"></a><h2> <span class="mw-headline"> Discussion </span></h2>
<p><a href="http://wiki.eclipse.org/index.php?title=User:S.voigt.brox.de&amp;action=edit" class="new" title="User:S.voigt.brox.de">Sebastian Voigt</a>:
</p><p>Especially for the&nbsp;Crawler Controller and Crawler Workflow we have only two different error types:
</p>
<ul><li> Crawler Errors: Crawler cannot start, cannot connect to the data source, Crawlercontroller should stop crawling.
</li></ul>
<ul><li> Crawling Errors: Error that can occur for every record or only for special record. User has to know that an Error occurred but Crawling should not be stopped.
</li></ul>
<p>Usually I would CrawlerException use only the Crawler Errors, Crawling Errors would be logged by the Crawler himself, and the Crawler would not throw an Exception for it.Do we need to throw an Exception in this case? What is the advantage? What can the CrawlerController do with this information? I see only one advantage, if this occur often, it can stop crawling also to prevent cases in that the crawler would throw an "Crawling" Exception for every entry in the data source....otherwise all records in the index would be deleted with the usage of DI.
</p><p>What is the advantage of collecting exceptions? Important for the use of logging is that the log method is called where the logging should be done and not one class upper because an exception was thrown. Thus we should not use exceptions to move logging to other classes. But Logging and Throwing should not be used at the same time.
</p><p>Ivan Churkin:
</p>
<ol><li> What should I throw/log for FileSystemCrawler if crawling folder is not found? - imho its ok and index should be deleted.
</li><li> Unfortunately crawling process is not encapsulated inside crawler. For example, crawler was able to read DI for the file, and pass this DI to Crawler Controller but was unable to read all properties of Record - we should throw error to CC. But, from the other case, for example, we was unable to read only User Rights, but content was read ok - should we throw error/skip record?
</li></ol>
<p><a href="http://wiki.eclipse.org/index.php?title=User:S.voigt.brox.de&amp;action=edit" class="new" title="User:S.voigt.brox.de">Sebastian Voigt</a>: I think that is correct, a second crawler run for a specific folder in the case that the folder doesn't exist means the index has to be cleared. Interesting point. For your examples it depends, the crawler developer has to decide from case to case what information should he send to the CrawlerController - stop crawling or skip only this entry.
</p><p><a href="http://wiki.eclipse.org/User:Daniel.stucky.empolis.com" title="User:Daniel.stucky.empolis.com">Daniel Stucky</a>: I will describe my point of view.
I agreee that during crawling there are critical and non critical errors. Non critical errors mean that the crawl process itself is stable and that a record could not be read (e.g. temporary network problem, file is accessd by another application, etc.) but crawling should continue. Then there are critical errors were the crawl process should be stopped (e.g. bad configuration, root folder not available, no authentication, reoccuring network problems, .etc). I guess every Crawler has to decide for himself what is critical and non critical. In either case, DeltaIndexing:delete() MUST NOT be performed. It is crucial that the DeltaIndexing logic removes only those records from the index that are really deleted from the original source\! I don't know if it's better if the CrawlerController stops the Crawler on critical errors or if the Crawler does this on his own. Important is that the CrawlerController is informed that there were any errors and so can skip DeltaIndexing:delete(). The CrawlerController doesn't even need knowledge to what record the error belongs to. If each Crawler stops itself on critical errors it would be enough the provide a method hasExceptions() on the Crawler that is called by the CrawlerController to check for. Otherwise the CrawlerController nedds to decide if to stop crawling or continue. To differentiate between errors we could either use different exceptions or error levels.
</p><p>If a root folder for crawling (or the start URL) is not found the Crawler should throw an exception. Usually this is a wrong configuration. Imagine someone build an index with millions of documents from one directory. Then, because of a typo in the configuration, suddenly the complete index is deleted. This is not a good behavior. We have to provide other mechanisms for deletion of whole indexes or data sources from an index. If however the root folder exists and it is empty the Crawler should process it normaly (thus sending 0 records).
</p><p><a href="http://wiki.eclipse.org/User:Juergen.schumacher.empolis.com" title="User:Juergen.schumacher.empolis.com">Jürgen Schumacher</a> A remark from an "outsider": I think that empty data sources always indicate some kind of problem. The above case "root folder exists and is empty" could be caused by a mount failure: the root folder could be a directory in which another file system should have been mounted. This case should not delete a million-document-index\! Therefore I propose for now to NEVER delete the index if the crawl did not find ANY document. As an advanced feature we could think of adding a config option to delta indexing to specify a threshold for index deletion: "do not delete obsolete documents from index if more than X% are deleted\!".
</p>
<a name="Resulting_Rules_for_SMILA"></a><h3> <span class="mw-headline"> Resulting Rules for SMILA </span></h3>
<p><a href="http://wiki.eclipse.org/User:Daniel.stucky.empolis.com" title="User:Daniel.stucky.empolis.com">Daniel Stucky</a>:
</p>
<ul><li> what is the reason for 4.4, never logging when throwing an exception&nbsp;? The worst case is that the same (or similar) exception is logged multiple times.
</li><li> what is the result for Crawlers? I assume it is
<ul><li> Crawlers make use of CrawlerException and CrawlerCriticalException.
</li><li> If any of both exceptions occur, CrawlerController MUST NOT execute delta-delete.
</li><li> On CrawlerCriticalException the CrawlerController stops the crawl process.
</li></ul>
</li></ul>
<p>I see the following issues:
</p>
<ul><li> if the Crawler does not stop itself on critical errors but waits to be stopped by the CrawlerController it may produce lots of internal errors
</li><li> getNextDeltaIndexingData() returns a MObject[]. Imagine a (non critical) exception occurs while the Crawler builds this return object. What happens with those MObjects? They are never returned because an Exception is thrown! There is no problem if the size of MObject[] is always 1, but for better performance we want to use bigger sizes (in tests values of up to 100 proved feasible). So an exception on the Nth elemnet would skip n-1 elements. I guess this is a realy bad behavior.
</li></ul>
<p><br />
</p><p><br />
</p>
<a name="Technical_proposal"></a><h2> <span class="mw-headline"> Technical proposal </span></h2>
<a name="First_problem_.22producer-consumer.22"></a><h3> <span class="mw-headline"> First problem "producer-consumer" </span></h3>
<p>Its obvious that producer should collect exceptions to some exceptions list/queue.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">private</span> Queue&lt;Throwable&gt; _producerExceptions;
&nbsp;
...
&nbsp;
&nbsp;
<span class="co1">//producer thread</span>
<span class="kw1">try</span><span class="br0">&#123;</span>
<span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Throwable</span> ex<span class="br0">&#41;</span><span class="br0">&#123;</span>
_producerExceptions.<span class="me1">add</span><span class="br0">&#40;</span>ex<span class="br0">&#41;</span>;
<span class="kw1">if</span><span class="br0">&#40;</span>isCritical<span class="br0">&#40;</span>ex<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
<span class="co1">// stop</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p>There are two solutions how to pass all errors to crawler-controller.
First of them to is to check producer exceptions inside of every public/consumer method.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">public</span> MObject<span class="br0">&#91;</span><span class="br0">&#93;</span> getNextDeltaIndexingData<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> CrawlerException <span class="br0">&#123;</span>
<span class="kw3">Throwable</span> ex = _producerExceptions.<span class="me1">poll</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw1">if</span><span class="br0">&#40;</span>ex!=<span class="kw2">null</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
<span class="kw1">throw</span> <span class="kw1">new</span> CrawlerException<span class="br0">&#40;</span>ex<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
Record getRecord<span class="br0">&#40;</span><span class="kw4">int</span> pos<span class="br0">&#41;</span> <span class="kw1">throws</span> CrawlerException<span class="br0">&#123;</span>
<span class="co1">//the same</span>
<span class="br0">&#125;</span>
<span class="co1">//the same</span></pre></div>
<p>Second solution is to enrich crawler interface
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">interface</span> Crawler<span class="br0">&#123;</span>
...
<span class="kw4">boolean</span> hasInnerExceptions<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="kw3">Throwable</span><span class="br0">&#91;</span><span class="br0">&#93;</span> getInnerExceptions<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></div>
<p>And to process it in the Crawler Controller.
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java">...
<span class="me1">MObject</span><span class="br0">&#91;</span><span class="br0">&#93;</span> diData;
<span class="kw1">while</span><span class="br0">&#40;</span><span class="kw2">true</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>_crawler.<span class="me1">hasInnerExceptions</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#123;</span>
<span class="co1">// check is critical</span>
<span class="br0">&#125;</span>
<span class="kw1">try</span><span class="br0">&#123;</span>
diData = _crawler.<span class="me1">getNextDeltaIndexingData</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Throwable</span> ex<span class="br0">&#41;</span><span class="br0">&#123;</span>
<span class="co1">// check is critical</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<a name="Second_problem_.22is_critical.3F.22"></a><h3> <span class="mw-headline"> Second problem "is critical?" </span></h3>
<p>There are also two solutions.
</p>
<a name=".22let_crawler_developer_choose_it_byself.22"></a><h4> <span class="mw-headline"> "let crawler developer choose it byself" </span></h4>
<p>First of them is "let crawler developer choose it byself".
And to define in interface two types of fixed exceptions, for example, CrawlerCriticalException and CrawlerNonCriticalException.
</p>
<a name="Configurable_SMILAException"></a><h4> <span class="mw-headline"> Configurable SMILAException </span></h4>
<p>Second solution is to make exceptions processing configurable. It may be done on generic way. It should be declared list of possible exceptions in XML configuration file. And it will be written XSD schema and helper for loading/validating configuration and creating new exception based on exception name.
</p><p>budle: org.eclipse.smila.exception
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-xml"><span class="sc3"><span class="re1">&lt;xs:schema</span> <span class="re0">xmlns:xs</span>=<span class="st0">&quot;http://www.w3.org/2001/XMLSchema&quot;</span> <span class="re0">elementFormDefault</span>=<span class="st0">&quot;qualified&quot;</span> <span class="re0">attributeFormDefault</span>=<span class="st0">&quot;unqualified&quot;</span>
<span class="re0">xmlns</span>=<span class="st0">&quot;http://www.eclipse.org/smila/exception&quot;</span>
<span class="re0">targetNamespace</span>=<span class="st0">&quot;http://www.eclipse.org/smila/exception&quot;</span>
<span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;ExceptionConfigurations&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;xs:annotation<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:documentation<span class="re2">&gt;</span></span></span>list of exceptions<span class="sc3"><span class="re1">&lt;/xs:documentation<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:annotation<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:complexType<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;ExceptionConfig&quot;</span> <span class="re0">minOccurs</span>=<span class="st0">&quot;0&quot;</span> <span class="re0">maxOccurs</span>=<span class="st0">&quot;unbounded&quot;</span><span class="re2">&gt;</span></span>
<span class="sc3"><span class="re1">&lt;xs:complexType<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:sequence<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:element</span> <span class="re0">name</span>=<span class="st0">&quot;Text&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:string&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;xs:attribute</span> <span class="re0">name</span>=<span class="st0">&quot;name&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:string&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;required&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;xs:attribute</span> <span class="re0">name</span>=<span class="st0">&quot;critical&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:boolean&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;optional&quot;</span> <span class="re0">default</span>=<span class="st0">&quot;true&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="coMULTI">&lt;!-- for extensibility - class should extends EilfException or implements some common inteface --&gt;</span></span>
<span class="sc3"><span class="re1">&lt;xs:attribute</span> <span class="re0">name</span>=<span class="st0">&quot;class&quot;</span> <span class="re0">type</span>=<span class="st0">&quot;xs:string&quot;</span> <span class="re0">use</span>=<span class="st0">&quot;optional&quot;</span><span class="re2">/&gt;</span></span>
<span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:element<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:sequence<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:complexType<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:element<span class="re2">&gt;</span></span></span>
<span class="sc3"><span class="re1">&lt;/xs:schema<span class="re2">&gt;</span></span></span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">public</span> <span class="kw1">class</span> EilfException <span class="kw1">extends</span> <span class="kw3">Exception</span><span class="br0">&#123;</span>
....
<span class="kw4">boolean</span> isCritical<span class="br0">&#40;</span><span class="br0">&#41;</span>;
....
<span class="br0">&#125;</span></pre></div>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">public</span> <span class="kw1">class</span> ExceptionHelper <span class="br0">&#123;</span>
&nbsp;
<span class="kw1">public</span> ExceptionHelper<span class="br0">&#40;</span><span class="kw1">final</span> <span class="kw3">String</span> bundleId<span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="co1">// load configuration here - for usage in crawler controller, for example</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> ExceptionHelper<span class="br0">&#40;</span><span class="kw1">final</span> <span class="kw3">String</span> bundleId, <span class="kw3">String</span><span class="br0">&#91;</span><span class="br0">&#93;</span> <span class="br0">&#41;</span>
<span class="br0">&#123;</span>
<span class="co1">// load configuration here and validate for required exceptions - for usage in crawler, for example</span>
<span class="br0">&#125;</span>
&nbsp;
&nbsp;
<span class="kw1">public</span> EilfException createException<span class="br0">&#40;</span><span class="kw1">final</span> <span class="kw3">String</span> name<span class="br0">&#41;</span>
<span class="br0">&#123;</span> <span class="co1">// create EilfException</span>
<span class="kw1">return</span> <span class="kw2">null</span>;
<span class="br0">&#125;</span>
<span class="kw1">public</span> <span class="kw4">void</span> throwException<span class="br0">&#40;</span><span class="kw1">final</span> <span class="kw3">String</span> name<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="co1">// create and throw</span>
<span class="br0">&#125;</span>
&nbsp;
<span class="kw1">public</span> <span class="kw4">boolean</span> isCritical<span class="br0">&#40;</span><span class="kw3">String</span> name<span class="br0">&#41;</span>;
&nbsp;
<span class="br0">&#125;</span></pre></div>
<p>Core component, for example, crawler controller will process exceptions using the same configuration file.
</p>
<a name="Resulting_Rules_for_SMILA_.28suggestion.29"></a><h2> <span class="mw-headline"> Resulting Rules for SMILA (suggestion) </span></h2>
<ol><li> Throwing an Exception depends on the situation. Every bundle/package should decide by itself when to throw an Exception or when to handle the problem/error by itself.
</li></ol>
<p>Bad Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> Bundle <span class="br0">&#123;</span>
<span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">try</span><span class="br0">&#123;</span>
...
<span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> MyException<span class="br0">&#40;</span><span class="st0">&quot;Problem!&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
&nbsp;
Or
&nbsp;
<span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">try</span><span class="br0">&#123;</span>
...
<span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
_log.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;Problem&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p>Good example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">public</span> <span class="kw4">void</span> run<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">try</span><span class="br0">&#123;</span>
...
<span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">IOException</span> ioException<span class="br0">&#41;</span> <span class="br0">&#123;</span>
_log.<span class="me1">debug</span><span class="br0">&#40;</span><span class="st0">&quot;IOException, will try it again&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span>UrlException urlException<span class="br0">&#41;</span>
<span class="kw1">throw</span> <span class="kw3">FileNotFoundException</span><span class="br0">&#40;</span><span class="st0">&quot;Can't work anymore, inform caller&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></div>
<ol><li> Bundles/Packages (same scope of work) can define own checked Exceptions. They can be used to return more specific information, because some Exceptions that are thrown into methods are not informational for the caller. Therefore, it should be avoided to throw "internal" Exceptions (e.g., URLException).
</li></ol>
<p>Bad Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> FileSystemCrawler <span class="br0">&#123;</span>
<span class="kw1">public</span> getThing<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throw</span> URLException <span class="br0">&#123;</span> <span class="co1">// without explicit description the URLException makes no sense for the caller</span>
...
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p><br />
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> FileSystemCrawler <span class="br0">&#123;</span>
<span class="kw1">public</span> getThings<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throw</span> CrawlerException <span class="br0">&#123;</span>
<span class="kw1">try</span> <span class="br0">&#123;</span>
&nbsp;
<span class="br0">&#125;</span><span class="kw1">catch</span><span class="br0">&#40;</span>UrlException e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> <span class="kw1">new</span> CrawlerException<span class="br0">&#40;</span><span class="st0">&quot;Problems with ...&quot;</span>, e<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<ol><li> Self-defined Exceptions should encapsulate layer-dependent / internal exceptions (like IOException). The caller can use getCause / Stacktrace to see more information about the problem.
</li></ol>
<p>Bundles/Packages should define different Exceptions, in case the caller has to react differently on problems.
Bad Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> FileSystemCrawler <span class="br0">&#123;</span>
<span class="kw1">public</span> get...<span class="me1"><span class="br0">&#40;</span></span><span class="br0">&#41;</span> <span class="kw1">throw</span> CrawlerException <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>state==<span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> CrawlerException<span class="br0">&#40;</span><span class="st0">&quot;not really bad&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> CrawlerException<span class="br0">&#40;</span><span class="st0">&quot;Crawler should be stopped&quot;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p>Good Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">class</span> FileSystemCrawler <span class="br0">&#123;</span>
<span class="kw1">public</span> getThings<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throw</span> CrawlerException <span class="br0">&#123;</span>
<span class="kw1">try</span> <span class="br0">&#123;</span>
...
<span class="br0">&#125;</span> <span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">IOException</span> e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">if</span><span class="br0">&#40;</span>state==<span class="nu0">1</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> CrawlerException<span class="br0">&#40;</span><span class="st0">&quot;not really bad&quot;</span>, e<span class="br0">&#41;</span>;
<span class="br0">&#125;</span> <span class="kw1">else</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> CrawlerCriticalException<span class="br0">&#40;</span><span class="st0">&quot;Crawler should be stopped&quot;</span>, e<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<ol><li> Never log and throw an Exception (should be used only in special cases)
</li></ol>
<p>Bad Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">IOException</span> e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
_log.<span class="me1">error</span><span class="br0">&#40;</span><span class="st0">&quot;We have a problem&quot;</span><span class="br0">&#41;</span>;
<span class="kw1">throw</span> BundleException<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span></pre></div>
<ol><li> Unchecked Exceptions should only be used in specific cases. These cases are given when the developer wants to ensure that requirements are fulfilled. If these requirements are not fulfilled, the developer should throw an unchecked Exception to stop the execution immediately.
</li></ol>
<p>Bad Example:
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="kw1">public</span> getThings<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
...
<span class="kw1">catch</span><span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span> <span class="br0">&#123;</span>
<span class="kw1">throw</span> <span class="kw3">NullPointerException</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<p>Good Example:
</p><p><br />
</p>
<div dir="ltr" style="text-align: left;"><pre class="source-java"><span class="coMULTI">/** this method should only be execute when _crawler is instantiated
*
*/</span>
<span class="kw1">public</span> getThings<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#123;</span>
...
<span class="kw1">if</span><span class="br0">&#40;</span>_crawler==<span class="kw2">null</span><span class="br0">&#41;</span> <span class="co1">// here: we know that a developer has used this method incorrectly</span>
<span class="kw1">throw</span> <span class="kw3">NullPointerException</span><span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span class="br0">&#125;</span></pre></div>
<!--
NewPP limit report
Preprocessor node count: 58/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:15308-0!1!0!!en!2!edit=0 and timestamp 20130415231125 -->
<div class="printfooter">
Retrieved from "<a href="Exceptions_configurations_and_processing.html">http://wiki.eclipse.org/SMILA/Project_Concepts/Exceptions_configurations_and_processing</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; 2013 The Eclipse Foundation. All Rights Reserved</span>
<p id="footercredit">This page was last modified 10:16, 15 August 2008 by <a href="http://wiki.eclipse.org/User:Daniel.stucky.empolis.com" title="User:Daniel.stucky.empolis.com">Daniel Stucky</a>. </p>
<p id="footerviews">This page has been accessed 2,632 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.055 secs. --></body></html>