tag:blogger.com,1999:blog-6080567303438160892024-03-08T10:56:50.224+01:00Java addictkackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.comBlogger8125tag:blogger.com,1999:blog-608056730343816089.post-41312081354983254422009-09-02T16:38:00.003+02:002009-09-02T16:56:17.339+02:00Scanning java annotations - reflections<p><a href="http://code.google.com/p/reflections/">reflections</a></p><p>"Reflections scans your classpath, indexes the metadata, allows you to query it on runtime and may save and collect that information for many modules within your project."</p><p>Related project: <a href="http://bill.burkecentral.com/2008/01/14/scanning-java-annotations-at-runtime/">scannotation</a></p>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-65721813030989119582009-08-27T17:34:00.010+02:002009-08-27T18:22:21.563+02:00Troubleshooting Deployment in Glassfish + XSD Namespaces<a href="http://blogs.sun.com/swchan/entry/troubleshooting_deployment_in_glassfish">Troubleshooting Deployment in Glassfish</a><br /><br />Plussz amit sosem talalok amikor kell, nem birom megjegyezni es nem rakok fel 20 kilos eclipse plugint erte:<br /><br />application.xml<br /><pre name="code" class="xml"><application xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="5" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/application_5.xsd></pre><br />ejb-jar.xml<br /><pre name="code" class="xml"><ejb-jar xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/ejb-jar_3_0.xsd"></pre><br />web.xml<br /><pre name="code" class="xml"><web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"></pre>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-18493935196192308712009-08-16T22:42:00.005+02:002009-08-16T22:49:40.126+02:00HG ignore RTFMEclipse-esek .hgignore file-jaban a <span style="font-style:italic;">.project</span> biztosan megtalalhato. Sideeffectje a dolognak, hogy barmi amiben benne van a <span style="font-style:italic;">project</span> ignoralva lesz. Hg baratunk ket pattern syntax-ot is tud, celszeru explicit megadni melyiket hasznaljuk:<br /><br /><div><br /><span style="font-weight:bold;">syntax: glob</span><br />.project<br />...<br /></div><br /><br />Tovabbi RTFM <a href="http://www.selenic.com/mercurial/hgignore.5.html">itt</a>.kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-28825324735447154282009-07-20T16:16:00.004+02:002009-07-20T16:19:22.914+02:00Building Artifactory RTFM"How do I build Artifactory from source? Maven tells me there are some missing dependencies.<br /><br />Simply download the source and run mvn clean install from within the Artifactory root module (parent").<br />To gain access to open source dependencies not currently deployed on Maven's public repositories, you have to run mvn with the artifactory profile activate. e.g.:<br />mvn clean install -Partifactory."<br /><br/><br /><p><a href="http://wiki.jfrog.org/confluence/display/RTF/Usage">http://wiki.jfrog.org/confluence/display/RTF/Usage</a><br /></p><br/>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-91983761921491210472009-07-18T01:38:00.002+02:002009-07-18T01:42:29.569+02:00Lodon Wicket (Yeah, London BABY)<p>Wicket-es eloadas slidok, forrasok, webcast-ok, stb:</p><p><a href="http://code.google.com/p/londonwicket/">London-Wicket</a></p>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-85492931779499660662008-08-08T19:15:00.003+02:002008-08-08T19:20:04.178+02:00Maven vs Apache snapshot repository<p style="margin: 10px 0 10px 0;">Addot a kovetkezo motto:</p><blockquote><p style="margin: 10px 0 10px 0;">Apache Maven Simplifies the Java Build Process — Even More Than Ant</p></blockquote><p style="margin: 10px 0 10px 0;">A fenti idezet alapjan felteteleztem, hogy egy snapshot-os dependency-t behuzhatok a sajat projectembe. Csak hat a Apache Snapshot Repository-n a kivant artifact alatt a kovetkezo kep fogadott: <a href="http://people.apache.org/repo/m2-snapshot-repository/org/apache/commons/commons-cli/2.0-SNAPSHOT/">m2-snapshot-repository</a>.</p>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0tag:blogger.com,1999:blog-608056730343816089.post-81671247227874423172008-08-07T11:24:00.000+02:002008-08-07T03:00:45.587+02:00Lazy fetching a'tka<p style="MARGIN: 10px 0px">Aki hasznalt/hasznal ORM framework-ot, biztos vagyok benne, hogy talalkozott mar a <em>LAZY</em>/<em>EAGER</em> fetching modokkal. Mind a ket loading modnak megvan az elonye/hatranya. Jelen esetben <em>LAZY</em> mod egyik igen bosszanto es gyakran elofordulo hatranyaval fogok foglalkozni, delikvens ORM pedig a Hibernate3.</p><p>Tegyuk fel, hogy three tier-es kornyezetben vagyunk es presentation tier-hez szeretnenk eljuttatni egy entity-t a business tier-bol. Az entity-nk neve legyen A.<br /></p><p style="MARGIN: 10px 0px"><div class="java" align="left"><table cellspacing="0" cellpadding="3" border="0" style="color:#ffffff;"><tbody><tr><!-- start source code --><td valign="top" align="left"><code><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>class </b></span><span style="color:#000000;">A </span><span style="color:#000000;">{</span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>private </b></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">id;</span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">List<B> b;</span><br /><span style="color:#ffffff;"></span><span style="color:#000000;">}</span><br /><span style="color:#ffffff;"></span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>class </b></span><span style="color:#000000;">B </span><span style="color:#000000;">{</span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">id;</span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>private </b></span><span style="color:#000000;">List<C> c;</span><br /><span style="color:#ffffff;"></span><span style="color:#000000;">}</span><br /><span style="color:#ffffff;"></span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>class </b></span><span style="color:#000000;">C </span><span style="color:#000000;">{</span><br /><span style="color:#ffffff;"></span><span style="color:#7f0055;"><b>int </b></span><span style="color:#000000;">id;</span><br /><span style="color:#ffffff;"></span><span style="color:#000000;">}</span></code> </td><!-- end source code --></tr></tbody></table></div><p style="MARGIN: 10px 0px">Fenti kodreszlet lenyegeben az A entitynk strukturajat mutatja. Fontos, hogy B es C is entity, tehat adatbazis szinten harom tablank van. A-ban talalhato B illetve a B-ben levo C lista <em>LAZY</em> modos fetching-t hasznal, JOIN kapcsolat van koztuk. Tehat A.getB() illetve B.getC() egy proxy-zott listat fog visszadni, csak akkor lesz populalva, ha valaki hasznalni akarja (pl. amikor vegig akarunk iteralni rajta).</p><p style="align: 10px 0 10px 0">Perfomance szempontjabol teljesen korrekt megoldas, minek betolteni azt, amit nem is biztos, hogy hasznalunk. Azonban van egy exception amivel szerintem minden Hibernate "barat" talalkozott mar: <em>org.hibernate.LazyInitializationException</em>. Ezt az exception akkor kapjuk, amikor egy proxyzott listan akarunk vegigiteralni, viszont a Hibernate session-unk mar nem letezik, igy a lista populalasa meghiusult. </p><p style="MARGIN: 10px 0px">Tegyuk fel, hogy presentation tier es a business tier kozott WebService-en keresztul mozognak az egyes entity-k. Marshalling soran (Object -> XML) valoszinuleg kapni fogunk egy exception a lazy loading miatt. A <em>LazyInitializationException</em>-t ugy tudjuk elkerulni, hogy az entitynket <em>detach</em>-eljuk, tehat a lazy loados listakat betoltjuk meg mielott a Hibernate session megszunne.</p><p style="MARGIN: 10px 0px">Kinai farmeres modszerrel megtehetjuk azt, hogy vegigiteralunk az oszes lista elemen, viszont nem a legegeszsegesebb. Szerencsere Hibernate biztosit szamunkra egy built-in utility methodot, <em>org.hibernate.Hibernate#initialize(Object proxy)</em>. A proxy-zott listakat atjuk a <em>initialize()</em> methodusnak igy initializalva lesz a listank.</p><p style="MARGIN: 10px 0px">A fentiek alapjan, azt gondolnank, hogy a kovetkezo dologgal meg is oldottuk a marshalling problemat:</p><p style="MARGIN: 10px 0px"><div class="java" align="left"><table cellspacing="0" cellpadding="3" border="0" style="color:#ffffff;"><tbody><tr><!-- start source code --><td valign="top" align="left"><code><span style="color:#ffffff;"></span><span style="color:#000000;">A a = </span><span style="color:#7f0055;"><b>...</b></span><span style="color:#000000;">;</span><br /><span style="color:#ffffff;"></span><span style="color:#000000;">Hibernate.initialize</span><span style="color:#000000;">(</span><span style="color:#000000;">a.getB</span><span style="color:#000000;">())</span><span style="color:#000000;">;</span></code> </td><!-- end source code --></tr></tbody></table></div><p></p><p style="MARGIN: 10px 0px">Ha megfigyeljuk akkor B entity szinten tartalmaz egy proxyzott listat (C). Ezen lista nem kerul initializalasra, igy B entity C listajan is meg kellene hivnunk a <em>initialize()</em> methodust. Egy nagyon complex model eseten tobb szaz soros kodreszlet lesz, ami a detach-et vegzi, ami nem a legszebb latvany, illetve konnyu hibat veteni.</p><p style="MARGIN: 10px 0px">Tegyuk fel, hogy a detach-et vegzo kodot megirtuk, viszont RMI-re valtunk WebService helyett. Az RMI legjobb tulajdonsaga az, hogy egy az egyben kiszerializalja az objecteket, nem kell DDL, WebService esetben viszont igen. Ezen jo tulajdonsaga lesz esetunkben a hatranya, ugyanis List objectek konkret tipusa Hibernate fuggo, sajat tipusok. Ha a presentation tier dependency listaja nem tartalmazza a Hibernate libeket, akkor <em>NoClassFoundException </em>fogunk kapni. </p><p style="MARGIN: 10px 0px">Most erkeztunk el a lenyeghez amiert ezt a post-ot megirtam. Letezik egy megoldas, ami a teljes detach-es kodiras terhet leveszi a vallunkrol, illetve a RMI-s problemat is eliminalja. A utility class neve, ami nem resze a Hibernate CORE-nak (egyenlore), <a href="http://lists.jboss.org/pipermail/jboss-user/2008-July/126064.html">HibernateCleaner</a>. Ahoz, hogy detach-eljuk illetve a megszabaduljunk a hibernate dependent class tipusoktol, meg kell hivnunk a <em>clean()</em> metodust.</p>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com3tag:blogger.com,1999:blog-608056730343816089.post-51440805009041713392008-08-04T20:02:00.000+02:002008-08-04T23:09:46.527+02:00TestCase debugolas ala SureFire<p>Kovetkezo problemaval szembesultunk a minap: Adott N darab TestNG-s TestCase + Maven. TestNG-s Eclipse plugin-al az osszes TestCase szepen lefut, viszont <span style="font-family:lucida grande;font-size:12px;"><em>mvn clean install</em></span> hatasara failel 2-3 db. </p><p>Roviden tomoren, a reakcio: <strong>W*F???</strong></p><p style="MARGIN: 10px 0px">Mivel az intuicios kepesseg csodot modott, ezert debugos modszereket vetettunk be. Eloszor minden jozan eszu ember, aki m2eclipse-et hasznal, megporbalja maven-os runnerrel debug-olni. Problema az, hogy breakpoint-on atszaladt az egesz, kvazi surefire va... (oreg es faradt vagyok, hogy megnezzem a plugin forrasat, akinek konkluzio kell varjon egy kicsit :P)</p><p style="MARGIN: 10px 0"><strong>RTFM:</strong></p><div style="width: 100%; background-color: silver;border:1px solid black; display: block;"><p style="margin: 10px 10px 10px 10px"><span style="font-family:lucida grande;font-size:12px;"><em>mvn clean install -Dmaven.surefire.debug="-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 -Xnoagent"</em></span></p></div><p style="MARGIN: 10px 0px 10px 0px">A fenti "magic" parameterrel ellatott maven, lehetove teszi, hogy remote debug-oljuk a TestCase-ek futtatasat/futasat.</p><p style="margin: 10px 0 10px 0">Ref.: <a href="http://maven.apache.org/plugins/maven-surefire-plugin/examples/debugging.html">Surfire - Debugging Tests</a></p>kackhttp://www.blogger.com/profile/07631438113608814496noreply@blogger.com0