Java ist auch eine Insel

Samstag, März 31, 2007

So kann eine Exception ein trauriges Gesicht machen

try { ... }
catch ( NumberFormatException ó_ò ) { ... }

AddThis Social Bookmark Button

Montag, März 26, 2007

parse()-Fehler bei DateFormat und setLenient(false)

Unsinnige Werte meckert parse() standardmäßig nicht an, wie die folgenden Zeilen darlegen:

DateFormat formatter = new SimpleDateFormat( "dd-MM-yyyy" );
System.out.println( formatter.parse( "29-02-2008" ) ); // Fri Feb 29 00:00:00 CET 2008
System.out.println( formatter.parse( "29-02-2007" ) ); // Thu Mar 01 00:00:00 CET 2007
System.out.println( formatter.parse( "33-02-2008" ) ); // Tue Mar 04 00:00:00 CET 2008

An den letzten beiden Beispielen lässt sich ablesen, dass das Datum auf den nächsten Monat „rollt“. Um das abzusichern, bietet DateFormat eine Funktion setLenient(boolean), die den „Mildmodus“ mit setLenient(false) ausschaltet.

DateFormat formatter = new SimpleDateFormat( "dd-MM-yyyy" );
formatter.setLenient( false );
System.out.println( formatter.parse( "29-02-2007" ) );

Jetzt gibt es für den 29.02.2007 eine ParseException mit dem Text „Unparseable date: "29-02-2007"“. Der 29.02.2008 ist in Ordnung, weil 2008 ein Schaltjahr ist.

Labels:

AddThis Social Bookmark Button

Freitag, März 23, 2007

PHP in purem Java mit Quercus

Quercus (http://quercus.caucho.com/) implementiert eine PHP 5 Engine in purem Java. Die Software ist unter LGPL und stammt von Caucho, die auch den performanten Resin-Server implementieren. Laut Herstellerangaben laufen bisher

Von den PHP-Funktionen fehlen bisher:

  • call_user_method, call_user_method_array, get_declared_interfaces, interface_exists, property_exists
  • date_default_timezone_get, date_default_timezone_set, date_sunrise, date_sunset, idate, localtime, strptime
  • debug_print_backtrace, restore_exception_handler, set_exception_handler
  • exif_read_data, exif_thumbnail, exif_tagname
  • disk_free_space (stub), disk_total_space (stub), readlink (stub), umask (stub)
  • register_tick_function, unregister_tick_function
  • bind_textdomain_codeset (stub)
  • headers_list, setrawcookie
  • ob_iconv_handler
  • imagecolorclosesthwb, imagecolorset, imagecolorstotal, imageftbbox, imagefttext, imagegammacorrect, imageinterlace, imagelayereffect, imageloadfont, imagepalettecopy, imagepsbbox, imagepscopyfont, imagepsencodefont, imagepsextendfont, imagepsfreefont, imagepsloadfont, imagepsslantfont, imagepstext, imagerotate, iptcembed, image2wbmp, jpeg2wbmp, png2wbmp, imagecreatefromgd2, imagecreatefromgd2part, imagecreatefromgd, imagegd2, imagegd
  • ezmlm_hash
  • mhash_keygen_s2k
  • connection_aborted, connection_status, connection_timeout, __halt_compiler, highlight_file, highlight_string, ignore_user_abort, php_check_syntax, php_strip_whitespace, show_source, sys_getloadavg, time_nanosleep, time_sleep_until
  • mysqli_debug, mysqli_disable_reads_from_master, mysqli_disable_rpl_parse, mysqli_info, mysqli_kill, mysqli_master_query, mysqli_report, mysqli_rpl_parse_enabled, mysqli_rpl_probe, mysqli_rpl_query_type, mysqli_send_long_data, mysqli_send_query, mysqli_server_end, mysqli_server_init, mysqli_ssl_set, mysqli_stmt_send_long_data, mysqli_thread_id, mysqli_thread_safe
  • dns_get_record, inet_ntop, inet_pton, long2ip, pfsockopen, socket_get_status, socket_get_blocking, socket_get_timeout
  • assert_options, dl (stub), get_current_user (stub), get_included_files, get_magic_quotes_gpc, get_magic_quotes_runtime, get_required_files, getopt, getrusage, ini_restore, memory_get_usage, php_ini_scanned_files, php_logo_gid, phpcredits, putenv, restore_include_path, set_magic_quotes_runtime, zend_logo_gid, zend_version
  • proc_close, proc_get_status, proc_nice, proc_open, proc_terminate
  • stream_bucket_append, stream_bucket_make_writeable, stream_bucket_new, stream_bucket_prepend, stream_filter_append, stream_filter_prepend, stream_filter_register, stream_filter_remove, stream_get_filters, stream_get_meta_data, stream_select, stream_set_blocking, stream_set_timeout (stub), stream_set_write_buffer (stub), stream_socket_accept, stream_socket_server, stream_socket_client, stream_socket_enable_crypto, stream_socket_get_name, stream_socket_pair, stream_socket_recvform, stream_socket_sendto, stream_socket_server
  • xml_error_string, xml_get_current_byte_index, xml_get_current_column_number, xml_get_current_line_number, xml_get_error_code, xml_set_external_entity_ref_handler
  • und noch ein paar

Aus PHP heraus lassen sich Java-Objekte bauen und auf die gesamte API zugreifen:

<?php

$a = new java("java.util.Date", 1234567);

echo $a->day();

?>

Neu eingeführt in PHP wurde auch das import Schlüsselwort.

Beiträge, die sich mit Quercus beschäftigen und zeigen, wie das MediaWiki und Forums-Software läuft, sind:

Labels:

AddThis Social Bookmark Button

Donnerstag, März 15, 2007

Inselupdate: Ist eine Zahl mit value % 2 == 1 ungerade?

Um mit value % 2 == 1 zu testen, ob value eine ungereade Zahl ist, muss value positiv sein, denn -3 % 2 wertete Java zu -1 aus. Der Test auf ungereade Zahlen wird erst wieder korrekt mit value % 2 != 0.

AddThis Social Bookmark Button

Insel: Innere Klasse und Serializable

Werden Exemplare einer nicht statischen inneren Klasse serialisiert, die äußere Klasse implementiert aber nicht Serializable, gibt es einen Fehler, denn intern hält ein Objekt der inneren Klasse einen Verweis auf das Exemplar der äußeren Klasse. Statische innere Klassen machen das nicht, was das Problem mit der Serialisierung lösen kann. Das Datenvolumen kann natürlich groß werden, wenn schlanke nicht-statische innere Serializable-Klassen in einer äußeren Serializable-Klassen liegen, die sehr viele Eigenschaften besitzt.

AddThis Social Bookmark Button

Insel: Negative Rückgabe bei Math.abs(int)

Es gibt genau einen Wert, auf den kann Math.abs(int) keine positive Rückgabe liefern. Das ist -2147483648. Der Grund ist, dass -2147483648 die kleinste darstellbare int-Zahl (Integer.MIN_VALUE) ist, aber +2147483648 gar nicht in ein int int! Die größte darstellbare int-Zahl ist 2147483647 (Integer.MAX_VALUE). Was sollte hier abs() machen?

Labels:

AddThis Social Bookmark Button

Dienstag, März 13, 2007

JAX-WS 2.1 with Spring under Java 6

First you need some jars in your classpath of an web application

  • commons-logging.jar
  • jaxw-api.jar
  • jaxws-rt.jar
  • jaxws-spring-1.1.jar
  • saaj-api.jar
  • saaj-impl.jar
  • spring.jar
  • stax-ex.jar
  • streambuffer.jar
  • xbean-spring-2.8.jar

The Jars are from Spring itself, http://geronimo.apache.org/xbean/, https://jax-ws.dev.java.net/ (jax-ws 2.1, JAXWS2.1_nightly.zip) and https://jax-ws-commons.dev.java.net/spring/ (jaxws-spring-1.1.jar). It is although important to place

  • jaxb-api.jar
  • jaxb-impl.jar

under C:\Programme\Apache Software Foundation\Tomcat 5.5\common\endorsed.

This was the necessary and boring preparation.

Next the Web Service itself

package com.tutego.service;

import javax.jws.WebMethod;
import javax.jws.WebService;
import javax.jws.soap.SOAPBinding;

@WebService
@SOAPBinding(style = SOAPBinding.Style.RPC)
public class GreeterService
{
@WebMethod
public String greet( String name )
{
return "Hello " + name + "!"
}
}

And web.xml:

<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>SpringWeb</display-name>
<welcome-file-list>
<welcome-file>index.html</welcome-file>
<welcome-file>index.htm</welcome-file>
<welcome-file>index.jsp</welcome-file>
<welcome-file>default.html</welcome-file>
<welcome-file>default.htm</welcome-file>
<welcome-file>default.jsp</welcome-file>
</welcome-file-list>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<servlet>
<servlet-name>jaxws-servlet</servlet-name>
<servlet-class>
com.sun.xml.ws.transport.http.servlet.WSSpringServlet
</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>jaxws-servlet</servlet-name>
<url-pattern>/greet</url-pattern>
</servlet-mapping>
</web-app>

The applicationContext.xml follows the suggestions with the namespace.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ws="http://jax-ws.dev.java.net/spring/core"
xmlns:wss="http://jax-ws.dev.java.net/spring/servlet"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://jax-ws.dev.java.net/spring/core http://jax-ws.dev.java.net/spring/core.xsd
http://jax-ws.dev.java.net/spring/servlet http://jax-ws.dev.java.net/spring/servlet.xsd">
<ws:service id="greeterService"
impl="com.tutego.service.GreeterService" />
<wss:bindings id="jax-ws.http">
<wss:bindings>
<wss:binding url="/greet" service="#greeterService" />
</wss:bindings>
</wss:bindings>
</beans>

Now you can consume your WS. If your Web-Context is SpringWeb use http://localhost:8080/SpringWeb/greet?wsdl. Enjoy it!

Labels:

AddThis Social Bookmark Button

Spring in einer Web-Applikationen nutzen - so einfach ist das

Mit dem WTP ist es eine Sache von Minuten.

Lege ein Dynamic-Web-Projekt an. Nenne es etwa spring.

Aus dem Spring-all-in-one-glücklich.zip kopiere spring.jar und common-loggings.jar in das WEB-INF/lib.

Lege in WEB-INF eine Datei applicationContext.xml.

Setze in die Datei:

<?xml version="1.0" encoding="UTF-8"?> 


<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>

<bean id="date" class="java.util.Date" />

</beans>


Setzte in WEB-INF/web.xml die Zeilen:

<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>

<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>


Schreibe eine index.jsp

<%@page import="org.springframework.web.context.support.WebApplicationContextUtils"%>
<%@page import="org.springframework.context.ApplicationContext"%>
<%
ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
%>

<%= appContext.getBean("date") %>


Das war's. Unter http://localhost:8080/spring/ gibt's dann das Datum.

Labels:

AddThis Social Bookmark Button

Freitag, März 09, 2007

Swing Application Framework und Swing Databinding -- eine Aufzeichnung

Labels:

AddThis Social Bookmark Button

Mittwoch, März 07, 2007

Aktuelle Closure-Varianten (BGGA, CICE, FCM) im Vergleich

Zwar wird Java 7 höchst wahrscheinlich Closures bekommen, aber nicht jeder wird wissen, dass im Moment ganz unterschiedliche Varianten diskutiert werden:

- Gilad Bracha, Neal Gafter, James Gosling, Peter von der Ahé (BGGA)
- Bob Lee, Doug Lea, and Josh Bloch (CICE)
- Stefan Schulz (FCM)

Der Blog-Eintragt http://www.jroller.com/page/scolebourne?entry=java_7_comparing_closure_proposals vergleicht Szenarien mit den drei bisherigen Vorschlägen.

AddThis Social Bookmark Button

Freitag, März 02, 2007

Find all hyperlinks in a text file

FileChannel     fc = new FileInputStream( "c:/a.html" ).getChannel();
ByteBuffer byteBuf = fc.map( FileChannel.MapMode.READ_ONLY, 0, fc.size() );
CharBuffer charBuf = Charset.defaultCharset().newDecoder().decode( byteBuf );
Pattern pattern = Pattern.compile( "<a.*?href=[\"']([^\"]*?)[\"'].*?>", Pattern.CASE_INSENSITIVE );
Matcher m = pattern.matcher( charBuf );

while ( m.find() )
System.out.println( m.group( 1 ) );

fc.close();

AddThis Social Bookmark Button

Axis2/XFire Zoff. Der Gewinner: JAXWS 2.1?

Im Moment tobt der Kampf zwischen Axis2 und XFire um die Performance-Krone. Einige Benchmarks zeigen Axis2 vorne, doch das wohl nur, weil eigentlich XML-Bindings-Frameworks (JAXB bei XFire, ADB (Axis2 Data Binding) bei Asix2), also vergleichen werden, und nicht der Serialisierer selbst. Andere wiederum erfreuen sich über die Rechtschreibfehler in der Axis2-Doku bis zur Frustration:

  • isOneHanlder
    boolean isOneHanlder
    this is want if the phaseFirst and phaseLst same hanlder that is for this phase there is only one phase
  • This send the SOAP Message to other SOAP nodes and this alone write the SOAP Message to the wire. Out flow must be end with one of this kind.
  • cloneOMElement
    public OMElement cloneOMElement()
    Clones this element. Since both elements are build compleletely, you will lose the differed building capability.
    Returns:
    Returns OMElement.

Im Moment sieht gar nicht so schlecht für die Referenzimplementierung aus, insbesondere seit der neuen Version JAXWS 2.1 FCS. Die Performance-Ergebnisse sind ausgezeichnet und Spring-Support gibt's auch. Was will man mehr?

small.png

Einiges mehr zur Debatte:

AddThis Social Bookmark Button

SwingX Demos

Unter http://swinglabs.org/demos.jsp gibt's ein Demo (JNLP) aller zentraler SwingX-Komponenten. Im Incubator ist auch einiges interssantes dabei -- eine JXSplitButton Demo habe ich immer schon vermisst.

JNLP-Demos:

Labels:

AddThis Social Bookmark Button

Apache Tomcat 6.0 ist kein Beta mehr

Tomcat implementiert die Spezifkationen Servlet 2.5 und JavaServer Pages 2.1, womit auch reihe JSF 1.2 Anwendungen möglich werden. Die aktuelle Version ist 6.0.10.

AddThis Social Bookmark Button