Samstag, März 31, 2007
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: Insel
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
- DokuWiki, Dragonfly CMS, Drupal, Gallery2, Joomla, Mambo, Mantis, MediaWiki, Phorum, phpBB, phpMyAdmin, PHP-Nuke, Wordpress, XOOPS (http://quercus.caucho.com/quercus-3.1/doc/quercus-list-of-applications.xtp)
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:
- http://blogs.sun.com/alexismp/entry/php_in_glassfish_first_steps, Video: http://blogs.sun.com/alexismp/resource/phpbbingf.html
- 100% Java Quercus PHP engine running in GlassFish Java EE 5 Application Server... http://weblogs.java.net/blog/ludo/archive/2007/03/100_java_quercu.html
- Java and PHP Intermingling? http://www.javalobby.org/java/forums/t91427.html
Labels: Open Source
Donnerstag, März 15, 2007
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.
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: Insel
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: Java
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: Java
Freitag, März 09, 2007
Mittwoch, März 07, 2007
Aktuelle Closure-Varianten (BGGA, CICE, FCM) im Vergleich
- 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.
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();
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?
Einiges mehr zur Debatte:
- http://wso2.org/library/588
- http://jroller.com/page/fate?entry=dodgy_benchmarks
- http://www.bloglines.com/blog/sanjiva?id=176
- http://weblogs.java.net/blog/kohsuke/archive/2007/02/jaxws_ri_21_ben.html
- http://blogs.sun.com/alexismp/entry/why_jax_ws_isn_t
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:
- Column Group
- Quick Searcher Panel
- ScrollPane Selector
- WhiteBoard
- ListView
- SwingxTris
- AsynchronousFilter
- Custom Column Control
- TaskPaneRenderer
- JXCheckList
- SwingXtreme Renderer
- JXTabbedPane Demo
- JXLabel Demo
Labels: Open Source
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.
