<?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/"
	xmlns:georss="http://www.georss.org/georss" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:media="http://search.yahoo.com/mrss/"
	>

<channel>
	<title>Never Mind</title>
	<atom:link href="http://barakonyi.wordpress.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://barakonyi.wordpress.com</link>
	<description>... csak hogy emlékezzek...</description>
	<lastBuildDate>Tue, 25 May 2010 07:30:51 +0000</lastBuildDate>
	<language>hu</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.com/</generator>
<cloud domain='barakonyi.wordpress.com' port='80' path='/?rsscloud=notify' registerProcedure='' protocol='http-post' />
<image>
		<url>http://s2.wp.com/i/buttonw-com.png</url>
		<title>Never Mind</title>
		<link>http://barakonyi.wordpress.com</link>
	</image>
	<atom:link rel="search" type="application/opensearchdescription+xml" href="http://barakonyi.wordpress.com/osd.xml" title="Never Mind" />
	<atom:link rel='hub' href='http://barakonyi.wordpress.com/?pushpress=hub'/>
		<item>
		<title>Vector vs. ArrayList</title>
		<link>http://barakonyi.wordpress.com/2010/04/01/vector-vs-arraylist/</link>
		<comments>http://barakonyi.wordpress.com/2010/04/01/vector-vs-arraylist/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 15:13:33 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=152</guid>
		<description><![CDATA[Ki használ manapság Vektort? Szerintem senki. Mégis állásinterviewkon gyakran felteszik a kérdést, hogy mi a különbség a Vektor és az ArrayList között? Erre persze mindenki azt válaszolja, hogy a Vektor az szinkronizált, az ArrayList viszont nem. Részletesebben: http://geekexplains.blogspot.com/2008/05/difference-between-vector-and-arraylist.html Csak hogy össze legyen foglalva kicsit: Vektor: egy olyan tömb aminek mérete az elemszámtól függően nő/csökken. Az elemeket [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=152&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ki használ manapság Vektort? Szerintem senki. Mégis állásinterviewkon gyakran felteszik a kérdést, hogy mi a különbség a Vektor és az ArrayList között? Erre persze mindenki azt válaszolja, hogy a Vektor az szinkronizált, az ArrayList viszont nem.</p>
<p>Részletesebben: <a href="http://geekexplains.blogspot.com/2008/05/difference-between-vector-and-arraylist.html">http://geekexplains.blogspot.com/2008/05/difference-between-vector-and-arraylist.html</a></p>
<p>Csak hogy össze legyen foglalva kicsit:</p>
<p><strong><span style="color:#ff0000;">Vektor:</span></strong></p>
<ul>
<li>egy olyan tömb aminek mérete az elemszámtól függően nő/csökken.</li>
<li>Az elemeket indexekkel érjük el.</li>
<li>Az első JDK verzió óta létezik.</li>
<li>Áttervezték, a Java 2 Platformtól implementálja a List Interface-t.</li>
<li>Kiterjeszti az AbstractList class-t. Implementálja a Cloneable, Collection, List, RandomAccess, Serializable interfaceket.</li>
<li>Az vektor iterátora &#8220;fail-fast&#8221; jellegű: ha a vektor struktúrája változik (bármilyen iterátor biztosította módon kívül), akkor ConcurrentModificationException-t kapunk. (Elbukik és gyorsan, nem valami non-determinisztikus viselkedéssel&#8230;)</li>
<li>A vektor enumerátora viszont nem &#8220;fail-fast&#8221; jellegű.</li>
</ul>
<p><strong><span style="color:#ff0000;">ArrayList:</span></strong></p>
<ul>
<li>Szintén egy átméretezhető 1 dimenziós tömb.</li>
<li>A Java 1.2-es verzióban jelent meg.</li>
<li>Az AbstractList-ből származik. Implementált interface-ek: Cloneable, Collection, List, RandomAccess, Serializable.</li>
<li>n db elem hozzáadása O(n) ideig tart (tehát egy elem hozzáadása konstans idő).</li>
<li>Nem szinkronizált. Ha több szállal szeretnénk használni egyszerre, akkor szinkronizálnunk kell (Ha nem tesszük, könnyen kaphatunk IndexOutOfBoundsException-t).</li>
<li>List synchronizedArrayList = Collections.synchronizedList(new ArrayList(…));</li>
<li>Mivel nem szinkronizált, gyorsabb mint a Vektor.</li>
</ul>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/152/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/152/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/152/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=152&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/04/01/vector-vs-arraylist/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>Concurrency Control &#8211; Optimistic vs. Pessimistic lock</title>
		<link>http://barakonyi.wordpress.com/2010/03/18/concurrency-control-optimistic-vs-pessimistic-lock/</link>
		<comments>http://barakonyi.wordpress.com/2010/03/18/concurrency-control-optimistic-vs-pessimistic-lock/#comments</comments>
		<pubDate>Thu, 18 Mar 2010 12:54:12 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=130</guid>
		<description><![CDATA[Az előző poszthoz kerestem dolgokat a neten, és találtam egy nagyon jó kis leírást az optimistic és a pessimistic lock-ról (miközben olvasgattam, eszembe jutott, hogy ez az egyik kedvenc kérdés az állásinterjúkon ).  Úgy gondoltam megpróbálom összefoglalni magyarul is a dolgot (az eredeti jobb egyébként). 1. Ütközések (collisions) típusai A tranzakció izolációs szinteknél már volt [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=130&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Az <a href="http://barakonyi.wordpress.com/2010/03/17/java-tranzakcio-kezeles-es-tranzakcio-izolacios-szintek/">előző</a> poszthoz kerestem dolgokat a neten, és találtam egy <a href="http://www.agiledata.org/essays/concurrencyControl.html">nagyon jó kis leírást</a> az optimistic és a pessimistic lock-ról (miközben olvasgattam, eszembe jutott, hogy ez az egyik kedvenc kérdés az állásinterjúkon <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  ).  Úgy gondoltam megpróbálom összefoglalni magyarul is a dolgot (az eredeti jobb egyébként).</p>
<h2>1. Ütközések (collisions) típusai</h2>
<p style="text-align:justify;">A tranzakció izolációs szinteknél már volt szó róluk, ezért csak felsorolnám őket:</p>
<ul style="text-align:justify;">
<li>Dirty read</li>
<li>Non-repeatable read</li>
<li style="text-align:justify;">Phantom read</li>
</ul>
<h2 style="text-align:justify;">2. A lock-olás</h2>
<p style="text-align:justify;">A lock más userek/alkalmazások hozzáférését limitálja egy adatbázis entity-hez (rekordhoz, táblához, page-hez, &#8230;). Két típusa van:</p>
<ul style="text-align:justify;">
<li>Write lock: Ebben az esetben a lockoló user vagy alkalmazás szeretné updatelni/törölni az adott entity-t, ezért nem enged read/update/delete hozzáférést senki másnak.</li>
<li style="text-align:justify;">Read lock: Itt a lock holder csak olvassa az adott entity-t, nem fogja módosítani. Ezért mások is olvashatják az adott entity-t, de senki nem updatelheti vagy törölheti azt.</li>
</ul>
<h2 style="text-align:justify;">3. Pessimistic lock</h2>
<p style="text-align:justify;">Ebben az esetben az entity lockolva lesz egészen addíg, amíg az alkalmazás memóriájában van (általában objektumként). Tehát amikor az alkalmazásnak szüksége van pl.: egy user objectre, akkor az alkalmazás lockolja az adott user rekordját a DB-ben. A lock mindaddig megmarad, amíg a user object az alkalmazás memóriájában van, és az alkalmazás műveleteket végezhet vele. Így nem lehet ütközésünk.</p>
<h2 style="text-align:justify;">4. Optimistic lock</h2>
<div id="_mcePaste" style="text-align:justify;">Az optimistic lock-nál előzetesen azt feltételezzük, hogy nem lesz ütközés. Tehát az alkalmazás beolvassa a memóriába az objectet, de nem lockolja amíg commitolni nem akar. A commit előtt megnézi hogy az adott record változott-e, és ha kiderül hogy igen, tehát ütközés van, akkor ezt a helyzetet a kódban kezelnünk kell (csak logolja, kísérletet tesz az ütközés feloldására, &#8230;). Ábra (based on <a href="http://www.agiledata.org/essays/concurrencyControl.html">http://www.agiledata.org/essays/concurrencyControl.html</a>):</div>
<div style="text-align:justify;"><a href="http://barakonyi.files.wordpress.com/2010/03/optimisticlock.jpg"><img class="aligncenter size-full wp-image-132" title="OptimisticLock" src="http://barakonyi.files.wordpress.com/2010/03/optimisticlock.jpg?w=480" alt=""   /></a></div>
<div style="text-align:justify;">Alapvetően 2 módszer van az ütközések meghatározására:</div>
<div style="text-align:justify;">
<ol>
<li><strong>Egyedi azonosító:</strong> A rekordot egyedi azonosítóval látjuk el &#8211; A forrás rekordnak lesz egy egyedi azonosítója, amely minden updatekor változik.
<ul>
<li><em>Timestamp:</em> A DB-nek kell updatelnie, mert mi kódból nem tudjuk megfelelően&#8230;</li>
<li><em>Incremental counter:</em> Növeljünk egy számot&#8230;</li>
<li><em>User Id:</em> Ha az ütközések csak különböző userek tranzakcióikor fordulhatnak elő.</li>
<li><em>Generated UUID:</em> Minden updatekor új egyedi azonosítót kap.</li>
</ul>
</li>
<li style="text-align:justify;"><strong>Összehasonlítós módszer:</strong> Újra lekérjük az adott objectet a DB-től és összehasonlítjuk a property-jeit az eredetileg lekérttel.</li>
</ol>
</div>
<h2 style="text-align:justify;">5. Overly optimistic lock</h2>
<p style="text-align:justify;">Abban az esetben ha biztosan tudjuk, hogy soha nem lesznek ütközések (pl mert csak 1 user/alkalmazás használja a DB-t vagy csak olvasható tábláink vannak a DB-ben), akkor egyáltalán nem kell foglalkoznuk sem az ütközések detektálásával sem a kezelésével.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/130/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/130/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/130/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=130&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/03/18/concurrency-control-optimistic-vs-pessimistic-lock/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/optimisticlock.jpg" medium="image">
			<media:title type="html">OptimisticLock</media:title>
		</media:content>
	</item>
		<item>
		<title>Java &#8211; Tranzakció kezelés és tranzakció izolációs szintek</title>
		<link>http://barakonyi.wordpress.com/2010/03/17/java-tranzakcio-kezeles-es-tranzakcio-izolacios-szintek/</link>
		<comments>http://barakonyi.wordpress.com/2010/03/17/java-tranzakcio-kezeles-es-tranzakcio-izolacios-szintek/#comments</comments>
		<pubDate>Wed, 17 Mar 2010 10:23:12 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[DB]]></category>
		<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=125</guid>
		<description><![CDATA[1. Tranzakció kezelés Akkor lehet rá szükség ha több logikailag öszefüggő SQL utasítást szeretnénk egyszerre (közvetlenül egymás után, egy tranzakcióként) végrehajtani. Ezeknek az SQL utasításoknak általában van egy logikai sorrendje. Ha bármelyik SQL utasítás bukik akkor a logikailag ráépülő többi eljárás is bukik. Például: Több oldalas regisztráció, ahol minden oldalhoz tartozó adat külön SQL utasítással [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=125&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h2>1. Tranzakció kezelés</h2>
<p style="text-align:justify;">Akkor lehet rá szükség ha több logikailag öszefüggő SQL utasítást szeretnénk egyszerre (közvetlenül egymás után, egy tranzakcióként) végrehajtani. Ezeknek az SQL utasításoknak általában van egy logikai sorrendje. Ha bármelyik SQL utasítás bukik akkor a logikailag ráépülő többi eljárás is bukik. Például:</p>
<ul>
<li style="text-align:justify;">Több oldalas regisztráció, ahol minden oldalhoz tartozó adat külön SQL utasítással bekerül az adatbázisba. Ha az x. oldal után a felhasználó nyom egy cancel-t, akkor az eddig végrehajtott SQL insert-eket is érvénytelenítenünk kell</li>
<li style="text-align:justify;">Banki tranzakciók &#8211; átutalás egy számláról egy másikra, vagy kézpénzfelvét az autómatából: Először megterhelődik az egyik számla a kívánt összeggel, ezután jóváíródik a másik számlán, vagy kiadja az autómata. Ha a második lépés meghiúsul (pl.: Az autómata technikai okok miatt nem tud pénzt kiadni) akkor az első tranzakciót is vissza kell vonni.</li>
</ul>
<p style="text-align:justify;">Ezekben az esetekben az SQL utasításokat egy tranzakcióban kezeljük. Ez a teljes tranzakció csak akkor hajtódik végre, ha mi erre a programunkból direkt felszólítjuk, egészen addig az adatbázis-kezelő elkülönítve kezeli őket. A tranzakció közben bármikor lehetőség van arra, hogy az addig kiadott SQL utasításokat érvénytelenítsük, ezzel az adatbázis visszaáll az eredeti állapotához.</p>
<p style="text-align:justify;">A tranzakciók kezelésének módját a Connection object-en a setAutoCommit() metódussal tudjuk megváltoztatni:</p>
<ul>
<li style="text-align:justify;"><strong>connection.setAutoCommit(true):</strong> Az új adatbázis kapcsolatok esetén ez a default beállítás. Ha az AutoCommit mód be van kapcsolva akkor minden SQL utasítás különálló tranzakcióként lesz kezelve és végrahajtva.</li>
</ul>
<ul>
<li style="text-align:justify;"><strong>connection.setAutoCommit(false):</strong> Ebben az esetben (AutoCommit mód kikapcsolva), az SQL utasítások csoportokba rendezhetőek, és csak akkor hajtódnak végre/fejeződnek be, ha a connection-ön meghívjuk a commit() vagy rollback() metódusokat. A commit() hatására a módosítások véglegesen bekerülnek az adatbázisba, míg a rollback() visszaállítja az adatbázist a tranzakció kezdetekori állapotába.</li>
</ul>
<h2>2. Tranzakció izolációs szintek</h2>
<p style="text-align:justify;">Azt határozzák meg, hogy hogyan kezelje a szerver az egyidejű hozzáférési kérelmeket (read, update, insert) ugyanahhoz az objektumhoz (tábla, rekord, &#8230;).</p>
<div>
<ol>
<li style="text-align:justify;"><strong>TRANSACTION_NONE:</strong> A tranzakciók nem támogatottak, nincs tranzakciókezelés.</li>
<li style="text-align:justify;"><strong>TRANSACTION_READ_UNCOMMITED:</strong> Olvasáskor mindig az aktuális (módosított) értéket kapjuk, még akkor is, ha az adott insert/update tranzakciót a kezdeményező nem commit-olta. A következő problémák léphetnek fel:
<ul>
<li><strong>Dirty reads:</strong> A kiolvasott rekord változhat más tranzakciók által a mi tranzakciónk ideje alatt. Tehát előfordulhat, hogy a tranzakciónk elején és végén az adott rekordban más értékek szerepelnek, holott mi nem is változtattuk, csak olvastuk&#8230;</li>
<li><strong>Non-repeatable reads:</strong> A tábla egy adott sora törlődhet a mi tranzakciónk közben. Így amikor mi a tranzakciónk elején és végén futtatunk egy-egy select-et, akkor a második esetben hiányozhatnak sorok az eredményből.</li>
<li><strong>Phantom reads:</strong> Hasonló az előzőhöz, csak insert-tel. A táblába új sor (fantom sor) kerülhet egy másik tranzakció által miközben a mi tranzakciónk még fut. Így a tranzakciónk végén több sor lesz az adott táblábam, mint amivel számolhattunk az elején&#8230;</li>
</ul>
</li>
<li style="text-align:justify;"><strong>TRANSACTION_READ_COMMITED:</strong> Olvasáskor mindig az adott rekord véglegesített értéket kapjuk. Ez az esetek 99%-ra használható, a tranzakcióink mindig csak olyan rekordokat olvasnak, amik kommittálva vannak, azaz nincs nyitott tranzakció, ami dolgozna rajtuk. A baj ezzel az, hogy ha sokan írják és olvassák az adott rekordot vagy táblát akkor könnyen kialakulhat az a helyzet, hogy az olvasó tranzakciók arra várnak hogy az írás (pl egy nagy tábla update-je) befejeződjön. Ez a főleg a rekordokra vonatkozik így csak a dirty read-től véd, probléma lehet:
<ul>
<li>a non-repeatable read</li>
<li>és a phantom read</li>
</ul>
</li>
<li style="text-align:justify;"><strong>TRANSACTION_REPEATABLE_READ:</strong> Ez annyival jobb a READ_COMMITTED-nél, hogy már a non-repeatable read hibát is képes kiszűrni a tranzakcióból. Egyszerűbben: csak a recordok commit-olt értékeit használja és a recordok tranzakció közbeni törlése nem befolyásolja a select-eket.  Ebben az esetben csak egy probléma marad:
<ul>
<li>a phantom read</li>
</ul>
</li>
<li style="text-align:justify;"><strong>TRANSACTION_SERIALIZABLE:</strong> Annyival több a REPEATABLE_READ-től, hogy más tranzakció nem írhatja felül a mi tranzakciónk által olvasott értékeket, azaz addig várakoztatja azokat míg be nem fejeződik a tranzakciónk. Így nem fognak tranzakció közben fantom sorok keletkezni a táblában. Itt elég problémás lehet, ha több résztvevő folyamatosan olvas egy táblát, amíg az updatelő szál várakozik, mert a tábla lock-olva van és nem tud bele írni&#8230;</li>
</ol>
</div>
<p style="text-align:justify;">Ezek szintek föntről lefelé egyre költségesebbek lesznek az adatbázisnak, így a tranzakciók végrehajtási sebessége lassul. Az izolációs szinteket a Connection objektumon a  setTransactionIsolation() metódussal állíthatjuk be a tranzakció megkezdése előtt. Például:</p>
<p style="text-align:justify;padding-left:30px;">con.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);</p>
<p style="text-align:justify;">
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/125/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/125/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/125/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=125&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/03/17/java-tranzakcio-kezeles-es-tranzakcio-izolacios-szintek/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>C# WS Client Generálása (Service Reference solution)</title>
		<link>http://barakonyi.wordpress.com/2010/03/12/c-ws-client-generalasa-service-reference-solution/</link>
		<comments>http://barakonyi.wordpress.com/2010/03/12/c-ws-client-generalasa-service-reference-solution/#comments</comments>
		<pubDate>Fri, 12 Mar 2010 11:27:22 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[WS]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=53</guid>
		<description><![CDATA[Ez az újabb megoldás WS Client készítésére C#-ban. A régi &#8220;Web Reference&#8221; megoldás megtalálható itt. A .NET 3.0-ás verziójában már Service Reference-eket tudunk hozzáadni a project-hez. A lényeg, hogy itt egyszerűbb lesz a SOAP Header-t módosítani az authentikáció érdekében. Egy nagyon jó leírás a Web reference és a Service Reference közötti különbségről: http://andrewtokeley.net/archive/2008/07/10/the-difference-between-ldquoadd-web-referencerdquo-and-ldquoadd-service-referencerdquo.aspx 1. Készítsünk egy [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=53&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p>Ez az újabb megoldás WS Client készítésére C#-ban. A régi &#8220;Web Reference&#8221; megoldás megtalálható <a href="http://barakonyi.wordpress.com/2009/08/13/c-ws-client-generalasa/">itt</a>. A .NET 3.0-ás verziójában már Service Reference-eket tudunk hozzáadni a project-hez. A lényeg, hogy itt egyszerűbb lesz a SOAP Header-t módosítani az authentikáció érdekében.  Egy nagyon jó leírás a Web reference és a Service Reference közötti különbségről: <a href="http://andrewtokeley.net/archive/2008/07/10/the-difference-between-ldquoadd-web-referencerdquo-and-ldquoadd-service-referencerdquo.aspx">http://andrewtokeley.net/archive/2008/07/10/the-difference-between-ldquoadd-web-referencerdquo-and-ldquoadd-service-referencerdquo.aspx</a></p>
<h2>1. Készítsünk egy új projectet a Visual Studióban.</h2>
<p>Legyen ez egy egyszerű Konzolos alkalmazás:</p>
<p><a href="http://barakonyi.files.wordpress.com/2010/03/1_servicereference.jpg"><img class="aligncenter size-full wp-image-118" title="1_ServiceReference" src="http://barakonyi.files.wordpress.com/2010/03/1_servicereference.jpg?w=480" alt=""   /></a></p>
<p><a href="http://barakonyi.files.wordpress.com/2010/03/2_servicereference.jpg"><img class="aligncenter size-full wp-image-119" title="2_ServiceReference" src="http://barakonyi.files.wordpress.com/2010/03/2_servicereference.jpg?w=480&#038;h=348" alt="" width="480" height="348" /></a></p>
<h2>2. Adjuk hozzá a Service Reference-t a Projectünkhöz:</h2>
<p><a href="http://barakonyi.files.wordpress.com/2010/03/3_servicereference.jpg"><img class="aligncenter size-full wp-image-120" title="3_ServiceReference" src="http://barakonyi.files.wordpress.com/2010/03/3_servicereference.jpg?w=480" alt=""   /></a></p>
<p><a href="http://barakonyi.files.wordpress.com/2010/03/4_servicereference.jpg"><img class="aligncenter size-full wp-image-121" title="4_ServiceReference" src="http://barakonyi.files.wordpress.com/2010/03/4_servicereference.jpg?w=480&#038;h=369" alt="" width="480" height="369" /></a></p>
<p>Ekkor a Solution Explorerben megjelenik a behivatkozott Service.</p>
<p><a href="http://barakonyi.files.wordpress.com/2010/03/5_servicereference.jpg"><img class="aligncenter size-full wp-image-122" title="5_ServiceReference" src="http://barakonyi.files.wordpress.com/2010/03/5_servicereference.jpg?w=480" alt=""   /></a></p>
<h2>3. A kliens létrehozása:</h2>
<p>Az autómatikusan legenerált Program.cs-t egésszítsük ki a következőképpen:</p>
<p><code> </code> <code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<div>using System;</div>
<div>using System.Collections.Generic;</div>
<div>using System.Linq;</div>
<div>using System.Text;</div>
<div>using ServiceReferenceTest.AtlasServiceReference;</div>
<div>namespace ServiceReferenceTest</div>
<div>{</div>
<div style="padding-left:30px;">class Program</div>
<div style="padding-left:30px;">{</div>
<div style="padding-left:60px;">static void Main(string[] args)</div>
<div style="padding-left:60px;">{</div>
<div style="padding-left:90px;">ATLASWServicePortClient client = new ATLASWServicePortClient();</div>
<div style="padding-left:90px;">AWSProduct[] products = client.findAllProducts();</div>
<div style="padding-left:90px;">foreach(AWSProduct product in products) {</div>
<div style="padding-left:120px;">Console.Out.WriteLine("-&gt; " + product.wkProductId);</div>
<div style="padding-left:90px;">}</div>
<div style="padding-left:90px;">Console.In.ReadLine();</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:30px;">}</div>
<div>}</div>
<p></code></p>
<p>Ez csak egy teszt a WS methodok meghívására. Ez így már működne is, ha nem kérne a WS Server SoapHeader authentikációt. Viszont a mi szerverünk a következő formátumú Soap Header-t kér:</p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<div>&lt;soap:Header&gt;</div>
<div style="padding-left:30px;">&lt;LoginCredentials&gt;</div>
<div style="padding-left:60px;">&lt;userid&gt;WebService_User&lt;/userid&gt;</div>
<div style="padding-left:60px;">&lt;password&gt;WebService_Password&lt;/password&gt;</div>
<div style="padding-left:60px;">&lt;groupid&gt;WebService_Group&lt;/groupid&gt;</div>
<div style="padding-left:30px;">&lt;/LoginCredentials&gt;</div>
<div>&lt;/soap:Header&gt;</div>
<p></code></p>
<h2>4. A LoginCredentials class</h2>
<p>Csinálnunk kell egy Data class-t a login credentials -hoz. Legyen benne userid, password és groupid property (Ezek szükségesek a header-be). Ez a LoginCredentials class származzon a SoapHeader ősosztályból (Ahhoz, hogy ez így működjön, hozzá kell adnunk a System.Web.Services referenciát). Vigyázni! A LoginCredentials class legyen publikus, különben nem lehet serializálni.</p>
<p><code> </code></p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<div>public class LoginCredentials <strong><span style="color:#ff0000;">: SoapHeader</span></strong></div>
<div>{</div>
<div style="padding-left:30px;">private string useridField;</div>
<div style="padding-left:30px;">...</div>
<div style="padding-left:30px;">public LoginCredentials() { }</div>
<div style="padding-left:30px;">...</div>
<div style="padding-left:30px;"><strong><span style="color:#ff0000;">[System.Xml.Serialization.SoapElementAttribute(IsNullable = false)]</span></strong></div>
<div style="padding-left:30px;">public string userid</div>
<div style="padding-left:30px;">{</div>
<div style="padding-left:60px;">get { return this.useridField; }</div>
<div style="padding-left:60px;">set { this.useridField = value; }</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">...</div>
<div>}</div>
<p></code></p>
<h2>5. A &#8220;behavior&#8221; class</h2>
<p>Egy jó leírás a következő linken: <a href="http://weblogs.asp.net/jdanforth/archive/2008/10/27/wcf-client-calling-asmx-service-with-soap-headers.aspx">http://weblogs.asp.net/jdanforth/archive/2008/10/27/wcf-client-calling-asmx-service-with-soap-headers.aspx</a>.</p>
<p>Kell csinálnunk egy ServiceBehavior classt, amivel manipulálni tudjuk a kimenő SOAP messageket. Ehhez a következők kellenek:</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.configuration.behaviorextensionelement.aspx">BehaviorExtensionElement</a>: Ezen osztály segítségével tudjuk módosítani a kliens végpont tulajdonságait.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.dispatcher.iclientmessageinspector.aspx">IClientMessageInspector</a>: Messagek módosítására.</li>
<li><a href="http://msdn.microsoft.com/en-us/library/system.servicemodel.description.iendpointbehavior.aspx">IEndpointBehavior</a>: Kiterjeszthető vele a végpont viselkedése.</li>
</ul>
<p>Példa:</p>
<p><code> </code></p>
<p><code> </code></p>
<p><code></p>
<div>public class SoapHeaderBehaviour : <span style="color:#ff0000;"><strong>BehaviorExtensionElement, IClientMessageInspector, IEndpointBehavior</strong></span></div>
<div>{</div>
<div style="padding-left:30px;"><span style="color:#008000;">#region <strong>IClientMessageInspector </strong>Members</span></div>
<div style="padding-left:60px;">public void AfterReceiveReply(ref Message reply, object correlationState)</div>
<div style="padding-left:60px;">{</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:60px;">public object BeforeSendRequest(ref Message request, IClientChannel channel)</div>
<div style="padding-left:60px;">{</div>
<div style="padding-left:60px;">LoginCredentials login = new LoginCredentials("username", "password", "group");</div>
<div style="padding-left:60px;">MessageHeader&lt;LoginCredentials&gt; messageHeader = new MessageHeader&lt;LoginCredentials&gt;() { Actor = "Anyone", Content = login };</div>
<div style="padding-left:60px;">request.Headers.Add(messageHeader.GetUntypedHeader("LoginCredentials", "atlas"));</div>
<div style="padding-left:60px;">return null;</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:30px;"><span style="color:#008000;">#endregion</span></div>
<div style="padding-left:30px;"><span style="color:#008000;">#region <strong>IEndpointBehavior </strong>Members</span></div>
<div style="padding-left:60px;">public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { }</div>
<div style="padding-left:60px;">public void ApplyClientBehavior(ServiceEndpoint serviceEndpoint, ClientRuntime behavior) { behavior.MessageInspectors.Add(this); }</div>
<div style="padding-left:60px;">public void ApplyDispatchBehavior(ServiceEndpoint serviceEndpoint, EndpointDispatcher endpointDispatcher) { }</div>
<div style="padding-left:60px;">public void Validate(ServiceEndpoint serviceEndpoint) { }</div>
<div style="padding-left:30px;"><span style="color:#008000;">#endregion</span></div>
<div style="padding-left:30px;"><span style="color:#008000;">#region <strong>BehaviorExtensionElement </strong>Members</span></div>
<div style="padding-left:60px;">protected override object CreateBehavior() { return new AtlasSoapHeaderBehaviour(); }</div>
<div style="padding-left:60px;">public override Type BehaviorType { get { return GetType(); } }</div>
<div style="padding-left:30px;"><span style="color:#008000;">#endregion</span></div>
<div>}</div>
<p></code></p>
<h2>6. Az app.config: EndPoitBehavior beállítása:</h2>
<p>Ha megvan a &#8220;behavior&#8221; class-unk, akkor már csak be kell állítanunk az app config-ban, hogy az alkalmazás használja is ezt az osztályt:</p>
<p><code> </code></p>
<p><code></p>
<div>&lt;?xml version="1.0" encoding="utf-8" ?&gt;</div>
<div>&lt;configuration&gt;</div>
<div style="padding-left:30px;">&lt;system.serviceModel&gt;</div>
<div style="padding-left:60px;">&lt;bindings&gt;</div>
<div style="padding-left:90px;">...</div>
<div style="padding-left:60px;">&lt;/bindings&gt;</div>
<div style="padding-left:60px;"><span style="color:#ff0000;">&lt;behaviors&gt;</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">&lt;endpointBehaviors&gt;</span></div>
<div style="padding-left:120px;"><span style="color:#ff0000;">&lt;behavior name="MyEndpointBehaviors"&gt;</span></div>
<div style="padding-left:150px;"><span style="color:#ff0000;">&lt;ClientSoapHeaderAdderBehavior /&gt;</span></div>
<div style="padding-left:120px;"><span style="color:#ff0000;">&lt;/behavior&gt;</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">&lt;/endpointBehaviors&gt;</span></div>
<div style="padding-left:60px;"><span style="color:#ff0000;">&lt;/behaviors&gt;</span></div>
<div style="padding-left:60px;"><span style="color:#ff0000;">&lt;extensions&gt;</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">&lt;behaviorExtensions&gt;</span></div>
<div style="padding-left:120px;"><span style="color:#ff0000;">&lt;add name="ClientSoapHeaderAdderBehavior" type="<strong>ServiceReferenceTest.SoapHeaderBehaviour</strong>, ServiceReferenceTest, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null" /&gt;</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">&lt;/behaviorExtensions&gt;</span></div>
<div style="padding-left:60px;"><span style="color:#ff0000;">&lt;/extensions&gt;</span></div>
<div style="padding-left:60px;">&lt;client&gt;</div>
<div style="padding-left:90px;">&lt;endpoint address="http://servername:80/remote_ws/AWService" <span style="color:#ff0000;">behaviorConfiguration="MyEndpointBehaviors"</span> binding="basicHttpBinding" bindingConfiguration="AWServicePort" contract="ServiceReference.AWServicePort" name="AWServicePort" /&gt;</div>
<div style="padding-left:60px;">&lt;/client&gt;</div>
<div style="padding-left:30px;">&lt;/system.serviceModel&gt;</div>
<div>&lt;/configuration&gt;</div>
<p></code></p>
<p>Mostmár futtathatjuk is az alkalmazást. A kliens által elküldött SOAP message-eknek mostmár lesz header-je és a header tartalmazni fogja a credentials-t.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/53/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/53/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/53/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=53&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/03/12/c-ws-client-generalasa-service-reference-solution/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/1_servicereference.jpg" medium="image">
			<media:title type="html">1_ServiceReference</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/2_servicereference.jpg" medium="image">
			<media:title type="html">2_ServiceReference</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/3_servicereference.jpg" medium="image">
			<media:title type="html">3_ServiceReference</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/4_servicereference.jpg" medium="image">
			<media:title type="html">4_ServiceReference</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/03/5_servicereference.jpg" medium="image">
			<media:title type="html">5_ServiceReference</media:title>
		</media:content>
	</item>
		<item>
		<title>Property validálás Java-ban</title>
		<link>http://barakonyi.wordpress.com/2010/03/10/property-validalas-java-ban/</link>
		<comments>http://barakonyi.wordpress.com/2010/03/10/property-validalas-java-ban/#comments</comments>
		<pubDate>Wed, 10 Mar 2010 11:16:06 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Java]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=105</guid>
		<description><![CDATA[Az egész ott kezdődött, hogy a Kanadaiak kedvéért kénytelen voltam megnézni hogyan validálja az Amerikaiak indiaiakkal íratott csodarendszere a first/last name property-ket. És kicsit megrémültem: Rossz példa, ne használd! private static Vector getFirstLastNameAlphaChars(Vector inputvectors){ for(int i=65; i &#60; 91; i++){ char[] charbuff = new char[1]; char ch = (char) i; charbuff[0] = ch; String letters [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=105&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;">Az egész ott kezdődött, hogy a Kanadaiak kedvéért kénytelen voltam megnézni hogyan validálja az Amerikaiak indiaiakkal íratott csodarendszere a first/last name property-ket. És kicsit megrémültem:</p>
<p>Rossz példa, ne használd!</p>
<div><code></p>
<div>private static Vector getFirstLastNameAlphaChars(Vector inputvectors){</div>
<div style="padding-left:30px;">for(int i=65; i &lt; 91; i++){</div>
<div style="padding-left:60px;"><span style="color:#ff0000;">char[] charbuff	= new char[1];</span></div>
<div style="padding-left:60px;"><span style="color:#ff0000;">char ch = (char) i;</span></div>
<div style="padding-left:60px;">charbuff[0]	= ch;</div>
<div style="padding-left:60px;">String letters = new String(charbuff);</div>
<div style="padding-left:60px;">inputvectors.add(letters);</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">for(int i=97; i &lt; 123; i++){</div>
<div style="padding-left:60px;">char[] charbuff	= new char[1];</div>
<div style="padding-left:60px;">char ch = (char) i;</div>
<div style="padding-left:60px;">charbuff[0]	= ch;</div>
<div style="padding-left:60px;">String letters = new String(charbuff);</div>
<div style="padding-left:60px;">inputvectors.add(letters);</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">String exStr = <span style="color:#ff0000;">new String(new char[]{'!'})</span>;</div>
<div style="padding-left:30px;">inputvectors.add(exStr);</div>
<div style="padding-left:30px;">String aposStr = new String(new char[]{'\''});</div>
<div style="padding-left:30px;">inputvectors.add(aposStr);</div>
<div style="padding-left:30px;">String dotStr = new String(new char[]{'.'});</div>
<div style="padding-left:30px;">inputvectors.add(dotStr);</div>
<div style="padding-left:30px;">String plusStr = new String(new char[]{'+'});</div>
<div style="padding-left:30px;">inputvectors.add(plusStr);</div>
<div style="padding-left:30px;">String hypenStr = new String(new char[]{'-'});</div>
<div style="padding-left:30px;">inputvectors.add(hypenStr);</div>
<div style="padding-left:30px;">String underScoreStr = new String(new char[]{'_'});</div>
<div style="padding-left:30px;">inputvectors.add(underScoreStr);</div>
<div style="padding-left:30px;">String apos1Str = new String(new char[]{'`'});</div>
<div style="padding-left:30px;">inputvectors.add(apos1Str);</div>
<div style="padding-left:30px;">String atStr = new String(new char[]{'@'});</div>
<div style="padding-left:30px;">inputvectors.add(atStr);</div>
<div style="padding-left:30px;">String spaceStr = new String(new char[]{' '});</div>
<div style="padding-left:30px;">inputvectors.add(spaceStr);</div>
<div style="padding-left:30px;">return inputvectors;</div>
<div>}</div>
<div>public static boolean validateString(String inputString) {</div>
<div style="padding-left:30px;">boolean result = true;</div>
<div style="padding-left:30px;">Vector allowedchars = getFirstLastNameAlphaChars(new Vector());</div>
<div style="padding-left:30px;">allowedchars = getNumericChars(allowedchars);</div>
<div style="padding-left:30px;">if(inputString!=null &amp;&amp; <span style="color:#ff0000;">inputString.trim()!=null</span>)</div>
<div style="padding-left:30px;">{</div>
<div style="padding-left:60px;"><span style="color:#ff0000;">inputString = inputString.trim();</span></div>
<div style="padding-left:60px;">for(int i = 0; i &lt; inputString.length(); i++)</div>
<div style="padding-left:60px;">{</div>
<div style="padding-left:90px;"><span style="color:#ff0000;">char letters 	= inputString.charAt(i);</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">char[] charbuff	= {letters};</span></div>
<div style="padding-left:90px;"><span style="color:#ff0000;">if(!allowedchars.contains(new String(charbuff)))</span></div>
<div style="padding-left:90px;">{</div>
<div style="padding-left:120px;">result = false;</div>
<div style="padding-left:120px;">break;</div>
<div style="padding-left:90px;">}</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">return result;</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;">Nem is részletezném a hibákat, amik első ránézésre látszanak. Az hogy ez a kód lassú, az egy dolog. De! Ha engedélyezni kellene egy új karaktert, akkor rögtön kód módosítás + új release kell. Ami sok idő.</p>
<div>Aztán felmerült bennem hogyan is kellene ezt megoldani gyorsabban.</div>
<h2><span style="color:#888888;">1. Property validálás Regexp-pel:</span></h2>
<p>Egy jó leírás a regexpekről: <a href="http://www.regular-expressions.info/java.html">http://www.regular-expressions.info/java.html</a></p>
<p><code></p>
<div>public class RegExpValidation {</div>
<div style="padding-left:30px;">private static String disabledCharacters = "[^A-Za-z0-9!.+-_'`@ ]+";</div>
<div style="padding-left:30px;">private static Pattern pattern = Pattern.compile(disabledCharacters);</div>
<div style="padding-left:30px;">private static boolean result = true;</div>
<div style="padding-left:30px;">public static boolean validateString(String inputString) {</div>
<div style="padding-left:60px;">result = true;</div>
<div style="padding-left:60px;">Matcher matcher = pattern.matcher(inputString);</div>
<div style="padding-left:60px;">if (matcher.find()) {</div>
<div style="padding-left:90px;">result = false;</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:60px;">return result;</div>
<div style="padding-left:30px;">}</div>
<div>}</div>
<p></code></p>
<h2><strong><span style="color:#888888;">2. OVal (Object Validation) Framework:</span></strong></h2>
<p style="text-align:justify;">Nagyon jó kis cucc, a Java objectek property-jeire és a method-ok argumentumaira tudunk annotációkban feltételeket tenni. <a href="http://oval.sourceforge.net/">Itt</a> találhatunk bővebb leírást róla. Csak annyit kell tenni, hogy az OVal jar file-ját felvesszük a projectre. Rögtön két lehetséges megoldást találtam a fenti problémára:</p>
<h5>a.) Business Object Property validálása:</h5>
<p>Kell egy Business Object, amit annotációkkal preparálunk:</p>
<p><code></p>
<div>public class BusinessObject {</div>
<div style="padding-left:30px;">@MatchPattern(pattern="[A-Za-z0-9!.+-_'`@ ]+")</div>
<div style="padding-left:30px;">private String inputString;</div>
<div style="padding-left:30px;">public BusinessObject(String inputString) {</div>
<div style="padding-left:60px;">this.inputString = inputString;</div>
<div style="padding-left:30px;">}</div>
<div>}</div>
<p></code>Majd amikor ezt létrehozzuk egy másik class-ban, a következő képpen tudjuk validálni:</p>
<p><code></p>
<div>public boolean validateString(String inputString) {</div>
<div style="padding-left:30px;">result = true;</div>
<div style="padding-left:30px;">bo = new BusinessObject(inputString);</div>
<div style="padding-left:30px;">violations = validator.validate(bo);</div>
<div style="padding-left:30px;">if (!violations.isEmpty()) {</div>
<div style="padding-left:60px;">result = false;</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">return result;</div>
<div>}</div>
<p></code></p>
<h5><strong>b.) Method Argumentum validálása:</strong></h5>
<p>Egy kicsit bonyolultabb a helyzet ha a methodok argumentumait szeretnénk validálni. Ehhez az Eclips-es projectet kicsit preparálnunk kell. Ehhez nem árt elolvasnunk a következő leírást: <a href="http://oval.sourceforge.net/userguide.html#d4e183">http://oval.sourceforge.net/userguide.html#d4e183</a> (Telepítsük az AspectJ plugin-t, Konvertáljuk a projectet AspectJ projectre, hozzunk létre egy új Aspect-et a projecten, amely a net.sf.oval.guard.GuardAspect -ből származik. )</p>
<p>A validálni kívánt methodunk a következőképpen néz ki:</p>
<p><code></p>
<div>public void validateStringDirectly(@MatchPattern(pattern="[A-Za-z0-9!.+-_'`@ ]+") String inputString) {</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;">Ha a project megfelelően van preparálva, akkor ha ezt a method-ot egy invalid (pl.: &#8220;ááá&#8221;) stringgel hívjuk meg, akkor ConstraintsViolatedException-t fog dobni a method.</p>
<p style="text-align:justify;">
<h2><span style="color:#888888;">3. Statisztikák:</span></h2>
<p style="text-align:justify;">14 db különböző (valid/invalid vegyesen) string-et validáltam mind a 4 megoldással 10.000-szer egymás után. Az idők ms-ben a következők lettek:</p>
<ul>
<li>Bad Solution: <span style="color:#ff0000;">2000 ms</span></li>
<li>RegExp validation: <span style="color:#ff0000;">312 ms</span></li>
<li>OVal property validation: <span style="color:#ff0000;">1844 ms</span></li>
<li>OVal method argument validation: <span style="color:#ff0000;">1813 ms</span></li>
</ul>
</div>
<div><span style="color:#ff0000;"><span style="color:#000000;">Tehát a papírforma bejött. A RegExp a leggyorsabb.</span></span></div>
<div><span style="color:#ff0000;"><span style="color:#000000;"><br />
</span></span></div>
<h2><span style="color:#ff0000;"><span style="color:#888888;">4. Miért lehet mégis jó választás az OVal:</span></span></h2>
<div style="text-align:justify;">Egy nagyon jó leírás található az OVal használatáról a következő blogon: <a href="http://jee-bpel-soa.blogspot.com/2008/12/jsr-303-and-oval-validation-framework.html">http://jee-bpel-soa.blogspot.com/2008/12/jsr-303-and-oval-validation-framework.html</a></div>
<div style="text-align:justify;">A validációs hibákat nagyon jól tudjuk kezelni, mivel minden feltételre különböző error code-okat tudunk definiálni:</div>
<p><code></p>
<div style="padding-left:30px;">@MinLength(value=2, errorCode = "Customer.lastName.error.minLength")</div>
<div style="padding-left:30px;">@MaxLength(value=20, errorCode = "Customer.lastName.error.maxLength")</div>
<div style="padding-left:30px;">private String lastName;</div>
<p></code></p>
<p style="text-align:justify;">Természetesen az OVal esetében is van lehetőség kölső XML fileban definiálni a validációs szabályokat, így elég konfigurálhatóvá válik a validálás&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/105/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/105/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/105/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=105&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/03/10/property-validalas-java-ban/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>Tárolt eljárás meghívása C# és Java kódból</title>
		<link>http://barakonyi.wordpress.com/2010/03/03/tarolt-eljaras-meghivasa-c-es-java-kodbol/</link>
		<comments>http://barakonyi.wordpress.com/2010/03/03/tarolt-eljaras-meghivasa-c-es-java-kodbol/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:09:09 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[C#]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[SP]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=99</guid>
		<description><![CDATA[1. Feladat: Az ügyfél csodálatos alkalmazása Back Office adatok szinkronizálásra biztosít tárolt eljárásokat. (Eredetileg úgy wolt, hogy a WS getter metódusai szarok, hibásak és lassúak voltak. Erre kitalálták, hogy úr isten, itt nagyon nagy mennyiségű adat van, meg hogy milyen nehéz már a WS-t kijavítani, és mennyivel egyszerűbb írni néhány tárolt eljárást. A business unit [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=99&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<h3><strong>1. Feladat:</strong></h3>
<p style="text-align:justify;">Az ügyfél csodálatos alkalmazása Back Office adatok szinkronizálásra biztosít tárolt eljárásokat. (Eredetileg úgy wolt, hogy a WS getter metódusai szarok, hibásak és lassúak voltak. Erre kitalálták, hogy úr isten, itt nagyon nagy mennyiségű adat van, meg hogy milyen nehéz már a WS-t kijavítani, és mennyivel egyszerűbb írni néhány tárolt eljárást. A business unit érje el közvetlenül a DB-t, és hívja meg az erre gyártott tárolt eljárásokat. Advanced Architecture!) A verzióváltás miatt ezeket is le akartam tesztelni. Még a végén nem működik az új rendszeren valamelyik, és a BU jön nekem sírni, hogy de miért&#8230;</p>
<h3>2. A tárolt eljárás</h3>
<p>A tárolt eljárás egy kicsit egyszerűsítve következőképpen van létrehozva:</p>
<p><code></p>
<div id="_mcePaste">CREATE PROCEDURE [bosuser].Bos_GetData @RequestType VARCHAR(32), @RequestFlag VARCHAR(5) OUTPUT</div>
<div>AS</div>
<div>BEGIN</div>
<div style="padding-left:30px;">DECLARE @xmlOut	XML</div>
<div style="padding-left:30px;">IF @RequestType='Accounts'</div>
<div style="padding-left:60px;">EXEC Bos_GetAllAccounts @RequestType, @xmlOut OUTPUT, @RequestFlag OUTPUT</div>
<div style="padding-left:30px;">ELSE IF @RequestType='Groups'</div>
<div style="padding-left:60px;">EXEC Bos_GetAllGroups @RequestType, @xmlOut OUTPUT, @RequestFlag OUTPUT</div>
<div style="padding-left:30px;">ELSE IF @RequestType='Users'</div>
<div style="padding-left:60px;">EXEC Bos_GetAllUsers @RequestType, @xmlOut OUTPUT, @RequestFlag OUTPUT</div>
<div style="padding-left:30px;">ELSE</div>
<div style="padding-left:60px;">RAISERROR('Invalid RequestType %s.',16,1,@RequestType)</div>
<div style="padding-left:30px;">SELECT @xmlOut AS 'XmlData'</div>
<div>END</div>
<div>GO</div>
<p></code></p>
<p>Ahogy látható, a tárolt eljárásunk belső tárolt eljárásokat hív meg. A paraméterei:</p>
<ul style="text-align:justify;">
<li>&#8220;RequestType&#8221; input paraméter: Melyik belső SP-t hívja meg.</li>
<li>&#8220;RequestFlag&#8221; in/out paramétere: Pager megoldás. Ha több mint X record van amit vissza kellene adni, akkor visszaadja az első X-et, és a &#8220;RequestFlag&#8221; false lesz. Ilyenkor akkor újra meg kell hívni az SP-nket az előzőleg használt &#8220;RequestType&#8221;-pal és erre visszatér a következő X recorddal.</li>
<li style="text-align:justify;">XML visszatérési érték.</li>
</ul>
<h3 style="text-align:justify;">3. C# megoldás</h3>
<p style="text-align:justify;">Először lefuttattam azt a C# kódot, amit még az előző verzióhoz csináltam a business unitnak. (Igen, kicsit kézi vezérlésűek, meg kell nekik mutatni, hogy hogyan kell csinálni.) A pagerrel (&#8220;RequestFlag&#8221;) most nem foglalkozunk. Ez a következőképpen néz ki:</p>
<p><code></p>
<div>string connect = System.Configuration.ConfigurationManager.AppSettings["connection"];</div>
<div>SqlConnection sqlConnection = new SqlConnection(connect);</div>
<div>sqlConnection.Open();</div>
<div>SqlCommand sqlCommand = new SqlCommand("Bos_GetAtlasData", sqlConnection);</div>
<div>sqlCommand.CommandType = CommandType.StoredProcedure;</div>
<div>sqlCommand.Parameters.Add("@RequestType", SqlDbType.VarChar, 32);</div>
<div>sqlCommand.Parameters["@RequestType"].Value = requestType;</div>
<div>sqlCommand.Parameters.Add("@RequestFlag", SqlDbType.VarChar, 5);</div>
<div>sqlCommand.Parameters["@RequestFlag"].Direction = ParameterDirection.Output;</div>
<div>XmlReader xmlReader = sqlCommand.ExecuteXmlReader();</div>
<div>xmlDocument.Load(xmlReader);</div>
<div>xmlReader.Close();</div>
<div>if ("FALSE".Equals(sqlCommand.Parameters["@RequestFlag"].Value.ToString()))</div>
<div>{</div>
<div style="padding-left:30px;">// Skip this case</div>
<div>}</div>
<div>sqlConnection.Close();</div>
<p></code></p>
<p>Ne felejtsük el az App.config-ba betenni a DB connection részleteit:</p>
<p><code></p>
<div>&lt;appSettings&gt;</div>
<div style="padding-left:30px;">&lt;add key="connection" value="Data Source='server.db.int, 1302';Initial Catalog=db;User ID=user;Password=password" /&gt;</div>
<div>&lt;/appSettings&gt;</div>
<p></code></p>
<p>Ha lefuttatjuk pl.: &#8220;Users&#8221; requestType-pal, akkor az XmlDocument-ünk tartalmazni fogja a usereket.</p>
<h3 style="text-align:justify;">4. A Java megoldás</h3>
<p style="text-align:justify;">Kis naívan azt hittem, hogy a Connection-ön meghívom a prepareCall() metódust ami ugye létrehozza nekem a CallableStatementet, ezen beállítom a paramétereit, hívok rajta egy execute()-ot, és a ResultSet-ből kiolvasom a végeredményt. Csak hogy ez így nem működik. Futottam vele néhány kört, mire debuggolás közben rájöttem, hogy ha sikerül feltartanom a programot az execute és a ResultSet processzálása között, akkor a ResultSet-ben feltűnik egy &#8220;XmlData&#8221; property amiben benne van a várt eredmény. Megpróbáltam az MS jdbc drivere helyett a <a href="http://jtds.sourceforge.net/">JTDS</a> jdbc drivert is használni, de azzal is hasonló lett az eredmény.</p>
<p style="text-align:justify;">A következző thread segített megérteni mi is a probléma: <a href="http://dbaspot.com/forums/ms-sqlserver/223916-problem-boolean-return-parameter-callablestatement-execute.html">http://dbaspot.com/forums/ms-sqlserver/223916-problem-boolean-return-parameter-callablestatement-execute.html</a> (Thanks to Joe Weinstein @ BEA Systems).</p>
<p style="text-align:justify;">A mi esetünkben a példa Java kód a következő:</p>
<p><code></p>
<div>CallableStatement callableStatement = null;</div>
<div>ResultSet resultSet = null;</div>
<div>Connection con = null;</div>
<div>try {</div>
<div style="padding-left:30px;">con = getConnection();</div>
<div style="padding-left:30px;">String sql = "{call Bos_GetData(?, ?)}";</div>
<div style="padding-left:30px;">callableStatement = con.prepareCall(sql);</div>
<div style="padding-left:30px;">callableStatement.setString(1, requestType);</div>
<div style="padding-left:30px;">callableStatement.registerOutParameter(2, java.sql.Types.VARCHAR);</div>
<div style="padding-left:30px;">boolean getResultSetNow = callableStatement.execute();</div>
<div style="padding-left:30px;">int updateCount = -1;</div>
<div style="padding-left:30px;">DocumentBuilderFactory dbfac = DocumentBuilderFactory.newInstance();</div>
<div style="padding-left:30px;">DocumentBuilder docBuilder = dbfac.newDocumentBuilder();</div>
<div style="padding-left:30px;">Document doc = null;</div>
<div style="padding-left:30px;">while (true) { // handle all in-line results from any procedure</div>
<div style="padding-left:60px;">if (getResultSetNow) {</div>
<div style="padding-left:90px;">resultSet = callableStatement.getResultSet();</div>
<div style="padding-left:90px;">while (resultSet.next()) {</div>
<div style="padding-left:120px;">InputStream is = resultSet.getAsciiStream(1);</div>
<div style="padding-left:120px;">doc = docBuilder.parse(is);</div>
<div style="padding-left:90px;">}</div>
<div style="padding-left:90px;">resultSet.close();</div>
<div style="padding-left:60px;">} else {</div>
<div style="padding-left:90px;">updateCount = callableStatement.getUpdateCount();</div>
<div style="padding-left:90px;">// if (updateCount != -1) {</div>
<div style="padding-left:90px;">// process update count if desired</div>
<div style="padding-left:90px;">// }</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:60px;">if ((!getResultSetNow) &amp;&amp; (updateCount == -1))</div>
<div style="padding-left:90px;">break; // done with loop</div>
<div style="padding-left:60px;">getResultSetNow = callableStatement.getMoreResults();</div>
<div style="padding-left:60px;">// go to next return if a Callable statement, get any output</div>
<div style="padding-left:60px;">// parameters after the loop.</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">boolean hasAllElementRetrived = Boolean.parseBoolean(callableStatement.getString(2));</div>
<div style="padding-left:30px;">callableStatement.close();</div>
<div style="padding-left:30px;">return new AtlasDataResult(hasAllElementRetrived, doc);</div>
<div>} catch (Exception e) {</div>
<div style="padding-left:30px;">log.error(e);</div>
<div style="padding-left:30px;">throw new RuntimeException(e);</div>
<div>} finally {</div>
<div style="padding-left:30px;">if (con != null) {</div>
<div style="padding-left:60px;">try { con.close(); } catch (SQLException e) {</div>
<div style="padding-left:60px;">log.error(e); }</div>
<div style="padding-left:30px;">}</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;"><strong>Némi magyarázat:</strong> Azért van erre az egészre szükség, mert a tárolt eljárás végrehajtása elég sokáig is eltarthat. A CallableStatement getMoreResults() metódusa true-val tér vissza, ha a következő result egy ResultSet object. Az getUpdateCount() -1 -gyel tér vissza, ha befejeződött a tárolt eljárás. Tehát a kilépési feltételünk: nincs több result (a getMoreResult() false-sal tért vissza), és nincs is több updatelendő sora az SP-nek (a getUpdateCount() -1-et adott.)</p>
<p style="text-align:justify;">A szép az egészben hogy a coding standards alapján ezért a while(true)/break megoldásért minimum nyilvánosan kivégeznének (De ahogy Joe@BEA írja, ez a legjobb kód feldolgozni bármilyen statementet).</p>
<p style="text-align:justify;">
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/99/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/99/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/99/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=99&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/03/03/tarolt-eljaras-meghivasa-c-es-java-kodbol/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>WSDL file verziók összehasonlítása</title>
		<link>http://barakonyi.wordpress.com/2010/02/26/wsdl-file-verziok-osszehasonlitasa-egy-alkalmazas-eseten/</link>
		<comments>http://barakonyi.wordpress.com/2010/02/26/wsdl-file-verziok-osszehasonlitasa-egy-alkalmazas-eseten/#comments</comments>
		<pubDate>Fri, 26 Feb 2010 14:00:42 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[WS]]></category>
		<category><![CDATA[XML]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=81</guid>
		<description><![CDATA[Feladat: Hasonlítsam össze mi változott az ügyfél két WS Interface-én a verzióváltás során. Tulajdonképpen a különböző alkalmazás verziók WSDL filejait kellene összediffelni. Mivel a WSDL file-ok rohadt nagyok, ráadásul generáltak, ezért kézzel (WinDiff, AraxisMerge) összehasonlítgatni elég unalmas lett volna. (Az egyik WSDL file-t a build-ben egy ant taskkal generálják axis segítségével, a másikat wiszont a JAX-WS [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=81&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;"><strong>Feladat:</strong> Hasonlítsam össze mi változott az ügyfél két WS Interface-én a verzióváltás során. Tulajdonképpen a különböző alkalmazás verziók WSDL filejait kellene összediffelni. Mivel a WSDL file-ok rohadt nagyok, ráadásul generáltak, ezért kézzel (WinDiff, AraxisMerge) összehasonlítgatni elég unalmas lett volna. (Az egyik WSDL file-t a build-ben egy ant taskkal generálják axis segítségével, a másikat wiszont a JAX-WS -es wsgen taskkal.)</p>
<p style="text-align:justify;">Mivel ezt minden verzióváltáskor el kell majd játszani (ugyanis a fejlesztők nem szeretnek Release Note-ot/Change Logot írni), igy célszerűnek tűnt írni rá egy kis programot.</p>
<p>Amit össze kell hasonlítani:</p>
<ul>
<li>Az elérhető függvények listája (van-e új WS method, töröltek-e belőle)</li>
<li>Az egyes függvények paraméterei változtak-e?</li>
<li>Az WS által használt összetett típusok változtak-e?</li>
</ul>
<h3>1. WSDL file szerkezete:</h3>
<p>Hivatalos leírás <a href="http://www.w3.org/TR/wsdl#_document-s">itt</a>.</p>
<p>A számomra lényeges node-ok a WSDL file-ban:</p>
<ul>
<li><strong><em>portType node:</em></strong> Az operation-ok listáját tartalmazza.
<ul>
<li style="text-align:justify;"><strong><em>operation nodes:</em></strong> A távolról meghívható függvény neve, egy imput és egy output message. (elvileg lehetne több output message is)</li>
</ul>
</li>
<li style="text-align:justify;"><strong><em>message nodes:</em></strong> Absztrakt leírása az infónak ami a kliens és a szerver között utazik. Az &#8220;függvények&#8221; imput és output üzenetei itt vannak kibontva. Az AXIS-os WSDL esetén itt már egyszrű vagy összetett típusok szerepelnek, míg a JAX-WS es WSDL-ben element hivatkozások a típusokra.</li>
<li><strong><em>types node:</em></strong> Adat típus definíciók
<ul>
<li><strong><em>complexType node:</em></strong> Az összetett adattípusok definíciója.</li>
</ul>
</li>
</ul>
<h3>2. XPath használata:</h3>
<p style="text-align:justify;">Először is kell egy Document (<code>org.w3c.dom.Document</code>) object ami az XML-ünket fogja tartalmazni a memóriában.</p>
<p><code></p>
<div>DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();</div>
<div>DocumentBuilder docBuilder = null;</div>
<div>try {</div>
<div style="padding-left:30px;">docBuilder = docBuilderFactory.newDocumentBuilder();</div>
<div style="padding-left:30px;">xmlDocument = docBuilder.parse(ClassLoader.getSystemResourceAsStream(filePath));</div>
<div>} catch (ParserConfigurationException e) {</div>
<div style="padding-left:30px;">log.error("ParserConfigurationException ", e);</div>
<div>} catch (FileNotFoundException e) {</div>
<div style="padding-left:30px;">log.error("FileNotFoundException ", e);</div>
<div>} catch (SAXException e) {</div>
<div style="padding-left:30px;">log.error("SAXException ", e);</div>
<div>} catch (IOException e) {</div>
<div style="padding-left:30px;">log.error("IOException ", e);</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;">Ezután kell egy XPath (<code>javax.xml.xpath.XPath</code>) object amiben a kereső kifejezést definiáljuk. (Megjegyzés: Az xsd namespace-t azért definiáljuk mert a komplex type-ok ebben a namespace-ben vannak. Ha nem adjuk meg az XPath-nak, nem fogja megtalálni. Bővebb leírás a NamespaceContext-ről <a href="http://xml.apache.org/xalan-j/xpath_apis.html">itt</a>.)</p>
<p><code> </code></p>
<p><code></p>
<div>XPath xpath = XPathFactory.newInstance().newXPath();</div>
<div>xpath.setNamespaceContext(new NamespaceContext() {</div>
<div style="padding-left:30px;">@SuppressWarnings("unchecked")</div>
<div style="padding-left:30px;">@Override</div>
<div style="padding-left:30px;">public Iterator getPrefixes(String namespaceURI) {</div>
<div style="padding-left:60px;">return null;</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">@Override</div>
<div style="padding-left:30px;">public String getPrefix(String namespaceURI) {</div>
<div style="padding-left:60px;">return "xsd";</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">@Override</div>
<div style="padding-left:30px;">public String getNamespaceURI(String prefix) {</div>
<div style="padding-left:60px;">return "http://www.w3.org/2001/XMLSchema";</div>
<div style="padding-left:30px;">}</div>
<div>});</div>
<p></code></p>
<p style="text-align:justify;">Végül szükség van egy XPathExpression (<code>javax.xml.xpath.XPathExpression</code>) objectre amit az XPath segítségével hozunk létre és kiértékelünk az XML documentünkön:</p>
<p><code></p>
<div>try {</div>
<div style="padding-left:30px;">XPathExpression  expr = xpath.compile("/definitions/portType/operation/@name");</div>
<div style="padding-left:30px;">Object exprResult = expr.evaluate(xmlDocument, XPathConstants.NODESET);</div>
<div>} catch (XPathExpressionException e) {</div>
<div style="padding-left:30px;">log.error("XPath error!", e);</div>
<div>}</div>
<div>NodeList methodNameNodes = (NodeList) exprResult;</div>
<p></code></p>
<p style="text-align:justify;">Az XPathExpression evaluate() methodusa egy objecttel tér vissza. Ennek az objectnek a típusát az evaluate method második paraméterében tudjuk meghatározni (boolean, string, nodeset, &#8230;). A mi esetünkben ezt símán kasztolhatjuk NodeList-re, amit aztán egy for ciklussal végigjárhatunk.</p>
<h3>3. WS Methodok kilistázása a WSDL file-ból:</h3>
<div id="_mcePaste" style="text-align:justify;">A fenti példa épp ezt csinálja. A &#8220;/definitions/portType/operation/@name&#8221; xpath kifejezés kilistázza a wsdl fileból az összes elérhető WS method nevét.</div>
<h3>4. WS methodok Input és Output paraméterei</h3>
<div>A portType node-on belül a method absztrakt definíciója a következőképpen néz ki:</div>
<p><code></p>
<div id="_mcePaste">&lt;operation name="<strong><em>findAllActivePacks</em></strong>"&gt;</div>
<div id="_mcePaste" style="padding-left:30px;">&lt;input message="tns:<strong><em>findAllActivePacks</em></strong>" /&gt;</div>
<div id="_mcePaste" style="padding-left:30px;">&lt;output message="tns:<strong><em>findAllActivePacksResponse</em></strong>" /&gt;</div>
<div id="_mcePaste">&lt;/operation&gt;</div>
<p></code></p>
<p style="text-align:justify;">Itt van leírva, hogy az adott WS method meghívásakor a kliens milyen input messaget küld a szervernek és a szerver milyen output üzenettel válaszol. A konkrét paraméterlista viszont a megfelelő messagek-ben van ledefiniálva (az AXIS esetén), vagy hivatkozva elementként a Type definícióknál (a JAX-WS -es WSDL-nél).</p>
<p>Példa Axis-os message definíció:</p>
<p><code></p>
<div>&lt;message name="<strong><em>removeUserFromGroup</em></strong>"&gt;</div>
<div style="padding-left:30px;">&lt;part xmlns:partns="http://www.w3.org/2001/XMLSchema"</div>
<div style="padding-left:90px;">type="<strong><em>partns:string</em></strong>" name="string" /&gt;</div>
<div style="padding-left:30px;">&lt;part xmlns:partns="http://www.w3.org/2001/XMLSchema"</div>
<div style="padding-left:90px;">type="<strong><em>partns:string</em></strong>" name="string0" /&gt;</div>
<div>&lt;/message&gt;</div>
<p></code></p>
<p>Példa JAX-WS message definíció:</p>
<p><code></p>
<div>&lt;message name="<strong><em>login</em></strong>"&gt;</div>
<div style="padding-left:30px;">&lt;part xmlns:partns="atlas" name="parameters" element="<strong><em>partns:login</em></strong>" /&gt;</div>
<div>&lt;/message&gt;</div>
<p></code></p>
<p>Ahol az element a types-on belül van definiálva:</p>
<p><code></p>
<div>&lt;xsd:element name="<strong><em>login</em></strong>"&gt;</div>
<div style="padding-left:30px;">&lt;xsd:complexType&gt;</div>
<div style="padding-left:60px;">&lt;xsd:sequence&gt;</div>
<div style="padding-left:90px;">&lt;xsd:element xmlns:tp="java:com.company.auth.ws"</div>
<div style="padding-left:180px;">name="authWSReq" type="<strong><em>tp:AuthWSReq</em></strong>" /&gt;</div>
<div style="padding-left:60px;">&lt;/xsd:sequence&gt;</div>
<div style="padding-left:30px;">&lt;/xsd:complexType&gt;</div>
<div>&lt;/xsd:element&gt;</div>
<p></code></p>
<p style="text-align:justify;">Tehát először kikeressük a message nevét a portType/operation-ból, majd ezzel a névvel kikeressük az üzenetet. (JAX-WS-nél az üzenet neve ugyanaz mint az element-é amire az adott message hivatkozik, így a message helyett rögtön kereshetjük az elementet, ezzel egy lépést megspórolva.) Példa egy függvény imput paramétereinek kikeresésére:</p>
<p><code></p>
<div>private ArrayList&lt;String&gt; <strong><em>getInputParameters</em></strong>(String wsMethodName) {</div>
<div style="padding-left:30px;">ArrayList&lt;String&gt; resultInputParameters = null;</div>
<div style="padding-left:30px;">String expression = <strong>"<em>/definitions/portType/operation[@name='" + wsMethodName + "']/input/@message</em></strong><strong>"</strong>;</div>
<div style="padding-left:30px;">try {</div>
<div style="padding-left:60px;">expr = xpath.compile(expression);</div>
<div style="padding-left:60px;">exprResult = expr.evaluate(xmlDocument, XPathConstants.NODESET);</div>
<div style="padding-left:30px;">} catch (XPathExpressionException e) {</div>
<div style="padding-left:60px;">log.error("Can't find input message for this method!", e);</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">NodeList inputParamMessageNames = (NodeList) exprResult;</div>
<div style="padding-left:30px;">if (inputParamMessageNames.getLength() &gt; 0) {</div>
<div style="padding-left:60px;">// it has only one input message definition under the portType node</div>
<div style="padding-left:60px;">String inputParamMessageName = inputParamMessageNames.item(0).getNodeValue();</div>
<div style="padding-left:60px;">// cut off the tns: namespace</div>
<div style="padding-left:60px;">inputParamMessageName = inputParamMessageName.substring(4);</div>
<div style="padding-left:60px;">if (isAxisWSDL) {</div>
<div style="padding-left:90px;">expression = <strong>"<em>/definitions/message[@name='" + inputParamMessageName + "']/part/@type</em></strong><strong>"</strong>;</div>
<div style="padding-left:60px;">} else {</div>
<div style="padding-left:90px;">expression = <strong>"</strong><strong><em>/definitions/types/schema/element[@name='" + inputParamMessageName</em></strong></div>
<div style="padding-left:120px;"><strong><em>+ "']/complexType/sequence/element/@type</em></strong><strong>"</strong>;</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:60px;">try {</div>
<div style="padding-left:90px;">expr = xpath.compile(expression);</div>
<div style="padding-left:90px;">exprResult = expr.evaluate(xmlDocument, XPathConstants.NODESET);</div>
<div style="padding-left:60px;">} catch (XPathExpressionException e) {</div>
<div style="padding-left:90px;">log.error("Can't find message deffinition for this type!", e);</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:60px;">NodeList inputMessageParameterTypes = (NodeList) exprResult;</div>
<div style="padding-left:60px;">if (inputMessageParameterTypes.getLength() &gt; 0) {</div>
<div style="padding-left:90px;">String paramType = null;</div>
<div style="padding-left:90px;">resultInputParameters = new ArrayList&lt;String&gt;();</div>
<div style="padding-left:90px;">for (int i = 0; i &lt; inputMessageParameterTypes.getLength(); i++) {</div>
<div style="padding-left:120px;">paramType = inputMessageParameterTypes.item(i).getNodeValue();</div>
<div style="padding-left:120px;">if (isAxisWSDL) {</div>
<div style="padding-left:150px;">// cut off the partns: namespace value</div>
<div style="padding-left:150px;">paramType = paramType.substring(7);</div>
<div style="padding-left:120px;">} else {</div>
<div style="padding-left:150px;">// cut off the "tp:" namespace value</div>
<div style="padding-left:150px;">paramType = paramType.substring(3);</div>
<div style="padding-left:120px;">}</div>
<div style="padding-left:120px;">resultInputParameters.add(paramType);</div>
<div style="padding-left:90px;">}</div>
<div style="padding-left:60px;">}</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">return resultInputParameters;</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;"><strong>Megjegyzés:</strong> Az, hogy substringgel levágom a namespace-t az egyes attribútumokról, csúnya megoldás. Megfelelően kellene kezelni a namespace-eket. Viszont a célnak éppen pont megfelelt.</p>
<h3>5. Complex type-ok összehasonlítása</h3>
<p>Az összetett típusok a definitions/types/xsd:schema xml node alatt vannak definiálva. Például:</p>
<p><code></p>
<div>&lt;xsd:complexType name="<strong><em>Pack</em></strong>"&gt;</div>
<div style="padding-left:30px;">&lt;xsd:sequence&gt;</div>
<div style="padding-left:60px;">&lt;xsd:element type="<strong><em>xsd:boolean</em></strong>" name="<strong><em>active</em></strong>"</div>
<div style="padding-left:150px;">minOccurs="1" maxOccurs="1" /&gt;</div>
<div style="padding-left:60px;">&lt;xsd:element type="<strong><em>xsd:string</em></strong>" name="<strong><em>level</em></strong>"</div>
<div style="padding-left:150px;">minOccurs="1" nillable="true" maxOccurs="1" /&gt;</div>
<div style="padding-left:60px;">&lt;xsd:element type="<strong><em>xsd:string</em></strong>" name="<strong><em>packName</em></strong>"</div>
<div style="padding-left:150px;">minOccurs="1" nillable="true" maxOccurs="1" /&gt;</div>
<div style="padding-left:60px;">&lt;xsd:element type="<strong><em>xsd:string</em></strong>" name="<strong><em>packId</em></strong>"</div>
<div style="padding-left:150px;">minOccurs="1" nillable="true" maxOccurs="1" /&gt;</div>
<div style="padding-left:30px;">&lt;/xsd:sequence&gt;</div>
<div>&lt;/xsd:complexType&gt;</div>
<p></code></p>
<p>Itt 2 dolog fontos:</p>
<ul>
<li>Változott-e a komplex type-ok listája (jött-e új, vagy töröltek-e meglévőt)?</li>
<li>Az egyes komplex type-ok property-jei változtak-e?</li>
</ul>
<p style="text-align:justify;">Tehát egyrészt kell az összetett típusok neveinek a listája, amelyet a következő xpath kifejezéssel kérhetünk le:</p>
<p><code></p>
<div style="padding-left:30px;">"/definitions/types/schema/complexType/@name"</div>
<p></code></p>
<p style="text-align:justify;">Ezen kívül minden egyes komplex típusra meg kell néznünk a property-ket. Először lekérjük a property-k listáját:</p>
<p><code></p>
<div style="padding-left:30px;">String expression = "/definitions/types/schema/complexType[@name='"</div>
<div style="padding-left:120px;">+ complexTypeName + "']/sequence/element";</div>
<div style="padding-left:30px;">try {</div>
<div style="padding-left:60px;">expr = xpath.compile(expression);</div>
<div style="padding-left:60px;">exprResult = expr.evaluate(xmlDocument, XPathConstants.NODESET);</div>
<div style="padding-left:30px;">} catch (XPathExpressionException e) {</div>
<div style="padding-left:60px;">log.error("XPathExpressionException: ", e);</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">NodeList nodes = (NodeList) exprResult;</div>
<p></code></p>
<p style="text-align:justify;">Majd beolvassuk a property-k tulajdonságait egy általunk definiált osztályba (ParameterObject), hogy később össze tudjuk hasonlítgatni őket:</p>
<p><code></p>
<div>String <strong>name </strong>= null;</div>
<div>String <strong>type </strong>= null;</div>
<div>String <strong>minOccurs </strong>= null;</div>
<div>String <strong>maxOccurs </strong>= null;</div>
<div>boolean <strong>nillable </strong>= false;</div>
<div>for (int i = 0; i &lt; nodes.getLength(); i++) {</div>
<div style="padding-left:30px;"><strong>name </strong>= nodes.item(i).getAttributes().getNamedItem(</div>
<div style="padding-left:180px;">PARAMETER_NAME_PROPERTY).getNodeValue();</div>
<div style="padding-left:30px;"><strong>type </strong>= nodes.item(i).getAttributes().getNamedItem(</div>
<div style="padding-left:180px;">PARAMETER_TYPE_PROPERTY).getNodeValue();</div>
<div style="padding-left:30px;"><strong>minOccurs </strong>= nodes.item(i).getAttributes().getNamedItem(</div>
<div style="padding-left:180px;">PARAMETER_MINOCCURS_PROPERTY).getNodeValue();</div>
<div style="padding-left:30px;"><strong>maxOccurs </strong>= nodes.item(i).getAttributes().getNamedItem(</div>
<div style="padding-left:180px;">PARAMETER_MAXOCCURS_PROPERTY).getNodeValue();</div>
<div style="padding-left:30px;">if (nodes.item(i).getAttributes().getNamedItem(PARAMETER_NILLABLE_PROPERTY) != null) {</div>
<div style="padding-left:60px;"><strong>nillable </strong>= Boolean.parseBoolean(nodes.item(i).getAttributes().</div>
<div style="padding-left:210px;">getNamedItem("nillable").getNodeValue());</div>
<div style="padding-left:30px;">}</div>
<div style="padding-left:30px;">resultMap.put(name, new <strong>ParameterObject</strong>(name, type, minOccurs, maxOccurs, nillable));</div>
<div>}</div>
<p></code></p>
<p style="text-align:justify;">Szinte készen is vagyunk. Már ami a WSDL feldolgozását illeti. Az összehasonlítgatást (method paraméterek, complex type property-k esetén) én az erre definiált osztályok equals() methodjának felüldefiniálásával oldottam meg&#8230;</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/81/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/81/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/81/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=81&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/02/26/wsdl-file-verziok-osszehasonlitasa-egy-alkalmazas-eseten/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>Java és a speciális karakterek</title>
		<link>http://barakonyi.wordpress.com/2010/02/17/java-es-a-specialis-karakterek/</link>
		<comments>http://barakonyi.wordpress.com/2010/02/17/java-es-a-specialis-karakterek/#comments</comments>
		<pubDate>Wed, 17 Feb 2010 16:42:24 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[WebLogic]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=74</guid>
		<description><![CDATA[Feladat: Kellett tesztelnem az ügyfél csodálatos alkalmazását. A WS API-n keresztül kellett olyan entityket létrehoznom amelyek neve/description-je tartalmazza a következő karaktereket: &#8220;éèùàäëïöüâêîôûçÉÈÙÀÄËÏÖÜÂÊÎÔÛÇ«»&#8221; Leguttattam a tesztet és gyönyörűen működött minden. Probléma: Egy héttel később fel szerettem volna taggelni a tesztjeimet, így újrafuttattam őket. Közben az eredeti linuxos szerver environment helyett egy windowsosra kellett váltani. A speciális [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=74&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Feladat:</strong> Kellett tesztelnem az ügyfél csodálatos alkalmazását. A WS API-n keresztül kellett olyan entityket létrehoznom amelyek neve/description-je tartalmazza a következő karaktereket:</p>
<p style="text-align:center;"><em><strong>&#8220;éèùàäëïöüâêîôûçÉÈÙÀÄËÏÖÜÂÊÎÔÛÇ«»&#8221;</strong></em></p>
<p>Leguttattam a tesztet és gyönyörűen működött minden.</p>
<p><strong>Probléma:</strong> Egy héttel később fel szerettem volna taggelni a tesztjeimet, így újrafuttattam őket. Közben az eredeti linuxos szerver environment helyett egy windowsosra kellett váltani. A speciális karakteres tesztjeim a következő exceptiont dobták:</p>
<p style="text-align:center;"><em>Invalid byte 2 of 3-byte UTF-8 sequence</em></p>
<p>Méghozzá a response SOAP message feldolgozása közben. A Weblogic server logjában semmilyen exception-t nem találtam.</p>
<p><strong>Megoldás:</strong></p>
<p>Amikor a google-lal kerestem a problémára, mindenütt azt olvastam, hogy ilyen hiba XML fileoknál fordul elő, amikor pl.: az XML file enkódolása nem egyezik meg a definícióban szereplővel.</p>
<p>A linux default character encoding-ja UTF-8, míg a windows-é iso-8859-1. Ebből jött az ötlet, hogy az env-en levő Java valószínűleg az Oprendszer default encoding-ját használja&#8230; Tehát utánanéztem hogyan tudom átállítani a Java default character encoding-ot.</p>
<p>Kiderült hogy ezt nem lehet System property szinten konfigurálni, csak környezeti változó szintjén. A következő pagen találtam rá a megoldásra: <a href="http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding">http://stackoverflow.com/questions/361975/setting-the-default-java-character-encoding</a></p>
<p>Csinálnunk kell egy <strong><em>JAVA_TOOL_OPTIONS</em></strong> környezeti változót. (<a href="http://vlaurie.com/computers2/Articles/environment.htm">Leírás a Windows környezeti változókról.</a>) Az értéke ennek a változónak a következő lesz:</p>
<p style="text-align:center;"><strong><em>-Dfile.encoding=UTF8</em></strong></p>
<p>(A JAVA_TOOL_OPTIONS környezeti változóról bővebb leírás <a href="http://docs.hp.com/en/5992-4687/ch01s12.html" target="_blank">itt</a>.)</p>
<p>Ezt a környezeti változó a JVM induláskor olvassa fel. Amikor ujraindítottam a Weblogic servert, megjelent a következő sor a logban:</p>
<p style="text-align:center;">Picked up JAVA_TOOL_OPTIONS: -Dfile.encoding=UTF8</p>
<p>Jó, tehát a Java már UTF-8 char encodinggal megy. Lefuttattam a teszteket és láss csodát, mind működött <img src='http://s0.wp.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/74/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/74/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/74/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=74&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/02/17/java-es-a-specialis-karakterek/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
		<item>
		<title>Software Requirements &#8211; 5. fejezet: Establishing the Product Vision and Project Scope</title>
		<link>http://barakonyi.wordpress.com/2010/02/06/software-requirements-5-fejezet-establishing-the-product-vision-and-project-scope/</link>
		<comments>http://barakonyi.wordpress.com/2010/02/06/software-requirements-5-fejezet-establishing-the-product-vision-and-project-scope/#comments</comments>
		<pubDate>Sat, 06 Feb 2010 21:09:12 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Software Requirements]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=64</guid>
		<description><![CDATA[Áttekintés: Ez általában egy Vision and Scope doksiban testesül meg. Ez tartalmazhatja a business requirementeket is (bár általában ezt job külön doksiba kitenni). Ha nincs egy közös kép a software-ről és egy hatáskör definiálva a projectről, akkor a résztvevők soha nem fognak megállapodni a követelményekben. Ezen kívül a Vision and Scope doksi nagyban segítheti a [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=64&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p style="text-align:justify;"><strong>Áttekintés:</strong> Ez általában egy Vision and Scope doksiban testesül meg. Ez tartalmazhatja a business requirementeket is (bár általában ezt job külön doksiba kitenni). Ha nincs egy közös kép a software-ről és egy hatáskör definiálva a projectről, akkor a résztvevők soha nem fognak megállapodni a követelményekben. Ezen kívül a Vision and Scope doksi nagyban segítheti a Requirement Change Control Process-t (csak rápillantunk a scope-ra, és könnyebben eldönthetjük, hogy a change in scope vagy out of scope).</p>
<h3><strong>A product vízió definiálása Business Requirementeken keresztül</strong></h3>
<p style="text-align:justify;"><span style="text-decoration:underline;">A Product Vision:</span></p>
<ul>
<li>közös nevezőre hozza a project résztvevőit</li>
<li>mi a product, és mivé válhat</li>
<li>teljes egésszében tekinti a productot</li>
<li>általában nem vagy lassan változik</li>
</ul>
<p style="text-align:justify;"><span style="text-decoration:underline;">A Project Scope Statement:</span></p>
<ul>
<li>meghatározza, hogy a hosszú távú product víziónak mely része tartozik az adott projectbe</li>
<li>meghúzza a határokat (mi kerül be az adott projectbe és mi nem)</li>
<li>meghatározza a project limitjeit</li>
<li>a részletei a Requirement Baseline-okban vannak definiálva</li>
<li>sokkal dinamikusabban változhat mint a Product Vision.</li>
</ul>
<p style="text-align:justify;"><a href="http://barakonyi.files.wordpress.com/2010/02/visionandscope12.png"><img class="alignnone size-full wp-image-67" title="VisionAndScope1" src="http://barakonyi.files.wordpress.com/2010/02/visionandscope12.png?w=480&#038;h=182" alt="" width="480" height="182" /></a></p>
<h3><strong>Ütköző Business Requirementek</strong></h3>
<p style="text-align:justify;">Mivel a követelmények több különböző forrásból származnak így lehetnek köztük ütközőek. A Project Sponsor feladata, hogy feloldja ezeket az alapján, hogy project alapvető céljai szerint mi hordozza a maximális üzleti értéket. Ugyancsak a Sponsor feladata, hogy feloldja a konfliktusokat a project különböző résztvevői között&#8230;<br />
Ha a project résztvevői szabadjára vannak engedve, akkor túl sok lesz a követelmény, túl komplikált a rendszer.</p>
<h3><strong>Business Requirements and Use Cases</strong></h3>
<p style="text-align:justify;">A business requirement-ek meghatározzák:</p>
<ul>
<li>A business task-okat (Use Cases)</li>
<li>A mélységet vagy szintet, ahol ezek a Use Casek implementálva lesznek (pl.: manuális, automatikus)</li>
</ul>
<p style="text-align:justify;">(Itt nagyon high level Use Casek-re kell gondolni)&#8230;</p>
<h3><strong>Vision and Scope Document</strong></h3>
<p style="text-align:justify;">Tulajdonosa (irója/szerkesztője) a project szonzor. (Persze Requirement Analyst is dolgozhat rajta). Template:</p>
<p><em><strong>1. Business Requirements</strong></em></p>
<ul>
<blockquote>
<li><em>leirja az előnyöket amiket amiket az új rendszer biztosít. (Projects are launched in the belief that the new product will make the world a better place in some way for someone.)</em></li>
</blockquote>
</ul>
<p style="padding-left:30px;"><em><strong>1.1. Background</strong></em></p>
<ul>
<blockquote>
<li><em>általános leírás a helyzetről ami az új projecthez vezetett.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>1.2. Business Opportunity</strong></em></p>
<ul>
<blockquote>
<li><em>market opportunity, solution for a problem, complete customer solution</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>1.3. Business Objectives and Success Criteria</strong></em></p>
<ul>
<blockquote>
<li><em>Összefoglalja az előnyöket, megszámlálható/mérhető módon.</em></li>
<li><em>Pl.: Pénzügyi célok, Nem pénzügyi célok, %-ok, etc.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>1.4. Customer or Market Needs</strong></em></p>
<blockquote>
<ul>
<li><em>Tipikus ügyfél szükségletei az adott piacon. Kiemelve azok, amelyeket az uj product fog biztosítani.</em></li>
</ul>
</blockquote>
<p style="text-align:justify;padding-left:30px;"><em><strong>1.5. Business Risks</strong></em></p>
<ul>
<blockquote>
<li><em>Piaci verseny, fejlesztési idő, fogadtatás, fejlesztési problémák, negatív hatások a business-re, kompatibilitás, migráció.</em></li>
<li><em>Ezeknek a kockázatoknak a valószínűsége.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;"><em><strong>2. Vision of the Solution</strong></em></p>
<blockquote>
<ul>
<li><em>Strategic vision for the system that will achieve the business objectives.</em></li>
</ul>
</blockquote>
<p style="text-align:justify;padding-left:30px;"><em><strong>2.1. Vision Statement</strong></em></p>
<ul>
<blockquote>
<li><em>For  [target customer]</em></li>
<li><em>Who  statement of the need or opportunity]</em></li>
<li><em>The  [product name]</em></li>
<li><em>Is  [a product category]</em></li>
<li><em>That  [key benefit, compelling reason to buy or use]</em></li>
<li><em>Unlike  [primary competitive alternative, current system, or current business process],</em></li>
<li><em>Our product  [statement of primary differentiation and advantages of new product].</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>2.2. Major features</strong></em></p>
<blockquote>
<ul>
<li><em>hangsúlyozni azokat, amik megkülönböztetik a versenytársaktól/legacy producttól.</em></li>
</ul>
</blockquote>
<p style="text-align:justify;padding-left:30px;"><em><strong>2.3. Assumptions and Dependencies</strong></em></p>
<ul>
<blockquote>
<li> <em>A résztvevők feltevéseit rögzíteni, hogy a többi project member is át tudja nézni.</em></li>
<li><em>Rögzíteni a külső függőségeket amik befolyásolhatják a project időtartamát, stb.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;"><em><strong>3. Scope and limitations</strong></em></p>
<ul>
<blockquote>
<li><em>&#8220;The System is and what is not.&#8221;</em></li>
<li><em>Definiálja az elképzelést és a tervezett megoldásokat.</em></li>
<li><em>A limitek meghatározzák, hogy mikre nem lesz képes a rendszer.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>3.1. Scope of the Initial Release</strong></em></p>
<ul>
<blockquote>
<li><em>Major feature set of the initial release.</em></li>
<li><em>Koncentráljunk azokra a feature-ökre amelyektől a legnagyobb business value-t remélünk.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>3.2. Scope of the Subsequent Releases</strong></em></p>
<blockquote>
<ul>
<li><em>Mint az initial release-nél. De hangsűlyosabb a timing.</em></li>
</ul>
</blockquote>
<p style="text-align:justify;padding-left:30px;"><em><strong>3.3. imitations and Exclusions</strong></em></p>
<ul>
<blockquote>
<li><em>A határvonal definiálása &#8211; mi esik kívül az adott producton.</em></li>
<li><em>A kizárt feature-ok, amelyek nem lesznek megvalósítva.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;"><em><strong>4. Business Context</strong></em></p>
<ul>
<blockquote>
<li><em>Business Issues</em></li>
<li><em>Project résztvevő kategóriák</em></li>
<li><em>Management hierarchy</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>4.1. Stakeholder Profiles</strong></em></p>
<ul>
<blockquote>
<li><em>Stakeholders are the individuals, groups, or organizations who are actively involved in a project, are affected by its outcome, or are able to influence its outcome</em></li>
<li><em>Szerintem itt lehetne definiálgatni az egyes projectek vezetőit, a CCB tagjait, a project sponsorokat, stb.</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>4.2. Project Priorities</strong></em></p>
<ul>
<blockquote>
<li><em>A hatékony döntéshozáshoz a project résztvevőinek meg kell egyezniük a prioritásokban.</em></li>
<li><em>A software project 5 dimenziója: </em>
<ul>
<li><em>features</em></li>
<li><em>quality</em></li>
<li><em>schedule</em></li>
<li><em>cost</em></li>
<li><em>staff</em></li>
</ul>
</li>
<li><em>Mindegyikhez kell egy értéket rendelni a következőkből: </em>
<ul>
<li><em>constraint (show stopper)</em></li>
<li><em>driver (must have)</em></li>
<li><em>degree of freedom (nice to have)</em></li>
</ul>
</li>
<li><em>A project manager dolga, hogy meghatározza prioritásokat. Nem lehet minden constraint of driver, kell egy bizonyos fokú szabadság a projecthez&#8230;</em></li>
</blockquote>
</ul>
<p style="text-align:justify;padding-left:30px;"><em><strong>4.3. Operating environment</strong></em></p>
<ul>
<blockquote>
<li><em>availability, reliability, performance and integrity requirements</em></li>
<li><em>Defining System Architecture.</em></li>
</blockquote>
</ul>
<h3><strong>A kontextus diagram</strong></h3>
<p style="text-align:justify;">A Scope leírja a határokat és kapcsolatokat a fejlesztett rendszer és a külvilág között (Külső rendszerek, End Userek, stb.). A kontextus diagram ugyanezt teszi grafikusan. Ez a legmagasabb szintű folyamatábra a productról. Példa a könyvből: (nekem nem igazán tetszik&#8230;)</p>
<p style="text-align:justify;"><a href="http://barakonyi.files.wordpress.com/2010/02/visionandscope2.jpg"><img class="alignnone size-full wp-image-68" title="VisionAndScope2" src="http://barakonyi.files.wordpress.com/2010/02/visionandscope2.jpg?w=480&#038;h=345" alt="" width="480" height="345" /></a></p>
<p style="text-align:justify;">A lényeg az átláthatóság. Így könnyebb tisztázni a project részleteit a project résztvevői között.</p>
<h3><strong>Tartsuk a Scope-ot fókuszban!</strong></h3>
<p style="text-align:justify;">Új requirementek esetén mindig ellenőrizzük, hogy ez belül van-e az eredeti Scope-on. A scope módosítható, de csak nagyon indokolt esetben. Amennyiben a scope módosul, általában a project egyéb tényezőinek is módosítanunk kell (pl.: schedule vagy resourcing).</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/64/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/64/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/64/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=64&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2010/02/06/software-requirements-5-fejezet-establishing-the-product-vision-and-project-scope/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/02/visionandscope12.png" medium="image">
			<media:title type="html">VisionAndScope1</media:title>
		</media:content>

		<media:content url="http://barakonyi.files.wordpress.com/2010/02/visionandscope2.jpg" medium="image">
			<media:title type="html">VisionAndScope2</media:title>
		</media:content>
	</item>
		<item>
		<title>Web Service Error &#8211; Permission issue</title>
		<link>http://barakonyi.wordpress.com/2009/12/19/web-service-error-permission-issue/</link>
		<comments>http://barakonyi.wordpress.com/2009/12/19/web-service-error-permission-issue/#comments</comments>
		<pubDate>Sat, 19 Dec 2009 21:24:22 +0000</pubDate>
		<dc:creator>Matyi</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Bug]]></category>
		<category><![CDATA[WebLogic]]></category>
		<category><![CDATA[WS]]></category>

		<guid isPermaLink="false">http://barakonyi.wordpress.com/?p=51</guid>
		<description><![CDATA[Tanulság: Ha linuxon fut az appserver/webserver akkor a bug keresése közben sose felejtsük ki a jogosultságokból adódó problémákat. A sztori: Résztvevők: Ubuntu Linux, Weblogic AppServer, Apache Weblogic plugin, és a csodálatos alkalmazásunk egy generált Web Service interface-szel. A Probléma: Application maintanance és partial upgrade után az ügyfél Web Service Kliense a createProduct(Product product) WS methoddal [...]<img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=51&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></description>
			<content:encoded><![CDATA[<p><strong>Tanulság:</strong> Ha linuxon fut az appserver/webserver akkor a bug keresése közben sose felejtsük ki a jogosultságokból adódó problémákat.</p>
<h2>A sztori:</h2>
<p><strong>Résztvevők:</strong> Ubuntu Linux, Weblogic AppServer, Apache Weblogic plugin, és a csodálatos alkalmazásunk egy generált Web Service interface-szel.</p>
<p><strong>A Probléma:</strong> Application maintanance és partial upgrade után az ügyfél Web Service Kliense a createProduct(Product product) WS methoddal nem működött. A findAllProduct() -tal viszont igen. A hibaüzenet a következő volt:</p>
<pre>The remote server returned an unexpected response:
     (400) Bad Request. ---&gt;  System.Net.WebException:
     The remote server returned an error: (400) Bad Request..</pre>
<p>1. Tesztelés saját klienssel: Kipróbáltam saját C# WS klienssel, és minden WS method tökéletesen működött. A saját és a kliens  environmentjén egyaránt. Megírtam nekik, hogy frissítsék a WSDL file-t, generálják újra a WS Kliens Stub-ot, és próbálják újra.</p>
<p>2. Újrapróbálták. Nem ment.</p>
<p>3. Csináltam nekik példaprojectet. Ők visszaküldték az ő példájukat, ami tényleg nem működött. De csak a kliens environmentjén nem működött.</p>
<p>Az én C# kliensem a régi módszerrel Web Referenciaként importálta a WSDL file-t, míg az övéké Service Reference-ként. Egy ideig azt hittem, hogy a Service reference megvalósítás a hibás. De a mi env-ünkön ment&#8230;</p>
<p>4. Hozzáfogtam összehasonlítani a mi rendszerünket az ügyfélével. Minden tökéletesnek tűnt. A generált WSDL file megegyezett. A domain logig nem jutott el a kérés&#8230; Közben kiderült, hogy csak a paraméteres függvényhívások buknak el. Az Apache access logjában a következőt találtam:</p>
<pre>Invalid URI in request (- SOAP message -)
                     GET /bridge_error.html HTTP/1.1</pre>
<p>Ez még ok, mert nincs bridge_error.html bekonfigurálva. De mitől jön bridge error?</p>
<p>5. Az Apache Weblogic pluginon bekonfigoltuk a logozást. Ebből az derült ki, hogy “/tmp/_wl_proxy/”-ban lévő temp file-t nem tudja írni az apache mert nincs hozzá jogosultsága, ezért bukik el a request.</p>
<pre>- Going to get the post data of size=2419 clength=0
- getWLFilePath: Complete File name =
               [/tmp/_wl_proxy/_post_9929_0]
- Cannot open TEMP post file '/tmp/_wl_proxy/_post_9929_0'
               for POST of 2419 bytes
- Redirecting the error response to the errorPage =
               [/bridge_error.html]
- IO error reading client POST data; sys err#:
               [13] sys err msg [Permission denied]</pre>
<p><strong>Az ok:</strong> Amikor az ügyfél rendszergazdája karbantarotta a servert, létrehozott egy új usert/groupot az Apache server futtatásához. Mivel az Apache ezzel az új userrel futott, az előzőleg létrehozott &#8220;_wl_proxy&#8221; könyvtárhoz nem volt hozzáférése. A POST HTTP requestek esetén az Apache proxy temp fileba menti a  paramétereket, amiket jelen esetben nem tudott lementeni.</p>
<p>- Az ügyfél C# kliensével (Service Reference based) a paraméter nélküli függvényhívások azért működtek, mert nem kellett az Apache-nak semmit lementenie.</p>
<p>- Az én C#  kliensemmel (Web Reference based) azért működött, mert az GET HTTP requesteket használt&#8230;</p>
<p><strong>Megoldás:</strong> Rendszergazdaként töröltük a &#8220;_wl_proxy&#8221; mappát. A következő paraméteres HTTP POST requestnél az Apache újrakreálta ezt a mappát, és ezek után minden tökéletesen működött.</p>
<br />  <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gocomments/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/comments/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godelicious/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/delicious/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gofacebook/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/facebook/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gotwitter/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/twitter/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/gostumble/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/stumble/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/godigg/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/digg/barakonyi.wordpress.com/51/" /></a> <a rel="nofollow" href="http://feeds.wordpress.com/1.0/goreddit/barakonyi.wordpress.com/51/"><img alt="" border="0" src="http://feeds.wordpress.com/1.0/reddit/barakonyi.wordpress.com/51/" /></a> <img alt="" border="0" src="http://stats.wordpress.com/b.gif?host=barakonyi.wordpress.com&amp;blog=10911809&amp;post=51&amp;subd=barakonyi&amp;ref=&amp;feed=1" width="1" height="1" />]]></content:encoded>
			<wfw:commentRss>http://barakonyi.wordpress.com/2009/12/19/web-service-error-permission-issue/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	
		<media:content url="http://1.gravatar.com/avatar/7ac2dda886015419c22fc43d0b41b6b0?s=96&#38;d=identicon&#38;r=G" medium="image">
			<media:title type="html">Matyi</media:title>
		</media:content>
	</item>
	</channel>
</rss>
