<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		
		<title>levigo blog</title>
		<link>http://www.levigo.de/</link>
		<description>Blog der levigo Unternehmensgruppe</description>
		<language>de</language>
		<image>
			<title>levigo blog</title>
			<url>http://www.levigo.de/fileadmin/templates/img/rss_icon.gif</url>
			<link>http://www.levigo.de/</link>
			<width>14</width>
			<height>14</height>
			<description>Blog der levigo Unternehmensgruppe</description>
		</image>
		<generator>TYPO3 - get.content.right</generator>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		
		
		
		<lastBuildDate>Mon, 30 Jan 2012 12:18:00 +0100</lastBuildDate>
		
		
		<item>
			<title>Java ImageIO Plugin für das JBIG2 Image Format</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/java-imageio-plugin-fuer-das-jbig2-image-format/</link>
			<description>jbig2-imageio – ein Projekt der levigo solutions</description>
			<content:encoded><![CDATA[<p>Das Java ImageIO Plugin für JBIG2 ermöglicht die Anzeige von Schwarz-Weiss-Bildern, die in einem JBIG2-Standard-konformen Verfahren komprimiert worden sind. jbig2-imageio ist ein auf Google Code gehostetes Projekt der levigo solutions und unterliegt der <b><a href="http://www.gnu.org/licenses/gpl.html" target="_blank" class="external-link-new-window" >GNU General Public License V3</a></b>.<br /><br />Levigo bietet für das jbig2-imageio auch kommerziellen Support an.<br /><br />Die wichtigsten Merkmale des Plugins sind:<br /><br /></p><ul><li>Unterstützt das Lesen von Bildern, die in einem JBIG2-Standard-konformen Verfahren, gemäß ITU T.88 und ISO/IEC 14492, kodiert wurden.</li><li> Volle Unterstützung aller Merkmale, die im JBIG2-Standard definiert sind, einschließlich aller Kodierverfahren.</li><li>Reiner Java Code</li><li>Plugin für die Standard ImageIO API von Java.</li><li>Sichere, robuste und qualitativ hochwertige Dekodierung.</li><li>Hochoptimierte Geschwindigkeit.</li><li>Unterstützt die Dekodierung eingebetteter JBIG2-Daten durch eigene DecodeParams, wie sie beispielsweise in PDF vorkommen können.</li></ul><p><br /><b><a href="http://code.google.com/p/jbig2-imageio/" target="_blank" class="external-link-new-window" >Mehr zu jbig2-imageio &gt;</a></b></p>]]></content:encoded>
			
			
			<pubDate>Wed, 16 Feb 2011 12:29:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>jadice online-Dokumentation</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/jadice-online-dokumentation/</link>
			<description>jadice 4.2.0.7 jetzt verfügbar!</description>
			<content:encoded><![CDATA[<p>Die vollständige Dokumentation der jadice document platform steht ab sofort online zur Verfügung. Darin enthalten sind verschiedene Entwicklerdokumentationen, technische Hinweise und vor allem Informationen rund um die Software. Dazu gehören eine Übersicht über die aktuelle Auslieferung, Konfigurationsänderungen und&nbsp;im Besonderen die <b><a href="http://support.levigo.de/products/jadice/documentplatform/documentation/releasenotes.html" target="_blank" rel="nofollow" class="external-link-new-window" >Release Notes</a></b> mit Änderungen  der jeweils neuesten jadice-Version.<br />Das aktuelle<b> Release der jadice document platform (4.2.0.7), </b>das<b> </b>jetzt erschienen ist,<b>  </b>enthält im Wesentlichen Bugfixes und kleinere Korrekturen. </p>
<p><b><a href="http://support.levigo.de/products/jadice/documentplatform/" target="_blank" rel="nofollow" class="external-link-new-window" >Zur Documentation Library &gt;</a></b></p>]]></content:encoded>
			
			
			<pubDate>Wed, 14 Oct 2009 13:37:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Was ist BIRT?</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/was-ist-birt/</link>
			<description>Business Intelligence and Reporting Tools</description>
			<content:encoded><![CDATA[<p lang="de-DE"> <b>BIRT</b> (<b>B</b>usiness <b>I</b>ntelligence and <b>R</b>eporting <b>T</b>ools) ist ein OpenSource Projekt, das von der Firma Actuate Corporation vorgeschlagen wurde und über die Eclipse Foundation vorangetrieben wird. Es ist mittlerweile ein Top-Level-Softwareprojekt innerhalb der Eclipse Foundation.</p>
<p lang="de-DE"> BIRT besteht aus zwei Hauptkomponenten: Einem graphischen Berichte-Editor innerhalb der Eclipse IDE, um BIRT-Berichte zu designen, und einer Laufzeitkomponente für die Erzeugung von Berichten, die in jeder Java-Umgebung eingesetzt werden kann.</p>
<p lang="de-DE"> BIRT wird dazu eingesetzt, einen großen Bereich des Berichtwesens in typischen Applikationen in Unternehmen abzudecken.</p>
<p lang="de-DE" class="align-justify"><img height="137" width="380" src="fileadmin/pics/de/news/BIRT_01.png" alt="" /></p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE"> Mit BIRT kann der Report im Eclipse Report Designer generiert werden. Es ist aber auch möglich, mithilfe des Web Based Report Designer einen Report zu erstellen. Die dritte Möglichkeit ist wohl die vielseitigste und interessanteste: der Custom Report Designer. Dazu werden dem Entwickler die einzelnen Klassen der Engine, beziehungsweise diese als Ganzes (API), zur Verfügung gestellt und somit kann er einen eigenen Report Designer generieren.</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE"> <b>Einzelne Komponenten von BIRT</b></p>
<p lang="de-DE"> <i><b>Report Design Engine</b></i><br />Die Report Design Engine generiert aus den Eingabedaten eine XML-Datei, welche das Design, die Datenherkunft sowie die verschiedenen Parameter des Reports beschreibt.  </p>
<p lang="de-DE"> <i><b>Charting Engine</b></i><br />Die Charting Engine wird von der Report Engine dann aufgerufen, wenn ein  Diagramm (engl. Chart) erstellt werden muss. Daten werden von der aufrufenden Report Engine bereitgestellt.</p>
<p lang="de-DE"> <i><b>Report Engine</b></i><br />Die Report Engine ist in zwei Bereiche mit unterschiedlichen Services untergliedert: Der erste Bereich, die sogenannten Generation Services, kümmern sich um die Beschaffung der Daten. Er gibt eine Art Rohdokument an die Presentation Services weiter, welche die Aufbereitung in ein Ausgabeformat (zum Beispiel PDF o.ä.) übernehmen.</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE"> <b>Typische BIRT-Anwendung</b><br />In einer typischen Anwendung wird BIRT zur Generierung von Tabellen-basierten Reports, welche in einem leicht austauschbaren Format (PDF) erstellt werden, verwendet. Dazu wird BIRT aus einer JAVA-Anwendung aufgerufen und es werden POJOs bereitgestellt, um die Daten in der gewünschten Form präsentieren zu können. Als Datenquelle ist POJOs (Plain Old Java Object) gewählt worden, da diese eine größtmögliche Flexibilität ermöglichen. Hier gibt es einige Tricks und Kniffe zu beachten.</p>
<p lang="de-DE"> Für den Aufruf der verschiedenen Komponenten von BIRT, welche zu konfigurieren sind, findet man sehr viele Beispiele im Internet. Hier nur ein paar Auszüge:</p>
<p class="code"><div class="codeContent indent"><pre class="prettyprint">config = new EngineConfig();<br />config.setBIRTHome(file.getAbsolutePath());<br />  &#8942;<br />Platform.<i>startup</i>(config);<i><br />logger</i>.debug(„Platform created, starting factory.“;<br />IreportEngineFactory factory = (IReportEngineFactory) Platform<br />.createFactoryObject(IReportEngineFactory.EXTENSION_REPORT_ENGINE_FACTORY);<i><br />engine</i> = factory.createReportEngine(config);<br />  &#8942;<i><br />design</i> = <i>engine</i>.openReportDesign(name_rtpdesign_File);<br />  &#8942;<br />IRunAndRenderTask task = <i>engine</i>.createRunAndRenderTask(<i>design</i>);<br />  &#8942;<br />PDFRenderOption options = new PDFRenderOption();<br />  &#8942;<br />task.setRenderOption(options);<br />  &#8942;<br />try {<br />  task.run();<br />} catch (EngineException e) {<br />  throw (new, e);<br />}<i><br />engine</i>.destroy();<br />task.close();</pre></div></p>
<p lang="de-DE">Dieser Code (und noch ein paar andere Zeilen) wird verwendet, um einen BIRT zu konfigurieren und einen Report zu produzieren.  </p>
<p lang="de-DE"> Einer der wichtigsten Tricks ist, dass beim Beenden des (eigenen) Programms unmittelbar ein Plattform.shutdown() aufgerufen wird. Nach diesem Aufruf kann jedoch kein Bericht mehr erstellt werden. Deshalb soll man sie auch z.B. beim Schließen des Fensters aufrufen.</p>
<p lang="de-DE"> Im Folgenden werden die Klassen <b>Job4BirtFactory</b>, <b>Job4Birt</b> und <b>History4Birt</b> verwendet. Die Factory Klasse ist hierbei die Klasse, welche über eine Methode (getJob()) die beiden weiteren Klassen mit Daten füllt. Die beiden anderen Klassen fungieren hier als „Datenträger“ und bestehen größtenteils aus Gettern, Settern und Variablen.</p>
<p lang="de-DE"> Die Schnittstelle in BIRT wird über eine „scripted Datasource“ erstellt.</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE"><img height="102" width="380" src="fileadmin/pics/de/news/BIRT_02.png" alt="" /></p>
<p lang="de-DE">Hier ist das Script zu sehen, welches die Job4BirtFactory (aus dem Report) aufruft und über diesen Weg den Job (für welchen das Script die Job ID bereithält) erhält.</p>
<p lang="de-DE"> Nun können von dieser DataSource DataSets erstellt werden, welche wie Tabellen funktionieren. Achtung: 2 Scripts müssen erstellt werden!<br />Eines zum Öffnen der Datenquelle (open) - </p>
<p lang="de-DE"><img height="50" width="380" src="fileadmin/pics/de/news/BIRT_03.png" alt="" /></p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE"> das andere Script zur detaillierten Auswertung der Daten eines POJO (hier exemplarisch an der History dargestellt). Das Fetch-Script kann ähnlich einer While-Schleife verwendet werden.</p>
<p lang="de-DE"><img height="126" width="380" src="fileadmin/pics/de/news/BIRT_04.png" alt="" /></p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>
<p lang="de-DE">&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Wed, 08 Jul 2009 10:12:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Management und Monitoring der jadice document platform mit JMX</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/management-und-monitoring-der-jadice-document-platform-mit-jmx/</link>
			<description>Von François Fernandès</description>
			<content:encoded><![CDATA[<p>Mit JAVA 5 wurde eine Reihe sehr nützlicher Funktionalitäten in die Runtime aufgenommen. Dies sind beispielsweise das <b>java.util.concurrent</b>-Framework, Annotations, Generics und natürlich JMX. Interessant ist nun das JMX-Framework, welches ermöglicht, Informationen über eine Applikation mittels eines standardisierten Interface (<b><a href="http://jcp.org/en/jsr/detail?id=3" title="Opens external link in new window" target="_blank" rel="nofollow" class="external-link-new-window" >JSR-3</a></b> und <b><a href="http://jcp.org/en/jsr/detail?id=160" title="Opens external link in new window" target="_blank" rel="nofollow" class="external-link-new-window" >JSR-160</a></b>) auch außerhalb der Anwendung zur Verfügung zu stellen. Es existieren eine Reihe von JMX-Clients wie beispielsweise die in den JDK integrierte <b><a href="http://java.sun.com/j2se/1.5.0/docs/guide/management/jconsole.html" title="Opens external link in new window" target="_blank" rel="nofollow" class="external-link-new-window" >JConsole</a></b>. Alternativen gibt es ebenfalls zur Genüge. Beispielsweise <b><a href="https://visualvm.dev.java.net/" target="_blank" rel="nofollow" >VisualVM</a></b>, für welches ein JMX MBean Plugin existiert, oder <b><a href="http://mc4j.org/" target="_blank" rel="nofollow" >MC4J</a></b>.</p>
<p>Wir arbeiten daher an einer Möglichkeit, um den aktuellen Zustand der jadice document platform und deren Module und Komponenten mittels JMX zu propagieren. Derzeit sind wir in der Proof-Of-Concept Phase und möchten die bisherige Idee vorstellen.<br /> Um das Exponieren von Informationen über die jadice document platform einfach und flexibel zu gestalten, arbeiten wir an einer Pseudo-DSL (=Domain Specific Language), die möglichst aussagekräftig beschreiben soll, welche Daten exponiert werden und zusätzlich die JMX API deutlich vereinfachen:</p>
<p class="code"><div class="codeContent"><pre class="prettyprint">Viewer v = <span class="code-comment">//...<br /></span>MBeanServer mbs = ManagementFactory.getPlatformMBeanServer()<br />ManagementConfiguration.on(mbs)<br />	.addModule(SupportUtilsManagementModule.get())<br />	.addModule(ViewerManagementModule.manage(v,<span class="code-quote">&quot;MyViewer&quot;</span>))<br />	.start();</pre></div></p>
<p>Die Management Logik wird hierbei in Module gruppiert. Jedes dieser Module kann ein oder mehrere <b>MBeans</b> einem <b>MBeanServer</b> zuweisen. Das <b>ViewerManagementModule</b> beispielsweise erzeugt ein MBean mit lesendem und teilweise schreibendem Zugriff auf einige Properties des Viewer. So ist es beispielsweise möglich, den aktuellen Zoom-Faktor über eine JMX Console zu ändern.<br /> Wie bereits erwähnt, befindet sich diese Management-Erweiterung in einem Proof-Of-Concept Stadium. Für Ideen, Anforderungen oder auch einfach nur Lob sind wir jederzeit offen.</p>
<p>&nbsp;</p>
<p><img height="281" width="380" src="fileadmin/pics/de/news/jadice_screenshot.jpg" alt="" /></p>]]></content:encoded>
			
			
			<pubDate>Mon, 18 May 2009 11:44:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Textdokumente mit einem eigenen Encoding laden</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/textdokumente-mit-einem-eigenen-encoding-laden/</link>
			<description>In einer idealen Welt - nun gut zumindest IT-Welt - wäre jedes Dokument - egal welcher Art - in nur...</description>
			<content:encoded><![CDATA[<p>In einer idealen Welt - nun gut zumindest IT-Welt - wäre jedes Dokument - egal welcher Art - in nur einer einzigen Art und Weise codiert. Leider sieht die Realität etwas anders aus. Um die vielen Sprachen und vor allem vielen Zeichensätze abzubilden, wurden über die Jahre viele einzelne (oft auf ASCII aufbauende) Encodings entwickelt. Man benötigt daher für die Anzeige von Textdokumenten, neben dem Dokument selbst, auch die Information darüber, wie dieses codiert wurde.<br /> Standardmäßig wird beim Ladevorgang von Textdokumenten in der jadice document platform immer als Standard <b>ISO-8859-1</b> gesetzt. Um Dokumente mit einem speziellen Encoding zu laden, kann eine Instanz der Klasse <b>com.levigo.jadice.formats.text.TextFormatInfo</b> entsprechend konfiguriert werden. Hierzu folgendes Beispiel: </p>
<p class="code"><div class="codeContent"><pre class="prettyprint">TextFormatInfo tfi = <span class="code-keyword">new</span> TextFormatInfo();<br />tfi.setEncoding(<span class="code-quote">&quot;UTF-8&quot;</span>);	<br />Document doc = loader.loadDocument(is, tfi,0);</pre></div></p>
<p>Um das Beispiel möglichst einfach zu halten, wurde auf die Behandlung von möglichen Fehlern verzichtet. <br /> In diesem Beispiel wird eine Instanz der Klasse <b>TextFormatInfo</b> erzeugt und das Encoding auf <b>UTF-8</b> gesetzt. Möglich sind viele weitere Encodings, eingeschränkt lediglich durch die Möglichkeiten des Java <b>java.nio.charset.Charset</b>.</p>
<p>Ist der Name eines bestimmten Encodings nicht bekannt oder unklar, ob dieses der Java VM zur Verfügung steht, kann über folgendes Beispiel eine Liste aller möglichen Charset Namen und deren Aliase erzeugt werden:</p>
<p class="code"><div class="codeContent"><pre class="prettyprint">SortedMap&lt;<span class="code-object">String</span>, Charset&gt; m = Charset.availableCharsets();<br /><span class="code-keyword">for</span> (Entry&lt;<span class="code-object">String</span>, Charset&gt; e : m.entrySet()) {<br />    Charset charset = e.getValue();<br />    <span class="code-object">System</span>.err.println(charset.name());<br />    Set&lt;<span class="code-object">String</span>&gt; aliases = charset.aliases();<br />    <span class="code-keyword">for</span> (<span class="code-object">String</span> alias : aliases) {<br />        <span class="code-object">System</span>.err.println(<span class="code-quote">&quot;\t&quot;</span>+alias);<br />    }<br />}</pre></div></p>
<p>Neben dem Setzen eines Encodings für das Laden von Textdokumenten, bietet die Klasse <b>TextFormatInfo</b> auch eine Reihe weiterer Konfigurationsmöglichkeiten wie beispielsweise das Setzen einer Schrift, mit deren Hilfe die Texte angezeigt werden sollen. Weitere Details und Tipps hierzu werden in einen zukünftigen Artikel einfließen.</p>]]></content:encoded>
			
			
			<pubDate>Mon, 04 May 2009 12:36:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Wie baue ich einen eigenen Knoten für jadice server?</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/wie-baue-ich-einen-eigenen-knoten-fuer-jadice-server/</link>
			<description>In diesem Artikel soll anhand eines einfachen Beispiels gezeigt werden, wie der jadice server um...</description>
			<content:encoded><![CDATA[<p>In diesem Artikel soll anhand eines einfachen Beispiels gezeigt werden, wie der jadice server um eigene Nodes bzw. Worker erweitert werden kann, um damit neue Verarbeitungsschritte realisieren zu können.</p>
<p>&nbsp;</p>
<p><b>Node-Klasse</b><br />Die neu zu erstellende Nodeklasse muss von der abstrakten Superklasse com.levigo.jadice.server.Node erben. Dabei ist zunächst nur die abstrakte Methode <b>getNodeClassName()</b> zu implementieren. Als Rückgabewert hat diese den voll qualifizierten Klassennamen der korrespondierenden Workerklasse zu liefern: </p>
<p class="code"><div class="codeContent"><div><pre class="code-java"><span class="code-keyword">package</span> com.myCompany.jadice.client;<br /><span class="code-keyword">import</span> com.levigo.jadice.server.Node;<br /><br /><span class="code-keyword">public</span> class DemoNode <span class="code-keyword">extends</span> Node {<br />  <span class="code-keyword">public</span> <span class="code-object">String</span> getNodeClassName() {<br />    <span class="code-comment">// Klassenname der Workerklasse aus Bsp unten<br /></span>    <span class="code-keyword">return</span> <span class="code-quote">&quot;com.myCompany.jadice.worker.DemoWorker&quot;</span>;<br />  }<br />}</pre></div></div></p>
<p>Soll es möglich sein, dass dem Worker zur Laufzeit Parameter übermittelt werden, so kann dies durch weitere Methoden in der Node-Implementierung erfolgen. Dabei ist zu beachten, dass alle Objekt- und statischen Attribute das Interface Serializable implementieren müssen, da diese über JMS serialisiert und transportiert werden.</p>
<p class="code"><div class="codeContent"><pre class="code-java"><span class="code-keyword">public</span> <span class="code-object">String</span> getMyParameter() {<br />    <span class="code-comment">// Sollte z.B. über Setter-Methode gesetzt werden<br /></span>    <span class="code-keyword">return</span> <span class="code-quote">&quot;a Parameter&quot;</span>;<br />  }</pre></div></p>
<p>Der selbst implementierte Node muss sowohl client- als auch serverseitig im Klassenpfad eingebunden werden und kann später in eigene Workflows eingebettet werden.</p>
<p>&nbsp;</p>
<p><b>Worker-Klasse</b><br />Die Workerklasse, in der die Konvertierung durchgeführt wird, erbt von der abstrakten, generischen Superklasse com.levigo.jadice.server.core.NodeWorker&lt;N&gt;, wobei der Typ-Parameter &lt;N&gt; für die zugehörige Node-Klasse steht.<br /> Hier ist die abstrakte Methode <b>work()</b> zu implementieren, in der die serverseitige Konvertierung durchführt wird.</p>
<p class="code"><div class="codeContent"><pre class="code-java"><span class="code-keyword">package</span> com.myCompany.jadice.server;<br /><br /><span class="code-comment">// Hier nur die wichtigen Imports<br /></span><span class="code-keyword">import</span> com.levigo.jadice.server.core.NodeWorker;<br /><span class="code-keyword">import</span> com.myCompany.jadice.client.DemoNode;<br /><br /><span class="code-keyword">public</span> class DemoWorker <span class="code-keyword">extends</span> NodeWorker&lt;DemoNode&gt; {<br /><br />  <span class="code-keyword">protected</span> void work() <span class="code-keyword">throws</span> Throwable {<br />    <span class="code-comment">// Im Bsp oben definierter Parameter<br /></span>    <span class="code-object">String</span> myParam = getNode().getMyParameter();<br /><br />    <span class="code-comment">// Abholen der Eingabedaten<br /></span>    <span class="code-keyword">for</span> (Stream stream : getInputBundle()) {<br />      InputStream unprocessedIS = stream.getInputStream();<br />      <span class="code-comment">// Metadaten des empfangenen Datenstrom<br /></span>      StreamDescriptor unprocessedSD = stream.getDescriptor();<br /><br />      <span class="code-comment">// Methode, die den Datenstrom verarbeitet<br /></span>      <span class="code-comment">// (nicht im Listing gezeigt)<br /></span>      InputStream processedIS =  process(unprocessedIS, myParam);<br /><br />      <span class="code-comment">// Metadaten des verarbeiten Datenstroms<br /></span>      <span class="code-comment">// unprocessedSD wird als „Parent&quot; gesetzt<br /></span>      StreamDescriptor processedSD = <span class="code-keyword">new</span> StreamDescriptor(unprocessedSD);<br />      processedSD.setDescription(<span class="code-quote">&quot;&lt;Beschreibung&gt;&quot;</span>);<br />      processedSD.setMimeType(<span class="code-quote">&quot;&lt;MIME Type&gt;&quot;</span>);<br />      processedSD.setFileName(<span class="code-quote">&quot;&lt;Dateiname&gt;&quot;</span>);<br /><br />      <span class="code-comment">// Verknüpfen von Ergebnis und Metadaten<br /></span>      Stream result = <span class="code-keyword">new</span> BundledStream(processedIS, processedSD);<br />      <span class="code-comment">// Weitergabe des Ergebnisses<br /></span>      getOutputBundle().addStream(result);<br />    }<br />}</pre></div></p>
<p>Der auf diese Weise implementierte Worker muss nur im Klassenpfad des jadice servers eingebunden werden und wird bei Verwendung des zugehörigen Nodes aus dem vorherigen Abschnitt automatisch aufgerufen.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 26 Mar 2009 12:06:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Das jadice Signatur-Modul</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/das-jadice-signatur-modul/</link>
			<description>Die Integration von PenPads wird in der letzten Zeit mehr und mehr zum Thema für Firmen mit großem...</description>
			<content:encoded><![CDATA[<p>Die Integration von PenPads wird in der letzten Zeit mehr und mehr zum Thema für Firmen mit großem Dokumentaufkommen. Besonders bei Dokumenten, die von Kunden oder Mitarbeitern gegengezeichnet werden müssen, ist bei analogen Unterschriften das notwendige Ausdrucken und Wiedereinscannen der Dokumente ein mühsamer und zeitaufwändiger Arbeitsschritt. Mit einer PenPad-Lösung fällt dieser zusätzliche Arbeitsschritt weg.<br /><br />Das jadice Signatur-Modul bietet hierfür Funktionen zum Erfassen und Darstellen von Unterschriften, zum Entfernen temporär erfasster Unterschriftsdaten sowie zur Versiegelung von Dokumenten. Über eine Schnittstelle kann zudem ein externes Unterschriftsprüfsystem zum Abgleich der aufgebrachten Unterschrift angebunden werden.<br /><br />Konkret läuft ein Signaturvorgang wie folgt ab:<br />Das zu unterzeichnende Dokument wird im jadice viewer geladen und über die Schnittstelle per PenPad von Kunden unterzeichnet. Die zu unterschreibende Stelle wird dafür mit der Maus markiert. Hieraus entstehen zwei Datenströme, von denen der eine Signaturdaten, wie Unterschriftsansicht, Datum, Uhrzeit und Treiberversion, der andere biometrische Daten, wie Schriftzug, Aufdruck und Winkel, enthält. Nach anschließender Sichtprüfung durch Mitarbeiter und Kunde wird das Dokument versiegelt und somit untrennbar mit den Unterschriftsdaten verbunden. Das Dokument ist von nun an rechtsgültig und kann archiviert werden. Der Kunde erhält ein ausgedrucktes Exemplar als Beleg ausgehändigt. <br /><br />Siehe auch Technische Informationen<br /><b><a href="fileadmin/./download/de/dokumentenmanagement/technischeInfos/P003_jadice_signatur_PenPad_01.pdf" title="Initiates file download" class="download" >Unterschrift per PenPad</a></b><br /><b><a href="fileadmin/./download/de/dokumentenmanagement/technischeInfos/K003_jadice_PenPad_Fiducia_01.pdf" title="Initiates file download" class="download" >Unterschriftenerfassung</a></b></p>]]></content:encoded>
			
			
			<pubDate>Thu, 12 Feb 2009 12:02:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>eMail-Archivierung: Konvertieren ohne Informationsverlust</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/email-archivierung-konvertieren-ohne-informationsverlust/</link>
			<description>Die Konvertierung komplexer Dokumente läuft oftmals in mehreren Stufen ab. Um auch nach der...</description>
			<content:encoded><![CDATA[<p>Die Konvertierung komplexer Dokumente läuft oftmals in mehreren Stufen ab. Um auch nach der Umwandlung einen Überblick über das Ausgangsdokument zu haben, muss die Konvertierungssoftware mehrere Anforderungen erfüllen. Eine eingehende <b>Voranalyse</b> des Dokuments gibt der Software Aufschluss über die notwendigen Schritte. Zudem muss zeitgleich die <b>ursprüngliche Dokumentstruktur</b> dokumentiert werden, da diese nach einer Konvertierung nicht mehr verfügbar ist bzw. nicht übertragen werden konnte.<br />Wichtig sind hier vor allem die Informationen, die zu einem Dokument vorliegen und die auch nach der Konvertierung noch verfügbar sein sollen. Dies können Informationen über Änderungs- und Erstelldatum, Urheber, Ursprung und Struktur des Dokuments sein. Diese Informationen gingen bei einer einfachen Umwandlung, etwa von Office-Dokumenten in ein PDF-Format, unweigerlich verloren. <br />Aber gerade in größeren Projekten, in denen unzählige Dokumente konvertiert werden, sind solche Informationen ungemein wichtig, um den Überblick zu behalten oder um gezielt in deren Metadaten suchen zu können. Am Besten lässt sich dies am Beispiel einer eMail-Konvertierung verdeutlichen.</p>
<p><i><b>Beispiel eMail-Konvertierung</b></i><br />Der jadice Server untersucht und durchleuchtet die eMail auf deren Inhalt und leitet die weiteren Schritte ein. Eine eMail kann dabei sehr komplex strukturiert sein und unter Umständen neben dem reinen eMail-Text auch mehrere Anhänge mit weiteren Dokumenten unterschiedlicher Formate enthalten. Diese Anhänge müssen erkannt, entschlüsselt, ausgepackt und aufbereitet werden, ohne dass wichtige Informationen wie Metadaten verloren gehen. <br /> Erkennt der jadice Server beispielsweise ein ZIP-Dokument als Anhang, so leitet er automatisch eine Extraktion der enthaltenen Dokumente ein, welche dann erneut untersucht werden. Dies können Word-Dokumente mit zusätzlichen OLE und XLS-Informationen sein. <br /> Ziel einer Konvertierung ist es nun, all diese Informationen über Dateiinhalte und Dateianhänge zu bewahren. Das heisst, die Software muss Datenblätter erstellen können, die sowohl Aufschluss über die Struktur der Ursprungsdatei geben können als auch über die Metadaten der enthalten Dokumente, wie Änderungsdatum, Ersteller und dergleichen. Dies geschieht in einzelnen, automatisch ablaufenden Konvertierungsstufen, die kaskadiert ausgeführt werden. Am Ende der Konvertierung sollte ein Dokument vorliegen, das alle Informationen des Ursprungsdokuments in geordneter und übersichtlicher Form wiedergibt.</p>
<p><b>Eine Konvertierungssoftware muss also folgende Anforderungen erfüllen:</b></p><ul><li>Dynamisches System, das den Einbau zusätzlicher Konvertierungsstufen ermöglicht.</li><li>Automatische Erfassung, Erkennung, Voranalyse und Formatierung der Eingangsdokumente ohne Qualitäts- und Informationsverlust.</li><li>Erstellung von Datenblättern, die Aufschluss über Status- und Metadaten liefern.</li><li>Erstellung von Inhaltsverzeichnis und Trennblättern, die Informationen über Struktur und Inhalt der einzelnen Dateielemente beinhalten.</li></ul><p>Der jadice Server erfüllt diese Anforderungen problemlos und bleibt darüber hinaus flexibel, da neue Formate einfach über Drittanwendungen eingebunden werden können. Zudem führt er durch eine Fremdkomponente nach Abschluss der Formatierung eine Qualitätsvalidierung durch.</p>
<p>Siehe auch <b><a href="fileadmin/./download/de/dokumentenmanagement/technischeInfos/S013_SERVER_Konvertierung_01.pdf" title="Initiates file download" class="download" >Technische Informationen</a></b>.</p>
<p>&nbsp;</p>]]></content:encoded>
			
			
			<pubDate>Wed, 04 Feb 2009 13:27:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Speicherverbrauch analysieren</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/speicherverbrauch-analysieren/</link>
			<description>Beim Test von JAVA-Anwendungen ist es eine „good practice&quot;, den Speicherverbrauch der JVM zu...</description>
			<content:encoded><![CDATA[<p>Beim Test von JAVA-Anwendungen ist es eine „good practice&quot;, den Speicherverbrauch der JVM zu beobachten, um die Größe des zu allokierenden Speichers (JVM-Optionen -Xms und -Xmx) zu ermitteln und Memory Leaks auszuschließen.</p>
<p><b>Trau dem Task-Manager nicht ...</b></p>
<p>Die Versuchung liegt nahe, dabei zunächst auf Betriebssystem-Tools (wie den Windows Task-Manager) zurückzugreifen. Aber Achtung: die dort gemeldete Speicherauslastung entspricht mitnichten dem tatsächlichen Speicherverbrauch der JVM, denn:</p><ul><li>Im Task-Manager wird der Speicherverbrauch des JAVA-Prozesses angezeigt und nicht der JAVA Heap Size, der eigentlich interessiert, weil dies der durch die Anwendung verbrauchte Speicher ist. Neben dem JAVA Heap Size benötigt der Prozess weiteren Speicher für die JVM und deren Datenstrukturen.</li><li>Im Task-Manager wird häufig nicht der von der JVM tatsächlich verwendete Speicher dargestellt. Gibt die JVM in Zuge ihrer Garbage Collection Speicher frei, so wird dies von der JVM nicht zwangsläufig an das Betriebssystem propagiert. Im Task-Manager wird also ein viel höherer Wert angezeigt als der JAVA Heap tatsächlich einnimmt. Folge: Als Beobachter hat man den Eindruck, als ob die JAVA-Anwendung ständig „am Anschlag&quot; arbeitet, obwohl der Anwendung noch massig Speicher zur Verfügung steht.</li></ul><p><b>... sondern lieber den JAVA-Bordmitteln</b></p>
<p>Deshalb kann ein zuverlässiges Speicher-Monitoring nur mit Werkzeugen erfolgen, die exakte Werte für den JAVA Heap Size bzw. dessen einzelne Speicherbereiche (Eden Space, Survivor Space...) liefern. Ein ideales Tool ist die JConsole, die seit JAVA 5 zum Lieferumfang des JDK gehört (zu finden im Verzeichnis JDK_HOME/bin).</p>
<p>Musste unter JAVA 5 die Verwendung der JConsole beim Starten der Anwendung über die Kommandozeile mit dem Parameter <i>-Dcom.sun.management.jmxremote</i> noch explizit ermöglicht werden (Starten des JMX Agent), ist seit JAVA 6 ein unmittelbares Verbinden der JConsole auf den JAVA-Prozess möglich. Hierzu wird jconsole.exe aufgerufen und auf eine lokale oder eine Remote-Anwendung verbunden.</p>
<p>Neben der Auslastung der einzelnen Speicherbereiche (Heap und Non-Heap) lassen sich über die JConsole weitere Kenngrößen verfolgen (z.B. Threads). Sägezahnförmige Verläufe der Speicherauslastungen lassen erkennen, dass bei der Garbage Collection jeweils wieder ausreichend Speicher freigegeben wird und z.B. kein Memory Leak in der Applikation vorliegt. Auch eine Detailanalyse der einzelnen Memory Pools und deren Tuning über JVM Optionen wird damit möglich. </p>
<p>Alternativ kann zur Analyse auch VisualVM eingesetzt werden. VisualVM wird seit JAVA 6 Update 7 als Bestandteil des JDK mit ausgeliefert - es vereint einige der bisherigen JDK-eigenen Werkzeuge unter einer modernen, Netbeans-basierten Oberfläche. Die analysierten Anwendungen können dabei auch in älteren Umgebungen laufen - die zur Überwachung des Speicherverbrauchs erforderliche Monitoring-Funktionalität wird beispielsweise bereits ab JAVA 1.4.2 unterstützt. Der volle Funktionsumfang ist jedoch erst gegeben, wenn die Anwendung in einer JAVA 6-Umgebung abläuft.</p>
<p><b>Referenzen</b><br /> <b><a href="http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html" target="_blank" rel="nofollow" >http://java.sun.com/javase/6/docs/technotes/guides/management/jconsole.html<sup><img class="rendericon" src="uploads/RTEmagicC_7340fc8257.gif.gif" align="absmiddle" border="0" width="7" height="7" alt="" /></sup></a></b><br /> <b><a href="https://visualvm.dev.java.net/" target="_blank" rel="nofollow" >https://visualvm.dev.java.net/<sup><img class="rendericon" src="uploads/RTEmagicC_7340fc8257.gif.gif" align="absmiddle" border="0" width="7" height="7" alt="" /></sup></a></b></p>]]></content:encoded>
			
			
			<pubDate>Thu, 15 Jan 2009 10:26:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Was tun bei Memory Leaks?</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/was-tun-bei-memory-leaks/</link>
			<description>OutOfMemoryErrors analysieren</description>
			<content:encoded><![CDATA[<p>Viele Entwickler haben es bereits erlebt: Java-Anwendungen geht mitunter der Speicher aus. Normalerweise verhält sich die Anwendung dann &quot;seltsam&quot; oder reagiert nicht mehr und im Logfile ist ein OutOfMemoryError zu sehen.<br />Solange man sich in der Entwicklungsumgebung befindet und das Verhalten reproduzierbar ist, ist die Analyse einfach. Man bedient sich eines (in der Regel kommerziellen) Profilers und analysiert mit dessen Hilfe die Objektreferenzen und den von diesen allokierten Speicher. Memory Leaks kommt man damit leicht auf die Spur. <br />Schwieriger ist die Situation, wenn das Problem nur sporadisch oder nur in der Produktiv-Umgebung auftritt.</p>
<p><b>HPROF-Dateien</b><br />Dort kann man über die JVM-Option <i>-XX:+HeapDumpOnOutOfMemoryError</i> erzwingen, dass in einer OutOfMemory-Situation ein binärer Dump des Speicherinhalts in eine HPROF-Datei (Dateiname&nbsp;&nbsp; &quot;java_pidXXXX.hprof&quot;) geschrieben wird. Unterstützt wird dieses Feature in Java 6 sowie ab 5.0u7, in Java 1.4 nur bedingt. HPROF-Dumps sind plattformunabhängig und können recht groß werden (entsprechend dem Speicherverbrauch der JVM zum Zeitpunkt des Snapshots).</p>
<p>Vorteil: Exakt zum Fehlerzeitpunkt wird ein Dump geschrieben, der sich anschließend auswerten lässt. Insbesondere bei Server-basierten Anwendungen kann dies sehr hilfreich sein, um Memory Leaks von einem schlichtweg zu klein konfigurierten Java Heap zu unterscheiden.<br />Über das Kommandozeilen-Tool jmap (sowie 5 und 6) kann außerdem zu einem beliebigen Zeitpunkt ein Memory Snapshot einer laufenden JVM angefordert werden (jmap -dump:file=path_to_file java_pid).</p>
<p><b>Analyse</b><br />Zur Analyse der HPROF-Dateien kommt mit Java 6 das Utility jhat mit (Aufruf: jhat java_pidXXXX .hprof). Bei großen Dumps wirkt jhat allerdings überfordert. Sehr gute Erfahrungen konnten hingegen mit YourKit als kommerziellem Profiler gemacht werden, der das Laden von HPROF-Snapshots unterstützt. Die Darstellung der Objekte und der von diesen belegte Speicher entspricht der gewohnten Ansicht einer Profiling-Session, so dass die Ursachenfindung in gewohnter Weise erfolgen kann.</p>]]></content:encoded>
			
			
			<pubDate>Mon, 01 Dec 2008 09:30:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Applet Alternative: Windows URL Handler </title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/applet-alternative-windows-url-handler/</link>
			<description>Applets sind schön. Nun, zumindest theoretisch. Die Realität ist meist ernüchternd: schlecht oder...</description>
			<content:encoded><![CDATA[<p>Applets sind schön. Nun, zumindest theoretisch. Die Realität ist meist ernüchternd: schlecht oder gar nicht dokumentierte SecurityExceptions, Eigenheiten der Browser, umständliche Konfiguration und starke Einschränkungen beim Memory Management. Dennoch sind Applets derzeit extrem populär. Viele Anwendungen gehen weg von Fat-Clients hin zu Portal-Lösungen. Hier werden jedoch auch weiterhin teilweise Applets für diverse Tätigkeiten benötigt. Ein Beispiel hierfür ist der Einsatz der jadice document platform zur Anzeige von Dokumenten. Es gibt jedoch eine Alternative zu Java Webstart und den Java Applets, welche im Folgenden beschrieben werden soll. Das folgende Beispiel ist stark vereinfacht und enthält keine Verarbeitung von Fehlern. Ziel war es, das Prinzip möglichst einfach darzustellen. Auch die benötigte Konfiguration der Registry ist auf ein Minimum reduziert und man sollte auch den Empfehlungen von Microsoft Beachtung schenken (Integrieren der optionalen Angaben, etc.)</p>
<p>Windows bietet die Möglichkeit, eigene URL Handler für Protokolle zu definieren. Dies wird unter <b><a href="http://msdn.microsoft.com/en-us/library/aa767914%28VS.85%29.aspx" target="_blank" rel="nofollow" >http://msdn.microsoft.com/en-us/library/aa767914(VS.85).aspx<sup><img height="7" width="7" border="0" align="absmiddle" src="uploads/RTEmagicC_7340fc8257.gif.gif" class="rendericon" alt="" /></sup></a></b> sehr gut beschrieben. Benötigt werden zwei Dinge: Ein Eintrag in der Windows Registry und eine Anwendung, die eine entsprechende Anfrage behandeln soll. Möchte man ein JadicePanel für die Anzeige von Dokumenten nutzen, kann beispielsweise das Protokoll „<i>jadvwr</i>&quot; definiert werden. Wird eine URL mit dem Protokoll Prefix <i>jadvwr:</i> angefordert, wird die Anfrage an die dafür registrierte Anwendung weitergereicht. Für die Konfiguration kann ein Registry Eintrag ähnlich dem folgenden verwendet werden:</p>
<p class="code"><div class="codeContent"><pre class="prettyprint">Windows Registry Editor Version 5.00<br /><br />[HKEY_CLASSES_ROOT\jadvwr]<br />@=<span class="code-quote">&quot;URL:Jadice Viewing Protocol&quot;</span><br /><span class="code-quote">&quot;URL Protocol&quot;</span>=&quot;&quot;<br /><br />[HKEY_CLASSES_ROOT\jadvwr\shell]<br /><br />[HKEY_CLASSES_ROOT\jadvwr\shell\open]<br /><br />[HKEY_CLASSES_ROOT\jadvwr\shell\open\command]<br />@=<span class="code-quote">&quot;\&quot;</span>E:\\IEUrlHandler\\view.bat\<span class="code-quote">&quot; \&quot;</span>%1\&quot;&quot;</pre></div></p>
<p>Hierbei wird angenommen, dass das Batch-Script <i>E:\IEUrlHandler\viwer.bat</i> existiert. Dieses könnte in etwa wie folgt aussehen:</p>
<p class="code"><div class="codeContent"><pre class="prettyprint">set WD=%~dp0<br />java -cp %WD%jadice-documentplatform-4.1.0.9-all.jar;%WD%bin/ Startup %1<br />set WD=</pre></div></p>
<p>Dieses Script leitet den Aufruf lediglich an eine Java Applikation weiter. Hierbei ist die Zielapplikation ein Wrapper um das JadicePanel, welcher die angeforderte URL nimmt und die Daten mittels Java API auf den Client zieht und zur Anzeige bringt:</p>
<p><pre class="prettyprint"> import java.io.File;<br /> import java.io.FileOutputStream;<br /> import java.io.IOException;<br /> import java.io.InputStream;<br /> import java.net.URL;<br /> <br /> public class Startup {<br />   public static void main(String[] args) throws Throwable {<br />     <br />     // url prefix jadvwr: entfernen<br />     String url = args[0].substring(7);<br />     InputStream is = new URL(url).openStream();<br />     File f = File.createTempFile(&quot;jad-url-handler&quot;, &quot;tmpdoc&quot;);<br />     writeToFile(is, f);<br />     <br />     String openTarget = &quot;-open=&quot; + f.getAbsolutePath();<br />     JadicePanel.main(new String[]{openTarget});<br />   }<br />   <br />   private static void writeToFile(InputStream is, File f)<br />     throws IOException {<br />     FileOutputStream out = new FileOutputStream(f);<br />     byte[] buf = new byte[2048];<br />     int read;<br />     <br />     while ((read = is.read(buf)) &gt; -1) {<br />       out.write(buf, 0, read);<br />     }<br />     out.flush();<br />     out.close();<br />   }<br /> }</pre></p>
<p>Der hier gewählte Weg eines Wrappers um die Klasse JadicePanel ist lediglich ein Beispiel, um die Logik möglichst einfach darzustellen. Entscheidend sind bei diesem Vorgehen zwei Dinge: Der erste Parameter, welcher der Anwendung übergeben wird, ist die URL, die angefordert wurde. Diese enthält noch das Protokoll <i>jadvwr:</i>, welches für die weitere Verarbeitung entfernt wird.<br /> Die zweite wichtige Eigenschaft (oder vielmehr Annahme) ist, dass der Rest der URL in einer Art und Weise zur Verfügung steht, die die Java API verarbeiten kann. Es wird über URL.openStream() ein InputStream zum Dokument erfragt und die Daten daraus in eine temporäre Datei geschrieben.<br /> Die temporäre Datei wird dann als Parameter an JadicePanel.main(String[]) weitergereicht.</p>
<p>Mit diesem einfachen Beispiel ist es möglich in Webanwendungen URLs, ähnlich der folgenden, zu integrieren:</p>
<p>jadvwr:http://host.company.com/documentstore/some-document.pdf<img height="7" width="7" border="0" align="absmiddle" src="uploads/RTEmagicC_7340fc8257.gif.gif" class="rendericon" alt="" /></p>
<p>Der Vorteil dieser Methode ist, dass der Umgang mit der JavaVM und auch der Umgang mit Browser-Eigenheiten deutlich gemindert wird. Nachteilig ist wiederum die Notwendigkeit eine Anwendung auf alle Arbeitsstationen auszurollen.</p>]]></content:encoded>
			
			
			<pubDate>Thu, 27 Nov 2008 13:26:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>JBIG2 Anbindung über ImageIO</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/jbig2-anbindung-ueber-imageio/</link>
			<description>Um das Lesen von  JBIG2 Bilddaten zu ermöglichen, wurde ein JBIG2 Reader mit ImageIO...</description>
			<content:encoded><![CDATA[<p>Um das Lesen von  JBIG2 Bilddaten zu ermöglichen, wurde ein JBIG2 Reader mit ImageIO Schnittstellen-Anbindung in Java implementiert. Die entwickelte Implementierung dekodiert selbst riesige JBIG2 Bilddaten mit einer Größe von z.B. 6600x5100 Pixeln in wenigen 100 ms.<br /><br />JBIG2 ist ein hochoptimiertes Kompressionsverfahren für Bi-Level Bilddaten (Schwarz-Weiss) und unterstützt sowohl verlustfreie als auch verlustbehaftete Kompression. Es erreicht schon im verlustfreien Modus im Vergleich zu TIFF G4 eine 3 bis 5 mal bessere Kompressionsrate.<br />Eine mögliche Anwendung ist das Einbetten von JBIG2 Daten in PDF/A Dateien zur Langzeitarchivierung.</p>]]></content:encoded>
			
			
			<pubDate>Wed, 12 Nov 2008 10:45:00 +0100</pubDate>
			
		</item>
		
		<item>
			<title>Jadice search: Programmatische Textsuche, Part 1</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/jadice-search-programmatische-textsuche-part-1/</link>
			<description> Die jadice document platform enthält eine integrierte Suche nach textuellen Inhalten eines...</description>
			<content:encoded><![CDATA[<p> Die jadice document platform enthält eine integrierte Suche nach textuellen Inhalten eines Dokuments. Neben der bereits vorgefertigten GUI kann die Suche programmatisch gesteuert werden, um beispielsweise eigene Such-Masken zu implementieren.</p>
<p><pre>com.levigo.jadice.addon.search.SearchRequest</pre></p>
<p>Mittels des </p>
<p><pre>SearchRequest</pre></p>
<p>wird die Suchanfrage konfiguriert und letztlich auch ausgeführt.</p>
<p>Beispiel:<br /> Möchte man die Seiten eines geladenen Dokuments nach dem String „java&quot; durchsuchen, so genügt bereits folgendes Code-Fragment:</p>
<p class="code"><div class="codeContent indent"><pre class="prettyprint">SearchRequest request = <span class="code-keyword">new</span> SearchRequest();<br />request.setPages(document.getPages());<br />request.setSearchStrings(<span class="code-keyword">new</span> <span class="code-object">String</span>[]{<span class="code-quote">&quot;java&quot;</span>});<br />request.addSearchResultListener(<span class="code-keyword">new</span> MyListener());<br />request.execute();</pre></div></p>
<p>Die Methode setSearchStrings erlaubt es, mehrere Strings für eine Suche zu setzen. Es ist zu beachten, dass diese in einer „ODER&quot;-Relation zueinander stehen. Die Suche wird jeden Treffer melden, der einen der angegebenen Strings enthält.<br /> Die Method <i>execute()</i> führt die Suchanfrage letztlich aus. Wichtig sind hierbei zwei Dinge:</p><ul class="alternate" type="square"><li><i>execute()</i> wird asynchron ausgeführt. Die Anfrage wird an die jadice interne SearchEngine weitergereicht und in einem eigenen Thread bearbeitet.</li><li>Es kann derzeit nur eine Suche zur selben Zeit ausgeführt werden. Wird die Methode <i>execute() </i>gerufen, während noch eine weitere Suche läuft, wird die laufende Suchanfrage abgebrochen.</li></ul><p>Um die Ergebnisse der Suche zu erhalten wird eine Implementation des <i>com.levigo.jadice.addon.search.SearchResultListener</i> registiert. Dieser wird über jeden Treffer informiert. Eine Implementation könnte beispielsweise wie folgt aussehen:</p>
<p class="code"><div class="codeContent indent"><pre class="prettyprint"><span class="code-keyword">public</span> class MyListener <span class="code-keyword">implements</span> SearchResultListener {<br />    <span class="code-keyword">public</span> void searchResultFound(SearchResultEvent e) {<br />        Result result = e.getResult();<br />        Page page = result.getPage();<br />        <span class="code-object">String</span> text = result.getSelectedText();<br />        <span class="code-comment">// page und text verarbeiten<br /></span>    }<br />}</pre></div></p>
<p>Das SearchRequest verfügt über weitere kleine Helfer, die vor allem für die Verwendung innerhalb einer Suchmaske von Interesse sind. Mehr Informationen hierzu wird der zweite Teil dieser Artikel-Reihe „enthüllen&quot;.</p>]]></content:encoded>
			
			
			<pubDate>Tue, 23 Sep 2008 15:25:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>So viele Dateien? Die jadice document platform 4.1</title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/so-viele-dateien-die-jadice-document-platform-41/</link>
			<description>Mit Erscheinen der jadice document platform 4.1 wurde die Auslieferung grundlegend überarbeitet....</description>
			<content:encoded><![CDATA[<p>Mit Erscheinen der jadice document platform 4.1 wurde die Auslieferung grundlegend überarbeitet. Daraus resultierte eine Reihe neuer Dateien und Ordner.</p>
<p>Der beste Startpunkt für ein Verständnis dessen, was die document platform bietet, stellt die <i>documentation.html</i> dar. Diese enthält eine Reihe von Informationen zu technischen und auch organisatorischen Themen, wie etwa der Struktur der Auslieferung. Über den Link „Distribution Overview&quot; ist eine Übersicht über die gesamte Auslieferung erhältlich, welche die einzelnen Verzeichnisse und deren Inhalte beschreibt. Die Änderungen, die an den einzelnen Versionen vorgenommen wurden sind unter „Release notes&quot; zu finden. Hier wird aufgelistet welche Änderungen und Erweiterungen eingeflossen sind und welche evtl. entfernt wurden.</p>]]></content:encoded>
			
			
			<pubDate>Tue, 23 Sep 2008 15:19:00 +0200</pubDate>
			
		</item>
		
		<item>
			<title>Deadlocks analysieren </title>
			<link>http://www.levigo.de/dokumentenmanagement/developer-blog/article/deadlocks-analysieren/</link>
			<description>Jeder Entwickler kennt sie und hat auch schon - meist schmerzliche - Bekanntschaft mit ihnen...</description>
			<content:encoded><![CDATA[<p>Jeder Entwickler kennt sie und hat auch schon - meist schmerzliche - Bekanntschaft mit ihnen gemacht: Deadlocks. Die Anwendung reagiert nicht mehr oder nicht mehr wie erwartet. Wie findet man nun heraus, worin das Problem im Detail liegt? </p>
<p>Innerhalb einer IDE, wie beispielsweise Eclipse, ist eine Analyse verhältnismäßig einfach. Problematisch wird es jedoch, wenn die Probleme außerhalb der IDE auftauchen und ein Remote-Debugging nicht möglich ist.</p>
<p>Die JavaVM bietet für diese Fälle einen einfachen Weg den aktuellen Zustand aller Threads in einem Stack-Trace ähnlichen Format auszugeben: dem so genannten Thread Dump. Dieser kann über zwei Wege erstellt werden: </p><ul><li><i>STRG + PAUSE</i>: Wird diese Tastenkombination in einem Java Konsolen-Fenster betätigt, erstellt die JavaVM einen Thread Dump und gibt diesen auf der Konsole aus. Der Vorteil dieser Variante ist, dass keine zusätzlichen Werkzeuge benötigt werden. Ein Thread Dump ist somit sehr einfach zu erstellen. </li><li>Mittels der Tools <span class="important">jps</span> und <span class="important">jstack</span> (zu finden im Verzeichnis jdk-home/bin): Leider steht das Tool jstack unter Windows erst mit JDK 1.6 zur Verfügung. Unter Linux ist es bereits im JDK 1.5 enthalten. Bei der Ausführung von jps werden die PIDs (Process-IDs) aller laufenden Java-Anwendungen ausgegeben. Startet man nun jstack mit der PID des zu untersuchenden Prozesses, gibt das Kommando den Thread Dump auf der Standard-Ausgabe aus. Der Vorteil bei der Nutzung von jstack ist, dass hier nun der Thread Dump ausgegeben wird. Somit können sich keine konkurrierenden Ausgaben auf System.out &quot;dazwischen mogeln&quot;. </li></ul><p>Prinzipiell handelt es sich bei Thread Dumps um ein ASCII basiertes Format. Für eine komfortable Betrachtung sei aber auf das <b><a href="https://tda.dev.java.net/" title="Opens external link in new window" target="_blank" class="external-link-new-window" >Werkzeug TDA</a></b> verwiesen, welches die Daten in einem strukturierten UI zur Verfügung stellt.</p>]]></content:encoded>
			
			
			<pubDate>Mon, 22 Sep 2008 16:20:00 +0200</pubDate>
			
		</item>
		
	</channel>
</rss>
