<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress.com" -->
<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/"
	>

<channel>
	<title>java &amp;laquo; WordPress.com Tag Feed</title>
	<link>http://wordpress.com/tag/java/</link>
	<description>Feed of posts on WordPress.com tagged "java"</description>
	<pubDate>Thu, 16 Oct 2008 04:58:34 +0000</pubDate>

	<generator>http://wordpress.com/tags/</generator>
	<language>en</language>

<item>
<title><![CDATA[Javajavajavajava]]></title>
<link>http://dizzyninja.wordpress.com/?p=102</link>
<pubDate>Thu, 16 Oct 2008 04:35:19 +0000</pubDate>
<dc:creator>Dizzy</dc:creator>
<guid>http://dizzyninja.lt.wordpress.com/2008/10/16/javajavajavajava/</guid>
<description><![CDATA[Coffee is an odd thing. Whose idea was it to roast some strange green seeds until they were brown or]]></description>
<content:encoded><![CDATA[<p>Coffee is an odd thing. Whose idea was it to roast some strange green seeds until they were brown or black, then crush them up with a mortar and pestle and filter scalding hot water through them? Some alchemist back in the day when alchemy existed had far, far too much time on his hands and hadn't yet managed to turn anything into gold. He might've never made gold, but he made the next best thing. He made a beverage that tapped into all the energy and deliciousness of those strange little burned formerly green seeds. If he didn't get filthy rich off of his presumably accidental invention (the likes of which weren't seen again until the chocolate chip cookie and the post-it note), there is most certainly no justice in this world.</p>
<p>Coffee makes me wired, to be sure; especially since I don't drink enough of it to build any sort of tolerance. It isn't a real alertness, however. It doesn't feel genuine. It feels like my body is exhausted but lying to me and telling me "oh, sure dude, don't worry about it, we're cool" all while struggling to keep up. My muscles sometimes ache, and often times I'll feel a strange, awake version of grogginess.</p>
<p>I don't usually crash hard like I do wish sugar. Instead the grogginess and general heaviness lingers for most of the day. I get sore easier, usually by sitting for too long, and I'll usually sleep like a catatonic slug the following night.</p>
<p>I can't wait to see how my body reacts to excessive alcohol.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Learnings (Imp)]]></title>
<link>http://techzen.wordpress.com/?p=518</link>
<pubDate>Thu, 16 Oct 2008 04:34:10 +0000</pubDate>
<dc:creator>techzen</dc:creator>
<guid>http://techzen.lt.wordpress.com/2008/10/16/learnings-imp/</guid>
<description><![CDATA[java substring  ((min,max) s lower case )
min - inclusive
max - exculsive
indexOf (o upper case - r]]></description>
<content:encoded><![CDATA[<p>java substring  ((min,max) s lower case )<br />
min - inclusive<br />
max - exculsive</p>
<p>indexOf (o upper case - returns -1 of not found...)</p>
<p>Always send the complete URL to external party instead of alias -</p>
<p>Always check the path of each of pst files and do a regular back up. Do not depend on office laptop.<br />
Recheck pst file for opening before formatting the drive.</p>
<p>Can we use regex for extraction of domain from the url?</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[MD5]]></title>
<link>http://gylsheaven.wordpress.com/2008/10/16/md5/</link>
<pubDate>Thu, 16 Oct 2008 02:57:42 +0000</pubDate>
<dc:creator>gylsheaven</dc:creator>
<guid>http://gylsheaven.lt.wordpress.com/2008/10/16/md5/</guid>
<description><![CDATA[Following algorithms are equivalent.
.NET 



FormsAuthentication.HashPasswordForStoringInConfigFile]]></description>
<content:encoded><![CDATA[<p>Following algorithms are equivalent.</p>
<p>.NET<br><br />
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">FormsAuthentication.HashPasswordForStoringInConfigFile()</td>
</tr>
</tbody>
</table>
<p><br>Java<br><br />
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">
<p>import java.security.MessageDigest;
<p>...
<p>public String md5(String s, String s1)<br>&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; String s2 = s + s1;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte abyte0[] = s2.getBytes();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; StringBuffer stringbuffer = new StringBuffer();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; String s3 = null;<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; try<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; {<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; MessageDigest messagedigest = MessageDigest.getInstance("MD5");<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; messagedigest.reset();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; messagedigest.update(abyte0);<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; byte abyte1[] = messagedigest.digest();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; for(int i = 0; i &#60; abyte1.length; i++)<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; stringbuffer.append(Integer.toHexString(0xff &#38; abyte1[i] &#124; 0x100).substring(1, 3));
<p>&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; s3 = stringbuffer.toString();<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; catch(Exception exception) { }<br>&#160;&#160;&#160;&#160;&#160;&#160;&#160; return s3;<br>&#160;&#160;&#160; }</p>
</td>
</tr>
</tbody>
</table>
<p><br>VB/ASP<br><br />
<table cellspacing="0" cellpadding="2" width="400" border="1">
<tbody>
<tr>
<td valign="top" width="400">Google.</td>
</tr>
</tbody>
</table>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Hacking]]></title>
<link>http://offsignal.wordpress.com/?p=3</link>
<pubDate>Wed, 15 Oct 2008 23:12:24 +0000</pubDate>
<dc:creator>offsignal</dc:creator>
<guid>http://offsignal.lt.wordpress.com/2008/10/15/hacking/</guid>
<description><![CDATA[1. Basic Socket Programming: (4 videos - 65 mins)
1.1 Presentation on Socket Programming basics (25 ]]></description>
<content:encoded><![CDATA[<p><strong>1. Basic Socket Programming: (4 videos - 65 mins)</strong></p>
<p>1.1 Presentation on Socket Programming basics (25 mins)<br />
1.2 "Type with Me" exercise - a simple TCP server (19 mins)<br />
1.3 Coding a TCP Echo server (13 mins)<br />
1.4 Coding a TCP Echo client (9 mins)</p>
<p><a class="posted" href="http://www.security-freak.net/sockets/socket-programming.html" target="_blank">http://www.security-freak.net/sockets/socket-programming.html</a></p>
<p><strong>2. Packet Sniffing using Raw Sockets: (7 videos - 86 mins)</strong></p>
<p>2.1 Presentation on raw socket basics (14 mins)<br />
2.2 Sniffer coding basics (15 mins)<br />
2.3 Sniffer - Ethernet header parsing (10 mins)<br />
2.4 Sniffer - IP header parsing (14 mins)<br />
2.5 Sniffer - TCP header parsing (10 mins)<br />
2.6 Sniffer - Data parsing (9 mins)<br />
2.7 A look at Tcpdump and Ethereal (14 mins)</p>
<p><a class="posted" href="http://www.security-freak.net/raw-sockets/raw-sockets.html" target="_blank">http://www.security-freak.net/raw-sockets/raw-sockets.html</a></p>
<p><strong>3. Packet Injection using Raw Sockets: (6 videos - 75 mins)</strong></p>
<p>3.1 Packet injection basics presentation (10 mins)<br />
3.2 Your first packet injection program (9 mins)<br />
3.3 Ethernet header contruction &#38; injection (10 mins)<br />
3.4 IP header construction &#38; injection (14 mins)<br />
3.5 TCP header and data contruction &#38; injection (17 mins)<br />
3.6 ARP Request query injector (15 mins)</p>
<p><a class="posted" href="http://www.security-freak.net/packet-injection/packet-injection.html" target="_blank">http://www.security-freak.net/packet-injection/packet-injection.html</a></p>
<p><strong>4. Architecture of a Proactive Security Tool: (4 videos - 43 mins)</strong></p>
<p>4.1 The "Sniff - Think - Inject" logic - a presentation (10 mins)<br />
4.2 Programming the Framework (7 mins)<br />
4.3 Communication via the Framework (8 mins)<br />
4.4 ARP DoS tool using the Framework (18 mins)</p>
<p><a class="posted" href="http://www.security-freak.net/architecture/architecture.html" target="_blank">http://www.security-freak.net/architecture/architecture.html</a></p>
<p><strong>5. Encryption Basics using RC4: (3 videos - 38 mins)</strong></p>
<p>5.1 RC4 basics presentation (13 mins)<br />
5.2 Understanding RC4 via simulations (13 mins)<br />
5.3 File encryption / decryption using RC4 (12 mins)</p>
<p><a class="posted" href="http://www.security-freak.net/encryption/encryption-rc4.html" target="_blank">http://www.security-freak.net/encryption/encryption-rc4.html</a></p>
<hr /><strong>Irongeek - Hacking Illustrated</strong></p>
<p><a class="posted" href="http://www.irongeek.com/i.php?page=security/hackingillustrated" target="_blank">http://www.irongeek.com/i.php?page=security/hackingillustrated</a></p>
<hr /><strong>Hackeando Smart Cards de Fedex Kinko’s</strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,116216.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,116216.0.html</a></p>
<hr /><strong>Hackeando webs de Lineage 2 - video</strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,154731.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,154731.0.html</a></p>
<hr /><strong>Pocket Bluesnarfer</strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,109882.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,109882.0.html</a></p>
<hr /><strong>Local JPG shell Inclusion</strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,158322.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,158322.0.html</a></p>
<hr /><strong>Obteniendo Shell con LFI +[VIDEO]</strong><br />
<a class="posted" href="http://foro.elhacker.net/hacking_basico/obteniendo_shell_con_lfi_video-t217499.0.html" target="_blank">http://foro.elhacker.net/hacking_basico/obteniendo_shell_con_lfi_video-t217499.0.html</a></p>
<hr /><strong>EaryhLink.net Hacked By w32-Gen </strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,148012.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,148012.0.html</a></p>
<hr /><strong>Videos SHMOOCON 23-25 Marzo 2007</strong><br />
<a class="posted" href="http://www.shmoocon.org/2007/videos/" target="_blank">http://www.shmoocon.org/2007/videos/</a></p>
<hr /><strong>Ataques a controladores de dispositivos inalambricos</strong><br />
<a class="posted" href="http://foro.elhacker.net/index.php/topic,132675.0.html" target="_blank">http://foro.elhacker.net/index.php/topic,132675.0.html</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Migrando a openjdk(Debian)]]></title>
<link>http://migetech.wordpress.com/?p=79</link>
<pubDate>Wed, 15 Oct 2008 22:14:19 +0000</pubDate>
<dc:creator>Mike...</dc:creator>
<guid>http://migetech.lt.wordpress.com/2008/10/15/migrando-a-openjdkdebian/</guid>
<description><![CDATA[Hace poco me entere que en Debian ya se encontraba empaquetado una versión del openjdk(openjdk-6), ]]></description>
<content:encoded><![CDATA[<p>Hace poco me entere que en Debian ya se encontraba empaquetado una versión del openjdk(openjdk-6), pues resulta que este paquete fue construido usando el soporte de construcción de IceTea y parches provenientes del proyecto IceTea, esto para reemplazar los binarios privativos con  los que aun cuenta el java-6-sun.</p>
<p>para instalarlo:</p>
<blockquote><p>#apt-get install openjdk-6-jdk openjdk-6-jre</p></blockquote>
<p>opcionalmente pueden bajarce las fuentes</p>
<blockquote><p>#apt-get install openjdk-6-source</p></blockquote>
<p>Como antes ya tenia instalado el java-6-sun es necesario indicar cual opción utilizar para java, para ello usamos el comando update-alternatives</p>
<blockquote><p># update-alternatives --config java</p></blockquote>
<blockquote><p><a name="DDE_LINK"></a>Hay 4 alternativas que proveen `java'.</p>
<p>Selección     Alternativa<br />
-----------------------------------------------<br />
1    /usr/bin/gij-4.3<br />
2    /usr/lib/jvm/java-gcj/jre/bin/java<br />
*    3    /usr/lib/jvm/java-6-sun/jre/bin/java<br />
+   4    /usr/lib/jvm/java-6-openjdk/jre/bin/java</p>
<p>Pulse &#60;Intro&#62; para mantener el valor por omisión [*] o pulse un número de selección:</p></blockquote>
<p>en mi caso pulso 4 para poner el openjdk por omisión esto quiere decir que por ejemplo cuando utilice el comando java sera el del openjdk.</p>
<p>Una de las sorpresas con que me encontre fue que al momento de abrir netbeans 6 este se configuro para compilar y correr programas con el openjdk  X).</p>
<p>Ahora puedo decir que tengo java totalmente libre :D</p>
<p style="margin-bottom:0;">
]]></content:encoded>
</item>
<item>
<title><![CDATA[XWiki - User Authentication with Oracle SSO]]></title>
<link>http://bodez.wordpress.com/?p=130</link>
<pubDate>Wed, 15 Oct 2008 20:56:50 +0000</pubDate>
<dc:creator>gcatanese</dc:creator>
<guid>http://bodez.lt.wordpress.com/2008/10/15/xwiki-user-authentication-with-oracle-sso/</guid>
<description><![CDATA[XWiki is a popular Java-based wiki software offering a good variety of features and plugins. It is p]]></description>
<content:encoded><![CDATA[<p><a href="http://xwiki.org">XWiki</a> is a popular Java-based wiki software offering a good variety of features and plugins. It is pretty advanced, therefore ideal for any enterprise requiring a content management tool which is flexible, professional and free :-)</p>
<p>Installation and configuration come in different flavors, starting with the standalone distribution (Jetty container on HSQLDB db), by far the easiest option. Alternatively the XWiki WAR file can be deployed on any servlet container and any database of your choice (Oracle <strong>10.1.2 RDBMS</strong> and <strong>OC4J 10.1.3</strong> in my case).</p>
<p><!--more--></p>
<h3>Installation on Oracle infrastructure</h3>
<p>Create a new XWIKI database schema with all privileges.</p>
<p>Edit the XWiki WAR file (<strong>hibernate.cfg.xml</strong>) to point the datasource to the newly created schema. Deploy the WAR file itself (or package the WAR in an EAR file).</p>
<p>Restart the OC4J (the database objects will be created/populated when xwiki is first invoked).</p>
<p><em>Optional</em>: import the default XWiki XAR file to populate the wiki with an initial set of pages</p>
<h3>User Authentication</h3>
<p>XWiki has its default built-in authentication module, or it can be configured to use an LDAP server.</p>
<p>However if you need to use an existing authentication mechanism (Oracle SSO or any other) you will have to plugin a Custom Authentication handler.</p>
<h4>Implement the handler</h4>
<p>First of all you need to implement the <em>com.xpn.xwikiuser.api.XWikiAuthService</em> interface. One easy way to accomplish that is to extend the existing XWiki implementation (<em>com.xpn.xwiki.user.impl.xwiki.XWikiAuthServiceImpl</em>) as shown below:</p>
<pre>   public class SSOAuthServiceImpl extends XWikiAuthServiceImpl {
    ....</pre>
<p>Next step is to override the method which performs the authentication:</p>
<pre>    @Override
    public XWikiUser checkAuth(XWikiContext context) throws XWikiException {
    ....</pre>
<p>Your implementation of the <em>checkAuth()</em> method must contain the authentication logic and return an instance of the XWikiUser class:</p>
<pre>        String user = context.getRequest().getRemoteUser();
        if(user == null) {
           log.error("User cannot be authenticated");
           return super.checkAuth(context);
        } else {
           return new XWikiUser("XWiki." + user);
        }</pre>
<h4>Create the users</h4>
<p>Oracle SSO relies on Oracle Internet Directory (LDAP) to store the user information, however XWiki has its own repository. If you don't want to register manually each user into XWiki then you can create those programatically (maybe during logon):</p>
<pre>    context.getWiki().createEmptyUser("beppe", "edit", context);</pre>
<h4>Source</h4>
<p>I have attached my implementation (<a href="http://bodez.wordpress.com/files/2008/10/ssoauthserviceimpl.pdf">ssoauthserviceimpl.java</a>) as an example, hope it helps.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Importance of block cipher modes]]></title>
<link>http://gustlik.wordpress.com/?p=69</link>
<pubDate>Wed, 15 Oct 2008 20:28:57 +0000</pubDate>
<dc:creator>Zbigniew Cyktor</dc:creator>
<guid>http://gustlik.lt.wordpress.com/2008/10/15/importance-of-block-cipher-modes/</guid>
<description><![CDATA[While writing software dealing with cryptography, it&#8217;s important to be familiar with a concept]]></description>
<content:encoded><![CDATA[<p>While writing software dealing with cryptography, it's important to be familiar with a concept of block cipher modes. Most of common encryption algorithms work on data grouped together into blocks. For instance, in case of DES cipher, the block size is equal to 64 bits. While encrypting larger amounts of data, cipher implementation will divide the input into 8 byte chunks and encrypt each of them separately.</p>
<p>This is definitely not desired - in case of specific input that contains repeatable sets of information (like text documents, bitmaps with large areas of the same color), the encrypted chunks might repeat just like original plain-text values do. As a result of that, encrypted data might <a href="http://www.techworld.com/security/news/index.cfm?newsid=105263" target="_blank">reveal important details of the original content</a>.</p>
<p><!--more--></p>
<p>You might want to have a look at a very interesting article about this subject on (ahem) <a href="http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation" target="_blank">Wikipedia</a>. It clearly describes, how block cipher modes solve the problem and additionaly demonstrates how it manifests itself in case of bitmaps. I wanted to play with various block cipher modes and in order to do so I wrote a simple tool that encrypts a user-provided BMP file while leaving its headers intact. As a result of that we are still able to view the encrypted bitmap file in image browser and observe how particular ciphers, key sizes and block modes influence the output. Below are some examples showing:</p>
<ol>
<li>raw image</li>
<li>image encrypted with 56 bit DES using Electronic Codebook (ECB) mode</li>
<li>image encrypted with 56 bit DES using Cipher-block Chaining (CBC) mode</li>
</ol>
<p><img class="alignnone size-full wp-image-77" title="small_spaceman" src="http://gustlik.wordpress.com/files/2008/10/small_spaceman.png" alt="" width="218" height="237" /><img class="alignnone size-full wp-image-79" title="small_spaceman_des_ecb_pkcs5padding_56" src="http://gustlik.wordpress.com/files/2008/10/small_spaceman_des_ecb_pkcs5padding_56.png" alt="" width="218" height="237" /><img class="alignnone size-full wp-image-78" title="small_spaceman_des_cbc_pkcs5padding_56" src="http://gustlik.wordpress.com/files/2008/10/small_spaceman_des_cbc_pkcs5padding_56.png" alt="" width="218" height="237" /></p>
<p>In case of the second example I chose a rather high resolution (3923x4656) scan of an old document. What you see here is just a small cropped part of it, which is hopefully more than enough to observe the effect. I guess I could spare us all pictures representing the CBC mode since they are pretty noisy.</p>
<p><img class="alignnone size-full wp-image-81" title="small_doi1" src="http://gustlik.wordpress.com/files/2008/10/small_doi1.png" alt="" width="218" height="186" /><img class="alignnone size-full wp-image-83" title="small_doi_des_ecb_pkcs5padding_561" src="http://gustlik.wordpress.com/files/2008/10/small_doi_des_ecb_pkcs5padding_561.png" alt="" width="218" height="186" /><img class="alignnone size-full wp-image-82" title="small_doi_des_cbc_pkcs5padding_56" src="http://gustlik.wordpress.com/files/2008/10/small_doi_des_cbc_pkcs5padding_56.png" alt="" width="218" height="186" /></p>
<p>We can also look at this subject from slightly different perspective. The chart below shows how byte values are distributed in a file. Horizontal axis represents bytes from 0 to 255 obviously, while vertical axis stands for count of bytes of given value.</p>
<p><a href="http://gustlik.files.wordpress.com/2008/10/chart.png"><img class="alignnone size-full wp-image-86" title="chart" src="http://gustlik.wordpress.com/files/2008/10/chart.png" alt="" width="481" height="288" /></a></p>
<p>You can clearly see that in case of raw data as well as ECB mode some bytes show up more often than others. But if we look at the green line representing CBC mode - the distribution is very even across the whole scale which suggests that the encrypted data would contain less information valuable to a person willing to find out what is behind it.</p>
<p>The code to the BMP encrypter is below.</p>
<p>[sourcecode language="Java"]</p>
<p>import java.io.*;<br />
import java.security.GeneralSecurityException;</p>
<p>import javax.crypto.*;<br />
import javax.crypto.spec.IvParameterSpec;</p>
<p>public class BitmapPaddingTest {</p>
<p>    public static void main(String[] args) throws Exception {<br />
        if (args.length < 4) {<br />
            throw new Exception("Parameters: [file] [cipher] [keySize] [useInitVector]");<br />
        }<br />
        new BitmapPaddingTest().encrypt(<br />
                new File(args[0]), args[1], Integer.parseInt(args[2]), Boolean.parseBoolean(args[3]));<br />
    }</p>
<p>    public void encrypt(File file, String cipherName, int keySize, boolean useIv) throws Exception {<br />
        File encryptedFile = buildEncryptedFile(file, cipherName, keySize);<br />
        System.out.print("Encrypting " + file.getName() + " to " + encryptedFile.getName() + "... ");</p>
<p>        OutputStream outputStream = new BufferedOutputStream(new FileOutputStream(encryptedFile));<br />
        InputStream fileStream = new BufferedInputStream(new FileInputStream(file));<br />
        byte[] data = new byte[54]; // first 54 bytes of BMP file contain its header (in most cases)<br />
        fileStream.read(data);<br />
        outputStream.write(data);<br />
        outputStream.flush();        </p>
<p>        CipherOutputStream cipherStream =<br />
            new CipherOutputStream(outputStream, createCipher(cipherName, keySize, useIv));<br />
        data = new byte[1024];<br />
        int size = 0;<br />
        while ((size = fileStream.read(data)) > 0) {<br />
            cipherStream.write(data, 0, size);<br />
        }<br />
        cipherStream.flush();<br />
        cipherStream.close();<br />
        System.out.println("done.");<br />
    }</p>
<p>    private SecretKey createSymmetricKey(String cipherName, int keySize) throws GeneralSecurityException {<br />
        KeyGenerator keyGenerator = KeyGenerator.getInstance(cipherName.substring(0, cipherName.indexOf("/")));<br />
        keyGenerator.init(keySize);<br />
        return keyGenerator.generateKey();<br />
    }</p>
<p>    private Cipher createCipher(String cipherName, int keySize, boolean useIv) throws GeneralSecurityException {<br />
        SecretKey symmetricKey = createSymmetricKey(cipherName, keySize);<br />
        Cipher cipher = Cipher.getInstance(cipherName);<br />
        IvParameterSpec iv = useIv ? new IvParameterSpec(symmetricKey.getEncoded()) : null;<br />
        cipher.init(Cipher.ENCRYPT_MODE, symmetricKey, iv);<br />
        return cipher;<br />
    }</p>
<p>    private File buildEncryptedFile(File file, String cipherName, int keySize) {<br />
        String cipherNameUnderscored = cipherName.replaceAll("/", "_");<br />
        return new File(file.getParentFile(),<br />
                file.getName().replace(".bmp", "_" + cipherNameUnderscored + "_" + keySize + ".bmp"));<br />
    }<br />
}</p>
<p>[/sourcecode]</p>
<p>If run as follows:</p>
<p>java BitmapPaddingTest source.bmp DES/ECB/PKCS5Padding 56 false<br />
java BitmapPaddingTest source.bmp DES/CBC/PKCS5Padding 56 true</p>
<p>will generate two files located in the same directory as the source bitmap.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Spring Framework starts here...]]></title>
<link>http://xiaoxing.wordpress.com/2008/10/15/spring-framework-starts-here/</link>
<pubDate>Wed, 15 Oct 2008 19:50:53 +0000</pubDate>
<dc:creator>xiaoxing</dc:creator>
<guid>http://xiaoxing.lt.wordpress.com/2008/10/15/spring-framework-starts-here/</guid>
<description><![CDATA[1. A basic Spring App works this way:
When we enter http://localhost:8080/springapp/&nbsp; in a brow]]></description>
<content:encoded><![CDATA[<p>1. A basic Spring App works this way:<br />
When we enter http://localhost:8080/springapp/&#160; in a browser, <br />
it should pull up the welcome file 'index.jsp', which should redirect <br />
to 'hello.htm' and is handled by the <font color="#6633ff">DispatcherServlet</font>, which in turn <br />
delegates our request to the page controller(by <font color="#6633ff">springapp-servlet.xml</font> to <font color="#6633ff">InventoryController.java</font>) <br />
that puts the date and time in the model and then makes the model available to the view 'hello.jsp'.<br />
----------------------------------------<br />
The location of the view jsp is defined by a <font color="#6633ff">viewResolver</font>, inside the page-controller xml.<br />
so in the page-controller class, you don't have to use the full path, just provide a logic name.</p>
<p>2. A form added into this app. User inputs a number, app calculates then return:<br />
- Several beans are defined in "<font color="#6633ff">springapp-servlet.xml</font>": <br />
&#160;&#160;&#160;&#160;&#160; productManager (with product list)<br />
&#160;&#160;&#160;&#160;&#160; messageSource (ResourceBundleMessageSource)<br />
&#160;&#160;&#160;&#160;&#160; /hello.htm (InventoryController)<br />
&#160;&#160;&#160;&#160;&#160; /priceincrease.htm (PriceIncreaseFormController)<br />
- /priceincrease.htm bean is like:<br />
<font color="#6633ff">&#160;&#160;&#160; &#60;bean name="/priceincrease.htm" class="springapp.web.PriceIncreaseFormController"&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="sessionForm" value="true" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="commandName" value="priceIncrease" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="commandClass" value="springapp.service.PriceIncrease" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="validator"&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#160;&#160;&#160; &#60;bean class="springapp.service.PriceIncreaseValidator" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;/property&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="formView" value="priceincrease" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="successView" value="hello.htm" /&#62;<br />
&#160;&#160;&#160; &#160;&#160;&#160; &#60;property name="productManager" ref="productManager" /&#62;<br />
&#160;&#160;&#160; &#60;/bean&#62;</font><br />
- And inside <font color="#6633ff">        <tt class="classname">InventoryController</tt></font>, a reference to a <font color="#6633ff">ProductManager </font>is added,<br />
&#160; so this time when user visits "hello.htm",  we could retrieve a list of products to display. <br />
- User uses this link "priceincrease.htm" to the form (form in priceincrease.jsp)<br />
- A Java bean (<tt class="literal">commandClass</tt>) "<tt class="filename">PriceIncrease.java</tt>" is created to hold the increase value.<br />
- A SimpleFormController: <font color="#6633ff">PriceIncreaseFormController</font>, do calculations, return ModelAndView.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Reference Cards]]></title>
<link>http://jmmwrite.wordpress.com/?p=417</link>
<pubDate>Wed, 15 Oct 2008 18:51:02 +0000</pubDate>
<dc:creator>julianommartins</dc:creator>
<guid>http://jmmwrite.lt.wordpress.com/2008/10/15/reference-cards/</guid>
<description><![CDATA[Algo muito interessante para o pessoal de TI, são os reference cards. Estes &#8220;cartões&#8221; ]]></description>
<content:encoded><![CDATA[<p>Algo muito interessante para o pessoal de TI, são os reference cards. Estes "cartões" são uma fonte de consulta, muito objetiva que contém de modo prático, tudo que se precisa saber sobre um tema.</p>
<p>Eu mesmo, em minha mesa, tenho vários reference cards. Alguns até colados na parede. (parece festa).</p>
<p>Encontrei um site muito bom com ótimos reference cards, espero que aproveite! Ai vai: <a href="http://www.digilife.be/quickreferences/quickrefs.htm" target="_blank">http://www.digilife.be/quickreferences/quickrefs.htm</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Exploded Deployment OC4J 10.1.3]]></title>
<link>http://luizsantanna.wordpress.com/?p=11</link>
<pubDate>Wed, 15 Oct 2008 18:17:50 +0000</pubDate>
<dc:creator>luizsantanna</dc:creator>
<guid>http://luizsantanna.lt.wordpress.com/2008/10/15/exploded-deployment-oc4j-1013/</guid>
<description><![CDATA[Mais uma dor de cabeça para compartilhar com o pessoal.
Utilizando o MyEclispe para fazer o hot dep]]></description>
<content:encoded><![CDATA[<p>Mais uma dor de cabeça para compartilhar com o pessoal.</p>
<p>Utilizando o MyEclispe para fazer o hot deployment no OC4J. Ele faz o deployment na pasta application-autodeploy. Para funcionar são necessários os seguintes passos:</p>
<p>1) Configurar o server.xml (dentro de j2ee/home/config) para varrer esta pasta. Ele deverá estar da seguinte forma:</p>
<pre>&#60;application-server  ..
 check-for-updates="all"
 application-auto-deploy-directory="../application-autodeploy" &#62;
...
&#60;/application-server&#62;</pre>
<p>2) Faca o deployment de um archive packaged e inicie o oc4j. Isto fara com que ele encontre sua aplicacao e automaticamente registre-a no server.xml e no default-web-site.xml. Se voce souber configurar estes arquivos manualmente, podera pular este passo.</p>
<p>3) Com o OC4J desligado, remova o deployment packaged e faca o deployment exploded. Inicie novamente o OC4J.</p>
<p>Isto devera ser o suficiente para EARs e WARs, mas se você tiver algum módulo EJB, o OC4J 10.1.13 tem um bug. Quando voce faz o deployment exploded, ele diz uma mensagem "EJB module contains no beans" ou em portugues "O módulo EJB não contém beans". Isto é porque a pasta do EJB deve ter o sufixo .jar. Então, a estrutura do seu EAR deverá ser assim:</p>
<pre>MinhaAplicacao/
 + MeuModuloEJB.jar/
   + ...
 + MeuModuloWeb/
    + ...</pre>
<p>O problema é que se você então decide usar a opção de deployment "Custom Location - Suffixed" do MyEclipse também não deverá funcionar, pois ele adiciona o sufixo em todos os módulos, e o OC4J não encontra os módulos web se estiverem com o sufixo .war!</p>
<p>Odeio fazer gambiarras, mas desta vez nao teve jeito. Nao tenho tempo para fazer um script ant bem legal, tampouco para fazer um plugin do eclipse, entao la vai a marreta: Faco um deployment do oc4j exploded do meu EAR sem o EJB (resolvo as dependencias manualmente), dai depois faco um deployment custom location - suffixed do meu EJB no diretorio onde o EAR foi disponibilizado. E pronto! Funciona...</p>
<p>O pior de tudo é que com a compra da BEA, a Oracle provavelmente deve deixar o antigo OC4J de lado e investir no Oracle WebLogic. Então dificilmente encontraremos uma correção para este bug, apenas fazendo o upgrade. Testei com a versao 10.1.3.3 e 10.1.3.4. Arggg...</p>
<p>Abcs.</p>
<p>LH.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Hostname ke IP Address di Java]]></title>
<link>http://komputasi.wordpress.com/?p=52</link>
<pubDate>Wed, 15 Oct 2008 17:39:57 +0000</pubDate>
<dc:creator>lunix96</dc:creator>
<guid>http://komputasi.lt.wordpress.com/2008/10/15/hostname-ke-ip-address-di-java/</guid>
<description><![CDATA[Bicara pemrograman Jaringan, mungkin Java termasuk bahasa pemrograman yang paling lengkap dan mudah ]]></description>
<content:encoded><![CDATA[<p>Bicara pemrograman Jaringan, mungkin Java termasuk bahasa pemrograman yang paling lengkap dan mudah untuk tujuan itu. Pada tulisan sederhana ini, kita akan melihat bagaimana mendapatkan IP address dari suatu hostname. Fitur ini pula yang digunakan oleh Java untuk menghubungkan client (berbasis Java) ke suatu server. Sebagaimana diketahui...komunikasi pada jaringan komputer berbasis pada IP address, bukan nama host sehingga nama host harus dicarikan IP addressnya.<br />
<!--more--><br />
Java menyediakan kelas atau class bernama InetAddress. Dua metode yang telah kami coba adalah getByName(nama_host) dan getLocalHost().  Metode getByName digunakan untuk mendapatkan IP address dari suatu host bernama nama_host, sedangkan getLocalHost hanya dapat digunakan untuk memperoleh nama host dan IP address dari komputer dimana program dijalankan, local host.</p>
<p>Program singkat berikut memperlihatkan cara pemanfaatan perintah getbyName():</p>
<p>import java.net.*;<br />
import java.util.*;</p>
<p>public class NamekeIP {<br />
public static void main (String[] args) {<br />
try {<br />
<strong>InetAddress address = InetAddress.getByName("www.iGoogle.com");<br />
System.out.println("IP Address: " + address.toString());</strong><br />
}<br />
catch (UnknownHostException uhEx) {<br />
System.out.println("Host tidak dapat ditemukan.");<br />
}<br />
}<br />
}</p>
<p>Ada beberapa hal penting yang perlu diperhatikan dalam penggunaan kelas InetAddress:</p>
<p>1. Pastikan penggunaan dasar seperti di atas, selalu gunakan try dan catch...jika tidak maka program tidak dapat berjalan.</p>
<p>2. Jangan lupa mengimport paket java.util.* dan java.net.*.</p>
<p>Sedangkan contoh berikut memungkinkan pengguna untuk memasukkan nama host setiap kali dijalankan, tidak hanya iGoogle.com:</p>
<p>import java.net.*;<br />
import java.util.*;</p>
<p>public class IPFinder {<br />
public static void main (String[] args) {<br />
String host;<br />
Scanner input = new Scanner(System.in);</p>
<p>System.out.print("Masukan nama host: ");<br />
host = input.next();</p>
<p>try {<br />
// mendapatkan IP address berdasarkan nama host<br />
InetAddress address = InetAddress.getByName(host);</p>
<p>// mendapatan namahost dan IP address dari localhost<br />
//InetAddress address = InetAddress.getLocalHost();</p>
<p>System.out.println("IP Address: " + address.toString());<br />
}<br />
catch (UnknownHostException uhEx) {<br />
System.out.println("Tidak dapat menemukan " + host);<br />
}<br />
}<br />
}</p>
<p>OK, begitu saja ya...tidak banyak penjelasan...karena sangat sederhana...namun jika anda pemula...saran saya coba tulis dan jalankan kode program di atas.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[IcedTea 1.3 Released!]]></title>
<link>http://langel.wordpress.com/?p=173</link>
<pubDate>Wed, 15 Oct 2008 17:00:34 +0000</pubDate>
<dc:creator>Lillian</dc:creator>
<guid>http://langel.lt.wordpress.com/2008/10/15/icedtea-13-released-2/</guid>
<description><![CDATA[We are proud to announce the release of IcedTea6 1.3.
The IcedTea6 project provides a harness to bui]]></description>
<content:encoded><![CDATA[<p>We are proud to announce the release of IcedTea6 1.3.</p>
<p>The IcedTea6 project provides a harness to build the source code from<br />
OpenJDK6 (<a href="http://openjdk.java.net">http://openjdk.java.net</a>) using Free Software build tools and<br />
provides replacements libraries for the binary plugs with code from the<br />
GNU Classpath project. More information on IcedTea can be found here:<br />
<a href="http://icedtea.classpath.org">http://icedtea.classpath.org</a></p>
<p>What's New?<br />
-----------------<br />
- Updated to b12 bundle.<br />
- Fixed to use new sound service, Gervill.<br />
- Many Netx fixes and now built by default.<br />
- LiveConnect support (--enable-liveconnect).<br />
  - Implemented JavaScript-&#62;Java security.<br />
- PulseAudio integrated (--enable-pulse-java)<br />
- VisualVM tool integrated (--enable-visualvm).<br />
- Added out-of-the-box CACAO support (--with-cacao).<br />
- Added the experimental Shark JIT for Zero.<br />
- Cleaned up crypto support, all algorithms and key sizes are fully<br />
  supported now without any (regional) restrictions. No more need for<br />
  separate crypto policy jars.<br />
- Integration of Mozilla Rhino javascript support for javax.script.<br />
  (See <a href="http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=179">http://icedtea.classpath.org/bugzilla/show_bug.cgi?id=179</a> when<br />
   you want to enable non-system-installed versions of Rhino).<br />
- Add support for Zero builds on alpha, arm, mips, mipsel, m68k, s390.<br />
- Various build fixes.<br />
- Several bug and security fixes: (<a href="http://icedtea.classpath.org/bugzilla/">http://icedtea.classpath.org/bugzilla/</a> and<br />
<a href="https://bugzilla.redhat.com/">https://bugzilla.redhat.com/</a>).</p>
<p>-----------------</p>
<p>The tarball and nosrc RPM can be downloaded here:<br />
- <a href="http://icedtea.classpath.org/download/fedora/java-1.6.0-openjdk-1.6.0.0-0.23.b12.fc10.nosrc.rpm">java-1.6.0-openjdk-1.6.0.0-0.23.b12.fc10.nosrc.rpm</a><br />
- <a href="http://icedtea.classpath.org/download/source/icedtea6-1.3.tar.gz">icedtea6-1.3.tar.gz</a></p>
<p>The following people helped with this release:<br />
<a href="http://gbenson.net">Gary Benson</a>, Deepak Bhole, Tom Callaway, Pablo del Campo, <a href="http://fitzsim.org/blog">Thomas Fitzsimmons</a>, Dennis Gilmore, <a href="http://www.advogato.org/person/aph/">Andrew Haley</a>, <a href="http://fuseyism.com/">Andrew John Hughes</a>, Ioana Ivan, Matthias Klose, DJ Lucas, Omair Majid, Xerxes Ranby, Marc Schoenefeld, Keith Seitz, <a href="http://jsumali.wordpress.com">Joshua Sumali</a>, <a href="http://www.advogato.org/person/twisti/">Christian Thalinger</a>, <a href="http://gnu.wildebeest.org/diary">Mark Wielaard</a>, <a href="http://langel.wordpress.com">Lillian Angel</a></p>
<p>We would also like to thank the bug reporters and testers!</p>
<p>To get started:<br />
$ hg clone <a href="http://icedtea.classpath.org/hg/icedtea6">http://icedtea.classpath.org/hg/icedtea6</a><br />
$ cd icedtea6</p>
<p>Full build requirements and instructions are in INSTALL:<br />
$ ./configure (--enable-liveconnect --enable-visualvm --enable-pulse-java)<br />
$ make</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Static vs dynamic isn't about typing]]></title>
<link>http://andreasjacobsen.wordpress.com/?p=40</link>
<pubDate>Wed, 15 Oct 2008 15:17:50 +0000</pubDate>
<dc:creator>Andreas</dc:creator>
<guid>http://andreasjacobsen.com/2008/10/15/static-vs-dynamic-isnt-about-typing/</guid>
<description><![CDATA[In this post about maintenance of applications written in dynamic languages Ola Bini stirs up the wh]]></description>
<content:encoded><![CDATA[<p>In <a href="http://olabini.com/blog/2008/10/the-maintainence-myth/">this post about maintenance of applications written in dynamic languages</a> Ola Bini stirs up the whole static vs dynamic debate (again). It's a post well worth reading, especially the comments. One thing Bini points out is that in the context of this discussion, normally, statically typed language is a synonym for Java (and possibly C#), and dynamically typed means Python and Ruby.</p>
<p>This really is a key observation. If you say static typing is too verbose, anyone who's familiar with OCaml, Haskell or Scala disagrees. But the fact is that our current selection of useful statically typed languages are verbose. C# isn't quite as bad as Java, but Java is terrible.</p>
<p>The question then becomes whether Ruby or Python are less maintainable than Java. In my experience, the answer is 'that really depends on your project'. Maintainability isn't a language feature. No matter what language someone is writing they can create code that is difficult to maintain. The qualities of maintainable code is different in different style languages. A coding style that may be easier to deal with down the line with one language can be more difficult in another language. </p>
<p>In my experience tests are more far important than static type checking when doing refactorings. And personally, I find Java to be worse for reading code than Ruby or Python. People easily become thoughtless code generators when dealing with Java. Just keep hitting ctrl+space until it compiles, right? Meanwhile, languages like Ruby and Python make you focus on what the code actually does when it runs. Neither of these statements are absolutes and they're both limited by my experience, but I have seen both sides of things and my preference is clear.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[JSP life cycle]]></title>
<link>http://ebeworld.wordpress.com/?p=70</link>
<pubDate>Wed, 15 Oct 2008 15:07:09 +0000</pubDate>
<dc:creator>ebeworld</dc:creator>
<guid>http://ebeworld.lt.wordpress.com/2008/10/15/jsp-life-cycle/</guid>
<description><![CDATA[Explain the life cycle methods of a JSP?

Pre-translated:Before the JSP file has been translated and]]></description>
<content:encoded><![CDATA[<div><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">Explain the life cycle methods of a JSP?<br />
</span></span><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;"></p>
<div><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;"><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;">Pre-translated:</span></span></strong></span></span><strong><span style="font-size:x-small;font-family:Arial,Bold;"><span style="font-size:x-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">Before the JSP file has been translated and compiled into the Servlet.<br />
</span></span><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;">Translated: </span></span></strong><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">The JSP file has been translated and compiled as a Servlet.<br />
</span></span><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;">Initialized: </span></span></strong><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">Prior to handling the requests in the service method the container calls the jspInit() to initialize the Servlet. Called only once per Servlet instance.<br />
</span></span><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;">Servicing</span></span></strong><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">: Services the client requests. Container calls this method for each request.<br />
</span></span><strong><span style="font-size:xx-small;font-family:Arial,Bold;"><span style="font-size:xx-small;font-family:Arial,Bold;">Out of service</span></span></strong><span style="font-size:xx-small;font-family:Arial;"><span style="font-size:xx-small;font-family:Arial;">: The Servlet instance is out of service. The container calls the jspDestroy() method.</span></span></span></span></strong></strong> </p>
<p> </p></div>
<p></span></span></div>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Program Scanner Sederhana]]></title>
<link>http://fajarsaptono.wordpress.com/?p=412</link>
<pubDate>Wed, 15 Oct 2008 14:50:22 +0000</pubDate>
<dc:creator>fajarsaptono</dc:creator>
<guid>http://fajarsaptono.lt.wordpress.com/2008/10/15/program-scanner-sederhana/</guid>
<description><![CDATA[Berdasarkan janji gw pada tulisan yang disini maka gw akan berbagi dengan teman-teman bagaimana cara]]></description>
<content:encoded><![CDATA[<p><img style="float:left;margin:0 10px 0 0;" src="http://fajarsaptono.wordpress.com/files/2008/10/prog.jpg" alt="prog" />Berdasarkan janji gw pada tulisan yang <a href="http://fajarsaptono.wordpress.com/2008/09/17/beberapa-method-untuk-menangani-string-di-java/">disini</a> maka gw akan berbagi dengan teman-teman bagaimana caranya untuk membuat program scanner sederhana. Nah disini gw pake Java dengan kakas Netbeans 6.0 untuk buat program.  Program ini melakukan pencarian pada 10 record, dimana setiap record disimpan dlm 1 file tersendiri. Nantinya begitu program melakukan pencarian, program dapat mencari dengan menelusuri ke seluruh record.  Tapi sayangnya gw gak sempat buat mengkategorikan kata-kata tersebut terletak pada record ke berapa di suatu file. Soale tugasnya juga dibuat dalam waktu satu malam sebelum dikumpul <img src="http://static.plurk.com/static/emoticons/gold/doh.gif" alt="doh" />.</p>
<p>Berikut adalah potongan sourcecodenya :</p>
<ul>
<li>Masukkan/import library berikut:</li>
</ul>
<pre>
<pre>
<pre>[code language='java']

import java.util.TreeMap; //untuk data kata dan jumlahnya
import java.util.Scanner;	//untuk pembacaan file
import java.io.FileReader; //untuk pembacaan file
import java.io.FileNotFoundException; //eksepsi file tidak ditemukan
[/code]</pre>
</pre>
</pre>
<ul>
<li>Tambahkan Method getJumlah (untuk mengambil nilai jumlah dari kata apabila kta ditemukan (memakai method containsKey). Tambahkan parameter : 	kata (String) dan frekData (TreeMap )</li>
</ul>
<ul>
<pre>[code language='java']

if (frekData.containsKey(kata)){
return frekData.get(kata);
} else {
return 0;
}

[/code&#38;lt;/ul&#38;gt;
&#38;lt;ul&#38;gt;
	&#38;lt;li&#38;gt;Tambahkan method cetakJumlah (untuk mencetak jumlah kata ke dalam textArea). Tambahkan parameter : 	frekData (TreeMap )&#38;lt;/li&#38;gt;
&#38;lt;/ul&#38;gt;
&#38;lt;ul&#38;gt;[code language='java']

String carinya= txtCari.getText();
txtHasil.append(""+carinya+" =&#38;amp;gt; "+frekData.get(carinya)+" kali\n");

[/code]</pre>
</ul>
<ul>
<li>Tambahkan method bacaFile (untuk membaca file text, representasi ke dalam array). Tambahkan parameter : 	frekData (TreeMap )</li>
</ul>
<ul>
<pre>[code language='java']

Scanner filenya[] = new Scanner[10];
String kata[] = new String[10]; //array untuk file
Integer jumlah; // Jumlah kata yang dicari
try{
filenya[0] = new Scanner(new FileReader("file1.txt"));
filenya[1] = new Scanner(new FileReader("file2.txt"));
filenya[2] = new Scanner(new FileReader("file3.txt"));
filenya[3] = new Scanner(new FileReader("file4.txt"));
filenya[4] = new Scanner(new FileReader("file5.txt"));
filenya[5] = new Scanner(new FileReader("file6.txt"));
filenya[6] = new Scanner(new FileReader("file7.txt"));
filenya[7] = new Scanner(new FileReader("file8.txt"));
filenya[8] = new Scanner(new FileReader("file9.txt"));
filenya[9] = new Scanner(new FileReader("file10.txt"));
} catch (FileNotFoundException e) {
System.err.println(e);
return;
}
//mencari pada setiap file sampai file ke 10
for(int i=0; i&#38;amp;lt;10;i++){
while (filenya[i].hasNext()){
// Baca kata berikutnya
kata[i] = filenya[i].next();

// Ambil jumlah kata terakhir dari file
jumlah = getJumlah(kata[i], frekData) + 1;
frekData.put(kata[i], jumlah);
}
}
}

[/code]</pre>
</ul>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Pensiero del mercoledì pomeriggio...]]></title>
<link>http://franziskus.wordpress.com/?p=246</link>
<pubDate>Wed, 15 Oct 2008 14:36:05 +0000</pubDate>
<dc:creator>ZioTack</dc:creator>
<guid>http://franziskus.lt.wordpress.com/2008/10/15/pensiero-del-mercoledi-pomeriggio/</guid>
<description><![CDATA[OK&#8230; quando si programma Java si va un po&#8217; fuori di testa&#8230; Se poi si è costretti a]]></description>
<content:encoded><![CDATA[<p>OK... quando si programma Java si va un po' fuori di testa... Se poi si è costretti a leggere codice non commentato, riga per riga, per capirne il funzionamento, la mente inizia viaggi fantasiosi, nei quali di solito il programmatore originale viene orribilmente mutilato per vendetta... Ma ogni tanto, il cervello produce deliri simili a questo:</p>
<blockquote><p>[Se l'oggetto contenuto s'allarga troppo] il contenitore non riesce più a contenere il suo contenuto!</p></blockquote>
<p>Per il resto... il livello di fame aumenta a dismisura e ti viene voglia di mordere un collega... :shock:</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Manual - Core Java Volume 1: Fundamentals]]></title>
<link>http://jerrystar.wordpress.com/?p=172</link>
<pubDate>Wed, 15 Oct 2008 13:53:37 +0000</pubDate>
<dc:creator>jerrystar</dc:creator>
<guid>http://jerrystar.lt.wordpress.com/2008/10/15/manual-core-java-volume-1-fundamentals/</guid>
<description><![CDATA[
Ficha de Descarga:
Autor: Horstmann, Gary Cornell
Host: Rapidshare
Tamaño: 9.4 Mb
Comprimido: WinR]]></description>
<content:encoded><![CDATA[<p><a href="http://jerrystar.files.wordpress.com/2008/10/corejava.jpg"><img class="aligncenter size-full wp-image-173" title="corejava" src="http://jerrystar.wordpress.com/files/2008/10/corejava.jpg" alt="" width="415" height="540" /></a></p>
<h3 style="text-align:center;"><span style="color:#0000ff;">Ficha de Descarga:</span></h3>
<p style="text-align:center;"><strong>Autor:</strong> Horstmann, Gary Cornell</p>
<p style="text-align:center;"><strong>Host:</strong> Rapidshare</p>
<p style="text-align:center;"><strong>Tamaño:</strong> 9.4 Mb</p>
<p style="text-align:center;"><strong>Comprimido:</strong> WinRar</p>
<p style="text-align:center;"><strong>Formato manual:</strong> pdf</p>
<p style="text-align:center;"><strong>Idioma:</strong> Ingles</p>
<p><a href="http://rapidshare.com/files/153619742/Prentice_Hall_Core_Java_Volume_I_Fundamentals_8th_Edition_By_jerryStar.rar"><img class="alignnone size-full wp-image-5" title="Descargar manual" src="http://jerrystar.wordpress.com/files/2008/09/descargar.jpg" alt="" width="34" height="35" /></a> <a href="http://rapidshare.com/files/153619742/Prentice_Hall_Core_Java_Volume_I_Fundamentals_8th_Edition_By_jerryStar.rar">Descargar Core Java Volume 1 Fundamentals</a></p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[[Fixed] Eclipse editor text bouncing up and down under OS X]]></title>
<link>http://internetshizzle.wordpress.com/2008/10/15/eclipse-squashing-lines/</link>
<pubDate>Wed, 15 Oct 2008 13:53:02 +0000</pubDate>
<dc:creator>veggieboy4000</dc:creator>
<guid>http://internetshizzle.lt.wordpress.com/2008/10/15/eclipse-squashing-lines/</guid>
<description><![CDATA[

Eclipse squashing lines
Originally uploaded by Lenniboy
I used to have terrible problems with Ecli]]></description>
<content:encoded><![CDATA[<div style="float:right;margin-left:10px;margin-bottom:10px;"><a title="photo sharing" href="http://www.flickr.com/photos/24003367@N00/2943744255/"><img style="border:solid 2px #000000;" src="http://farm4.static.flickr.com/3042/2943744255_d5591d74a9_m.jpg" alt="" /></a></p>
<p><span style="font-size:.9em;margin-top:0;"><br />
<a href="http://www.flickr.com/photos/24003367@N00/2943744255/">Eclipse squashing lines</a></span></p>
<p>Originally uploaded by <a href="http://www.flickr.com/people/24003367@N00/">Lenniboy</a></div>
<p>I used to have terrible problems with Eclipse on my MacBook running OS X. Editor text was bouncing up and down and all my lines were squashing. Have a look at the photo if you think I'm crazy.</p>
<p>Finally I have managed to find out what has caused this behaviour: It is the font size, which was set to 9.5. I'm not sure if the small size or the .5 bit that is to blame but but as soon as I set it to 11pt everything was fine.</p>
<p>I'm happy I found this because I was very short of changing over to XCode.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Lucene - scoring direct hits]]></title>
<link>http://rosowski.wordpress.com/?p=23</link>
<pubDate>Wed, 15 Oct 2008 13:10:01 +0000</pubDate>
<dc:creator>rosowski</dc:creator>
<guid>http://rosowski.lt.wordpress.com/2008/10/15/lucene-scoring-direct-hits/</guid>
<description><![CDATA[This post is dealing with the scoring algorithm used in Lucene.
I guess most people who are using Lu]]></description>
<content:encoded><![CDATA[<p>This post is dealing with the scoring algorithm used in Lucene.</p>
<p>I guess most people who are using Lucene came to the point where they want to score direct matches higher than wildcard matches. For example if we have the searchphrase "cup" and we have several documents in our index which contain the searchphrase like:</p>
<ul>
<li><strong>doc 4711</strong>: name: cupholder</li>
<li><strong>doc 4712</strong>: name: cup</li>
</ul>
<p>In most use-cases people want the direct match, in this case doc 4712 to appear as the first hit. Because cup is contained in both names, you get both documents as matches, but doc 4712 as the first match. So far so good. If you add more complexity to the documents perhaps by giving them a description, you might end up with a messed up scoring. This can have different causes (perhaps "cup" appears in the description of doc 4711 but not in 4712). Check out the Similarity class in Lucene and call searcher.explain() on your document to find out the reason for the score. What you want to do is to boost a direct match. Here is how I did it:</p>
<p>[sourcecode language='java']<br />
//where fieldName is 'name' or 'description'<br />
Query tmpQuery = new TermQuery(new Term(fieldName, searchString));<br />
//boost the direct match<br />
tmpQuery.setBoost(2.0f);<br />
query.add(tmpQuery, BooleanClause.Occur.SHOULD);</p>
<p>//search for other occurences<br />
tmpQuery = new WildcardQuery(new Term(fieldName, "*" + searchString + "*"));<br />
query.add(tmpQuery, BooleanClause.Occur.SHOULD);<br />
[/sourcecode]</p>
<p>I hope that helped somebody on his or her Lucene journey. Have a nice day.</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[NetBeans 多语言界面]]></title>
<link>http://sealedblade.wordpress.com/?p=77</link>
<pubDate>Wed, 15 Oct 2008 11:57:24 +0000</pubDate>
<dc:creator>nusmql</dc:creator>
<guid>http://sealedblade.lt.wordpress.com/2008/10/15/netbeans-%e5%a4%9a%e8%af%ad%e8%a8%80%e7%95%8c%e9%9d%a2/</guid>
<description><![CDATA[英文：
&#8220;C:\Program Files\NetBeans 6.1\bin\netbeans.exe&#8221; &#8211;locale en:US

日文]]></description>
<content:encoded><![CDATA[<p>英文：</p>
<p>"C:\Program Files\NetBeans 6.1\bin\netbeans.exe" --locale en:US</p>
<h2><img class="alignnone" src="http://developers.sun.com.cn/blog/functionalca/resource/2008-06-11_225234.png" alt="" width="362" height="301" /></h2>
<p>日文：</p>
<p>"C:\Program Files\NetBeans 6.1\bin\netbeans.exe" --locale ja:JA</p>
<h2><img src="http://developers.sun.com.cn/blog/functionalca/resource/2008-06-11_225552.png" alt="" width="343" height="294" /></h2>
<p>NetBeans 6.1 多国语言版本下载地址：</p>
<p>http://download.netbeans.org/netbeans/6.1/final/</p>
]]></content:encoded>
</item>
<item>
<title><![CDATA[Spring WebServices]]></title>
<link>http://cygni.wordpress.com/?p=328</link>
<pubDate>Wed, 15 Oct 2008 11:21:15 +0000</pubDate>
<dc:creator>Tommy Wassgren</dc:creator>
<guid>http://stacktrace.se/2008/10/15/spring-webservices/</guid>
<description><![CDATA[Detta inlägg ingår i serien Spring från början och kommer att behandla det springstöd som finns]]></description>
<content:encoded><![CDATA[<p>Detta inlägg ingår i serien <a href="http://stacktrace.se/2008/05/30/spring-fran-borjan-introduktion/">Spring från början</a> och kommer att behandla det springstöd som finns för SOAP-baserade webbtjänster i modulen Spring WS.<br />
<!--more--></p>
<p>Generellt sätt kan man säga att webbtjänster är XML/HTTP (XML över HTTP). Webbtjänster är alltså ofta tjänster som finns tillgängliga över ett nätverk. Eftersom en webbtjänst typiskt är baserad på ett XML-gränssnitt gör detta att webbtjänsten blir oberoende av programmeringsspråk. Exempelvis kan tjänsten implementeras i Java men anropas från en klient skriven i C++. </p>
<p><a href="http://en.wikipedia.org/wiki/SOAP" target="_blank">SOAP</a> är ett standardiserat protokoll för överföring av XML-meddelanden som används för webbtjänster. Detta protokoll är standardiserat av <a href="http://www.w3.org/" target="_blank">W3C</a> och det finns ett brett stöd för SOAP-baserade webbtjänster via Spring/Java, .NET, C++ och så vidare. Andra standarder för webbtjänster är exempelvis <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" target="_blank">REST</a> som inte kommer att behandlas i detta inlägg.</p>
<p>En SOAP-baserad webbtjänst kan beskrivas med hjälp av <a href="http://en.wikipedia.org/wiki/Web_Services_Description_Language" target="_blank">WSDL</a>. Det finns inget krav på att WSDL måste användas men en WSDL-definition måste finnas tillgänglig för att en klient på ett <i>automatiserat</i> sätt ska kunna skapa proxy-objekt och liknande för att komma åt en webbtjänst.</p>
<p>Den typ av webbtjänster som kommer att diskuteras i detta inlägg är alltså webbtjänster som definieras via WSDL och använder protokollet SOAP.</p>
<h2>Contract First</h2>
<p>Om man ska generalisera lite kan man säga att det finns två vedertagna metoder för att utveckla webbtjänster, <i>Contract First</i> och <i>Contract Last</i>. Contract Last innebär helt enkelt att man först skapar ett javagränssnitt och sedan utifrån detta skapar en XML-definition via exempelvis WSDL som beskriver detta gränssnitt. Contract First innebär det motsatta det vill säga att man först skapar XML-kontraktet och sedan utifrån detta kontrakt skapar javagränssnittet.</p>
<p>Spring WS erbjuder endast stöd för det senare det vill säga Contract First och detta motiveras av Spring själva med följande:</p>
<ul>
<li>Java/XML inkompatibilitet – Vissa javatyper är svåra att beskriva i XML och det finns inget standardiserat sätt att göra detta på. Detta innebär att beroende på vilket sätt som används för att generera XML kan resultatet se olika ut.</li>
<li>Stabilitet – Om man genererar XML-kontraktet från ett javagränssnitt så kommer kontraktet att förändras om javagränssnittet förändras. Olika verktyg kan dessutom generera olika XML baserat på hur gränssnittet ser ut.</li>
<li>Prestanda – Om man genererar XML utifrån ett javagränssnitt kan en komplex objektgraf leda till att en väldigt stor mängd XML genereras. Ett objekt kan ha ett beroende till ett objekt som har ett beroende till ett objekt och så vidare. Om ett kontrakt specificeras så är det tydligt vilken XML som skickas.</li>
<li>Återanvändbarhet – Genom att deklarera ett schema i en separat XSD (XML Schema Definition) kan denna återanvändas i andra delar av applikationen eller rent av i andra applikationer.</li>
<li>Version – Om ett XML-schema måste uppdateras kan fortfarande samma javaimplementation användas för att hantera gamla och nya versioner.</li>
</ul>
<h2>Kontraktet</h2>
<p>Kontraktet som används för att uttrycka en webbtjänst baseras på en vanlig XSD. I exemplet nedan (som faktiskt är samma exempel som i inlägget tidigare om <a href="http://stacktrace.se/2008/09/29/distribuerade-tjanster-via-spring/" target="_blank">Distribuerade tjänster via Spring</a>) så används följande XSD:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;xs:schema
      xmlns:xs="http://www.w3.org/2001/XMLSchema"
      xmlns:calc="http://cygni.se/exporters/schemas"
      elementFormDefault="qualified"
      targetNamespace="http://cygni.se/exporters/schemas"&#62;

    &#60;xs:element
        name="CalculatorRequest"
        type="calc:CalculatorOperationType" /&#62;
    &#60;xs:element
        name="CalculatorResponse"
        type="calc:CalculatorResponseType" /&#62;

    &#60;xs:complexType name="CalculatorOperationType"&#62;
        &#60;xs:sequence&#62;
            &#60;xs:element name="First" type="xs:integer" /&#62;
            &#60;xs:element name="Second" type="xs:integer" /&#62;
            &#60;xs:element name="Operation" type="calc:OperationType" /&#62;
        &#60;/xs:sequence&#62;
    &#60;/xs:complexType&#62;

    &#60;xs:complexType name="CalculatorResponseType"&#62;
        &#60;xs:all&#62;
            &#60;xs:element name="Answer" type="xs:integer" /&#62;
            &#60;xs:element name="Error" type="xs:string" /&#62;
        &#60;/xs:all&#62;
    &#60;/xs:complexType&#62;

    &#60;xs:simpleType name="OperationType"&#62;
        &#60;xs:restriction base="xs:string"&#62;
            &#60;xs:enumeration value="ADD" /&#62;
            &#60;xs:enumeration value="SUBTRACT" /&#62;
            &#60;xs:enumeration value="MULTIPLY" /&#62;
            &#60;xs:enumeration value="DIVIDE" /&#62;
        &#60;/xs:restriction&#62;
    &#60;/xs:simpleType&#62;
&#60;/xs:schema&#62;
</pre>
</td>
</tr>
</table>
<p>Användning av ovanstående schema kan se ut som nedan när operanderna 3 och 2 ska adderas (det vill säga 3 + 2 = 5):</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;CalculatorRequest&#62;
    &#60;First&#62;3&#60;/First&#62;
    &#60;Second&#62;2&#60;/Second&#62;
    &#60;Operation&#62;ADD&#60;/Operation&#62;
&#60;/CalculatorRequest&#62;
</pre>
</td>
</tr>
</table>
<p>Om allt går bra blir svaret ett <code>CalculatorResponse</code> enligt nedan:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;CalculatorResponse&#62;
    &#60;Answer&#62;5&#60;/Answer&#62;
&#60;/CalculatorResponse&#62;
</pre>
</td>
</tr>
</table>
<p>Observera att detta endast är "vanlig" XML baserad på en XSD. Inga WSDL-definitioner eller liknande ännu.</p>
<h2>Javatjänst</h2>
<p>Det förra inlägget i denna serie som handlade om <a href="http://stacktrace.se/2008/09/29/distribuerade-tjanster-via-spring/">Distribuerade tjänster via Spring</a> beskrev hur man med hjälp av en service exporter kan exponera tjänster via exempelvis <a href="http://en.wikipedia.org/wiki/Java_remote_method_invocation" target="_blank">RMI</a>, <a href="http://hessian.caucho.com/" target="_blank">Hessian</a> och så vidare. Springstödet för webbtjänster baseras på samma princip men det krävs lite mer manuellt arbete för att få en webbtjänst att fungera. Vi utgår från samma exempel som i <a href="http://stacktrace.se/2008/09/29/distribuerade-tjanster-via-spring/">Distribuerade tjänster via Spring</a> det vill säga <code>CalculatorService</code> som passar väl ihop med det webbtjänstkontrakt som vi definierat ovan.</p>
<p>Javagränssnittet för <code>CalculatorService</code> ser ut så här:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters;

public interface CalculatorService {
    int add(int first, int second);
    int subtract(int first, int second);
    int divide(int first, int second);
    int multiply(int first, int second);
}
</pre>
</td>
</tr>
</table>
<p>Tjänsten realiseras med hjälp av en POJO enligt nedan:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters;

public class PojoCalculatorService implements CalculatorService {

    public int add(int first, int second) {
        return first + second;
    }

    public int subtract(int first, int second) {
        return first - second;
    }

    public int divide(int first, int second) {
        return first / second;
    }

    public int multiply(int first, int second) {
        return first * second;
    }
}
</pre>
</td>
</tr>
</table>
<p>Inga konstigheter, nu gäller det bara att koppla ihop XML-kontraktet och javatjänsten via en webbtjänst.</p>
<h2>Webbtjänst</h2>
<p>Springs webbtjänststöd på serversidan baseras kring en komponent som kallas <code>MessageDispatcher</code>. Denna komponent vidarebefordrar webbtjänstanrop till så kallade <code>Endpoints</code>. En endpoint är alltså en mottagare av ett webbtjänstanrop och är en javaklass som kan hanteras via Spring som vilken annan komponent som helst. Observera att man programmatiskt inte behöver känna till komponenten <code>MessageDispatcher</code>, Spring WS hanterar detta åt dig. Som applikationsutvecklare behöver du endast skapa/konfigurera endpoints.</p>
<p>Eftersom en endpoint är en javaklass och kontraktet är XML måste en mappning mellan XML och Java ske. Detta kallas marshalling/unmarshalling och Spring erbjuder stöd för detta via sin OXM teknologi (OXM – Object/XML Mapping). Spring OXM är alltså ett abstraktionslager för olika typer av tekniker för Object/XML Mapping, för mer information rekommenderas <a href="http://static.springframework.org/spring-ws/sites/1.5/reference/html/oxm.html" target="_blank">Springs OXM-dukumentation</a>.</p>
<p>De tekniker som följer med Spring för marshalling/unmarshalling är:</p>
<ul>
<li><a href="http://xstream.codehaus.org/" target="_blank">XStream</a></li>
<li><a href="http://jibx.sourceforge.net/" target="_blank">JiBX</a></li>
<li><a href="http://en.wikipedia.org/wiki/JAXB" target="_blank">JAXB</a></li>
<li><a href="http://www.castor.org/" target="_blank">Castor</a></li>
<li><a href="http://xmlbeans.apache.org/" target="_blank">XMLBeans</a></li>
</ul>
<p>Den teknologi som används i detta exempel är baserat på XStream. XStream är ett enkelt ramverk för serialisering av javaobjekt till och från XML. XStream erbjuder bland annat stöd för serialisering via annotationer.</p>
<p>Marshalling och unmarshalling är definierat via två springgränssnitt, <code>Marshaller</code> och <code>Unmarshaller</code>. Gränssnittet för marshalling är enkelt och innehåller metoden <code>marshal</code> som används för att konvertera ett <code>Object</code> till XML. XML:en skrivs till ett <code>javax.xml.transform.Result</code>.</p>
<p>Marshaller:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package org.springframework.oxm;

import java.io.IOException;
import javax.xml.transform.Result;

public interface Marshaller {
    void marshal(Object graph, Result result) throws XmlMappingException, IOException;
    boolean supports(Class clazz);
}
</pre>
</td>
</tr>
</table>
<p>Gränssnittet för unmarshalling innehåller en motsvarande <code>unmarshal</code>-metod som konverterar en <code>javax.xml.transform.Source</code> till ett <code>Object</code>.</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package org.springframework.oxm;

import java.io.IOException;
import javax.xml.transform.Source;

public interface Unmarshaller {
    Object unmarshal(Source source) throws XmlMappingException, IOException;
    boolean supports(Class clazz);
}
</pre>
</td>
</tr>
</table>
<p>En endpoint kan skapas på flera sätt men i detta exempel kommer annotationer att användas. Till skillnad från de "automagiska" service exporters vi tidigare träffat på måste vi nu mappa upp XML-requestet till en specifik metod i en javaklass (en endpoint). </p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters.ws;

import org.springframework.ws.server.endpoint.annotation.Endpoint;
import org.springframework.ws.server.endpoint.annotation.PayloadRoot;

import se.cygni.sample.spring.exporters.CalculatorService;

@Endpoint
public class CalculatorServiceEndpoint {
    private CalculatorService calculatorService;

    public CalculatorServiceEndpoint(CalculatorService calculatorService) {
        this.calculatorService = calculatorService;
    }

    @PayloadRoot(
            localPart = "CalculatorRequest",
            namespace = "http://cygni.se/exporters/schemas")
    public CalculatorResponse executeOperation(CalculatorRequest request) {
        try {
            int result;
            switch (request.getOperation()) {
                case ADD:
                    result = calculatorService.add(
                            request.getFirst(),
                            request.getSecond());
                    break;
                case SUBTRACT:
                    result = calculatorService.subtract(
                            request.getFirst(),
                            request.getSecond());
                    break;
                case DIVIDE:
                    result = calculatorService.divide(
                            request.getFirst(),
                            request.getSecond());
                    break;
                case MULTIPLY:
                    result = calculatorService.multiply(
                            request.getFirst(),
                            request.getSecond());
                    break;
                default:
                    return new CalculatorResponse("No valid operation");
            }
            return new CalculatorResponse(result);
        } catch (Throwable thr) {
            return new CalculatorResponse(thr.getMessage());
        }
    }
}
</pre>
</td>
</tr>
</table>
<p>Exemplet ovan visar implementation av en endpoint som delegerar vidare till en implementation av <code>CalculatorService</code>. Metoden <code>executeOperation</code> mappas via annotationen <code>@PayloadRoot</code> mot XML-taggen <code>CalculatorRequest</code>. </p>
<p>Värt att notera är inargument och returvärde. Inargumentet är av typen <code>CalculatorRequest</code> och returvärdet är av typen <code>CalculatorResponse</code>. Dessa typer mappas alltså mot XML-taggar via unmarshalling/marshalling som diskuterats tidigare. För detta exempel är klasserna <code>CalculatorRequest</code> och <code>CalculatorResponse</code> annoterade med XStream-annotationer (<code>XStreamAlias</code> och en marshaller/unmarshaller för XStream är deklarerad i applikationskontextet. För mer information om XStream och annotationer rekommenderas <a href="http://xstream.codehaus.org/annotations-tutorial.html" target="_blank">XStream-dokumentationen</a>.</p>
<p>Requestobjektet:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters.ws;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("CalculatorRequest")
public class CalculatorRequest {
    @XStreamAlias("First")
    private int first;

    @XStreamAlias("Second")
    private int second;

    @XStreamAlias("Operation")
    private OperationType operation;

    public CalculatorRequest() {
        // Ingen initiering nödvändig
    }

    public CalculatorRequest(
            int first,
            int second,
            OperationType operation) {

        this.first = first;
        this.second = second;
        this.operation = operation;
    }

    public int getFirst() {
        return first;
    }

    public int getSecond() {
        return second;
    }

    public OperationType getOperation() {
        return operation;
    }
}
</pre>
</td>
</tr>
</table>
<p>Enumeration för vilken typ av operation som ska utföras (add, subtract och så vidare):</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters.ws;

public enum OperationType {
    ADD, SUBTRACT, MULTIPLY, DIVIDE;
}
</pre>
</td>
</tr>
</table>
<p>Responseobjektet:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
package se.cygni.sample.spring.exporters.ws;

import com.thoughtworks.xstream.annotations.XStreamAlias;

@XStreamAlias("CalculatorResponse")
public class CalculatorResponse {
    @XStreamAlias("Answer")
    private Integer answer;

    @XStreamAlias("Error")
    private String error;

    public CalculatorResponse(Integer answer) {
        this.answer = answer;
    }

    public CalculatorResponse(String error) {
        this.error = error;
    }

    public Integer getAnswer() {
        return answer;
    }

    public String getError() {
        return error;
    }
}
</pre>
</td>
</tr>
</table>
<p>Själva marshaller/unmarshaller-bönan är en del av Spring OXM och deklareras enligt följande:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;bean id="xstreamMarshaller"
      class="org.springframework.oxm.xstream.AnnotationXStreamMarshaller"&#62;
    &#60;property
        name="annotatedClasses"
        value="se.cygni.sample.spring.exporters.ws.CalculatorRequest,
               se.cygni.sample.spring.exporters.ws.CalculatorResponse" /&#62;
&#60;/bean&#62;
</pre>
</td>
</tr>
</table>
<p>Alla de marshallers/unmarshallers som tillhandahålls av Spring implementerar både <code>Marshaller</code>- och <code>Unmarshaller</code>-gränssnitten. XStream-exemplet ovan använder propertyn <code>annotatedClasses</code> för att deklarera vilka klasser som är annoterade med XStream-annotationer.</p>
<p>Eftersom webbtjänster (som namnet antyder) är webbaserade så krävs det att tjänsterna exponeras via HTTP. Det sker enkelt via en deklaration i <code>web.xml</code> enligt nedan.</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;servlet&#62;
    &#60;servlet-name&#62;spring-ws&#60;/servlet-name&#62;
    &#60;servlet-class&#62;org.springframework.ws.transport.http.MessageDispatcherServlet&#60;/servlet-class&#62;
&#60;/servlet&#62;

&#60;servlet-mapping&#62;
    &#60;servlet-name&#62;spring-ws&#60;/servlet-name&#62;
    &#60;url-pattern&#62;/spring-ws/*&#60;/url-pattern&#62;
&#60;/servlet-mapping&#62;
</pre>
</td>
</tr>
</table>
<p>Klassen <code>MessageDispatcherServlet</code> är en utökning av den vanliga <code>DispatcherServlet</code> från Spring MVC som kommer att diskuteras i ett senare inlägg. <code>MessageDispatcherServlet</code> vidarebefordrar anrop till <code>MessageDispatchern</code> som vidare delegerar till de olika endpoints som finns deklarerade. </p>
<p>Den konvention som används är att applikationskontextet måste heta <code></code>-servlet.xml, precis som för Spring MVC. Om servletnamnet är <code>spring-ws</code> som i exemplet ovan så måste kontextfilen heta <code>spring-ws-servlet.xml</code> och den måste vara placerad i <code>WEB-INF</code> katalogen. Nedan visas ett exempel på hur <code>spring-ws-servlet.xml</code> kan se ut:</p>
<table border="0" bgcolor="#eeeeee">
<tr>
<td>
<pre style="font-size:8pt;">
&#60;beans
      xmlns="http://www.springframework.org/schema/beans"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation=
        "http://www.springframework.org/schema/beans
            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"&#62;

    &#60;bean id="pojoCalculatorService"
          class="se.cygni.sample.spring.exporters.PojoCalculatorService" /&#62;

    &#60;bean id="calculatorServiceEndpoint"
          class="se.cygni.sample.spring.exporters.ws.CalculatorServiceEndpoint"&#62;

        &#60;constructor-arg ref="pojoCalculatorService" /&#62;
    &#60;/bean&#62;

    &#60;bean id="endpointAdapter"
          class=
           "org.springframework.ws.server.endpoint.adapter.GenericMarshallingMethodEndpointAdapter"&#62;
        &#60;constructor-arg ref="xstreamMarshaller" /&#62;
    &#60;/bean&#62;

    &#60;bean id="xstreamMarshaller"
          class="org.springframework.oxm.xstream.AnnotationXStreamMarshaller"&#62;
        &#60;property name="annotatedClasses"
            value="se.cygni.sample.spring.exporters.ws.CalculatorRequest,
                   se.cygni.sample.spring.exporters.ws.CalculatorResponse" /&#62;
    &#60;/bean&#62;

    &#60;bean id="annotationMapper"
          class=
      "org.springframework.ws.server.endpoint.mapping.PayloadRootAnnotationMethodEndpointMapping" /&#62;

    &#60;bean id="calculatorWsdl" class="org.springframework.ws.wsdl.wsdl11.DefaultWsdl11Definition"&#62;
        &#60;property name="schema" ref="calculatorSchema" /&#62;
        &#60;property name="portTypeName" value="Calculator" /&#62;
        &#60;property name="locationUri" value="/spring-ws" /&#62;
    &#60;/bean&#62;

    &#60;bean id="calculatorSchema" class="org.springframework.xml.xsd.SimpleXsdSchema"&#62;
        &#60;property name="xsd" value="classpath:schemas/calculator.xsd" /&#62;
    &#60;/bean&#62;
&#60;/beans&#62;
</pre>
</td>
</tr>
</table>
<p>De bönor som deklarerats är:</p>
<ul>
<li><code>pojoCalculatorService</code> – Den faktiska POJO det vill säga den konkreta implementationen av <code>CalculatorService</code>.</li>
<li><code>calculatorServiceEndpoint</code> – Endpoint är den klass som tar emot det faktiska webbtjänstanropet. Komponenten <code>MessageDispatcher</code> kommer att vidarebefordra anrop till denna endpoint som sedan typiskt vidarebefordrar till en POJO.</li>
<li>endpointAdapter – Generell springklass för att hantera marshalling/unmarshalling. Den unmarshaller som används är den konfigurerade <code>xstreamMarshaller</code>.</li>
<li><code>xstreamMarshaller</code> – Den unmarshaller/marshaller som används för XStream-hanteringen.</li>
<li><code>annotationMapper</code> – Hanterar mappningen mellan XML-taggar och javametoder via <code>@PayloadRoot</code>-annoteringar som visats ovan.</li>
<li><code>calculatorWsdl</code> – Komponent som genererar en WSDL-fil baserat på ett vanligt schema.</li>
<li><code>calculatorSchema</code> – Komponent som håller en referens till ett XML-schema och kan konfigureras till WSDL-komponenten.</li>
</ul>
<p>För att exponera en webbtjänst krävs alltså följande:</p>
<ul>
<li>Ett XML-schema.</li>
<li>En endpoint som typiskt delegerar vidare till en POJO (i ovanstående fall delegeras alla anrop till POJO:n för <code>CalculatorService</code>). Endpointen kan skapas genom att använda annoteringarna <code>@Endpoint</code> och <code>@PayloadRoot</code>.</li>
<li>OXM – Mappning mellan XML och Java via Springs OXM-stöd. Observera att genom att implementera gränssnitten <code>Marshaller</code>/<code>Unmarshaller</code> kan egna mappningsklasser skapas.</li>
<li>Deklaration i <code>web.xml</code> för <code>MessageDispatcherServlet</code>.</li>
<li>Applikationskontext för hantering av exempelvis annoteringsmappers, WSDL och liknande.</li>
</ul>
<h2>Anropa webbtjänster</h2>
<p>Ett enkelt sätt att anropa eller testa en webbtjänst är att använda gratisprogrammet <a href="http://www.soapui.org/" target="_blank">soapUI</a>. Detta program kan automatiskt utifrån en WSDL-fil skapa olika requests och sedan anropa den exponerade tjänsten. Dessutom kan programmet användas till att bygga upp testfall som liknar enhetstester.</p>
<p>Om man vill anropa en webbtjänst rent programmatiskt erbjuder Spring stöd för detta genom klassen <code>WebServiceTemplate</code>. Denna klass bygger som så många andra klasser i Spring på templatingmönstret som tidigare nämnts i inlägget om <a href="http://stacktrace.se/2008/08/19/spring-jdbc/">Spring JDBC</a>. För att anropa en webbtjänst används typiskt också OXM det vill säga mappning mellan XML och Java. <code>WebServiceTemplate</code> kan konfigureras med <code>Marshaller</code>/<code>Unmarshaller</code>-objekt men erbjuder även stöd att anropa webbtjänster direkt med XML via användning av XML-objekt av typen <code>javax.xml.transform.Source</code>. Några metoder värda att nämna är:</p>
<ul>
<li><code>sendSourceAndReceiveToResult</code> – Metod för att sända ett objekt av typen <code>javax.xml.transform.Source</code> och spara returvärde i ett objekt av typen <code>javax.xml.transform.Result</code>. Detta innebär att du som applikationsutvecklare själv måste producera den XML som ska skickas via <code>Source</code>-objektet.</li>
<li><code>marshalSendAndReceive</code> – Metod för att hantera objektserialisering via <code>Marshaller</code>/<code>Unmarshaller</code>s. Detta är det sätt som rekommenderas för att XML-hanteringen helt enkelt kan abstraheras bort via Spring OXM.</li>
</ul>
<p>Springklassen <code>WebServiceGatewaySupport</code> är en stödklass som kan användas som basklass för de klasser som behöver använda webbtjänster. Den innehåller metoder för att konfigurera in en <code>WebServiceTemplate</code> och flera stödmetoder för att sända meddelanden via <code>WebServiceTemplate</code>.</p>
<h2>Sammanfattning</h2>
<p>Webbtjänster som baseras på SOAP är i grund och botten XML/HTTP. XML är ett relativt "pratigt" format så denna typ webbtjänster kanske inte alltid är det bästa alternativet. Det kanske är smidigare att använda exempelvis Hessian eller liknande som diskuterats tidigare i inlägget om <a href="http://stacktrace.se/2008/09/29/distribuerade-tjanster-via-spring/">Distribuerade tjänster via Spring</a>.</p>
<p>För att exportera en tjänst som en webbtjänst via Spring krävs en rad åtgärder. Först och främst måste ett XML-schema tas fram eftersom Spring endast stöder metoden Contract First. Sedan måste en så kallad endpoint skapas och konfigureras med hjälp av de mekanismer som Spring WS erbjuder. XML-innehållet måste konverteras till javaobjekt via så kallad unmarshalling och stöd för detta finns via Spring OXM.</p>
<p>För att anropa en tjänst krävs det betydligt färre handgrepp. Klassen <code>WebServiceTemplate</code> erbjuder så kallade templatingmetoder för att på olika sätt anropa webbtjänster. Det finns framför allt två sätt att använda denna template, genom att använda <code>Source</code>/<code>Result</code> från paketet <code>javax.xml.transform</code> eller genom att konfigurera <code>Marshaller</code>/<code>Unmarshaller</code> från Spring OXM.</p>
]]></content:encoded>
</item>

</channel>
</rss>
