<?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#"
	>

<channel>
	<title>Programování &#8211; Jiří Kratochvíl</title>
	<atom:link href="https://jiri.kratochvil.eu/category/programovani/feed/" rel="self" type="application/rss+xml" />
	<link>https://jiri.kratochvil.eu</link>
	<description>Kráťovo občasník</description>
	<lastBuildDate>Tue, 29 Mar 2011 19:03:46 +0000</lastBuildDate>
	<language>cs</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.7</generator>

<image>
	<url>https://jiri.kratochvil.eu/wp-content/uploads/2018/10/kratochvil-logo-100x100.png</url>
	<title>Programování &#8211; Jiří Kratochvíl</title>
	<link>https://jiri.kratochvil.eu</link>
	<width>32</width>
	<height>32</height>
</image> 
<site xmlns="com-wordpress:feed-additions:1">10187198</site>	<item>
		<title>Testování JMS v unit testech</title>
		<link>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/</link>
					<comments>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 29 Mar 2011 19:03:46 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JMS]]></category>
		<category><![CDATA[JNDI]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Messaging]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Transaction Manager]]></category>
		<category><![CDATA[Unit test]]></category>
		<category><![CDATA[Weblogic]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=389</guid>

					<description><![CDATA[Dnes jsem strávil skoro celý den tím, že jsem potřeboval vyřešit následující problém. Mám aplikaci, která poměrně sofistikovaně využívá několik JMS front pro asynchronní zpracování [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Dnes jsem strávil skoro celý den tím, že jsem potřeboval vyřešit následující problém. Mám aplikaci, která poměrně sofistikovaně využívá několik JMS front pro asynchronní zpracování požadavků z klientských aplikací. Celé je to postavené nad serverem Weblogic a aplikace využívá frameworku Spring. Další komplikací je, že veškeré fronty jsou v aplikačním kontextu získávány z JNDI, včetně konektivity do databáze. Na následujících řádcích zkusím popsat, jak jsem se s tímto problémem popasoval. Budu rád za jakékoliv reakce, co jsem měl udělat lépe a co jsem udělal špatně.<br />
<span id="more-389"></span><br />
Abych se vyhnul polemice, co je a co není unit testování a jestli nemám špatně navrženou aplikaci, když musím řešit JMS, JNDI apod., pak vězte, že implementaci jsem nepsal a implementaci jsem nesměl refaktorovat, protože se jednalo o celkem zásadní funkcionalitu, která se nachází těsně před ostrým nasazením a můj projektový vedoucí se obával toho, že kdybych provedl nějaký větší refactoring, mohlo by to způsobit v této fázi projektu více škody nežli užitku. </p>
<p>Ale i přesto bylo potřeba do této implementace doimplementovat několik požadavků. Rozhodl jsem se nejprve stávající implementaci pokrýt testy tak, abych tím, co tam doplním nerozbil to, co již funguje. A zde jsem trochu narazil. Implementace tohoto modulu je velice těsně spjata s JMS implementací Weblogicu a navíc tak, že se jedná o několik front, které jsou vzájemně propojeny a zpráva zkrze ně postupně &#8222;propadává&#8220; podle definovaných pravidel. </p>
<p>Abych to celé byl tedy schopen spustit jako unit test, musel jsem vyřešit pár &#8222;drobností&#8220;, a to poskytovatele <strong>JNDI kontextu</strong>, <strong>transaction manager</strong> a vlastní implementaci <strong>JMS</strong>. Pro JNDI kontextu jsem jednoduše využil prostředků Springu. Pro transakční manager jsem využil <a href="http://docs.codehaus.org/display/BTM/Home">Bitronix Transaction Manager</a> a pro messagingové služby padlo rozhodnutí na <a href="http://activemq.apache.org/">Apache ActiveMQ</a>.</p>
<h2>JNDI kontext</h2>
<p>Vytvoření vlastního JNDI kontextu je ve Springu triviální úloha. Já jsem si pro to napsal jednoduchou utilitku, která mi ji ještě více zjednodušuje:</p>
<pre lang="java">
package eu.kratochvil.utils.spring;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.mock.jndi.SimpleNamingContextBuilder;

import java.util.HashMap;
import java.util.Map;

/**
 * Simple implementation of JNDI context that should be used in unit-tests
 * within Spring context.
 * <p/>
 * Basic usage is simple:
 * 
 * &lt;bean id="jndiContext" class="cz.isvs.reg.ros.ws.repository.util.MockSpringJndiContext"&gt;
 *   &lt;property name="jndiContext"&gt;
 *      &lt;map&gt;
 *          &lt;entry key="ros.VstupniFronta" value-ref="destinationVstupniFronta"/&gt;
 *          &lt;entry key="ros.VystupniFronta" value-ref="destinationVystupniFronta"/&gt;
 *          &lt;entry key="weblogic.jms.XAConnectionFactory" value-ref="activeMQConnectionFactory"/&gt;
 *      &lt;/map&gt;
 *   &lt;/property&gt;
 * &lt;/bean&gt;
 *
 * There isn't needet to use something like <code>jndi.properties</code> because jndi context is define
 * directly inside spring context. 
 *
 * @author Jiri Kratochvil (jiri.kratochvil@jetminds.com)
 */
public class MockSpringJndiContext implements InitializingBean {

    public static final Logger logger = LoggerFactory.getLogger(MockSpringJndiContext.class);

    Map<String, Object> jndiContext = new HashMap<String, Object>();

    public void setJndiContext(Map<String, Object> jndiContext) {
        this.jndiContext = jndiContext;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        logger.info("Initializing JNDI context");
        SimpleNamingContextBuilder builder = SimpleNamingContextBuilder.emptyActivatedContextBuilder();
        for (Map.Entry entry : jndiContext.entrySet()) {
            logger.debug("Binding {} in JNDI context", entry.getKey().toString());
            builder.bind(entry.getKey().toString(), entry.getValue());
        }
    }
}
</pre>
<p>Použití je pak naprosto triviální:</p>
<pre lang="xml">
    <bean id="jndiContext" class="cz.isvs.reg.ros.ws.repository.util.MockSpringJndiContext">
        <property name="jndiContext">
            <map>
                <entry key="jms.queue1" value-ref="destinationQueue1"/>
                <entry key="jms.queue2" value-ref="destinationQueue2"/>
                <entry key="weblogic.jms.XAConnectionFactory" value-ref="connectionFactory"/>
            </map>
        </property>
    </bean>
</pre>
<p>Inicializací tohoto springového beanu se vytvoří JNDI kontext, který obsahuje dvě JMS fronty a ještě connection factory, o které budu mluvit dále. Pokud použijete Spring není potřeba dále definovat jak se k JNDI kontextu připojit, což se běžně dělá pomocí property souboru <code>jndi.properties</code> umístěném na classpath.</p>
<h2>JMS server</h2>
<p>Dále tedy potřebujeme vytvořit instanci embedovaného JMS serveru. Pro mé účely jsem zvolil <a href="http://activemq.apache.org/">Apache ActiveMQ</a>, který jde snadno inicializovat pomocí Springu, kde to vypadá následovně:</p>
<pre lang="xml">
   <!-- Definice message brokeru -->
    <amq:broker useJmx="false" persistent="false">
        <amq:transportConnectors>
            <amq:transportConnector uri="tcp://localhost:8888"/>
        </amq:transportConnectors>
    </amq:broker>

    <!-- Connection Factory pro message broker -->
    <bean id="activeMQConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://localhost:8888"/>
    </bean>

    <!-- Vlastni definice front -->
    <amq:queue id="destinationQueue1" physicalName="jms.queue1"/>
    <amq:queue id="destinationQueue2" physicalName="jms.queue2"/>

    <!-- listener pro zachytavani vyjimek z JMS (implemetnace rozhrani javax.jms.ExceptionListener) -->
    <bean id="jmsExceptionListener" class="eu.kratochvil.blog.ukazky.JmsExceptionListenerImpl" />

    <!-- Springova implementace connection factory, ktera bude vyuzita pro registraci listeneru a pro 
            posilani zprav prostrednictvim springove JmsTemplate -->
    <bean id="connectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory">
        <constructor-arg ref="activeMQConnectionFactory"/>
        <property name="exceptionListener" ref="jmsExceptionListener"/>
        <property name="sessionCacheSize" value="100"/>
    </bean>
</pre>
<p>Popis co a proč je použito v předchozím listingu jsou přímo v něm, tedy ve stručnosti. Vytvořili jsme si instanci message brokeru, který nám nahrazuje vlastní JMS server v aplikačním serveru, následně jsme zadefinovali jednotlivé fronty, které jsou použity ve vlastní implementaci business logiky a konečně connection factory, která nám umožní napojení vlastních listenerů JMS front a zároveň přes ni budeme posílat testovací zprávy z našit unit testů. </p>
<p>Nyní bych se ještě vrátil k tomu, proč jsem do JNDI kontextu umístil <code>weblogic.jms.XAConnectionFactory</code>. Důvod je takový, že aplikace, které využívají JMS ve Weblogiku by měli referenci na connection factory získávat právě z JNDI. </p>
<h2>Transaction Manager</h2>
<p>Poslední věc, kterou musíme vyřešit bez aplikačního serveru je transaction manager &#8211; tedy &#8222;něco&#8220;, co nám bude řídit vlastní transakce. Na to jsem použil <a href="http://docs.codehaus.org/display/BTM/Home">Bitronix Transaction Manager</a> což je celkem mocná implementace transakčního manažeru. Pro naše účely bude použití triviální:</p>
<pre lang="xml">
      <!--  Bitronix Transaction Manager embedded configuration -->
    <bean id="btmConfig" factory-method="getConfiguration" class="bitronix.tm.TransactionManagerServices">
        <property name="serverId" value="spring-btm" />
        <property name="journal" value="null" />
    </bean>

    <!-- create BTM transaction manager -->
    <bean id="bitronixTransactionManager" factory-method="getTransactionManager"
        class="bitronix.tm.TransactionManagerServices" depends-on="btmConfig,dataSource"
        destroy-method="shutdown" />

    <bean id="transactionManager"
        class="org.springframework.transaction.jta.JtaTransactionManager">
        <property name="transactionManager" ref="bitronixTransactionManager" />
        <property name="userTransaction" ref="bitronixTransactionManager" />
        <property name="allowCustomIsolationLevels" value="true" />
    </bean>
</pre>
<h2>Závěrem</h2>
<p>Kouzlo tohoto použití je v tom, že nyní stačí spustit unit test, který inicializuje springový kontext a zároveň načte definici kontextu vlastní aplikace, která právě využívá JNDI pro získání referencí na fronty a vše by mělo fungovat stejně, jako kdybychom tuto implementaci měli deployovanou přímo na aplikačním serveru. Pro úplnost dodávám ukázku definice kontextu přímo v aplikaci:</p>
<pre lang="xml">
    <!-- ===================== JNDI =========================================== -->
    <jee:jndi-lookup id="jmsConnectionFactory" jndi-name="weblogic.jms.XAConnectionFactory"/>
    <jee:jndi-lookup id="vstupniFronta" jndi-name="jms.queue1"/>
    <jee:jndi-lookup id="vystupniFronta" jndi-name="jms.queue2"/>

    <!-- JTA transakce -->
    <tx:annotation-driven transaction-manager="transactionManager"/>

    <!-- ===================== FRONTY ========================================= -->
    <bean id="jmsTemplate" class="corg.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="jmsConnectionFactory"/>
        <property name="messageConverter" ref="simpleMessageConverter"/>
    </bean>

    <bean id="simpleMessageConverter" class="org.springframework.jms.support.converter.SimpleMessageConverter"/>

    <bean id="destinationResolver" class="org.springframework.jms.support.destination.BeanFactoryDestinationResolver"/>

    <jms:listener-container connection-factory="jmsConnectionFactory" transaction-manager="transactionManager"
                            destination-resolver="destinationResolver"
                            message-converter="simpleMessageConverter">
        <jms:listener destination="destinationQueue1" ref="messageBroker" method="processVstupni"
                      selector="MessageType='test1'"/>
        <jms:listener destination="destinationQueue2" ref="messageBroker" method="processVystupni"
                      selector="MessageType='test2'"/>
    </jms:listener-container>

    <bean id="messageBroker" class="eu.kratochvil.blog.ukazky.MyMessageBroker" />
</pre>
<p>Na celém tomto cvičení je pěkné to, že jednoduchou springovou konfigurací jsme schopni rozchodit určitou část aplikace, která za normálních okolností nelze bez aplikačního serveru spustit, a my si tak můžeme napsat testy, které lze snadno spouštět bez neustálého a otravného redeploymentu na aplikační server.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/testovani-jms-v-unit-testech/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">389</post-id>	</item>
		<item>
		<title>Autentizace webových služeb JAX-WS na Weblogicu</title>
		<link>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/</link>
					<comments>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 01 Mar 2011 19:22:26 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=369</guid>

					<description><![CDATA[V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>V dnešním návodu se zaměřím na to, jakým způsobem zajistit autentizaci webových služeb vystavených na Weblogicu ve verzi 10.3.3, i když tento návod bude fungovat i ve verzích vyšších (a i nižších). Cílem je použít pouze standardní prostředky aplikačního serveru. A jako drobný bonus bude ukázka, jak vystavit webovou službu.<br />
<span id="more-369"></span><br />
Nejprve si tedy vystavíme libovolnou webovou službu pomocí JAX-WS. Základem je do našeho mavenního projektu přidat potřebné knihovny: </p>
<pre lang="xml">
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
   ...
    <dependencies>
   ...
        <dependency>
            <groupId>javax.xml</groupId>
            <artifactId>jaxws-api</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>com.sun.xml</groupId>
            <artifactId>jaxws-rt</artifactId>
            <version>2.0EA3</version>
            <scope>provided</scope>
        </dependency>
   ...
    </dependencies>
 </project>
</pre>
<p>Jako <em>scope</em> těchto knihoven uvedeme, že jsou provided, což v praxi znamená, že knihovny budou použity pro kompilaci, ale nezaintegrují se do výsledného balíku. To proto, že Weblogic má tyto knihovny vlastní a naším cílem je použít právě implementaci aplikačního serveru. </p>
<h2>Implementace webových služeb</h2>
<p>Nyní si vytvořime a vystavíme vlastní webové služby. Služby budou definovány svým rozhraním a implementací. Rozhraní webové služby pak může vypadat třeba takto:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.*;

@WebService(targetNamespace = "http://schema.kratochvil.eu", name = "TestService")
public interface TestService {

    @WebMethod
    String sayHello(@WebParam(name = "name") String name);

}
</pre>
<p>A ještě implementace vlastní &#8222;business logiky&#8220;:</p>
<pre lang="java">
package eu.kratochvil.clanky.ws;

import javax.jws.WebService;

@WebService(endpointInterface = "eu.kratochvil.clanky.ws.TestService")
public class TestServiceImpl implements TestService {

    @Override
    public String sayHello(String name) {
        return "Hello " + name + "!";
    }
}
</pre>
<p>Z implementace je zřejmé, co naše služba dělá a není potřeba nějak složitě popisovat. Důležité jsou anotace <em>WebService</em> a <em>WebMethod</em>, které nám popisují vlastní rozhraní webové služby. Další anotace, jako je například <em>WebParam</em> a podobně složí k přesnému popsání a definici kontraktu webové služby a v budoucnu o tom napíšu nějaký článek. Do té doby doporučuji použít <a href="http://jax-ws.java.net/">dokumentaci</a>.</p>
<p>Posledním krokem je konfigurace našeho webového archívu. K tomu slouží znamý <em>web.xml</em>, který je klasicky umístěn v adresáři WEB-INF naší aplikace a ještě <em>sun-jaxws.xml</em>.</p>
<p>Soubor _web.xml_ bude obsahovat následující:</p>
<pre lang="xml">
    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>
    <servlet>
        <servlet-name>jaxws</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/testService</url-pattern>
    </servlet-mapping>
</pre>
<p>Tímto donutíme weblogic, aby vystavil servlet, který bude handlovat naše webové služby. Samozřejmě je možné použít v definici patternu znaky wildcard například takto:</p>
<pre lang="xml">
    <servlet-mapping>
        <servlet-name>jaxws</servlet-name>
        <url-pattern>/ws/*</url-pattern>
    </servlet-mapping>
</pre>
<p>Pak budou servletem pro webové služby zpracován jakýkoliv požadavek, podle zadané masky (například <em>/ws/users</em> nebo <em>/ws/loans</em>). </p>
<p>Poslední konfigurační soubor, který musíme vytvořit, aby nám začaly korektně fungovat webové služby je <em>sun-jaxws.xml</em>, který je také umístěn v adresáři WEB-INF naší aplikace. Jeho podoba je následující:</p>
<pre lang="xml">
<endpoints
        xmlns='http://java.sun.com/xml/ns/jax-ws/ri/runtime'
        version='2.0'>
    <endpoint
            name='myService'
            implementation='eu.kratochvil.clanky.ws.TestServiceImpl'
            url-pattern='/testService'/>
</endpoints>
</pre>
<h2>Zabezpečení webové služby</h2>
<p>Nyní se konečně dostáváme k tomu, jak zabezpečit webové služby pomocí standardních prostředků aplikačního serveru Weblogic. Nejprve se přihlásíme do konzole aplikačního serveru, kde se proklikáme na správu uživatelů přes menu pomocí položky <em>Security Realms</em>. Následně vybereme konkrétní realm (defaultně <em>myrealm</em>). Na záložce <em>Users and Groups</em> si založíme uživatele, kterým se chceme autentizovat pro využívání našich webových služeb. </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10.png"><img fetchpriority="high" decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.57.10-300x267.png" alt="" title="Nový uživatel" width="300" height="267" class="aligncenter size-medium wp-image-377" /></a></p>
<p>V našem případě jsme si vytvořili uživatele test, kterého zařadíme do nějaké, námi vytvořené skupiny (například <em>TestGroup</em>). </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10.png"><img decoding="async" src="http://jiri.kratochvil.eu/wp-content/2011/03/Screen-shot-2011-03-01-at-19.58.10-300x206.png" alt="" title="Zařazení uživatele do skupiny" width="300" height="206" class="aligncenter size-medium wp-image-380" /></a></p>
<p>Tímto máme základní konfiguraci aplikačního serveru hotovou a dalším krokem bude nastavení naší aplikace. Úplně nejjednodušší cestou je přidání následujících několika řádků do souboru <em>web.xml</em>:</p>
<pre lang="xml">
    <security-constraint>
        <display-name>Security for WS</display-name>
        <web-resource-collection>
            <web-resource-name>WSPOST</web-resource-name>
            <description>
            </description>
            <url-pattern>/testService</url-pattern>
            <http-method>POST</http-method>
        </web-resource-collection>
        <auth-constraint>
            <role-name>TestGroup</role-name>
        </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>myrealm</realm-name>
    </login-config>
    <security-role>
        <role-name>TestGroup</role-name>
    </security-role>
</pre>
<p>Zde definujeme, co chceme zabezpečit, jaká skupina uživatelů je oprávněna používat naše služby apod. Pokud náš projekt nyní zkompilujeme a nasadíme na aplikační server, měli bychom být dotázání na heslo ve chvíli, kdy se pokusíme zavolat naši webovou službu, což si můžete vyzkoušet například pomocí skvělého nástroje <a href="http://www.soapui.org/">SoapUI</a>.</p>
<p>V článku jsem záměrně nepoužíval nic jiného než jen <em>JAX-WS</em>, tedy žádný Spring Security ani nic podobného. Výhodou je, že se vám tímto přístupem zjednoduší deployment a hlavně získáte skvělé možnosti, jak vaší aplikaci zaintegrovat do firemní infrastruktury, bez složitého nastavování. Weblogic vám totiž nastaví admin serveru, který Vám zároveň vytvoří i nějakou roli, kterou pak následně budete ve své aplikaci využívat. No a správa uživatelů a hesel pro aplikace, které vaše služby budou využívat je také věc administrátora. Navíc lze samozřejmě aplikační server klientské aplikace nastavit tak, aby autentizaci prováděl pro aplikaci transparentně, takže odpadá složitá správa hesel na obou stranách, ale o tom zase někdy příště.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/autentizace-webovych-sluzeb-jax-ws-na-weblogicu/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">369</post-id>	</item>
		<item>
		<title>Generated sources by JAXB and problem with encoding</title>
		<link>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/</link>
					<comments>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 21 Feb 2011 18:03:23 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=359</guid>

					<description><![CDATA[I recently had to solve the problem with JAXB to generate bad source from XSD. The problem was basically that the XSD source from which [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>I recently had to solve the problem with JAXB to generate bad source from XSD. The problem was basically that the XSD source from which they were subsequently generated Java code contained in the tag <xs:documentation> Czech diacritics characters, and unfortunately, the output files were not generated in the UTF-8, but the native format of operating system of my laptop, which is MacCentralEurope.<br />
<span id="more-359"></span><br />
What hapened when I then started building my code with Maven, I obviously &#8211; I had got exception that the generated files contain non-UTF characters. So I started investigation how to force the JAXB to generate source code in UTF-8 instead of using platform specific encoding.</p>
<p>A quick look into the source code JAXB again assured me that JAXB is not (politely spoken) the best written piece of software because there is something like this:</p>
<pre lang="java">
private final CharsetEncoder encoder = EncoderFactory.createEncoder(bw.getEncoding());
</pre>
<p>This piece of code always returns encoder by platform depend encoding and there is no way, how to force different encoding and only one way is to tell JVM wat encoding is the right one.</p>
<p>Fortunately, the solution is easy. Just set the system variable MAVEN_OPTS like this:</p>
<pre lang="Bash">
export MAVEN_OPTS="$MAVEN_OPTS -Dfile.encoding=UTF-8"
</pre>
<p>What surprised me that this issue is not documented, and even Google could not help me. So I hope these few lines will help to someone.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/generated-sources-by-jaxb-and-problem-with-encoding/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">359</post-id>	</item>
		<item>
		<title>SSL in Jetty plug-in</title>
		<link>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/</link>
					<comments>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Wed, 20 Oct 2010 06:00:11 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=342</guid>

					<description><![CDATA[Yesterday I had a chat with my colleague. We talked about how the Maven Jetty plug-ins enable SSL. In my last article I described how [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Yesterday I had a chat with my colleague. We talked about how the Maven Jetty plug-ins enable SSL. In my last article I described how to enable SSL in Tomcat, so now let&#8217;s see how to achieve the same result in the Jetty plugin.<br />
<span id="more-342"></span><br />
It is a few simple steps.</p>
<p>At first we have to create a keystore with a server certificate:</p>
<pre lang="bash">
keytool-genkey-alias-jetty6 keyalg RSA-keystore target / jetty-ssl.keystore-storepass changeit-keypass changeit-DNAME "CN = Your Domain Name"
</pre>
<p>Then modify the configuration of the Maven pom.xml:</p>
<pre lang="xml">
<plugin>
    <groupId>org.mortbay.jetty</groupId>
    <artifactId>maven-jetty-plugin</artifactId>
    <configuration>
        <contextPath>/context</contextPath>
        <scanIntervalSeconds>5</scanIntervalSeconds>
        <connectors>
            <connector implementation="org.mortbay.jetty.nio.SelectChannelConnector">
                <port>8080</port>
                <maxIdleTime>60000</maxIdleTime>
            </connector>
            <connector implementation="org.mortbay.jetty.security.SslSocketConnector">
                <port>8443</port>
                <maxIdleTime>60000</maxIdleTime>
                <keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
                <password>changeit</password>
                <keyPassword>changeit</keyPassword>
            </connector>
        </connectors>
    </configuration>
</plugin>
</pre>
<p>In the previous configuration, we defined the connection on port 8080 and port 8443 for SSL connections.</p>
<p>If we did not want to manually generate a server certificate, you can use other Maven plugin as shown below.</p>
<pre lang="xml">
<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>keytool-maven-plugin</artifactId>
    <executions>
        <execution>
            <phase>generate-resources</phase>
            <id>clean</id>
            <goals>
                <goal>clean</goal>
            </goals>
        </execution>
        <execution>
            <phase>generate-resources</phase>
            <id>genkey</id>
            <goals>
                <goal>genkey</goal>
            </goals>
        </execution>
    </executions>
    <configuration>
        <keystore>${project.build.directory}/jetty-ssl.keystore</keystore>
        <dname>cn=localhost</dname>
        <keypass>changeit</keypass>
        <storepass>changeit</storepass>
        <alias>jetty6</alias>
        <keyalg>RSA</keyalg>
    </configuration>
</plugin>
</pre>
<p>Now, when we invoke <code>mvn jetty: run</code> command, plug-in automatically creates a certificate that is then used in Jetty.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/ssl-in-jetty-plug-in/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">342</post-id>	</item>
		<item>
		<title>How to enable HTTPS on Tomcat</title>
		<link>https://jiri.kratochvil.eu/https-on-tomcat/</link>
					<comments>https://jiri.kratochvil.eu/https-on-tomcat/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 11 Oct 2010 09:12:41 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Security]]></category>
		<category><![CDATA[Tomcat]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=332</guid>

					<description><![CDATA[In this article I would like to describe how to enable SSL support in Tomcat. Basically it is a few steps, but there will be [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>In this article I would like to describe how to enable SSL support in Tomcat. Basically it is a few steps, but there will be recorded for cases when some of my colleague asked me <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /><br />
<span id="more-332"></span><br />
The first step is  creating a server certificate. It is possible to create in two different ways. Either you can create &#8222;self-signed certificate&#8220; or you can import certificate issued by some certification authority.</p>
<p>In this article we will create a self-signed certificate and then configure Tomcat to use the certificate. This configuration is enough for development.</p>
<p>For creating a server certificate, we will use <code>keytool</code> utility  of the JDK.</p>
<p>On Windows</p>
<pre lang="bash">%JAVA_HOME%binkeytool-genkey-alias tomcat-keyalg RSA</pre>
<p>On Linux</p>
<pre lang="bash">$JAVA_HOME/bin/keytool-genkey-alias tomcat-keyalg RSA</pre>
<p>Then uncomment the file server. (XML configuration file of Tomcat) this section:</p>
<pre lang="xml">
<!-- Define a SSL HTTP/1.1 Connector on port 8443          
        This connector uses the JSSE configuration, when using APR, the           
        connector should be using the OpenSSL style configuration           
       described in the APR documentation -->
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"
               maxThreads="150" scheme="https" secure="true"
               clientAuth="false" sslProtocol="TLS" />
</pre>
<p>And thats all. Your server supports both in SLL and non-SSL connections.</p>
<h2>Forcing SSL</h2>
<p>In case you need to make all connections to your application has been secured with SSL, and even when a user enters the address only as <strong>http</strong> you can use the following. </p>
<p>Edit the web.xml file of your application by adding the following element:</p>
<pre lang="xml">
<security-constraint>
        <display-name>AppOverSSL</display-name>
        <web-resource-collection>
            <web-resource-name>
                ResourceName
            </web-resource-name>
            <url-pattern>/</url-pattern>
            <http-method>POST</http-method>
            <http-method>GET</http-method>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>
</pre>
<p>Don&#8217;t forget to define right port number for SSL in your server.xml file in attribute <strong>redirectPort</strong> of element that is defined your unsecured connection:</p>
<pre lang="xml">
    <!-- A "Connector" represents an endpoint by which requests are received
         and responses are returned. Documentation at :
         Java HTTP Connector: /docs/config/http.html (blocking & non-blocking)
         Java AJP  Connector: /docs/config/ajp.html
         APR (HTTP/AJP) Connector: /docs/apr.html
         Define a non-SSL HTTP/1.1 Connector on port 8080
    -->
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
</pre>
<p>Now when users use non-secured connection is redirected on HTTPS connection.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/https-on-tomcat/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">332</post-id>	</item>
		<item>
		<title>Problem with Java Server Faces on JDK 1.6</title>
		<link>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/</link>
					<comments>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 21 Sep 2010 08:34:36 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[English]]></category>
		<category><![CDATA[JSF]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=325</guid>

					<description><![CDATA[On my new project, I had a problem with the web application deployment, which consisted of the classic combination of Java Server Faces, Spring Framework, [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>On my new project, I had a problem with the web application deployment, which consisted of the classic combination of Java Server Faces, Spring Framework, iBatis. I guess it was because I asked Google&#8217;s bad, but I spent it, how to solve this problem, some time, so they deserve an entry in my blog.</p>
<p>So what was the problem? Once I tried to deploy to Tomcat, I got this error message:</p>
<pre lang="inifile">
java.lang.ClassNotFoundException: [Ljava.lang.String;
at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java: 1645)
at org.apache.catalina.loader.WebappClassLoader.loadClass (WebappClassLoader.java: 1491)
at com.sun.faces.config.ConfigureListener.configure (ConfigureListener.java: 635)
at com.sun.faces.config.ConfigureListener.configure (ConfigureListener.java: 422)
        ...
</pre>
<p>I tried various queries, but I was not successful. When I lost hope, I found the following link, which is described <a href="http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6434149"> bug in JDK </a>.</p>
<p>Before I come across this error, because the last one was a web application to JDK 1.5, where everything works fine. So if anybody knows this bug, I offer the &#8222;official workaround.</p>
<p>Just pass the JVM startup parameter:</p>
<pre lang="shell">-Dsun.lang.ClassLoader.allowArraySyntax = true</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/problem-with-java-server-faces-on-jdk-1-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">325</post-id>	</item>
		<item>
		<title>Řízení vývoje – Metodika Scrum</title>
		<link>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/</link>
					<comments>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Mon, 18 Jan 2010 02:28:00 +0000</pubDate>
				<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[Agilní programování]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Metodiky]]></category>
		<category><![CDATA[Scrum]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=245</guid>

					<description><![CDATA[Před nedávnem jsme na projektu zavedli metodiku Scrum. Jedná se o metodiku, která se řadí mezi agilní metodiky pro řízení vývoje. Zájímavé na této metodice [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Před nedávnem jsme na projektu zavedli metodiku Scrum. Jedná se o metodiku, která se řadí mezi agilní metodiky pro řízení vývoje. Zájímavé na této metodice je to, že částečně eliminuje roli projektového managera a zodpovědnost za dodávku nechává v rukou samotných vývojářů.<br />
<span id="more-245"></span><br />
Na první pohled může to, co jsem uvedl znít &#8222;divoce&#8220;, ale už za pár dní jsem nabyl pocitu, &#8222;ze to může fungovat&#8220;. </p>
<p>Nejprve trochu terminologie. Samotný termín Scrum je odvozen od názvu tzv. mlýnu, který sportovní fanoušci mohou znát z rugby. Pro nesportovce (jako jsem třeba já)- jedná se o takový útvar, kdy se hráči postaví do zástupu a rozehrávají hru tím, že se mezi ně hodí míč a oni se o něj poperou. Dalšími termíny jsou pigs (prasata) a chickens (kuřata). Pigs jsou programátoři a chicken ti nad nimi (projekťáci, architekti, sponzoři projektu&#8230;).   </p>
<p>Celý proces vývoje se dělí na tzv. sprinty, což jsou období dlouhá několik týdnů (obyčejně tři až čtyři, ale může to být i delší). Pro tento sprint existuje plán úkolů, který se připraví do tzv. backlogu. V rámci sprintu si programátoři berou jeden úkol za druhým a postupně je realizují. Důležité je, aby doba realizace jednotlivých úkolů trvala ideálně jeden den. Navíc programátoři mohou do backlogu přidávat další úkoly, které je nutné realizovat během vývoje. </p>
<h2>Jak to celé funguje?</h2>
<p>Na počátku každého sprintu/etapy se svolá plánovací schůzka. Výsledkem této schůzky je plán pro příští sprint v takové formě, že s ním souhlasí každý člen týmu. Tento plánovací meeting je naplánován na celý den a povinně se účastní všichni &#8222;pigs&#8220;. Mohou být pozváni i zástupci z řad &#8222;chicken&#8220;, ti však nejsou oprávněni diskutovat. Je také vhodné pozvat zástupce z řad &#8222;business vlastníka&#8220; (zadavatel nebo analytik)</p>
<p>Tento meeting může být rozdělen do dvou částí. V první části se prochází jeden úkol backlogu za druhým a diskutuje se o tom, jak jej implementovat, co to má vlastně dělat apod. Jak bylo již uvedeno, právě pro tuto fázi je ideální, aby se této části meetingu zúčastnili i zástupci z business analytiků. Ti jsou tak však pouze od toho, aby zodpovídali dotazy.</p>
<p>V druhé části se jednotlivé úkoly ohodnocují body podle náročnosti. K tomuto účelu jsme s výhodou využili klasických hracích karet, kdy každý z členů měl k dispozici karty v hodnotě A, 2, 3, 5, 8 a K. Karty (kromě K) značí bodovou hodnotu, Král znamená &#8222;nelze realizovat&#8220;. Členové týmu u každého požadavku naráz ukáží kartu s jejich předpokladem (naráz proto, aby se nemohli ovlivňovat). Tuto &#8222;hru&#8220; můžeme nazvat třeba &#8222;hodnotící poker&#8220;. Důležité je, aby ve výsledku všichni členové týmu souhlasili s výslednou bodovou hodnotou. Tyto hodnoty se zapisují ke každému požadavku a stávají se závaznými. V našem týmu jsme tyto dvě etapy sloučili do jedné a přišlo mi to efektivnější.</p>
<p>Při hodnocení je důležité určit si převodní jednotku &#8211; tedy to, co vlastně znamená právě jeden bod. U nás je problém, že se nám nepodařilo úkoly rozdělit na tak atomické úkoly, že by měl jeden zabrat maximálně jeden den. Stanovili jsme tedy, že jeden bod znamená 0,5MD. </p>
<p>Dalším důležitým krokem určení tzv. velocity, což je zjednodušeně řečeno výkonnost týmu. Ta se počítá v různých jednotkách. V našem případě ji přepočítáváme na body, které reflektují pracnost úkolu, kterou jsme si určili na plánovacím meetingu pomocí hodnotícího pokeru. Vlastní velocita pak říká, kolik těchto bodů jsme schopni zrealizovat během jedné iterace (sprintu). </p>
<p>Během vlastní iterace(sprintu) se každý den uspořádá schůzka, které se říká scrum a vede ji Scrummaster. Délka této schůzky je striktně omezena na 15 minut. Během této schůzky každý vývojář odpoví na tři otázky: </p>
<ul>
<li>Co jsi udělal od poslední schůzky?</li>
<li>Co plánuješ udělat dnes? </li>
<li>Vyskytly se nějaké překážky, které bránily dokončení Tvého předhozího úkolu?</li>
</ul>
<p>Důležité je, že na této schůzce se případné problémy pouze identifikují, jejich řešení probíhá mimo scrum. Důvod je logický &#8211; nebudeme zdržovat ostatní členy týmu záležitostmi, které se jich přímo nedotýkají. A poslední věc: Scrumy je potřeba provádět ve stoje. Důvod je jednoduchý, relativně snadno se tím zabrání tomu, aby se účastníci scrumu rozpovídali (pokud nezabírá pořádat scrum ve stoje, pořádejte ho třeba v ruštině-uvidíte, že všichni budou rázem stručnější). Pokud je více týmů/scrumů, pořádá se ještě tzv. Scrum of Scrum. Na této schůzce Scrummasteři reportují problémy a status ze &#8222;svých&#8220; scrumů. A ještě jedna důležitá věc ke scrumům. Scrumy jsou určeny pouze pro členy týmů-projekťáci, sponzoři apod. se zúčastnít mohou, ale nesmí do schůzky nikterak zasahovat.</p>
<p>Na konci sprintu se pak uspořádá schůzka, kde se zhodnotí uplynulá iterace a diskutují se problémy, které se vyskytly během právě uplynulé iterace a hledá se jejich řešení. </p>
<p>Výhodou této metodiky je to, že zapojíme programátory přímo do procesu vývoje, navíc programátoři získají část zodpovědnosti za realizaci díla, termíny a kvalitu. Díky tomu nemají pocit, že by byli jen cvičenými opicemi. Další celkem důležitou záležitostí je fakt, že manažeři projektu ztratí část pravomocí, které se deleguje přímo na projektový tým. Manager pak má pouze funkci kontrolní, což ne vždy může být pro projektového manažera akceptovatelné. S tím se pojí nejdůležitější věc na celém procesu zavedení této metodiky. Vedení projektu musí plně důvěřovat vývojovému týmu, tomuto procesu vývoje a nesnažit se zavádět do této metodiky postupy, které znají ze své běžné praxe. </p>
<p>Uvidíme na konci projektu, jestli nám tato metodika pomohla lépe a s větší efektivitou zvládnout tu obrovskou horu práce, kterou realizujeme-určitě pak podám report. A co Vy? Používáte nějaké agilní metodiky vývoje (nebo i konzervativní)? Pokud ano, jaké s nimi máte zkušenosti?</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/rizeni-vyvoje-metodika-scrum/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">245</post-id>	</item>
		<item>
		<title>Zajímavá utilitka ve Springu</title>
		<link>https://jiri.kratochvil.eu/zajimava-utilita-ve-springu-stopwatch/</link>
					<comments>https://jiri.kratochvil.eu/zajimava-utilita-ve-springu-stopwatch/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 10 Nov 2009 02:41:37 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=186</guid>

					<description><![CDATA[Nejednou jsem si všiml, že spousta vývojářů má tendenci stále dokola vymýšlet kolo, místo toho, aby využili již hotových funkčností. Rozhodl jsem se tedy, že [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Nejednou jsem si všiml, že spousta vývojářů má tendenci stále dokola vymýšlet kolo, místo toho, aby využili již hotových funkčností. Rozhodl jsem se tedy, že vám čas od času předvedu některé zajímavé utilitky, které se nacházejí v často používaních frameworcích a knihovnách. Dnes si vezmu na paškál Spring framework a jejich package Utils.<br />
<span id="more-186"></span><br />
Package Utils ve Springu obsahuje spoustu zajímavých utilitek. V následujícím textu představím utilitu StopWatch. Třída org.springframework.util.StopWatch je jednoduchou utilitou, která pracuje jako stopky a nahrazuje konstrukce, které nejsou zcela nejčistší, jako je například tento pattern:</p>
<pre lang="java">long startTimeMillis = System.currentTimeMillis();

// do something ...

long endTimeMillis = System.currentTimeMillis();
log.debug("Volani trvalo: " + (endTimeMillis - startTimeMillis) + " ms");</pre>
<p>Ve springu tedy existují již zmíněné &#8222;stopky&#8220;. Výhodou jejich použití je zejména zvýšení čitelnosti kódu. Jen upozornění &#8211; StopWatch <strong>není thread safe</strong> (což znamená, že je nutné pro každé měření použít novou instanci této třídy).</p>
<p>Příklad použití:</p>
<pre lang="java">StopWatch stopWatch = new StopWatch("PrikladPouziti");
try {
    try {
        stopWatch.start("Krok1");
        // do something ...
    } finally {
        stopWatch.stop();
    }
    try {
        stopWatch.start("Krok2");
        // do something else ...
    } finally {
        stopWatch.stop();
    }
} finally {
    log.info(stopWatch.toString());
}</pre>
<p>Ten nejzákladnější výstup pak bude následující:</p>
<pre lang="ini">INFO StopWatchTest:34 - StopWatch 'PrikladPouziti': running time (millis) = 437;
                                        [Krok1] took 250 = 57%;
                                        [Krok2] took 187 = 43%</pre>
<p>Jenže tahle utilitka umí mnohem více, ale to už nechám na objevení každého z vás.</p>
<p>Vím, že podobná funkčnost je i v balíku Apache Commons Lang, ale tohle je článek o Springu <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
<p>[poll id=&#8220;1&#8243; type=&#8220;result&#8220;]</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/zajimava-utilita-ve-springu-stopwatch/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">186</post-id>	</item>
		<item>
		<title>JNDI kontext bez aplikačního serveru?</title>
		<link>https://jiri.kratochvil.eu/jndi-kontext-bez-aplikacniho-serveru/</link>
					<comments>https://jiri.kratochvil.eu/jndi-kontext-bez-aplikacniho-serveru/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Tue, 10 Nov 2009 00:31:19 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Spring]]></category>
		<category><![CDATA[Tipy]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=195</guid>

					<description><![CDATA[V praxi jsem se setkal se situaci, kdy potřebuji spouštět unit testy mimo aplikační server. Na tom není nic zvláštního, dělá to každý. Pro testy [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>V praxi jsem se setkal se situaci, kdy potřebuji spouštět unit testy mimo aplikační server. Na tom není nic zvláštního, dělá to každý. Pro testy si vytvořím vlastní konfigurace, které JNDI nepotřebují a je to. Jenže to by nebylo dostatečně zajímavé a hlavně je nutné udržovat dvě konfigurace, což je při vrozené lenosti programátora prostor pro inovaci.<br />
<span id="more-195"></span><br />
Představme si situaci, kdy používáme databázi, která je konfigurována přímo v aplikačním serveru pomocí JNDI. Ve Springu ji pak používáme nějak takto:</p>
<pre lang="xml">
 <jee:jndi-lookup id="analyticDataSource" jndi-name="jdbc/Analytic" 
                       resource-ref="false"/>
</pre>
<p>Jak pak v unit testech toto vyřešit? Ideální by bylo, vytvořit si nějakým způsobem vlastní JNDI kontext, který pak bude naše aplikace využívat. Spring nám k tomu nabízí rozumné prostředky. Pojďme se tedy podívat, jak na to.</p>
<pre lang="java">/**
 * InitialContext factory for test purposes - it simulates JNDI context.
 */
public class TestInitialContextFactory implements InitialContextFactory {
    /**
     * Creates an Initial Context for beginning name resolution.
     * Special requirements of this context are supplied
     * using <code>environment</code>.
     *

     * The environment parameter is owned by the caller.
     * The implementation will not modify the object or keep a reference
     * to it, although it may keep a reference to a clone or copy.
     *
     * @param environment The possibly null environment
     *                    specifying information to be used in the creation
     *                    of the initial context.
     * @return A non-null initial context object that implements the Context
     *         interface.
     * @throws javax.naming.NamingException If cannot create an initial context.
     */
    public Context getInitialContext(Hashtable environment) throws NamingException {

        // Vytvorime si datasource, ktery chceme publikovat v JNDI
        DriverManagerDataSource ds = new DriverManagerDataSource(
                "oracle.jdbc.driver.OracleDriver",
                "jdbc:oracle:thin:@localhost:1521:TES_DB",
                "test",
                "password");

        try {
            // Tady zacneme tvorit vlastni kontext
            SimpleNamingContextBuilder builder = new SimpleNamingContextBuilder();

            // Pridame nas datasource do kontextu
            builder.bind("jdbc/MyDataSource", ds);

            builder.activate();
            return builder.createInitialContextFactory(null).getInitialContext(null);
        } catch (NamingException e) {
            e.printStackTrace();
        }
        return null;
    }
}</pre>
<p>Nyní už jen zbývá si v aplikaci nastavit, jak se má kontext vytvářet. To zajistíme konfigurací v souboru jndi.properties:</p>
<pre lang="ini">java.naming.factory.initial=eu.kratochvil.blog.ukazky.TestInitialContextFactory</pre>
<p>Jak tuto problematiku řešíte na svých projektech? Budu rád, když mi odpovíte prostřednictvím komentáře.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/jndi-kontext-bez-aplikacniho-serveru/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">195</post-id>	</item>
		<item>
		<title>Nepříjemný bug v Mavenu</title>
		<link>https://jiri.kratochvil.eu/neprijemny-bug-v-mavenu/</link>
					<comments>https://jiri.kratochvil.eu/neprijemny-bug-v-mavenu/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Wed, 04 Nov 2009 00:23:46 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Programování]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Maven]]></category>
		<category><![CDATA[Spring]]></category>
		<guid isPermaLink="false">http://blog.kratochvil.eu/?p=133</guid>

					<description><![CDATA[Na projektu používáme pro build nástroj Maven ve verzi 2.0.9. Jedná se o perfektní nástroj do doby, kdy pracuje tak, jak má. Ve chvíli, kdy [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Na projektu používáme pro build nástroj Maven ve verzi 2.0.9. Jedná se o perfektní nástroj do doby, kdy pracuje tak, jak má. Ve chvíli, kdy se začne chovat &#8222;tak nějak divně&#8220; se chyby hledají docela těžko.<br />
<span id="more-133"></span><br />
Co se vlastně stalo? Začalo to tím, že testy začaly vyhazovat následující výjimky:</p>
<pre lang="ini">
org.apache.commons.dbcp.SQLNestedException: Cannot create JDBC driver of class 'oracle.jdbc.driver.OracleDriver' for connect URL 'http://maven.apache.org'
	at org.apache.commons.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1150)
	at org.apache.commons.dbcp.BasicDataSource.getConnection(BasicDataSource.java:880)
	at org.hibernate.ejb.connection.InjectedDataSourceConnectionProvider.getConnection(InjectedDataSourceConnectionProvider.java:46)
	at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446)
</pre>
<p>To nejdivnější bylo to, že se aplikace snažila připojovat na URL: &#8218;http://maven.apache.org&#8216; místo toho, aby se připojovala na URL, která byla v konfiguraci. </p>
<p>Dalším pátráním jsem zjistil, že se v &#8222;targetu&#8220;, tedy místě, kam se ukládají zkompilované zdrojáky, vyskytuje soubor, definující springový kontext, a v něm se vyskytovalo následující (v property <strong>url</strong>):</p>
<pre lang="xml">
    <bean id="microsDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
       <property name="driverClassName" value="${jdbc.driverClassName}"/>
       <property name="url" value="http://maven.apache.org"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
    </bean>
</pre>
<p>Jak se tam to mohlo dostat, když ve zdrojáku je něco úplně jiného:</p>
<pre lang="xml">
    <bean id="microsDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
       <property name="driverClassName" value="${jdbc.driverClassName}"/>
       <property name="url" value="${jdbc.url}"/>
       <property name="username" value="${jdbc.username}"/>
       <property name="password" value="${jdbc.password}"/>
    </bean>
</pre>
<p>Začali jsme tedy pátrat, jak se tam mohl tento řetězec dostat, a měla to na svědomí tahle konstelace:<br />
V POMu projektu byla definováno něco takového:</p>
<pre lang="xml">
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cz.csas.clf</groupId>
    <artifactId>clf-micros-product-configurator</artifactId>
    <packaging>war</packaging>
    <version>${version.micros}</version>
    <name>clf-micros-product-configurator</name>
    <url>http://maven.apache.org</url> 
       ...
    <build>
        <resources>
           ...
            <resource>
                <directory>src/main/resources</directory>
                <filtering>true</filtering>
            </resource>
        </resources>
          ...
</pre>
<p>Co je na předchozím POMu zajímavých několik věcí. Je nastaveno filtrování resourců pro adresář, kde je uložen soubor s konfigurací a v projektu byl definován parametr url.</p>
<p>Díky chybě v mavenu došlo k nahrazení placeholderu ${jdbc.url} za property url, která navíc nebyla property <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f642.png" alt="🙂" class="wp-smiley" style="height: 1em; max-height: 1em;" /> </p>
<p>Naštěstí pomohl upgrade na nejnovější verzi mevenu (2.2.1), kde se chyba už nevyskytla. Zvláštní je, že jsem v žádných release notes nebo něčem podobným nenašel o tomto problému žádnou zmínku.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/neprijemny-bug-v-mavenu/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">133</post-id>	</item>
	</channel>
</rss>
