<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>jTechnics &#187; yaml</title>
	<atom:link href="http://jtechnics.anzix.net/tag/yaml/feed/" rel="self" type="application/rss+xml" />
	<link>http://jtechnics.anzix.net</link>
	<description>Java napló</description>
	<lastBuildDate>Fri, 17 Sep 2010 18:06:04 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>YAML</title>
		<link>http://jtechnics.anzix.net/2009/12/15/yaml/</link>
		<comments>http://jtechnics.anzix.net/2009/12/15/yaml/#comments</comments>
		<pubDate>Tue, 15 Dec 2009 22:07:22 +0000</pubDate>
		<dc:creator>elek</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[db4o]]></category>
		<category><![CDATA[yaml]]></category>

		<guid isPermaLink="false">http://jtechnics.anzix.net/?p=365</guid>
		<description><![CDATA[Ahogy azt egy kedves szomszéd szokta monda, a törpök élete se mindig csak játék és mese. Ez különösen így van, ha a törpök db4o-t használnak. Ráadásul BigDecimal-t akarnak perzisztálni, amihez tartozó kiterjesztés csak a legújabb SNAPSHOT artifactokban van benne. És valószínű ennek a folyománya az, ami rendszeresen szembe jön, egy exception (hová is lenne az [...]]]></description>
			<content:encoded><![CDATA[<p>Ahogy azt egy kedves <a href="http://iwillworkforfood.blogspot.com/">szomszéd</a> szokta monda, a törpök élete se mindig csak játék és mese. Ez különösen így van, ha a törpök db4o-t használnak. Ráadásul BigDecimal-t akarnak perzisztálni, amihez tartozó kiterjesztés csak a legújabb SNAPSHOT artifactokban van benne.</p>
<p>És valószínű ennek a folyománya az, ami rendszeresen szembe jön, egy exception (hová is lenne az életünk exceptionök nélkül), ami valahogy így néz ki:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Caused by<span style="color: #339933;">:</span> com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">ext</span>.<span style="color: #006633;">InvalidSlotException</span><span style="color: #339933;">:</span> id<span style="color: #339933;">:</span> <span style="color: #cc66cc;">5182</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">UnmarshallingContext</span>.<span style="color: #006633;">invalidSlot</span><span style="color: #009900;">&#40;</span>UnmarshallingContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">81</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">UnmarshallingContext</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>UnmarshallingContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">49</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">ObjectReference</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>ObjectReference.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">281</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">ObjectReference</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>ObjectReference.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">267</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">ObjectContainerBase</span>.<span style="color: #006633;">getHardObjectReferenceById</span><span style="color: #009900;">&#40;</span>ObjectContainerBase.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">956</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">AbstractReadContext</span>.<span style="color: #006633;">classMetadataForObjectId</span><span style="color: #009900;">&#40;</span>AbstractReadContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">85</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">AbstractReadContext</span>.<span style="color: #006633;">readObject</span><span style="color: #009900;">&#40;</span>AbstractReadContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">57</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">AbstractReadContext</span>.<span style="color: #006633;">readAtCurrentSeekPosition</span><span style="color: #009900;">&#40;</span>AbstractReadContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">46</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">OpenTypeHandler</span>.<span style="color: #006633;">read</span><span style="color: #009900;">&#40;</span>OpenTypeHandler.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">172</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">Handlers4</span>.<span style="color: #006633;">readValueType</span><span style="color: #009900;">&#40;</span>Handlers4.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">313</span><span style="color: #009900;">&#41;</span>
        at com.<span style="color: #006633;">db4o</span>.<span style="color: #006633;">internal</span>.<span style="color: #006633;">marshall</span>.<span style="color: #006633;">AbstractReadContext</span>.<span style="color: #006633;">readAtCurrentSeekPosition</span><span style="color: #009900;">&#40;</span>AbstractReadContext.<span style="color: #006633;">java</span><span style="color: #339933;">:</span><span style="color: #cc66cc;">48</span><span style="color: #009900;">&#41;</span></pre></div></div>

<p>És így tovább.</p>
<p>A hiba teljesen kiszámíthatatlanul, ugyanakkor jól reprodukálhatóan előjön. Pl. előveszek egy backup db4o file-t, megnyitom, teszek-veszek benne, lezárom az alkalmazást. A következő megnyitáskor már nem nyílik meg az adatbázis. Ha viszont ugyanazt a cselekmény sort újra végigviszem az elmentett db4o file-on ugyanúgy elszáll.</p>
<p>Tehát előszőr is ki kéne dobni a db4o-ból a BigDecimal-okat, amihez át kéne konvertálni a sémát. (Tegyük fel, hogy egy számlázó programban sosem fogok beleütközni a float korlátaiba). Ha nincs több BigDecimal mezőm, akkor használhatom a stabil db4o változatot. A másik meg, hogy szükségem lesz egy dump file formátumra. Egyrészt mivel féltem a már bent lévő adatokat, másrészt mert a mező típus konvertálás is nagy szívás egy meglévő db4o adatbázison, az egyik legegyszerűbb megoldás, hogy kidumpolom az adatbázist, majd típus refaktor után vissza.</p>
<p>Mi legyen a dump formátum. Kapásból a JAXB és Json jutnak eszembe, de ezek ahogy én tudom nem támogatják a referenciák kezelését. (Ha az objektum fában többszőr is előfordul ugyanaz az objektum, akkor visszatöltés után ne két, hanem csak egy objektum legyen, amire két helyről mutat referencia.</p>
<p>És itt jön kébe a <a href="http://en.wikipedia.org/wiki/Yaml">YAML</a>, amit pont tudja mindezt.</p>
<p>Előszőr a jYaml-t próbáltam, ami alapból egyszerűen működik, de régóta nem fejlesztik, és túlságosan is elnézően bánt a Yaml fájl hibáival. Aztán jött a <a href="http://code.google.com/p/snakeyaml/">Snakeyaml</a>. Ez már tette a dolgát mint a kisangyal.</p>
<p>Objektum mentése:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Yaml yaml <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Yaml<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
yaml.<span style="color: #006633;">dump</span><span style="color: #009900;">&#40;</span>eztmentemel, <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileWriter</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Objektum betöltése:</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;">Yaml yaml <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> Yaml<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
DatabaseBackup backup <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>DatabaseBackup<span style="color: #009900;">&#41;</span> yaml.<span style="color: #006633;">load</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileInputStream</span><span style="color: #009900;">&#40;</span>file<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>

<p>Maga a Yaml file meg valahogy így néz ki.</p>

<div class="wp_syntax"><div class="code"><pre class="java" style="font-family:monospace;"><span style="color: #339933;">!!</span>net.<span style="color: #006633;">anzix</span>.<span style="color: #006633;">nona</span>.<span style="color: #006633;">entity</span>.<span style="color: #006633;">DatabaseBackup</span>
felhasznalok<span style="color: #339933;">:</span>
<span style="color: #339933;">-</span> email<span style="color: #339933;">:</span> geza@hutira.<span style="color: #006633;">net</span>
  partner<span style="color: #339933;">:</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>id001
    partnerek<span style="color: #339933;">:</span>
    <span style="color: #339933;">-</span> <span style="color: #339933;">&amp;</span>amp<span style="color: #339933;">;</span>id005
      partnerek<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>
      szamlak<span style="color: #339933;">:</span> <span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span>
      torzs<span style="color: #339933;">:</span> <span style="color: #009900;">&#123;</span>adoszam<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span>, bankszamlaSzam<span style="color: #339933;">:</span> <span style="color: #000066; font-weight: bold;">null</span>, nev<span style="color: #339933;">:</span> Asztal kft., szamlaCim<span style="color: #339933;">:</span> Sötét út <span style="color: #cc66cc;">20</span>.,
        szamlaIrsz<span style="color: #339933;">:</span> <span style="color: #0000ff;">'1111'</span>, szamlaVaros<span style="color: #339933;">:</span> Budapest<span style="color: #009900;">&#125;</span>
      tulajdonos<span style="color: #339933;">:</span> <span style="color: #339933;">*</span>id001
....</pre></div></div>

<p>Itt már rögtön látszik is a referencia kezelése. A partner objektum instance azonosítója id001, és a partnerek listában található egyik partner tulajdonos mezője pont erre mutat vissza referenciával.</p>
<p>Mivel a db4o-val egy paranccsal elmenti az objektumfát, ezért 3 sorban tudok backupolni és visszatölteni a backupot, és a yaml file-t minimálisan módosítgatva (segít a nagyerejű grep parancs) még a típus konverziókat is sikerült viszonylag kis fájdalom árán meglépni.</p>
<p>Yaml a mi barátunk.</p>
]]></content:encoded>
			<wfw:commentRss>http://jtechnics.anzix.net/2009/12/15/yaml/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

