<?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>AspectWorks</title>
	<atom:link href="http://www.aspectworks.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.aspectworks.com</link>
	<description>Vyvíjíme chytré webové aplikace pro střední a velké podniky</description>
	<lastBuildDate>Thu, 26 Jan 2012 14:25:59 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<item>
		<title>Synchronizace scheduleru v clusteru</title>
		<link>http://www.aspectworks.com/2012/01/synchronizace-scheduleru-v-clusteru</link>
		<comments>http://www.aspectworks.com/2012/01/synchronizace-scheduleru-v-clusteru#comments</comments>
		<pubDate>Thu, 26 Jan 2012 13:48:48 +0000</pubDate>
		<dc:creator>Tomáš Holý</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=3123</guid>
		<description><![CDATA[Na našem projektu Starthead jsme potřebovali implementovat automatické provádění úkolu určeného ke zpracovávání dat v databázi. Ve frameworku Spring, který je pro vývoj použit, je tato úloha jednoduše řešitelná například<a href="http://www.aspectworks.com/2012/01/synchronizace-scheduleru-v-clusteru" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Na našem projektu <a href="http://www.starthead.com" title="Starthead">Starthead</a> jsme potřebovali implementovat automatické provádění úkolu určeného ke zpracovávání dat v databázi. Ve frameworku Spring, který je pro vývoj použit, je tato úloha jednoduše řešitelná například pomocí <a title="TaskScheduler" href="http://static.springsource.org/spring/docs/3.1.x/javadoc-api/org/springframework/scheduling/TaskScheduler.html">TaskScheduler</a>.<br />
Zajímavější situace nastává, pokud má aplikace bežet v clusterovém řešení. To znamená, že je potřeba řešit synchronizaci, aby nedocházelo k vícenásobnému spouštění jobů ve stejný čas. Snažili jsme se najít co nejjednodužší řešení, které by splňovalo danou podmínku a tím se v našem případě ukázalo využití Quartz scheduleru s patřičnou clusterovou konfigurací a synchronizováním pomocí ukládání do databáze.<span id="more-3123"></span><br />
Zde je uveden jednoduchý příklad vytvoření takového úkolu a jeho konfigurace ve Spring frameworku.</p>
<p><strong>Implementace jednoduchého jobu</strong></p>
<pre class="brush: java; title: ; notranslate">
package com.aspectworks;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.StatefulJob;
import org.springframework.scheduling.quartz.QuartzJobBean;
public class TestJob extends QuartzJobBean implements StatefulJob {
	private TestService testService;
	protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
		//implementace úkolu
	}
	public void setTestService(TestService testService) {
		this.testService = testService;
	}
}
</pre>
<p><strong>Definice triggeru úkolu pomocí Cron definice</strong></p>
<pre class="brush: xml; title: ; notranslate">
&lt;bean id=&quot;testTrigger&quot; class=&quot;org.springframework.scheduling.quartz.CronTriggerBean&quot;&gt;
	&lt;property name=&quot;jobDetail&quot;&gt;
		&lt;bean class=&quot;org.springframework.scheduling.quartz.JobDetailBean&quot;&gt;
			&lt;property name=&quot;jobClass&quot; value=&quot;com.aspectworks.TestJob&quot; /&gt;
			&lt;property name=&quot;name&quot; value=&quot;TestJob&quot; /&gt;
		&lt;/bean&gt;
	&lt;/property&gt;
	&lt;property name=&quot;jobDataAsMap&quot;&gt;
		&lt;map&gt;
			&lt;entry key=&quot;testAttribute&quot; value=&quot;value &quot; /&gt;
		&lt;/map&gt;
	&lt;/property&gt;
	&lt;property name=&quot;cronExpression&quot; value=&quot;1 * * * * ?&quot; /&gt;
&lt;/bean&gt;
</pre>
<p><strong>Konfigurace scheduleru pro clusterové řešení</strong></p>
<pre class="brush: xml; title: ; notranslate">&lt;bean class=&quot;org.springframework.scheduling.quartz.SchedulerFactoryBean&quot;&gt;
&lt;property name=&quot;waitForJobsToCompleteOnShutdown&quot; value=&quot;true&quot; /&gt;
	&lt;property name=&quot;dataSource&quot; ref=&quot;dataSource&quot; /&gt;
	&lt;property name=&quot;overwriteExistingJobs&quot; value=&quot;true&quot; /&gt;
	&lt;property name=&quot;autoStartup&quot; value=&quot;true&quot; /&gt;
	&lt;property name=&quot;triggers&quot;&gt;
		&lt;list&gt;
			&lt;ref bean=&quot;testTrigger&quot; /&gt;
		&lt;/list&gt;
	&lt;/property&gt;
	&lt;property name=&quot;quartzProperties&quot;&gt;
		&lt;props&gt;
			&lt;prop key=&quot;org.quartz.scheduler.instanceName&quot;&gt;TestScheduler&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.scheduler.instanceId&quot;&gt;AUTO&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.jobStore.misfireThreshold&quot;&gt;60000&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.jobStore.class&quot;&gt;org.quartz.impl.jdbcjobstore.JobStoreTX&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.jobStore.driverDelegateClass&quot;&gt;org.quartz.impl.jdbcjobstore.StdJDBCDelegate&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.jobStore.tablePrefix&quot;&gt;QRTZ_&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.jobStore.isClustered&quot;&gt;true&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.threadPool.class&quot;&gt;org.quartz.simpl.SimpleThreadPool&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.threadPool.threadCount&quot;&gt;25&lt;/prop&gt;
			&lt;prop key=&quot;org.quartz.threadPool.threadPriority&quot;&gt;5&lt;/prop&gt;
		&lt;/props&gt;
	&lt;/property&gt;
	&lt;property name=&quot;schedulerContextAsMap&quot;&gt;
		&lt;map&gt;
			&lt;entry key=&quot;testService&quot; value-ref=&quot;testService&quot; /&gt;
		&lt;/map&gt;
	&lt;/property&gt;
&lt;/bean&gt;</pre>
<p>V dané konfiguraci je důležité nastavení atributů obsahujících <em>org.quartz.jobStore</em> a <em>org.quartz.impl.jdbcjobstore</em>. Ty říkají, že úkoly poběží v clusteru, a že se má provést jejich ukládání do tabulek s prefixem QRTZ_. Toto nastavení nám samo zajistí, že po inicializaci se úkol uloží do databáze s příslušnými parametry a ve chvíli vykonávání úkolu smí pouze jeden stroj v clusteru provést jeho spuštění. Právo na vykonání úkolu dostane první z běžících strojů v clusteru, který o to požádá.</p>
<p><strong>Vysvětlení nejdůležitějších atributů:</strong><br />
<strong>org.quartz.jobStore.isClustered</strong> – definování běhu úkolu v clusteru<br />
<strong>org.quartz.scheduler.instanceId</strong> – nastavení typu určování id instance (defaultně nastaveno na NON_CLUSTERED)<br />
<strong>org.quartz.jobStore.class</strong> – definování typu ukládání synchronizace úkolů (v našem případě definuje ukládání do databáze)<br />
<strong>org.quartz.jobStore.driverDelegateClass</strong> – definování driveru pro ukládání dat do databáze (v našem případě MySQL). Sql soubor pro založení tabulek můžete najít v adresáři doc v konkrétní verzi quartz implementace.<br />
<strong>org.quartz.jobStore.tablePrefix</strong> – nastavení prefixu Qartz tabulek pro ukládání synchronizace úkolů</p>
<p>Pokud se použije ukládání úkolů do databáze, ukládá se společně s JobDetailem i mapa jeho atributů jobDataAsMap. To znamená, že musí být možné je serializovat a také, že by to neměly být žádné objekty s aplikační logikou. Pokud je potřeba v úkolu využít nějakou service spravovanou Springem, je lepší ji předat do úkolu přes schedulerContextAsMap definovanou v SchedulerFactoryBeanu. Tento způsob uloží objekty do contextu Scheduleru a do úkolů je předá až při jejich inicializování, tedy bez nutnosti ukládání do databáze s ostatnímy atributy.</p>
<p>Více o Quartz schedulerech je možné najít na stránkách <a title="http://quartz-scheduler.org/overview" href="http://quartz-scheduler.org/overview">http://quartz-scheduler.org/overview</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2012/01/synchronizace-scheduleru-v-clusteru/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>XPath a Selenium testy</title>
		<link>http://www.aspectworks.com/2012/01/xpath-a-selenium-testy</link>
		<comments>http://www.aspectworks.com/2012/01/xpath-a-selenium-testy#comments</comments>
		<pubDate>Thu, 05 Jan 2012 09:02:32 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[ @cs]]></category>
		<category><![CDATA[Testování]]></category>
		<category><![CDATA[xpath]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=3083</guid>
		<description><![CDATA[XPath je dotazovací jazyk (query language) pro XML dokument. Nečekejte náhradu w3schools tutorialu, ale dozvíte se jak najít element v DOMu pomocí funkcí a atributů. Na názorném příkladu si ukážeme,<a href="http://www.aspectworks.com/2012/01/xpath-a-selenium-testy" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>XPath je dotazovací jazyk (query language) pro XML dokument. Nečekejte náhradu <a href="http://www.w3schools.com/xpath/">w3schools tutorialu</a>, ale dozvíte se jak najít element v <a href="http://cs.wikipedia.org/wiki/Document_Object_Model">DOMu</a> pomocí funkcí a atributů. Na názorném příkladu si ukážeme, jak lze XPath využít při psaní Selenium testů webových aplikací. Selenium používá jako <a href="http://release.seleniumhq.org/selenium-remote-control/0.9.0/doc/java/com/thoughtworks/selenium/Selenium.html">lokátory</a> například id, name, css selektor, text odkazu nebo právě XPath.<br />
<span id="more-3083"></span></p>
<p>Mějme následující HTML stránku.</p>
<pre class="brush: xml; title: ; notranslate">
&lt;html&gt;
	&lt;head&gt;
		&lt;title&gt;User list&lt;/title&gt;
	&lt;/head&gt;
	&lt;body&gt;
		&lt;table&gt;
			&lt;tr&gt;
				&lt;td&gt;Joe Smith&lt;/td&gt;
				&lt;td&gt;&lt;a href=&quot;edit.do?id=1&quot;&gt;Edit&lt;/a&gt; | &lt;a href=&quot;delete.do?id=1&quot;&gt;Delete&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td&gt;Eddie Johnson&lt;/td&gt;
				&lt;td&gt;&lt;a href=&quot;edit.do?id=2&quot;&gt;Edit&lt;/a&gt; | &lt;a href=&quot;delete.do?id=2&quot;&gt;Delete&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
				&lt;td&gt;Jack McCarthy&lt;/td&gt;
				&lt;td&gt;&lt;a href=&quot;edit.do?id=3&quot;&gt;Edit&lt;/a&gt; | &lt;a href=&quot;delete.do?id=3&quot;&gt;Delete&lt;/a&gt;&lt;/td&gt;
			&lt;/tr&gt;
		&lt;/table&gt;
		&lt;button&gt;New user&lt;/button&gt;
	&lt;/body&gt;
&lt;/html&gt;
</pre>
<p>V testovacím scénáři potřebujeme editovat uživatele &#8216;Eddie Johnson&#8217;.</p>
<pre class="brush: plain; title: ; notranslate">/html/body/table/tbody/tr[2]/td[2]/a[1]</pre>
<p>Toto je plný XPath dotaz. Nicméně lokátory je třeba co nejvíce abstrahovat od struktury stránky, aby vám jejich drobná změna nerozbila testy.</p>
<pre class="brush: plain; title: ; notranslate">//a[@href='edit.do?id=2']</pre>
<p>To ovšem přepokládá, že víme jaké má Eddie id.</p>
<pre class="brush: plain; title: ; notranslate">//a[contains(@href,'edit.do')][2]</pre>
<p>Ani tentokrát není dotaz ideální, protože spoléháme na to, že Eddie bude na druhém řádku tabulky.</p>
<pre class="brush: plain; title: ; notranslate">//tr//*[contains(text(), 'Eddie Johnson')]</pre>
<p>Takto nalezneme element obsahující text &#8216;Eddie Johnson&#8217;. Nicméně potřebujeme vybrat odkaz sice na stejné řádku ale v jiném sloupci. Řešením je najít předka pomocí klíčového slova <strong>ancestor</strong>. Nalezení odkazu na daném řádku už je hračka. Výsledný dotaz vypadá následovně.</p>
<pre class="brush: plain; title: ; notranslate">//tr//*[contains(text(), 'Eddie Johnson')]/ancestor::tr/td/a[contains(text(), 'Edit')]</pre>
<p>Příklady si můžete vyzkoušet ve Firefox pluginu <a href="https://addons.mozilla.org/en-US/firefox/addon/xpather/">XPather</a>.<br />
S nainstalovaným pluginem se vám kontextové menu (pravé tlačítko myši) rozšíří o možnost &#8222;Show in XPather&#8220;.</p>
<p><img class="aligncenter size-full wp-image-3088" title="xpath" src="http://www.aspectworks.com/wp-content/uploads/2012/01/xpath.png" alt="Ukázka pluginu XPather" width="755" /></p>
<p><strong>Související články</strong></p>
<p><a href="http://www.aspectworks.com/2010/12/konfigurace-selenium-testu-ve-springu">Konfigurace Selenium testů ve Springu</a><br />
<a href="http://www.aspectworks.com/2010/06/selenium-a-navrhovy-vzor-page-objects">Selenium a návrhový vzor Page Objects</a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2012/01/xpath-a-selenium-testy/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>IntelliJ Idea pro vývoj v Javě</title>
		<link>http://www.aspectworks.com/2011/12/intellij-idea-pro-vyvoj-v-jave</link>
		<comments>http://www.aspectworks.com/2011/12/intellij-idea-pro-vyvoj-v-jave#comments</comments>
		<pubDate>Wed, 14 Dec 2011 09:27:14 +0000</pubDate>
		<dc:creator>Jaroslav Kavalec</dc:creator>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=3048</guid>
		<description><![CDATA[Většina lidí si vývoj v Javě spojí s jedním ze dvou nejpoužívanějších IDE &#8211; Eclipse a Netbeans. Třetí, donedávna čistě komerční IDE je často neprávem přehlíženo. Před pár dny byla<a href="http://www.aspectworks.com/2011/12/intellij-idea-pro-vyvoj-v-jave" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Většina lidí si vývoj v Javě spojí s jedním ze dvou nejpoužívanějších IDE &#8211; Eclipse a Netbeans. Třetí, donedávna čistě komerční IDE je často neprávem přehlíženo. Před pár dny byla uvolněna nová verze IDE IntelliJ Idea s číslem 11. IntelliJ Idea (dále jen Idea), je vyvíjena firmou Jet Brains, která se zaměřuje na vývoj špičkových vývojových nástrojů pro různé programovací jazyky, mimo jiné IDE pro Ruby, Python nebo Objective C. V článku se budu snažit shrnout věci, které jsem si oblíbil a chybí nebo jsou v horším provedení u konkurence (především Eclipse).<span id="more-3048"></span></p>
<p>Idea je dodávána ve dvou edicích &#8211; Ultimate a Comunity, která je k dispozici zdarma. Comunity edici chybí pluginy na vývoj Java enterprise aplikací postavených na Springu, Hibernate, JPA, EJB, GWT a další a proto se v článku budu zabývat Ultimate edicí.</p>
<h2>Enterprise vývoj</h2>
<p>Idea má ve své Ultimate edici bohatou sadu pluginů podporujíchích vývoj enterprise aplikací běžících na široké škále aplikačních serverů, využívajících mnoho frameworků. Pojďme si tedy pžiblížit nějaké nástroje, kterí nám dá IDE k dispozici.</p>
<h3>Spring a Hibernate</h3>
<p>Idea si velmi dobře rozumí se Springem. Dokáže si sestavit model celé aplikace, vygenerovat diagram závislostí jednotlivých beanů, a jednotlive chyby, které se třeba v Eclipse zjistí až v runtime, se projeví okamžitě při psaní chybného kódu. Toto funguje jak s autowiringem, tak se Spring AOP. Dále je k dispozici mnoho dalších pomůcek jako generování kódu, podpora pro snadnou editaci xml konfuguračních souborů nebo snadný import beanů přímo do testů, nebo vygenerování diagramu který přehledně zobrazí závislosti jednotlivých beanů nakonfigurovaných Spring kontejnerem.</p>
<p><a href="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG1.png" rel="lightbox[3048]"><img class="aligncenter size-large wp-image-3049" title="Intellij Idea" src="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG1-1024x654.png" alt="" width="640" height="408" /></a></p>
<p>Třída je na outline editoru oanotována ikonkou značící, že se jedná o komponentu, při kliku na ikonu je možné se přesunout do konfiguračního xml souboru s deklarací komponenty. Další anotace značí komponenty, které jsou autowirovány Spring kontejnerem do komponenty. U komponenty TwitterServiceImpl byla odebrána anotace @Service, takže není registrována v kontejneru a je na první pohled vidět že něco není v pořádku, jelikož chybí ikona.</p>
<p>Podpora Hibernate a JPA je také na velmi vysoké úrovni. Idea opět sestaví model doménových tříd v aplikaci, dokáže z něj vygenerovat i ER diagram, s modelem jde dále pracovat. Velmi užitečné je, že má Idea podporu pro editaci Hibernate i JPA dotazů přímo v Java kódu, takže se jakákoli chyba v dotazech projevuje okamžitě a také je možné využít autocompletition jak pro jednotlivé entity tak pro různé funkce dotazovacího jazyka.</p>
<h3>Properties a lokalizace</h3>
<p>Velmi příjemná je práce s lokalizavanými zprávami a properties soubory obecně. Lokalizované zprávy mají speciální editor, v němž se všechny zprávy zobrazí pro editaci současně, v případě že zapomenete překlad tak je položka s chybějícím textem zvýrazněna. Idea dokonce vyznačí varování v případě, že nějakou property nelze najít v property souborech aplikace, takže není nutné čekat než se taková chyba projeví v runtime.</p>
<p>Velmi dobrá věc kterou je možné využít je propisování properties přímo do Java kódu.</p>
<div id="attachment_3050" class="wp-caption aligncenter" style="width: 650px"><a href="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG2.png" rel="lightbox[3048]"><img class="size-large wp-image-3050" title="Idea" src="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG2-1024x640.png" alt="" width="640" height="400" /></a><p class="wp-caption-text">Pohled na nastavení IDE - panel s inspekcemi</p></div>
<h2>Vývoj webu</h2>
<p>IntelliJ si velmi dobře dokáže poradit s HTML a CSS, a také velmi dobře si rozumí s JavaScriptem a mnoha JS knihovnami. Výborná je například podpora jQuery, různých technologií z rodiny HTML5 či pokročilých možností CSS3 a to včetně vendor prefixů. Pro příznivce CSS pre-procesorů je tu v základu podpora LESS, SASS a SCSS. Dokonce se prodává i samostatná verze, určená jen pro vývoj webu, bez podpory Javy, což svědčí o tom, že tato funkčnost není jen navíc ale, že dokáže stát i sama o sobě. K dispozici je i velmi dobrý JavaScript debugger. Java programátoři jistě ocení pohodlnou práci s JSP stránkami.</p>
<h2>Editace textu</h2>
<p>Toto je oblast v které Idea vyniká. Idea nabízí mnoho detailů které když se sečtou, tak vytvoří velmi silný nástroj na editaci textu:</p>
<p>- Autocompletition &#8211; jedna z důležitých vlastností moderních IDE, Idea má velmi mnoho možností jak doplňovat text i podle částí slov, podle prvních písmen camel-case identifikátorů, a také jsou možnosti nabízeny podle kontextu, v němž se nachází právě editovaný kód, takže většinou je nejvhodnější možnost jako první.</p>
<p>- Navigace &#8211; ve větších projektech je určitě důležité se velmi rychle navigovat v textu i mezi soubory. Idea má nepřeberné množství různých metod navigace jako je hledaní souborů, tříd, nebo symbolů. přecházení mezi třídou a testem k ní náležícímu, mezi rozhraními a implementacemi, navigace v hierarchii&#8230;</p>
<p>- Oblíbené položky a skupiny oblíbených položek</p>
<p>- Inkrementální výběr textu kdy se s každým výběrem rozšíří vybraný text obecně ve formátu slovo-&gt;camelCase-&gt;identifikátor-&gt;výraz-&gt;blok kódu-&gt;metoda</p>
<p>- Rozeznání camel case</p>
<p>- Obalení vybraného textu párovým symbolem</p>
<p>- Velmi dobře zpracované šablony na vkládání často používaných výrazů (opravdu značné vylepšení proti Eclipse, podrobnějčí popis je nad rámec článku)</p>
<p>- XML editace &#8211; velmi dobře funguje a editování xml už není utrpení (tady srovnávám s Eclipsem), navíc je možné použít různé transformace dokumentu, a využít vylepšenou podporu pro editaci specifických XML jako například Spring konfigurace</p>
<p>- Kontrola slov slovníkem &#8211; v praxi velmi užitečná věc, okamžitě se tak odhalí překlepy jak v kódu, tak v komentářích, čímž se předejde zbytečným opravám v budoucnu</p>
<p>- Zalamování řádků, na první pohled nevýznamná ale v praxi velmi užitečná funkčnost, zalamovat je možné jak v editoru tak i v konzoli (konzole nabízí navíc folding a filtrování textu)</p>
<p>- navigace v souborech v kódu &#8211; Idea ví o všech souborech v projektu, když se třeba v kódu odkazujete na soubor, který neexistuje tak vás na to upozorní.</p>
<h2>Analýza kódu</h2>
<p>IDE obsahuje velmi kvalitní nástroj na analýzu kódu &#8211; k dispozici je velmi rozsáhlá knihovna inspekcí, které je možno vypnout a zapnout, dle potřeby týmu. IDE pak vyznačí podezřelý kód v outline editoru. Je tak možné být varován před kódem, který povede ke špatnému výkonu, mrtvým kódem, místům, která mají potenciál způsobit NullPointerException a mnoho dalších problémů.</p>
<h2>JavaDoc</h2>
<p>Idea si velmi dobře vede i v práci s JavaDocem, dokáže generovat kostry JavaDoců, hledat chyby v pravopisu, ale hlavně upozorní na chyby, které vzniknou obvykle když programátor změní kód, ale zapomene provést náležité změny i v JavaDocu. Je to velmi pohodlné, a hlavně kód vypadá mnohem profesionálněji.</p>
<h2>Refaktoring a transformace kódu</h2>
<p>Idea má k dispozici mnoho různých refaktoringů, které pomohou zvýšit kvalitu kódu, bez zbytečných komplikací.</p>
<p>Velmi zajímavou vlastností jsou tzv Intention actions. Jedná se o akce, které je možné spustit v určitém kontextu, na určitém kódu.</p>
<p>Díky tomu lze například v testech transformovat boolean výrazy do asercí, optimalizovat logické výrazy, nahradit kontrolní struktury za jiné, přesunout inicializátor stojící mimo konstruktor do konstruktoru, uzavřít nejbližší výraz po !if! do závorek a velmi velké množství dalších věcí. Navíc v případě, že je možné na kódu nějakou akci vykonat, tak Idea zobrazí náležitou ikonu.</p>
<div id="attachment_3052" class="wp-caption aligncenter" style="width: 650px"><a href="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG3.png" rel="lightbox[3048]"><img class="size-large wp-image-3052" title="IMG3" src="http://www.aspectworks.com/wp-content/uploads/2011/12/IMG3-1024x640.png" alt="" width="640" height="400" /></a><p class="wp-caption-text">Vyznačení inspekcí, chyb v JavaDocu, také taby jsou značeny dle toho jedná-li se o test, nový či změněný soubor atd. V pravém panelu je naznačeno použití intention akce.</p></div>
<h2>Verzovací systémy a Maven</h2>
<p>Idea má konzistentní systém pro práci s různými verzovacími systémy, takže přecházet například mezi SVN a Gitem není žádný problém.</p>
<p>Změny, které se provádějí jsou strukturovány do change setů, které je možné v případě potřeby schovat (shelve changes). Celkově je práce verzovacími systémy velmi pohodlná a komfortní, velmi dobře je řešeno i mergování souborů s  pěkně vyřešenou grafickou navigací.</p>
<p>Velmi pěkně je řešeno načení změn přímo v outline editoru, včetně snadného vyvolání předchozích verzí.</p>
<p>IDE má velmi dobrou podporu Mavenu, rozjet nový projekt z pomu je hračka. Z Maven panelu lze spouštět jednotlivé Maven goals, prohlížet závislosti a pluginy. Je možné jednoduše přepnout spouštění testu toggle tlačítkem.</p>
<p>Groovy &#8211; nemám zkušenost, ale kolegové si chváli velmi dobrou podporu Groovy.</p>
<h2>Nevýhody</h2>
<p>Kromě ceny je snad jediná částečná nevýhoda oproti Eclipsu menší množství dostupných pluginů. Na druhou stranu, v základním balíku IntelliJ je jich obrovské množství a jsou bezproblémové &#8211; fungují tak jak mají, takže tato nevýhoda není tak vážná.</p>
<p>Mezi nejzajímavější pluginy patří:</p>
<p>- IdeaVim &#8211; přidává editoru mnoho funkcí velmi efektivního Vim editoru</p>
<p>- Scala plugin &#8211; jednoznačně nejlepší IDE pro Scalu</p>
<p>- Clojure plugin &#8211; platí to stejné co u Scala pluginu</p>
<p>Celkově je velmi těžké hledat na tomto IDE nějaké nevýhody. Tým JetBrains jde velmi tvrdě za vývojem nejlepších vývojových nástrojů, a i když Ultimate verze jejich Java IDE není zdarma jako ostatní velká Java IDE, určitě stojí za zamyšlení, je možné vyzkoušet Comunity edition, která je open-source a zdarma, a nebo Ultimate, u které je trial verze na 30 dní. Neznám nikoho kdo zkusil IntelliJ Ideu a poté se dobrovolně vrátil k Eclipse, je tu hromada malých detailů, které však dohromady přispívají k mnohem příjemnější práci, hlavě dokáže odhalit mnoho chyb, které se při práci s jinými nástroji projeví až při spuštění aplikace.</p>
<p>Do článku se všechny možnosti, které Idea přináší nevlezou, k dalšímu studování doporučuji navštívit stránky <a href="http://www.jetbrains.com/idea/">JetBrains</a>, k dispozici je kompletní seznam vlastností, mapy klávesových zkratek, množství video tutoriálů a dalších informací.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/12/intellij-idea-pro-vyvoj-v-jave/feed</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Doporučená četba</title>
		<link>http://www.aspectworks.com/2011/11/doporucena-cetba</link>
		<comments>http://www.aspectworks.com/2011/11/doporucena-cetba#comments</comments>
		<pubDate>Wed, 30 Nov 2011 09:12:44 +0000</pubDate>
		<dc:creator>Luboš Račanský</dc:creator>
				<category><![CDATA[Jen tak]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=3000</guid>
		<description><![CDATA[Na twitteru vám pravidelně přinášíme doporučení na technické články. Pro ty, kteří nás nesledují, ale i pro ty, kterým například nějaký odkaz utekl, přinášíme seznam toho nejzajímavějšího. Doporučená četba, která<a href="http://www.aspectworks.com/2011/11/doporucena-cetba" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p><a href="https://twitter.com/#!/AspectWorks">Na twitteru</a> vám pravidelně přinášíme doporučení na technické články. Pro ty, kteří nás nesledují, ale i pro ty, kterým například nějaký odkaz utekl, přinášíme seznam toho nejzajímavějšího. Doporučená četba, která by neměla zapadnout ve štěbetání twitteru. Nakonec pro odlehčení dva Dilbert stripy.<span id="more-3000"></span></p>
<p>Firma <a href="http://www.thoughtworks.com">ThoughtWorks</a>, kde pracuje <a href="http://martinfowler.com/">Martin Fowler</a>, vydává zprávu <a href="http://www.thoughtworks.com/radar">Technology Radar</a>, která vyhodnocuje technologické novinky a trendy. Slouží jim jako podklad pro rozhodování. V posledním radaru jsou zajímavé argumenty proti GWT. Docela mě překvapilo, že na jejich radaru není Groovy.</p>
<p>Michal Vallo se zamýšlí, zda <a href="http://www.agilia.cz/2011/06/potrebujeme-certifikovany-vodicsky.html">Potrebujeme „certifikovaný“ vodičský preukaz</a> pro Scrum. Držitel řidičského průkazu nemusí být dobrý řidič a naopak dobrý závodník „řidičák“ nepotřebuje. Analogii vidíme v Java certifikacích, proto si naši odborníci doplňují své zkušenosti o oficiální papír.</p>
<p><a href="http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx">Objektově relační mapování je Vietnamem softwarového inženýrství</a> &#8211; Ted Neward v podrobné analýze srovnává ORM s válkou ve Vietnamu. Tak jako byl potřeba zásah USA v jihovýchodní Asii, tak se programátoři neobejdou bez ORM. Nedosáhli jsme vítězství a není jasné, jak se z té šlamastiky dostat.</p>
<p>Pointy-haired boss (archetyp zachycený v Dilbertovi) vůbec nerozumí technologiím, ale má na ně velmi silný názor. Jaký programovací jazyk by vybral na implementaci čehokoliv? Dnes určitě JAVA! Paul Graham názorně vysvětluje, že <a href="http://www.paulgraham.com/icad.html">Languages vary in power</a>. Není překvapením, že každý jazyk se hodí lépe na něco jiného. Součástí článku není <a href="http://comments.gmane.org/gmane.comp.lang.groovy.user/6421">řešení příkladu v Groovy</a>.</p>
<p>Vydařená on-line <a href="http://sourcemaking.com/refactoring">učebnice refaktorování</a>: „Komentáře se často používají jako deodorant zdrojového kódu.“ Na stránkách najdete i učebnici UML a návrhový vzorů.</p>
<p>Na InfoQ vyšla kniha <a href="http://www.infoq.com/minibooks/kanban-scrum-minibook">Kanban and Scrum &#8211; making the most of both</a>.</p>
<p>Dilbertův šéf kouzlí s čísly, aneb <a href="http://search.dilbert.com/comic/300%20Man%20Day">jak stihnout projekt s rozpočtem 300 MD za jediný den</a>.</p>
<p>Hlavním tajemstvím agilních firem je to, že se při jednáních stojí, ale je <a href="http://dilbert.com/strips/comic/2011-03-11/">způsob, jak Scrum porazit</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/11/doporucena-cetba/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Získávání dat z HTML stránek</title>
		<link>http://www.aspectworks.com/2011/10/ziskavani-dat-z-html-stranek</link>
		<comments>http://www.aspectworks.com/2011/10/ziskavani-dat-z-html-stranek#comments</comments>
		<pubDate>Thu, 27 Oct 2011 10:22:03 +0000</pubDate>
		<dc:creator>Milan milan.cecrdle</dc:creator>
				<category><![CDATA[Java]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2713</guid>
		<description><![CDATA[Na jednom projektu jsme potřebovali získávat informace z HTML stránek a využili jsme knihovnu jSoup. Její jednoduché použití si ukážeme na příkladu získání jednotlivých popisů volných pozic ze stránek Aspectworks. Pomocí<a href="http://www.aspectworks.com/2011/10/ziskavani-dat-z-html-stranek" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Na jednom projektu jsme potřebovali získávat informace z HTML stránek a využili jsme knihovnu <a title="jSoup" href="http://jsoup.org">jSoup</a>. Její jednoduché použití si ukážeme na příkladu získání jednotlivých popisů volných pozic ze stránek <a title="AspectWorks" href="http://www.aspectworks.com/volne-pozice">Aspectworks</a>. Pomocí metody connect a get() získáme načtenou stránkou</p>
<pre class="brush: java; title: ; notranslate">Document doc = Jsoup.connect(&quot;http://www.aspectworks.com/volne-pozice&quot;).get();</pre>
<p><span id="more-2713"></span></p>
<p>Stránka obsahuje &#8222;ul&#8220; element s class = &#8222;subPages&#8220;, ve které jsou pod elementy &#8222;li&#8220; uloženy jednotlivé pozice. Pomocí metody select nad daným dokumentem najdeme odpovídající pozice a vypíšeme pozici a URL kde získáme detail pozice</p>
<pre class="brush: java; title: ; notranslate">
Elements positions=doc.select(&quot;ul.subPages li a&quot;);
for (Element elem:positions) {
   System.out.printf(&quot;Pozice=%s,URL=%s\n&quot;,elem.text(),elem.absUrl(&quot;href&quot;));
}</pre>
<p>K vyhledání cílových informací lze použít syntaxy jquery případně CSS selektorů, <a href="http://jsoup.org/cookbook/extracting-data/selector-syntax" title="Příklady jak použít selektory">detailní popis najdete zde</a>. Užitečné jsou dále metody text(), která vrátí vnitřní obsah elementu a dále absUrl, která vrátí absolutní URL, tak abychom jej mohli přímo použít na další volání. Samozřejmostí je také automické vyplnění parametru stránky a odeslání např. metodou post</p>
<pre class="brush: java; title: ; notranslate">
Jsoup.connect(URL).data(&quot;název parametru&quot;,&quot;hodnota&quot;).post();
</pre>
<p>Knihovna funguje velmi intuitivně a její použití bylo bezproblémové. Jediný nedostatek je zatím nemožnost nastavit proxy. Výhodou knihovny je také to, že má minimun závislostí a lze ji tedy použít např. při vývoji Android aplikací.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/10/ziskavani-dat-z-html-stranek/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>V AspectWorks úspěšně odstartovala podzimní Java stáž</title>
		<link>http://www.aspectworks.com/2011/10/v-aspectworks-uspesne-odstartovala-podzimni-java-staz</link>
		<comments>http://www.aspectworks.com/2011/10/v-aspectworks-uspesne-odstartovala-podzimni-java-staz#comments</comments>
		<pubDate>Wed, 12 Oct 2011 13:18:29 +0000</pubDate>
		<dc:creator>Veronika Sýkorová</dc:creator>
				<category><![CDATA[Novinky]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2903</guid>
		<description><![CDATA[Naše firma uspořádala pro studenty vysokých škol se základem Javy podzimní Java stáž. Stáž začíná 17. října 2011 v Prague Gate na Chodově. Tento náš projekt vyvolal veliký zájem. Studenti<a href="http://www.aspectworks.com/2011/10/v-aspectworks-uspesne-odstartovala-podzimni-java-staz" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Naše firma uspořádala pro studenty vysokých škol se základem Javy podzimní Java stáž. Stáž začíná 17. října 2011 v Prague Gate na Chodově. Tento náš projekt vyvolal veliký zájem. Studenti se snažili svou šanci maximálně využít. Celkem se nám sešlo neuvěřitelných 70 životopisů. Výběrová řízení probíhala takřka nepřetržitě a zúčastnilo se jich 28 pozvaných uchazečů. Výsledkem této akce je sedm vybraných studentů. Ti budou mít jedinečnou možnost absolvovat baterii školení, na jejímž konci mohou získat certifikát. Budou pracovat pod vedením profesionála z praxe na reálných projektech. Mají tak jedinečnou šanci nastartovat svou IT kariéru ještě během studia. Vybraným studentům gratulujeme a přejeme jim mnoho štěstí.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/10/v-aspectworks-uspesne-odstartovala-podzimni-java-staz/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JTA v integračních testech bez aplikačního serveru</title>
		<link>http://www.aspectworks.com/2011/10/jta-v-integracnich-testech-bez-aplikacniho-serveru</link>
		<comments>http://www.aspectworks.com/2011/10/jta-v-integracnich-testech-bez-aplikacniho-serveru#comments</comments>
		<pubDate>Wed, 12 Oct 2011 07:27:26 +0000</pubDate>
		<dc:creator>Milan milan.cecrdle</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2740</guid>
		<description><![CDATA[JTA tedy distribuované transakce se dost často použivájí v enterprise systémech, kde je potřeba přistupovat jak k více databázím, tak třeba v kombinaci databáze a messaging systém (např. Websphere MQ).<a href="http://www.aspectworks.com/2011/10/jta-v-integracnich-testech-bez-aplikacniho-serveru" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>JTA tedy distribuované transakce se dost často použivájí v enterprise systémech, kde je potřeba přistupovat jak k více databázím, tak třeba v kombinaci databáze a messaging systém (např. Websphere MQ). Mezi vývojáři obecně panuje představa, že pro jeho využítí potřebuji aplikační server ala Jboss či Websphere, případně také, že bez EJB JTA nelze použít. Toto není samozřejmě pravda a např. pokud použijeme Spring, situace se nám ještě velmi zjednoduší. V příkladu si ukážeme jak nakonfigurovat transakční manager pro test, který otestuje jednu komponentu, ve které je logika přístupu k více XA zdrojům.<span id="more-2740"></span></p>
<p>Takto vypadá šablona spring integračního testu, který naloaduje aplikační kontexty, jeden s konfigurací aplikace a jeden s konfigurací testovacího JTA manageru.</p>
<pre class="brush: java; title: ; notranslate">
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {&quot;/applicationTestContext.xml&quot;, &quot;/applicationContext.xml&quot;})
@TestExecutionListeners({TransactionalTestExecutionListener.class})
@Transactional
public class JTASampleIntegrationTest extends AbstractJUnit4SpringContextTests {
  @Test
  public void testComponenet() {
  }
}
</pre>
<p>Existuje více implementací JTA, například <a href="http://www.atomikos.com/">Atomikos</a> nebo <a href="http://jotm.ow2.org/xwiki/bin/view/Main/WebHome">Jotm</a>. Pro testy jsem se rozhodl použít Jotm implementace a dále implementaci XA pool datasource z projektu <a href="http://xapool.ow2.org/">Enhydra XAPool</a>.</p>
<p>Prvni co musíme je definovat JTATransactionManagera. Tomu musíme specifikovat referenci na factory, která vytvoří JOTM objekt, který implementuje UserTransaction interface. Pro JOTM je již factory součastí springu. V případě běhu v aplikačním server už má JTATransactionManager implementován automatický lookup do JNDI pro konkrétní objekt a není třeba specifikovat nic.</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;bean id=&quot;jotm&quot; class=&quot;org.springframework.transaction.jta.JotmFactoryBean&quot; /&gt;
	&lt;bean id=&quot;transactionManager&quot;
		class=&quot;org.springframework.transaction.jta.JtaTransactionManager&quot;&gt;
		&lt;property name=&quot;userTransaction&quot; ref=&quot;jotm&quot; /&gt;
	&lt;/bean&gt;
</pre>
<p>Takto nadefinujeme &#8222;testDataSource1&#8243; s využitím XA datasource z Enhrydry, obdobně definuje i druhý datasource.</p>
<pre class="brush: xml; title: ; notranslate">
	&lt;bean id=&quot;testDataSource1&quot; class=&quot;org.enhydra.jdbc.pool.StandardXAPoolDataSource&quot;
		destroy-method=&quot;shutdown&quot;&gt;
		&lt;property name=&quot;dataSource&quot;&gt;
			&lt;bean class=&quot;org.enhydra.jdbc.standard.StandardXADataSource&quot;
				destroy-method=&quot;shutdown&quot;&gt;
				&lt;property name=&quot;transactionManager&quot;&gt;
					&lt;ref local=&quot;jotm&quot; /&gt;
				&lt;/property&gt;
				&lt;property name=&quot;driverName&quot;&gt;
					&lt;value&gt;com.informix.jdbc.IfxDriver&lt;/value&gt;
				&lt;/property&gt;
				&lt;property name=&quot;url&quot; value=&quot;jdbc:informix-sqli://.....&quot;/&gt;
			&lt;/bean&gt;
		&lt;/property&gt;
		&lt;property name=&quot;user&quot;&gt;
			&lt;value&gt;user&lt;/value&gt;
		&lt;/property&gt;
		&lt;property name=&quot;password&quot;&gt;
			&lt;value&gt;password&lt;/value&gt;
		&lt;/property&gt;
	&lt;/bean&gt;
</pre>
<p>Pak už pouze spustíme test a ověříme, že změny v obou datasourcech při testech nebyly commitnuty.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/10/jta-v-integracnich-testech-bez-aplikacniho-serveru/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Zveme Vás na kurz Java</title>
		<link>http://www.aspectworks.com/2011/09/zveme-vas-na-kurz-java</link>
		<comments>http://www.aspectworks.com/2011/09/zveme-vas-na-kurz-java#comments</comments>
		<pubDate>Tue, 13 Sep 2011 08:21:16 +0000</pubDate>
		<dc:creator>Josef Jelínek</dc:creator>
				<category><![CDATA[Homepage]]></category>
		<category><![CDATA[Novinky]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2832</guid>
		<description><![CDATA[V termínu 24. 10. – 25. 10. 2011 pořádá společnost AspectWorks základní školení programovacího jazyka Java. Školení bude probíhat pod vedením zkušeného profesionála z praxe v plně zařízené učebně na Praze 5.<a href="http://www.aspectworks.com/2011/09/zveme-vas-na-kurz-java" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>V termínu 24. 10. – 25. 10. 2011 pořádá společnost AspectWorks základní školení programovacího jazyka Java.<span id="more-2832"></span> Školení bude probíhat pod vedením zkušeného profesionála z praxe v plně zařízené učebně na Praze 5. V ceně kurzu jsou školící materiály, pomůcky, občerstvení a certifikát. Kurz je v současné době otevřen dalším zájemcům. Podmínky a způsoby přihlášení a další podrobnosti o kurzu najdete <a href="http://www.aspectworks.com/sluzby/skoleni-it/skoleni-java" title="Školení Java">zde</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/09/zveme-vas-na-kurz-java/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Jak na mock HTTP serveru</title>
		<link>http://www.aspectworks.com/2011/09/jak-na-mock-http-serveru</link>
		<comments>http://www.aspectworks.com/2011/09/jak-na-mock-http-serveru#comments</comments>
		<pubDate>Mon, 05 Sep 2011 12:35:12 +0000</pubDate>
		<dc:creator>Roman Valina</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Testování]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2664</guid>
		<description><![CDATA[Pro jednoho z naších zákazníků dodáváme C2DM &#8211; zasílání notifikací na mobilní telefon s operačním systémem Android. Tato služba je implementována jako HTTP request, ve kterém pošlete zprávu, registrační identifikátor<a href="http://www.aspectworks.com/2011/09/jak-na-mock-http-serveru" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Pro jednoho z naších zákazníků dodáváme <a title="C2DM" href="http://code.google.com/android/c2dm/">C2DM</a> &#8211; zasílání notifikací na mobilní telefon s operačním systémem Android. Tato služba je implementována jako HTTP request, ve kterém pošlete zprávu, registrační identifikátor instance zařízení s androidem a C2DM server se postará o doručení.<span id="more-2664"></span></p>
<p>Narazil jsem ale na problém jak vytvořit unit test který ověří, správný formát odesílané notifikace. Problém je právě v tom, jak namockovat chování C2DM serveru bez toho, abych musel někde rozebíhat Jetty či nedejbože Tomcat.</p>
<p>Testovaný kód vypadá nějak takto:</p>
<pre class="brush: java; title: ; notranslate">
private static int sendMessage(String message, URL url) throws IOException {
   // create connection
   HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    connection.setDoInput(true);
    connection.setDoOutput(true);
    connection.setRequestMethod(&quot;POST&quot;);
    // post data
   DataOutputStream output = new DataOutputStream(connection.getOutputStream());
    output.writeBytes(&quot;message=&quot;message);
    output.flush();
    output.close();
    // establish connection
   connection.connect();
    // return errocode
   return connection.getResponseCode();
}
</pre>
<p>Umím vytvořit mock interfacu (viz. EasyMock , PowerMock ect.), dokonce i stub konkrétní třídy. Final třídu <a title="URL" href="http://download.oracle.com/javase/6/docs/api/java/net/URL.html">URL</a> zkrátka nepodědíte a testovanému kódu pak &#8222;nepředhodíte&#8220;.</p>
<p>Narazil jsem na knihovnu <a title="simple" href="http://www.simpleframework.org/">simple</a>, která velice jednoduše na několika řádcích na pár sekund rozběhne „webový server“. Vy pak můžete snadno nasimulovat chování protějšího serveru.</p>
<p>Vytvoříte třídu implementující interface org.simpleframework.http.core.Container</p>
<pre class="brush: java; title: ; notranslate">
public class MockC2dmServer implements Container {
  protected String capturedMessage;
  public void handle(Request request, Response response) {
     try {
       capturedMessage = request.getParameter(&quot;message&quot;);
     } catch (IOException e1) {
       capturedMessage = null;
     }
    if(capturedMessage != null) {
      response.setCode(HttpURLConnection.HTTP_OK);
    } else {
      response.setCode(HttpURLConnection.HTTP_BADREQUEST);
    }
  }
}
</pre>
<p>Samotné vytvoření serveru a test pak může vypadat nějak takto:</p>
<pre class="brush: java; title: ; notranslate">
@Test
public void basicSenderTest() throws Exception {
  MockC2dmServer mockServer = new MockC2dmServer();
   // binds server to socket on adress
  Connection connectionServer = new SocketConnection(mockServer);
  SocketAddress address = new InetSocketAddress(&quot;localhost&quot;,8080));
  connectionServer.connect(address);
   // test method
  String message = &quot;message text&quot;
  C2dmNotificationSender.sendNotification(message, new URL(&quot;http://localhost:8080&quot;);
  Assert.assertEquals(message, mockServer.capturedMessage);
}
</pre>
<p>Uznávám, že tento způsob testování má svá rizika, například vám nikdo nezaručí, že port 8080 bude volný, to však jde minimalizovat například metodou, která vám nějaký volný port najde, ale to už není tématem tohoto článku. Pokud někdo z vás přijde na jiné, lepší řešení rád si ho přečtu v diskuzi pod článkem.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/09/jak-na-mock-http-serveru/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Absolvovali jsme školení Soft skills</title>
		<link>http://www.aspectworks.com/2011/08/absolvovali-jsme-skoleni-soft-skills</link>
		<comments>http://www.aspectworks.com/2011/08/absolvovali-jsme-skoleni-soft-skills#comments</comments>
		<pubDate>Mon, 29 Aug 2011 08:55:43 +0000</pubDate>
		<dc:creator>Josef Jelínek</dc:creator>
				<category><![CDATA[Novinky]]></category>
		<guid isPermaLink="false">http://www.aspectworks.com/?p=2770</guid>
		<description><![CDATA[Komunikační dovednosti jsou pro každého člověka velkým přínosem a v obchodním světě to platí dvojnásob. Je velice důležité vědět jak komunikovat s obchodními partnery i zákazníky. Tým firmy AspectWorks je si toho plně<a href="http://www.aspectworks.com/2011/08/absolvovali-jsme-skoleni-soft-skills" class="moreLink">více&#160;»</a>]]></description>
			<content:encoded><![CDATA[<p>Komunikační dovednosti jsou pro každého člověka velkým přínosem a v obchodním světě to platí dvojnásob. Je velice důležité vědět jak komunikovat s obchodními partnery i zákazníky. Tým firmy AspectWorks je si toho plně vědom. Na základě tohoto poznatku se účastní i školení zaměřených na komunikační dovednosti.</p>
<p>První část tohoto školení Soft-skills technik pro efektivní práci se konalo v období 26.8.-27.8. 2011. Druhá část školení proběhla v termínu od 9 .9. do 10. 9. 2011. Cílem bylo prostřednictvím soft-skills technik zvýšit efektivitu práce u zákazníků.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.aspectworks.com/2011/08/absolvovali-jsme-skoleni-soft-skills/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

