Posts Tagged ‘Java’

Code conventions and programming style

October 1st, 2007

Coding conventions are rules that computer programmers follow to ensure that their source code is easy to read and maintain.

Why is that important?

Sun Microsystems provides the following rationale for the Java Programming Language:

Code conventions are important to programmers for a number of reasons:

  • 80% of the lifetime cost of a piece of software goes to maintenance.
  • Hardly any software is maintained for its whole life by the original author.
  • Code conventions improve the readability of the software, allowing engineers to understand new code more quickly and thoroughly.
  • If you ship your source code as a product, you need to make sure it is as well packaged and clean as any other product you create.

Crossbow Software has gather a set of code conventions and programming style documents, take a look at their Coding Style Standards download page.

Maven 2 Cobertura Plugin

June 24th, 2007

The Maven 2 Cobertura Plugin web site lacks information to successfully generate Cobertura reports. Worse, some of the usage examples are incorrect and don’t work.

The most common problem when generating Cobertura reports is when the generated report shows 100% test coverage while in reality many of the classes don’t even have tests.

The following example shows how to configure the reports so that it would reflect real test coverage and then check if the specified packages achieved the wanted test coverage:

<build>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
            <version>2.1</version>
            <configuration>
                <check>
                    <haltOnFailure>false</haltOnFailure>
                    <regexes>
                        <regex>
                            <pattern>com.samaxes.business.*</pattern>
                            <branchRate>90</branchRate>
                            <lineRate>90</lineRate>
                        </regex>
                        <regex>
                            <pattern>com.samaxes.persistence.*</pattern>
                            <branchRate>90</branchRate>
                            <lineRate>90</lineRate>
                        </regex>
                    </regexes>
                </check>
                <instrumentation>
                    <includes>
                        <include>com/samaxes/**/*.class</include>
                    </includes>
                </instrumentation>
            </configuration>
            <executions>
                <execution>
                    <id>clean</id>
                    <phase>pre-site</phase>
                    <goals>
                        <goal>clean</goal>
                    </goals>
                </execution>
                <execution>
                    <id>instrument</id>
                    <phase>site</phase>
                    <goals>
                        <goal>instrument</goal>
                        <goal>cobertura</goal>
                        <goal>check</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>
<reporting>
    <plugins>
        <plugin>
            <groupId>org.codehaus.mojo</groupId>
            <artifactId>cobertura-maven-plugin</artifactId>
        </plugin>
    </plugins>
</reporting>

JBoss – Stacking Login Modules

May 27th, 2007

Sometimes no single login module is enough to meet our needs. Imagine the case of using an external LDAP server to provide the user authentication and a database server to provide the user authorization. A user would be in one repository or the other, and login should succeed if the user is found in either repository.

JBoss allows you to specify multiple login modules for a single security domain. But simple module stacking doesn’t resolve the problem on its own. For that, you need to use password stacking.

Password stacking allows modules to skip the actual authentication and to provide supplemental roles. The modules require the password-stacking option to useFirstPass for this to work.

<application-policy name="myRealm">
  <authentication>
    <login-module code="org.jboss.security.auth.spi.LdapLoginModule" flag="optional">
      <module-option name="password-stacking">useFirstPass</module-option>
      <module-option name="java.naming.factory.initial">com.sun.jndi.ldap.LdapCtxFactory</module-option>
      <module-option name="java.naming.provider.url">ldap://LDAP_SERVER:LDAP_PORT/</module-option>
      <module-option name="java.naming.security.authentication">simple</module-option>
      <module-option name="principalDNPrefix">MY_DOMAIN\</module-option>
    </login-module>
    <login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
      <module-option name="password-stacking">useFirstPass</module-option>
      <module-option name="dsJndiName">java:myDS</module-option>
      <module-option name="principalsQuery">SELECT passwd FROM user WHERE login = ?</module-option>
      <module-option name="rolesQuery">SELECT role, 'Roles' FROM user_roles r, user u WHERE u.userid = r.userid AND u.login = ?</module-option>
    </login-module>
  </authentication>
</application-policy>

The option principals query is optional; it’s a fallback in the case the authentication fails in the LDAP server. Notice that the LDAP configuration omits the roles query option set so the authorization is only provided by the database server module.

Where does .NET beat Java?

May 9th, 2007

Werner Schuster posted at InfoQ an article entitled “Microsoft Surpasses Java’s Dynamic Language Support” trying to show where .NET is doing better than Java.

Some of the highlights are:

  • Microsoft CLR (Common Language Runtime), LINQ and the support for multiple languages
  • DLR (Dynamic Language Runtime)
  • .NET modularization and versioning

Secure JSP Taglibs

February 4th, 2007

I’ve just created the project Secure JSP Taglibs at Google Code Project Hosting with the ambition to fill some gaps in the security of the presentation layer in a Java web application.

For now it doesn’t do too much, more features will be added in the future.
This Taglib allows you to evaluate the nested body content of the tag to test if the user has the specified roles.
This is equivalent to the isUserInRole() method, but you can evaluate multiple roles (comma separated) at the same time.

Examples:

<secure:one roles="role1toevaluate, role2toevaluate">
    Show this content if the user has one of the specified roles.
</secure:one>
<secure:all roles="role1toevaluate, role2toevaluate">
    Show this content if the user has all the specified roles.
</secure:all>
<secure:none roles="role1toevaluate, role2toevaluate">
    Show this content if the user has none of the specified roles.
</secure:none>

Feel free to use it, it’s licensed under Apache License 2.0 and can be found at http://code.google.com/p/secure-taglib/.

Comparison between Stripes and JSF

January 8th, 2007

Reading the TheServerSide.COM news I’ve found a comparison’s article between Stripes and JSF frameworks.

I can’t agree more with the author Gregg Bolinger when he says Since I stumbled on Stripes, I’ve found it to be the best all around framework for my purposes.

Read it at “Stripes and JSF: A Brief Comparison“.

Java and UTF-8 encoding

December 31st, 2006

If the J2SE platform has come a long way in internationalization, entering non-ASCII text in the J2EE world isn’t nearly as easy.

To achieve the same result you have to make some changes in your code and in your web server settings.

Firstly, to make sure that the right value in the Content-Type header precedes the text/html content so your browser correctly auto-detects the right encoding, place the following declaration at the beginning of the JSP:

<%@ page contentType="text/html; charset=utf-8" pageEncoding="UTF-8" %>

Next you have to create a filter that implements the ‘javax.servlet.Filter’ interface so you can have the request parameters encoded with UTF-8:

package com.samaxes.filters;

import javax.servlet.*;
import java.io.IOException;

/**
 * Filter called before every action.
 *
 * @author : samaxes
 */
public class UTF8Filter implements Filter {

    public void init(FilterConfig filterConfig) {
    }

    public void destroy() {
    }

    public void doFilter(ServletRequest servletRequest,
                         ServletResponse servletResponse,
                         FilterChain filterChain)
            throws IOException, ServletException {
        servletRequest.setCharacterEncoding("UTF-8");
        filterChain.doFilter(servletRequest, servletResponse);
    }
}

Now, your server reads the URL POST parameters correctly…

But there still is an issue – during a GET operation.

The trouble is that none of the charset information gets sent back to the web server during a GET or POST operation. The server has no way of knowing how to interpret the url-encoded GET parameters, so it assumes ISO-8859-1.

Fortunately the solution to address this is pretty simple, just specify URIEncoding="UTF-8" in your Tomcat’s connector settings within the server.xml file.

Your application shall now handle UTF-8 just fine.

Java 6 Final Release Available for Download

December 11th, 2006

The news article from InfoQ:

This morning Sun officially released Java 6 for download after over two years of development. The Java 6 development cycle has been the most open of any Java release with weekly builds available to the public and extensive collaboration between Sun and over 330 external developers. Sun has worked with over 160 companies to ensure backwards compatibility, stability and optimum performance of applications running on the JVM. Java 6 included a number of focus areas. From the press release:

Web 2.0

The Java SE 6 software helps accelerate developer innovation for web-based, dynamic and online collaboration applications by including a new framework and developer APIs to allow mixing of Java technology with dynamically typed languages, such as PHP, Python, Ruby and JavaScript(TM) technology. Sun has also created a collection of scripting engines at: http://scripting.dev.java.net and pre-configured the Rhino JavaScript engine in the Java SE 6 platform. In addition, the Java SE 6 software includes a full web services client stack and supports the latest web services specifications, such as JAX-WS 2.0, JAXB 2.0, STAX and JAXP.

Diagnostics, Monitoring, and Management

The Java SE 6 platform provides expanded tools for diagnosing, managing and monitoring applications and also includes support for the new NetBeans Profiler 5.5 and for Solaris(TM) DTrace, a comprehensive dynamic tracing framework for the Solaris 10 Operating System (OS). In addition, the Java SE 6 software further increases ease of development with tool interface updates for the Java Virtual Machine (JVM (TM)) and the Java Platform Debugger Architecture (JPDA).

Enterprise Desktop

The Java SE 6 release delivers significant improvements to the desktop, which enable Java applications to integrate even more seamlessly into the end-user experience. For rapid visual development of interactive applications, the Java SE 6 platform includes a new layout manager component, based on the NetBeans GUI Builder (formerly code named Matisse). The Java SE 6 software also provides enhanced support for the upcoming version of Windows Vista.

InfoQ discussed the Java 6 release with Bill Curci, Product Marketing Manager for Java Platform Standard Edition and Danny Coward, Java SE Platform Lead. Among the items they highlighted:

A good summary of the main features included in Java 6 can be found in InfoQ’s previous coverage “Top 10 New Things You Need to Know About Java 6“.

Sun open sources Java under GPLv2

November 14th, 2006

It’s finally here as you can see in Free and Open Source Java.

The key behind moving to the GPL is to drive more volume and more adoption for the platform. The GPL helps get Java into some markets that it hasn’t served as fully as it should – such as educational markets, governments in the developing world, and some commercial customers – as well as, obviously, some distributions of Linux which insist not on Linux-friendly licenses but on actual GPL licensing.

GPLv2 was chosen over GPLv3 for fairly obvious reasons: GPLv3 isn’t finished yet! Sun is, they said, working with the FSF on defining GPLv3.

Read the complete news.

Gantt Charts with JFreeChart

November 4th, 2006

If you have ever tried to draw gantt charts with JFreeChart you have already noticed that it’s a very simplistic implementation – it doesn’t have the facility to display dependency lines or milestones.

Orginal Gantt Chart
Gantt chart demo from JFreeChart samples

In a recent project I needed some additional features like:

  1. Summary tasks
  2. Milestones/deliverables
  3. Dependencies between task and milestones/deliverables

So I modified BarRenderer.java, GanttRenderer.java, GanttCategoryDataset.java, Task.java, and TaskSeriesCollection.java appropriately and also created my own class called LineAndShapeGanttRenderer.java.

Modified Gantt Chart
Gantt chart with JFreeChart after files modification

The base version of JFreeChart was 1.0.2, and the modified files were: