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

<channel>
	<title>www.konri.com &#187; Java</title>
	<atom:link href="http://www.konri.com/category/java/feed" rel="self" type="application/rss+xml" />
	<link>http://www.konri.com</link>
	<description>KONRI.COM - Java, GWT, Spring, Billing dla SaaS...</description>
	<lastBuildDate>Mon, 19 Jul 2010 07:26:03 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Szybka konwersja obiektu na i z XML&#8217;a</title>
		<link>http://www.konri.com/2010/02/szybka-konwersja-obiektu-na-i-z-xmla</link>
		<comments>http://www.konri.com/2010/02/szybka-konwersja-obiektu-na-i-z-xmla#comments</comments>
		<pubDate>Fri, 26 Feb 2010 12:49:12 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=455</guid>
		<description><![CDATA[<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>1904</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>1904</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>2257</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3206</b><br />
<br />
<b>Warning</b>:  implode() [<a href='function.implode'>function.implode</a>]: Argument must be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3258</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3289</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3289</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3332</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3332</b><br />
<br />
<b>Warning</b>:  array_keys() [<a href='function.array-keys'>function.array-keys</a>]: The first argument should be an array in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3477</b><br />
<br />
<b>Warning</b>:  Invalid argument supplied for foreach() in <b>/home/konrad/public_html/wp-content/plugins/wp-syntax/geshi/geshi.php</b> on line <b>3477</b><br />
Często pisząc krótkie &#8220;spike&#8217;i&#8221; (dla nie wtajemniczonych mianem spike określa się testowe/demonstracyjne aplikacje, lub ich zmodyfikowane fragmenty) potrzebujemy gdzieś zapisać lub przesłać obiekt Javy w formacie XML&#8217;a. Znajdziemy całą masę rozwiązań wspomagających to zadanie, jednak gdy zależy nam na czasie, niekiedy najprostsze rozwiązania są najlepsze.
Oto bardzo szybki przykład takiego zadania:

package com.konri.spikes.xml;
&#160;
import java.beans.XMLDecoder;
import java.beans.XMLEncoder;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.UnsupportedEncodingException;
import java.text.MessageFormat;
&#160;
public class Sample &#123;
&#160;
	public static void main&#40;String&#91;&#93; args&#41; throws UnsupportedEncodingException &#123;
		SampleObj sampleObj = new SampleObj&#40;&#41;;
		sampleObj.setLabel&#40;&#34;This is test message&#34;&#41;;
		sampleObj.setValue&#40;123&#41;;
		sampleObj.setCheck&#40;true&#41;;
&#160;
		String res = write&#40;sampleObj&#41;;
		System.out.println&#40;&#34;XML:\n&#34; + res&#41;;
&#160;
		SampleObj sampleObj2 = read&#40;res&#41;;
		System.out.println&#40;&#34;Loaded object: &#34; + sampleObj2&#41;;
	&#125;
&#160;
	public static class ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/02/szybka-konwersja-obiektu-na-i-z-xmla/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zanim zdecydujesz się na Google App Engine</title>
		<link>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine</link>
		<comments>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine#comments</comments>
		<pubDate>Tue, 12 Jan 2010 20:19:54 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=402</guid>
		<description><![CDATA[Zanim zdecydujesz się na Google App Engine warto wiedzieć o pewnych przypadłościach i zastosowanych rozwiązaniach.

[-] Zapytania do Datastore mogą zwrócić jedynie do 1000 rekordów, zespół GAE pracuje nad propozycją kursora, który będzie pozwalał na iteracje po większej ilości danych.
[--] Duże limitacje GQL &#8211; w sortowaniu oraz użyciu operatorów. Szczegóły można przeczytać tutaj.
[---] Znaczne zużycie API CPU dla zapisu i odczytu danych z Datastore, zwłaszcza gdy ich hierarchia jest dość głęboka (więcej na ten temat w moim poprzednim poście &#8211; i o rozwiązaniu używając pola Serializowalnego).
[-] Długi czas tworzenia indeksów &#8211; ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/zanim-zdecydujesz-sie-na-google-app-engine/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pole serializowalne w GAE datastore</title>
		<link>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore</link>
		<comments>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore#comments</comments>
		<pubDate>Sun, 03 Jan 2010 21:18:13 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=393</guid>
		<description><![CDATA[W poprzednim poście napisałem o problemach z niebywale dużym zużyciem CPU podczas operacji zapisu do datastore Google App Engine. Od kilku dni zastanawiałem się, jak zaradzić temu problemowi &#8211; rozwiązanie znalazłem i zaimplementowałem dosłownie przed chwileczką.
Struktura rekordu z danymi zapisywany podczas zapytania do API była dość rozgałęziona &#8211; coś w stylu drzewa o 3 poziomach na drugim poziomie około 3-4 rekordów &#8211; na kolnym po około 2-3 dla każdego elementu z poziomu wyżej. Co ważne, żaden z elementów poniżej głównego rekordu nie był używany w zapytaniach.
Po kilku nieudanych próbach ograniczenia ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/pole-serializowalne-w-gae-datastore/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Czy użycie CPU przez Datastore Cię zrujnuje?</title>
		<link>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje</link>
		<comments>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje#comments</comments>
		<pubDate>Fri, 01 Jan 2010 22:18:16 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=372</guid>
		<description><![CDATA[Bawiąc się z małym projektem aplikacji dla Google App Engine doszedłem do różnych interesujących wniosków.
Jednym z ciekawszych jest użycie CPU &#8211; i bynajmniej nie CPU generowanego przez kod samej aplikacji &#8211; a CPU użyte przez datastore (jak wywnioskować można z panelu administracyjnego &#8211; około 90% użycia CPU jest generowane przez API Calls CPU).
Konsumowane jest ono w dość dużym tempie. Moja przykładowa aplikacja zapisuje pewne dane przy zapytaniu przesłanym do API. Zapytanie takie może zapisać/uaktualnić około (oszacowane manualnie na podstawie definicji modelu klas danych) 20 wierszy, musi załadować również dwa troszkę ...]]></description>
		<wfw:commentRss>http://www.konri.com/2010/01/czy-uzycie-cpu-przez-datastore-cie-zrujnuje/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google App engine i DatastoreTimeoutException</title>
		<link>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception</link>
		<comments>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception#comments</comments>
		<pubDate>Mon, 28 Dec 2009 22:55:42 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[datastore]]></category>
		<category><![CDATA[google]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=383</guid>
		<description><![CDATA[Po kilku tygodniach zabawy z GAE zauważyć można masę problemów. Jedną z bardzo denerwujących przypadłości Clouda w wykonaniu Google jest problem z Datastore, do którego proste zapytanie przekracza dozwolony czas odpowiedzi.
Logi prostej aplikacji po pewnym czasie pełne są informacji o DatastoreTimeoutException.
Na dyskusję na ten temat można natknąć się tu. Sugestią inżynierów z Google zdaje się być ponowienie próby operacji na datastor&#8217;ze w przypadku takiego błędu. O ile nie najgorzej to wygląda w przypadku odczytu danych o tyle już sprawa zapisu z takim rozwiązaniem była by co nieco dyskusyjna. Jak na ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/12/google-app-engine-i-datastoretimeoutexception/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Google AppEngine &#8211; kolejne schody&#8230;</title>
		<link>http://www.konri.com/2009/10/google-appengine-kolejne-schody</link>
		<comments>http://www.konri.com/2009/10/google-appengine-kolejne-schody#comments</comments>
		<pubDate>Mon, 12 Oct 2009 18:20:16 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=327</guid>
		<description><![CDATA[
Ech. Nie jest łatwo zaprzyjaźnić się z GAE. Ciągle jakieś schody&#8230;
Przed momentem odkryłem problem z dostępem za pomocą refleksji do java.util.TimeZone, chcąc wyświetlić listę stref czasowych.
Wszystko zaczęło się niewinnie, od atrybutu modelu, zawierającego przefiltrowane listy:

@ModelAttribute&#40;&#34;timeZones&#34;&#41;
public List&#60;TimeZone&#62; getTimeZones&#40;&#41; &#123;
    return TimeTools.TIME_ZONES;
&#125;

i kodu jsp:

&#60;form:select path=&#34;timeZoneID&#34;&#62;
    &#60;form:options items=&#34;${timeZones}&#34; itemValue=&#34;id&#34; itemLabel=&#34;displayName&#34;/&#62;
&#60;/form:select&#62;

Po otwarciu tego JSP AppEngine wyrzuca błąd:
HTTP ERROR: 500
access denied (java.lang.RuntimePermission accessClassInPackage.sun.util.calendar)
RequestURI=/product/add.htm
Caused by:
java.security.AccessControlException: access denied (java.lang.RuntimePermission accessClassInPackage.sun.util.calendar)
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:323)
at java.security.AccessController.checkPermission(AccessController.java:546)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
at com.google.appengine.tools.development.DevAppServerFactory
$CustomSecurityManager.checkPermission(DevAppServerFactory.java:139)
&#8230;
Problem tkwi w tym, że form:options używa refleksji do pobrania pól id dla itemValue oraz displayName dla itemLabel. ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/10/google-appengine-kolejne-schody/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kod źródłowy aplikacji FinPlan.pl dostępny publicznie</title>
		<link>http://www.konri.com/2009/07/kod-zrodlowy-aplikacji-finplan-pl-dostepny-publicznie</link>
		<comments>http://www.konri.com/2009/07/kod-zrodlowy-aplikacji-finplan-pl-dostepny-publicznie#comments</comments>
		<pubDate>Sat, 04 Jul 2009 20:33:04 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[GWT]]></category>
		<category><![CDATA[Informacje]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=282</guid>
		<description><![CDATA[Dzisiaj postanowiłem udostępnić kod źródłowy aplikacji FinPlan.pl publicznie. Do tego na zasadach licencji Apache 2.0.
Dość długo nosiłem się z takim zamiarem, dziś w końcu znalazłem czas by go urzeczywistnić.
Co to jest FinPlan.pl
Samą aplikację można zobaczyć pod adresem http://www.finplan.pl. Serwis pozwala na przeanalizowanie swojej obecnej sytuacji finansowej oraz zaplanowanie oszczędności, tak by ułatwić     osiągnięcie przyszłych celów finansowych. Opcjonalna rejestracja w serwisie pozwoli te plany weryfikować i     dostosowywać do bieżącej sytuacji &#8211; zarówno zawodowej jak i ekonomicznej. Na łamach serwisu mogą być udostępniane spersonalizowane ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/07/kod-zrodlowy-aplikacji-finplan-pl-dostepny-publicznie/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Springframework i Jackrabbit (JCR)</title>
		<link>http://www.konri.com/2009/06/springframework-i-jackrabbit-jcr</link>
		<comments>http://www.konri.com/2009/06/springframework-i-jackrabbit-jcr#comments</comments>
		<pubDate>Wed, 10 Jun 2009 19:52:32 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[Spring Framework]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=219</guid>
		<description><![CDATA[Z góry zaznaczam, że specjalnym sympatykiem JSR1 ani Jackrabbit&#8217;a nie jestem, i póki co dwa razy zastanowił się bym, czy użyć go w produkcyjnym systemie. Wydaje mi się, że nie jest to technologia wystarczająco dojrzała, w internecie można natrafić na informacje od wielu osób skarżących się na problemy przeróżnej natury, od integracji z innymi narzędziami poprzez skalowalność aż po niełatwy backup. Lecz czasem coś po prostu jest Ci &#8220;dane&#8221;, więc trzeba się z tym oswoić i starać się podejść do tego z najlepszej strony.
Pierwszym problemem, jaki musiałem rozwiązać, była integracja ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/06/springframework-i-jackrabbit-jcr/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>InvalidQueryException: Parse error: data is not a RelationQueryNode</title>
		<link>http://www.konri.com/2009/05/invalidqueryexception-parse-error-data-is-not-a-relationquerynode</link>
		<comments>http://www.konri.com/2009/05/invalidqueryexception-parse-error-data-is-not-a-relationquerynode#comments</comments>
		<pubDate>Thu, 28 May 2009 08:54:41 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[jackrabbit]]></category>
		<category><![CDATA[jcr]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=254</guid>
		<description><![CDATA[
Ostatnio z potrzeb zawodowych zająłem się JCR - konkretnie Jackrabbitem. Próbując załadować obiekt z repozytorium otrzymywałem błąd: InvalidQueryException: Parse error: data is not a RelationQueryNode. Błąd spowodowany był tym, że nie kodowałem XPath&#8217;a którego używałem do załadowania obiektów.
Błąd był spowodowany niewłaściwym kodowaniem znaków, ID obiektu, który chciałem załadować składało się z liczb, przesłane bez zakodowania ISO-9075 powodowało błąd.
Wystarczyło dodać kodowanie za pomocą klasy org.apache.jackrabbit.util.ISO9075 (znajduje się ona w bibliotece jackrabbit-jcr-commons-1.5.5.jar).
Przykładowe rozwiązanie:
[java]return (Person) jcrMappingTemplate.getObject(&#8220;/person/&#8221; + ISO9075.encode(id));[/java]
by wszystko wróciło do normy.
]]></description>
		<wfw:commentRss>http://www.konri.com/2009/05/invalidqueryexception-parse-error-data-is-not-a-relationquerynode/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Spring i RESTTemplate</title>
		<link>http://www.konri.com/2009/04/spring-i-resttemplate</link>
		<comments>http://www.konri.com/2009/04/spring-i-resttemplate#comments</comments>
		<pubDate>Mon, 06 Apr 2009 21:35:11 +0000</pubDate>
		<dc:creator>Konrad</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Polecane]]></category>
		<category><![CDATA[Spring Framework]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[springframework]]></category>

		<guid isPermaLink="false">http://www.konri.com/?p=148</guid>
		<description><![CDATA[Jak donosi blog twórców Spring framework, a konkretnie Arjen Poustma, Spring 3.0 zostanie wzbogacony o nowy Template &#8211; a mianowicie RestTemplate, który ma być podobny do już istniejących szablonów, takich jak  JdbcTemplate czy JmsTemplate, co oznacza między innymi synchronizację (thread-safe) czy rozszerzanie operacji przez tzw. operacje callback.
RestTemplate pozwalać będzie na automatyczne konwertowanie odpowiedzi na obiekt Java. Kilka standardowych konwerterów będzie wbudowanych (domyślam się, że JSON i XML), łatwo będzie również rozszerzyć je o własne implementacje. 
RestTemplate oferować będzie wszystkie podstawowe metody REST (GET, POST, PUT, DELETE, HEAD oraz OPTIONS). ...]]></description>
		<wfw:commentRss>http://www.konri.com/2009/04/spring-i-resttemplate/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
