<?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>J2EE &#8211; Jiří Kratochvíl</title>
	<atom:link href="https://jiri.kratochvil.eu/tag/j2ee/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>J2EE &#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>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>JAX-WS a SOAP Attachments</title>
		<link>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/</link>
					<comments>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sat, 06 Feb 2010 06:08:16 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[JAX-WS]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[MTOM]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[SOAP-Attachment]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Weblogic]]></category>
		<category><![CDATA[WS]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=253</guid>

					<description><![CDATA[Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Pokud potřebujete poslat přes webovou službu trochu víc dat, než je pár detailů o klientovi, je dobré tyto data posílat jako SOAP attachment a ne přímo v nějakém tagu samotné zprávy. A přesně to, jsem se snažil řešit na projektu. Používáme JAX-WS a aplikace běží to na Weblogicu Server. Weblogic je znamý tím, že si &#8222;sem-tam&#8220; některé knihovny upraví k obrazu svému a pak se výsledek může chovat trochu jinak, než by člověk mohl čekat. Nevím, zda se v mém případě jednalo o nějakou lahůdku Weblogicu, ale postup k cíli nebyl vůbec přímočarý.<br />
<span id="more-253"></span><br />
Typická služba vypadá takto:</p>
<pre lang="java">
import ...

@WebService(targetNamespace = "http://schemas/wsdl")
@SOAPBinding(style = SOAPBinding.Style.DOCUMENT, use = SOAPBinding.Use.LITERAL)
public interface Documentation {

    @WebMethod
    @WebResult(name = "receiveDocument")
    @XmlMimeType("application/octet-stream")
    DataHandler getDocument(
            @WebParam(name = "documentId",
                    targetNamespace = "http://schemas/wsdl",
                    mode = WebParam.Mode.IN) Integer documentId);
}
</pre>
<p>a následná implementace:</p>
<pre lang="java">
import ...

@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Pokud chceme používat SOAP attachmentů, můžeme využít implementace od SUNu (vlastně teď Oraclu). Souhrnně se této technice říká <a href="http://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism">Message Transmission Optimization Mechanism</a> (zkráceně MTOM) a právě SUN nabízí pro tyto účely implementaci pro JAX-WS (upozorňuji, že třeba v AXISu to funguje úplně jinak).</p>
<p>Vše se tváří naprosto triviálně &#8211; stačí jako jeden výstupní parametr použít s typem <code>javax.activation.DataHandler</code>, nastavit u tohoto parametru pomocí <code>javax.xml.bind.annotation.XmlMimeType</code> správný content type a celou třídu oanotovat pomocí <code>@MTOM</code>. Vše by mělo zázračně začít fungovat. Jenže ono to nefunguje.</p>
<p>Ač o tom není v dokumentaci ani zmínka záleží na tom, kde se anotace umístí. Tato anotace se totiž neumisťuje do interface, kde bych to očekával, ale přímo do třídy, která implementuje naše rozhraní této webové služby. Abychom nám začali fungovat attachmenty, upravíme příklad, který jsem uvedl na začátku tohoto článku:</p>
<pre lang="java">
import ...

@MTOM
@StreamingAttachment(parseEagerly = true, memoryThreshold = 40000L)
@WebService(serviceName = "Documentation", endpointInterface = "Documentation")
@SchemaValidation
public class DocumentationImpl  implements Documentation {

    @Override
    public DataHandler getDocument(Integer documentId) {
        return getService().getDocument(documentId);
    }
}
</pre>
<p>Přidal jsem dvě anotace: <code>@MTOM</code> a <code>@StreamingAttachment(...)</code>. Ta první aktivuje tuto funkčnost a od nyní se všechny atributy typu <code>DataHandler</code> budou přenášet jako SOAP attachment. Anotaci <code>@StreamingAttachment(...)</code> využijeme v případě, že budeme přenášet skutečně velké soubory a posílání souboru nám bere moc paměti. A ještě jedna chytrá věc-v anotaci <code>@MTOM</code> je parametr <code>threshold</code>, který říká, od jaké velikosti se daný element pošle jako SOAP attachment a kdy se pošle přímo v elementu samotné zprávy.</p>
<p>Na závěr ještě ukázku, jak pak vypadají data ze služby:</p>
<pre lang="XML">
HTTP/1.1 200 OK
Date: Sat, 06 Feb 2010 07:46:28 GMT
Transfer-Encoding: chunked
Content-Type: multipart/related;start="<rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>";type="application/xop+xml";boundary="uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e";start-info="text/xml"
X-Powered-By: Servlet/2.5 JSP/2.1

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <rootpart*783e56c7-ff09-40d8-91cd-d0ec0ce9555e@example.jaxws.sun.com>
Content-Type: application/xop+xml;charset=utf-8;type="text/xml"
Content-Transfer-Encoding: binary

<?xml version='1.0' encoding='UTF-8'?>
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <ns2:getDocumentResponse xmlns:ns2="http://schemas/wsdl">
      <receiveDocument>
        <Include xmlns="http://www.w3.org/2004/08/xop/include" href="cid:383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com"/>
      </receiveDocument>
    </ns2:getDocumentResponse>
  </S:Body>
</S:Envelope>
--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e
Content-Id: <383e4726-8e85-4a46-a917-23811ec4ef3e@example.jaxws.sun.com>
Content-Type: application/pdf
Content-Transfer-Encoding: binary

%PDF-1.4
.
.
.
%%EOF

--uuid:783e56c7-ff09-40d8-91cd-d0ec0ce9555e-
</pre>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/jax-ws-a-soap-attachments/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">253</post-id>	</item>
		<item>
		<title>Co je nového v Javě EE 6</title>
		<link>https://jiri.kratochvil.eu/novinky-java-ee-6/</link>
					<comments>https://jiri.kratochvil.eu/novinky-java-ee-6/#respond</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sat, 12 Dec 2009 01:16:27 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Události]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=237</guid>

					<description><![CDATA[Vyšla Java EE 6 a pro mě to byla příležitost se seznámit s tím, co nová platforma nabízí. Mezi novinky, které stojí za zmínku, patří [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Vyšla Java EE 6  a pro mě to byla příležitost se seznámit s tím, co nová platforma nabízí. Mezi novinky, které stojí za zmínku, patří například dependency injection nebo bean validation. Dále byly výrazně rozšířeny funkčnosti EJB, servletů.<br />
<span id="more-237"></span><br />
Dle vývojářů nové Javy EE byla snaha o docílení několika hlavních cílů: flexibilní technologická platforma, možnosti rozšiřování platformy a snadnost vývoje. </p>
<h2>Technologická platforma</h2>
<p>Java EE 6 přináší nový koncept profilů a konfigurovatelnosti, které nyní mohou být designovány až na úroveň jednotlivých tříd. Co to vlastně je? Profil je v podstatě podmnožina Javy EE, která může být navíc doplněna o další technologie a toto vše slouží pak pro plnění určité úlohy. Například v aktualním releasu Javy EE byl uvolněn profil <a href="http://java.sun.com/developer/technicalArticles/JavaEE/JavaEE6Overview_Part3.html#webprof">WebProfile</a>, což je jakési redukované SDK, které slouží pouze pro provozování webových aplikací a &#8222;netahá&#8220; na server věci,které pro provoz webové aplikace nepotřebuji (EJB, messaging apod.).</p>
<h2>Rozšiřování platformy</h2>
<p>Nová verze této platformy poskytuje mnohem více možností, jak rozšířit funkčnost SDK. Tuto oblast jsem však hluboce nestudoval, a tak pojďme dále.</p>
<h2>Jednoduchost vývoje</h2>
<p>Toto je asi oblast, která zajímá každého vývojáře, protože by mu měla usnadnit práci. Byla rozšířena sada nových anotací, které může vývojář využívat. Pro definovánáí webových komponent přibyla možnost snadné deklarace servletů (<code>@WebServlet</code>) nebo filtrů (<code>@WebFilter</code>). Dále byla standardizováno dependency injection, díky čemuž dojde ke sjednocení zápisu napříč všemi frameworky. </p>
<p>Další příjemnou záležitostí je to, že došlo ke zjednodušení požadavků na jednotlivé javové packages. Což v praxi například znamená, že dnes můžeme do *.war přibalit implementaci EJB. </p>
<p>Další nové funkčnosti, které bych rád představil můžeme rozdělit do následujících kategorií: Prezentační vrstva, dependency injection a data validation, služby a perzistenční vrstva.</p>
<h2>Prezentační vrstva</h2>
<p>Za nejzásadnější změnu považuji implementaci specifikace <a href="http://jcp.org/en/jsr/detail?id=315">Servlet 3.0</a>. Tato nová specifikace, kromě spousty jiného, přináší podporu asynchronního zpracování nebo tzv. long-lived spojení.</p>
<p>Další novinkou na prezentační vrstvě je <a href="http://jcp.org/en/jsr/detail?id=314">nová specifikace JSF</a>. JSF 2.0 zjednodušuje tvorbu jednotlivých stránek pomocí faceletů, šablon a pod. Výhodou je, že tyto funkšnosti byly konečně standardizovány a neřeší si to každý framework po svém. Dále se objevila vestavěná podpora Ajaxu a anotací. </p>
<p>Součástí release Java EE 6 je i nová specifikace JSP 2.2.</p>
<h2>Dependency Injection a Data Validation</h2>
<p>The Contexts and Dependency Injection for the Java EE Platform (CDI) je definován v <a href="http://jcp.org/en/jsr/detail?id=299">JSR 299</a> a zavádí standardizovanou formu dependency injection. CDI dále zjednodušuje interoperabilitu mezi JSF a EJB, kdy umožňuje použití EJB místo managed beans.</p>
<p><a href="http://jcp.org/en/jsr/detail?id=303">Bean Validation</a> (JSR 303) zavádí validace, které byly standardizovány a navíc mohou být sdíleny mezi všemi vrstvami aplikace (webová vrstva, služby nebo doménový model).</p>
<h2>Služby a konponenty</h2>
<p>Novinkou je určitě nová verze <a href="http://jcp.org/en/jsr/detail?id=318">EJB 3.1</a> a nativní <a href="http://jcp.org/en/jsr/detail?id=311">podpora RESTových služeb</a>. </p>
<p>V EJB 3.1 nyní kromě spousty jiného najdeme:</p>
<ul>
<li>Není dále potřeba vytvářet interface pro jednotlivé EJB</li>
<li>Nová anotace, kterou je možné definovat singleton (<code>@Singleton</code>)</li>
<li>Stejně jednoduše jako singleton se zajistí asynchronní služby. Na beanu se pouze použije anotace <code>@Asynchronous</code>.</li>
</ul>
<h2>Perzistenční vrstva</h2>
<p>V nové vezi Javy EE se konečně dočkáme nové verze <a href="http://jcp.org/en/jsr/detail?id=317">JPA 2.0</a>. Došlo k rozšíření JPQL a nabízí zcela nové API pro definici kriterií (Criteria API). V nové verzi JPA dále programátor získává přístup k vlastnímu metamodelu.</p>
<p>Zajímavostí je zavedení podpory kolekcí. Slouží pro to dvě anotace <code>@ElementCollection</code>(definuje vlastní objekt, který má být v dané kolekci) a <code>@CollectionTable</code> (popisuje vlastní tabulku, kde bude ona kolekce uložena).</p>
<p>Snad se mi alespoň z části podařilo popsat ty, z mého pohledu, nejzajímavější novinky v Javě EE. Pokud jste narazili na další chytré novinky, budu rád za to, když se o ně podělíte v komentářích.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/novinky-java-ee-6/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">237</post-id>	</item>
		<item>
		<title>Co to jsou Java Closures?</title>
		<link>https://jiri.kratochvil.eu/java-closures/</link>
					<comments>https://jiri.kratochvil.eu/java-closures/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Sat, 21 Nov 2009 03:45:39 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Návody]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=212</guid>

					<description><![CDATA[Opět se ve světě jazyka Java objevil fenomén zvaný Java Closures (také zvaný BGGA), který je plánován do Javy 7. Už při prvním uvedení se [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Opět se ve světě jazyka Java objevil fenomén zvaný Java Closures (také zvaný BGGA), který je plánován do Javy 7. Už při prvním uvedení se proti němu zvedla vlna nevole a zdálo se, že tato konstrukce přeci jen v Javě 7 vznikne. Kolem tohoto tématu bylo už napsána spousta textu. Navíc jsme se o tématu Java Closures docela vášnivě pobavili v našem týmu. Proto jsem se rozhodl, že k tomuto tématu upustím nějaké moudro i já&#8230;<br />
<span id="more-212"></span><br />
Když jsem narazil na <a href="http://docs.google.com/View?docid=ddhp95vd_0f7mcns">článek</a>, který naznačuje, že Java Closures v Javě budou, napadlo mě, kde Java skončí. Kam se v Javě vytratila ona striktnost a objektovost? Ale konec stěžování si. Pojďmě si říct, co to vlastně ony closures jsou. </p>
<p>Definice říká, že se jedná o anonymní funkci, která není izolována od okolního světa tak, jak to známe běžně v Javě. Navíc má takováto funkce přístupné všechny proměnné, které jsou přístupné ve scope, ve kterém byla tato &#8222;funkce&#8220; volána. </p>
<p>Tolik definice. Vlastní closures vznikly v jazyce Lisp a postupně se rozšířily do dalších jazyků &#8211; zejména funkcionálních. Kolega mi doporučil, abych se podíval na jazyk Ruby, který je prý dokonalý &#8211; uvidíme. V rámci studia Ruby se pokusím closures pochopit nejprve v jazyce, kde to již funguje &#8211; tedy právě v Ruby. A pak se podíváme na to, jak by se to dalo používat v Javě.</p>
<p>Začněme příkladem, který bude simulovat funkci unixové aplikace grep. V Ruby se to dá implementovat celkem snadno:</p>
<pre lang="ruby">
IO.foreach("test.txt") do |line| 
	if (line =~ /total: (d+)/)
		puts $1;
	end
end
</pre>
<p>Tento kód projde soubor test.txt a vypíše řádky, které ty, které odpovídají patternu. První příjemné překvapení v Ruby je to, jak některé věci jdou snadno. Otevření souboru a jeho proiterování po řádcích zajistí příkaz IO.foreach. </p>
<p>Pojďme dále. Zapouzdříme si toto volání do samostatné operace, která bude očekávat na vstupu název souboru a pattern, který budeme vyhledávat.</p>
<pre lang="ruby">
class File
	def File.grep(filename, pattern)
		IO.foreach(fileName) do |line|
			if matchData = pattern.match(line)
				yield matchData;
			end
		end
	end
end
	
File.grep("test.txt", /total: (d+)/) { |matchData| puts matchData[1]; }
</pre>
<p>Teď už to vypadá zajímavěji. Voláme funkci <code>File.grep</code> s tím, že definujeme funkci, která se má provést uvnitž volané funkce. Jak toto zajistit? Všimněte si příkazu <code>yield</code>. Ten zajistí předání proměnné <code>matchData</code> do closure a její vyvolání. Doufám, že jsem to popsal dostatečně srozumitelně. </p>
<p>Zastánci těchto konstrukcí říkají, že tyto konstrukce velmi zjednodušují vývoj. Velmi častým příkladem je konstrukce <code>foreach</code>. Argumentem je to, že v Javě se konstrukce <code>foreach</code> objevila teprve v Javě 5. Kdyby měla closures, nebylo by nutné <code>foreach</code> vůbec řešit. Když to srovnáme s Ruby, zjistíme, že tento jazyk tyto konstrukce vůbec neřeší. Nemusí, protože tyto věci jsou řešeny právě prostřednictvím closures.</p>
<p>Dalším pádným argumentem pro closures je použití patternu command v Javě, kdy dnes musíme v parametru metody předávat novou instanci objektu. </p>
<p>Tolik tedy výhody. Na první pohled se zdá, že closures jsou skvělou věcí. Jenže když se na to podíváme z jiného úhlu pohledu, nebudou se tyto konstrukce zdát tak dokonalé. </p>
<p>První věcí je, že se mění syntaxe jazyka. Podle mého názoru musí být pro změnu syntaxe jazyka opravdu pádný důvod s tím, že současné řešení je naprosto nedostatečné (například annotace). Změna syntaxe totiž přináší spoustu nepříjemností. Kromě toho, že ztrácíme zpětnou kompatibilitu, komplikujeme život programátorům tím, že se snižuje čitelnost tohoto kódu.</p>
<p>Další věcí je že tyto konstrukce patří dle mého názoru spíše do světa funkcionálních jazyků, boří striktnost objektového programování. Navíc se podle všeho Java bude chovat tak, že onu konstrukci closure převede do &#8222;staré konstrukce&#8220;. Díky tomu se stále častěji budeme setkávat s tím, že nám bude docházet PerGemSpace, protože pokud si programátoři closures oblíbí a začnou je masivně používat, budou vznikat mraky objektů.</p>
<p>Jak se v Javě closures budou používat? Pojďme se tedy podívat na jednoduchý příklad, který na příkladu <a href="http://jakarta.apache.org/commons/collections/api-release/org/apache/commons/collections/CollectionUtils.html">CollectionUtils</a> ukazuje použití closures v Javě.</p>
<pre lang="java">
public Collection<User> getAdminList(Collection<User> users) {
    return select(users, {User user =>
        user.isAdmin()
    });
}

/**
 * Vraci seznam objektu T z kolekce, kde closure vraci true.
 *
 * @param source kolekce objektu T nesmi byt null
 * @param predicate vraci true pro zadany objekt T, ktery ma byt ve vysledne kolekci
 * @return vraci seznam objektu T z kolekce, kde closure vraci true
 */
public static <T> Collection<T> select(Collection<T> source,
        {T=>Boolean} predicate) {
    Collection<T> result = new ArrayList<T>();
    for (T o : source) {
        if (predicate.invoke(o)) {
            result.add(o);
        }
    }
    return result;
}
</pre>
<p>A ještě jeden příklad použití. Bývá jím použití komparátoru jako closure. Díky tomu získáme možnost řadit si objekty v kolekci podle toho, jak potřebujeme. </p>
<pre lang="java">
public static void sortByTitle(Collection books) {
    sort(books, {Book book =>
        book.getTitle()
    });
}

/**
 * Sorts the given list of T objects, using the block to compare
 * individual elements of the list.
 *
 * @param l
 *            list to be sorted
 * @param block
 *            returns the value of a property of the given T object
 *            that should be used for sorting
 */
public static <T> void sort(List<T> l,
        {T=>Comparable} block) {
    sort(T o1, T o2 : l) {
        block.invoke(o1).compareTo(block.invoke(o2));
    }
}
</pre>
<p>To, zda jsou closures dobrá nebo špatná věc, nechám na uvážení každého. Osobně s tímto konceptem nejsem smířen a nelíbí se mi. Na druhou stranu nepopírám, že rozumné použití closures může vést ke zjednodušení kódu aplikace. Otázkou zůstává, zda tyto změny syntaxe nepovedou k tomu, aby se z Javy stal jazyk typu PHP&#8230;</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/java-closures/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">212</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>Vlastní certifikát ve Weblogicu</title>
		<link>https://jiri.kratochvil.eu/vlastni-certifikat-weblogic/</link>
					<comments>https://jiri.kratochvil.eu/vlastni-certifikat-weblogic/#comments</comments>
		
		<dc:creator><![CDATA[Jiří Kratochvíl]]></dc:creator>
		<pubDate>Fri, 06 Nov 2009 16:23:37 +0000</pubDate>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[Návody]]></category>
		<category><![CDATA[J2EE]]></category>
		<category><![CDATA[linkedin]]></category>
		<category><![CDATA[Tipy]]></category>
		<category><![CDATA[Weblogic]]></category>
		<guid isPermaLink="false">http://jiri.kratochvil.eu/?p=164</guid>

					<description><![CDATA[Na projektu jsem se setkal se situací, kdy se prostřednictvím SSL připojujeme na middleware. V podstatě se jedná o klasické volání webových služeb. Problém byl [&#8230;]]]></description>
										<content:encoded><![CDATA[<p>Na projektu jsem se setkal se situací, kdy se prostřednictvím SSL připojujeme na middleware. V podstatě se jedná o klasické volání webových služeb. Problém byl v tom, že když jsme tuto službu zavolali, Weblogic vracel výjimky o tom, že protistrana používá neznámé certifikáty.<br />
<span id="more-164"></span><br />
Problém byl v tom, že se protistrana identifikovala certifikátem, který byl self-signed, ale stejný problém nás potká, pokud protistrana bude využívat certifikát vydaný certifikační autoritou, kterou neznáme. V obou případech dostaneme výjimku:</p>
<pre lang="ini">
javax.xml.ws.WebServiceException: javax.net.ssl.SSLKeyException: 
[Security:090477]Certificate chain received from mw.company.com - 10.0.0.1 
was not trusted causing SSL handshake failure.
</pre>
<p>Jak z toho wen? Musíme náš server naučit pracovat s certifikátem protistrany. Weblogic pro práci s certifikáty využívá několik cest. Já si pro dosažení kýženého cíle zvolil standardnější cestu, a to přes <em>java key store</em>. </p>
<p>Začneme s tím, že si vytvořime náš serverový certifikát:</p>
<pre lang="bash">
keytool -genkey -file ./app_server.jks
</pre>
<p>Tím se nám na aplikačním serveru vytvoří keystore s naším serverovým certifikátem. Následně musíme získat veřejný certifikát protistrany. Buď nám jej pošle hodný správce serveru nebo si jej stáhneme (například pomocí webového browseru). Tento server si naimportujeme do jiného key store:</p>
<pre lang="bash">
keytool  -keystore ./micros_trust.jks -import -file ./alsb.cer
</pre>
<p>(soubor alsb.cer obsahuje veřejný klíč protistrany)</p>
<p>Nyní už nám nezbývá nic jiného, než nakonfigurovat Weblogic. V menu zvolíme <em>Enviroment->Servers</em>. Vybereme si node, na kterém máme nadeployovanou aplikaci a následně zvolíme záložku <em>Keystores</em>.</p>
<p>V combo boxu zvolíme volbu <em>Custom Identity and Custom Trust</em>.<br />
<a href="http://jiri.kratochvil.eu/wp-content/2009/11/wl_jks1.PNG"><img decoding="async" src="http://jiri.kratochvil.eu/wp-content/2009/11/wl_jks1-150x117.PNG" alt="Volba keystore" title="Volba keystore" width="150" height="117" class="aligncenter size-thumbnail wp-image-174" /></a></p>
<p>Následně si nastavíme cesty v jednotlivým keystore, vyplníme typ (JKS) a hesla. </p>
<p><a href="http://jiri.kratochvil.eu/wp-content/2009/11/wl_jks2.PNG"><img loading="lazy" decoding="async" src="http://jiri.kratochvil.eu/wp-content/2009/11/wl_jks2-150x150.PNG" alt="wl_jks2" title="Nastavení keystore" width="150" height="150" class="aligncenter size-thumbnail wp-image-177" /></a></p>
<p>A to je vše. Od této chvíle bude Weblogic věřit pouze certifikátům, které máme v našem keystore. Navíc budou SSL spojení na náš server zabezpečena certifikátem, který jsme si vyrobili v prvním kroku.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://jiri.kratochvil.eu/vlastni-certifikat-weblogic/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
		<post-id xmlns="com-wordpress:feed-additions:1">164</post-id>	</item>
	</channel>
</rss>
