Wednesday, 26 November 2008

java.lang.ClassCastException: oracle.sql.BLOB

This is by far the most annoying problem I've ever had. What ClassCastException??? This is my code:

oracle.sql.BLOB blob = (oracle.sql.BLOB) resultSet.getObject("fileBlob");

It turned out that there are 2 Oracle JDBC jars in my Tomcat directory (common/lib and WEB-INF/lib), so I removed the one from WEB-INF, restarted the application, and it all worked fine.

Tuesday, 9 September 2008

Custom Authentication Using Spring Security

Customising Spring Security could be a challenge as there seems to be lack of practical examples. Recently I tried to customise my login page when authentication fails. I found this blog really useful: Spring Security - Using custom Authentication Processing Filter

Monday, 14 July 2008

JSCalendar Problem - Stack overflow at line: 1797

I posted a blog regarding this JSCalendar earlier in the year, and it has been working great.. until recently when I got "Stack overflow at line: 1797" on my IE. This is caused by duplication in the javascript declaration, causing the calendar script to be loaded a couple of times. I cleaned up my HTML code and made sure that it was only declared once, and the problem went away.

Spring Security (Acegi) and Sitemesh

Sitemesh is a great tool to decorate your java-based web page. I am currently using it to decorate my web application so that I can have the menu on the left panel, a header, and a footer withouth worrying about including it in all my jsp pages. Spring Security (formerly known as Acegi Security System) is another great tool that I also use together with Sitemesh for authentication and authorisation. My Spring Security "authorize" tag recently did not work properly, and the problem was because in my web.xml, I declared Sitemesh BEFORE Spring Security. Spring Security would clean up before Sitemesh is able to decorate the pages, causing Spring Security tags to stop working. The solution is to declare Sitemesh after Spring Security.

Thursday, 10 April 2008

Spring JMS

Using Spring JMS to send and receive messages to Queues is not difficult nowadays. I followed this tutorial in order to communicate to IBM MQ Series with no problem. It is simple, straightforward, and you can set up your applications in a very short amount of time.

Wednesday, 9 April 2008

Groovy Scripting

I've recently had a chance to use Groovy in my workplace. The script checks all connections to test server, including database connections and web services. It tries to log in using web services to all test servers and gives results.
This link provides a very good overview for Groovy starters, but the web service part is quite old, because now groovyws is much easier to use instead of groovysoap.

Tuesday, 1 April 2008

Timezone and Daylight Savings

Recently I've had problems with Timezones becaus this year, Daylight Saving Time is extended for 1 week in NSW. The trouble is, there is no world time zone authority, and this has caused some dramas in the applications that I am looking after. The good news is that Sun has released a Java patch to fix Java's timezone database. For more information, see: http://java.sun.com/javase/timezones/DST_faq.html

Thursday, 20 March 2008

Schema Spy

SchemaSpy is a database reverse engineering tool that generates information about your database, including relationships, constraints, columns, and it even detects potential anomalies that may exist in your database. In order to maximise the benefit, you'd need to install GraphViz so that the HTML report would include nice graphical stuff.

I recently downloaded both software and run it against an Oracle database with this command:

# java -jar schemaSpy_3.1.1.jar -cp "D:\oraclexe\..\jdbc\lib\ojdbc14.jar"
-t ora -db [dbname] -s [schema] -u [user] -p [password] -cid -o output

I installed the latest Oracle Express Edition so that I get the latest Oracle client and JDBC driver. Make sure ORACLE_HOME is set, and include "GraphViz\bin" and "ORACLE_HOME\bin" in your PATH.

Thursday, 13 March 2008

Javascript Calendar

There are lots of Javascript Calendars out there, both in the form of javascript(s) or within an AJAX library (DOJO, Scriptaculous). Recently, I came across The Coolest DHTML / JavaScript Calendar [dynarch.com] and it was extremely easy to use! It only requires a few lines of codes in your HTML and bang, you've got a working date picker.

One thing to note is, it can clash with your existing css. JsCalendar is actually using "calendar" class for its div, and it has a table within the div. The solution to this problem is by adding this piece of css code:

.calendar table {
width: auto;
}

Monday, 10 March 2008

JBoss Deployment Order

JBoss by default deploys ear files before war files, but if you want to have this changed, here is how to do it:
  • Edit C:\jboss-4.2.0.GA\server\default\conf\xmdesc\org.jboss.deployment.MainDeployer-xmbean.xml
  • Look for EnhancedSuffixOrder
  • Under descriptors tag, there is a value tag, and you would see "value" attribute
  • Change the priority of the file type that you want. The format is "priority:file type" (the bigger the number, the lower the priority)

Thursday, 6 March 2008

Sun Tech Days

I've been attending Sun Tech Days in Darling Harbour. I attended the "Enterprise Track", but wanted to go to the "Desktop Track" at around 12:20 to check out "Java SE 6 Top 10 Features and Java SE 7", but it was full. It turned out that I was not the only one planning to do such a thing. I met some colleagues and ex-colleagues and had a time to catch up during lunch. The afternoon sessions were, I have to say, more useful to me, as there were practical examples and demos that I can relate to.

A few attendees asked an interesting question during the last session. The question was something like "If I was to create a java application with RDBMS back end, which framework should I use?". This is definitely one of the questions that I had always wanted to ask. It was a very good question, I thought, given the vast amount of frameworks that java developers can use in order to create an application. Well, there was no definite answer. Each framework has its own advantage/disadvantage. Spring's advantage, for example, is its ability to unit test business logic outside the container, and also AOP is useful. It is also interesting to note that Glassfish server now almost matches Tomcat in terms of startup time. I did notice that when the presenter started the server using NetBeans, it was pretty quick.

Anyway, I had fun in the event, and we had free lunch, dinner, and drinks, both alcoholic and non alcoholic..

Tuesday, 26 February 2008

Canoo WebTest

I have been looking for unit testing my web pages and came across Canoo WebTest recently. I have to say it is a very simple tool to use, flexible, produce excellent reports, and it supports groovy scripting language as well for more complicated tests. By following the screencast, I was able to start testing my web pages in less than half an hour.

Monday, 25 February 2008

Personal Information Online

I have recently read this article from The Sydney Morning Herald Blogs: MashUp. It is really amazing to note that people put a significant amount of personal detail online. The article also mentions that your mother's maiden name is often used in Internet Banking as a security question, and people do put it somewhere online. It is like keeping your PIN number next to your ATM card! I guess the lesson here is, whatever you put online, most of the time can be traced by criminals, so be careful! Think twice before hitting that "publish"/"submit" button.

Tuesday, 19 February 2008

File Download In Spring

In order to implement a file download in Spring, the key is returning null instead of a ModelAndView object. This controller that I created below is specifically for text/ascii data. You'd need to change the content type appropriately in order to download other file types.

public class DownloadController implements Controller {
/*
* Spring dependency injection
*/
private XService xService;

public void setxService(
XService xService) {
this.xService = xService;
}

public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
String idStr = request.getParameter("id");
if (idStr != null) {
long id = Long.parseLong(idStr);
String data = xService.getData(id);
doDownload(request, response, data, "file" + idStr + ".xml");
}
return null;
}

private void doDownload(HttpServletRequest request,
HttpServletResponse response, String data, String filename)
throws IOException {
int length = data.length();
ServletOutputStream op = response.getOutputStream();

response.setContentType("text/plain");
response.setContentLength(data.length());
response.setHeader("Content-Disposition",
"attachment; filename=\"" + filename + "\"");

byte[] bbuf = data.getBytes();
op.write(bbuf, 0, length);
op.flush();
op.close();
}
}

Accessing EJB 3 from Spring 2.5

Spring 2.5 now supports EJB 3 access, and it could not be any easier! Here is the spring xml snippet to achieve it:

<beans>
...
<!-- *** EJBs *** -->
<!-- REMOTE JNDI CONNECTION -->
<bean id="remoteJndiTemplate"
class="org.springframework.jndi.JndiTemplate">
<property name="environment">
<props>
<prop key="java.naming.factory.initial">
org.jnp.interfaces.NamingContextFactory
</prop>
<prop key="java.naming.provider.url">
localhost
</prop>
<prop key="java.naming.security.principal">
username
</prop>
<prop key="java.naming.security.credentials">
mycredentials
</prop>
</props>
</property>
</bean>

<bean id="abstractRemoteSlsb" abstract="true"
class="org.springframework.ejb.access.
SimpleRemoteStatelessSessionProxyFactoryBean">
<property name="lookupHomeOnStartup" value="false">
<property name="jndiTemplate">
<ref bean="remoteJndiTemplate" />
</property>
</bean>

<bean id="myService" parent="abstractRemoteSlsb">
<property name="jndiName"
value="myapp/MySessionBeanImpl/remote">
<property name="businessInterface"
value="au.com.package.name.MySessionBean">
</bean>
...
</beans>

Friday, 15 February 2008

Logging A StackTrace Exception

Logging an error seems to be a very easy job to do, but one of the common mistakes that Java programmers make is using the wrong method. Consider this piece of code:
try {
..
}
catch (Exception e) {
LOG.error(e);
}

Can you see what is really going on? If you have a look at commons logging's API, there are 2 error methods in the Log interface. All the above code does is it logs e.toString() to the error log, which means the error stack trace will be lost! Here is what you need to do instead:
try {
..
}
catch (Exception e) {
LOG.error("problem...", e);
}

Wednesday, 13 February 2008

EJB 3.0 LazyInitializationException In Unit Tests

I have to say that unit testing in EJB is very challenging. All I want is doing unit tests on a local session bean that someone else created, so here is what I did:
  • Create a remote interface
  • Create a base interface from the current local session bean interface
  • Delete all abstract methods on the local interface and extend the base interface
  • Update the remote interface to extend the base interface
  • Add the methods that I want to unit test in the remote interface
  • Change the methods that I want to test in the implementation to public
  • Edit the implementation class so that it extends both the local and remote interface

Gosh, if that is not time consuming, tell me what is! After all the effort, finally I wrote the actual unit test class, wrote the code to get the remote home that I created earlier using JNDI in the setUp() method, wrote my test, compile the whole project, and then start my JBoss.To my surprise, I got LazyInitializationException, so I thought, all the effort that I did earlier was useless! I tried googling and found some ways to avoid this exception. There are actually 4 ways to do this:

  • Change the session bean to be stateful, and change the persistence context type to EXTENDED. Do I really need to do this just to get the test working?
  • Run the session from within another session bean. Do I really need to create another one just to get the test working?
  • Make fetch type EAGER (obviously). Impossible! There are lots of data, and therefore the laziness
  • Create another method and use Hibernate's JOIN FETCH strategy. This one seems to be the cleanest and the least destructive solution

Honestly, why is it so hard to unit test a Session Bean? If the project had been done in Spring, there are Spring tools that can be utilised and therefore unit testing would have been much easier! See my earlier post to work around this Exception in Spring.

Tuesday, 12 February 2008

Grails

With the recent announcement of Grails version 1.0, it is time to give it another try! This time I went to the screencasts, then downloaded the binary release and started fiddling. Creating a CRUD web application could not be easier with scaffolding feature. Domain objects with relationships can also be handled by following this tutorial.

I also came across another tutorial that I thought would allow Grails to connect to existing EJBs in an existing container. You would actually need to copy the POJO implementations into the project in order to make it work.

Overall, I really like its features ease of use and I reckon it has a great potential to penetrate the enterprise market in the future. It is based on well known and enterprise-ready frameworks: Spring, Hibernate, and Groovy. Well done guys!

Tuesday, 5 February 2008

java.lang.OutOfMemoryError: PermGen space

Recently we've been getting this OutOfMemory error on our development system at work. We've been jumping up and down trying to figure out what is wrong, but we could not, until we came across this article explaining how JVM allocates memory space.
It turns out that the default Permanent Generation memory is 64K, which is definitely not enough! We then increased the size by adding -XX:PermSize="newSize"m and everything went back to normal.

Multiple JBoss Instances

There are 2 ways to achieve this:

  • Use different IP addresses on the machine
  • Use different ports on the machine

The first method is the one recommended by JBoss because it reduces complications in tracking down problems in the future.

Links:

Friday, 25 January 2008

Import delicious bookmarks into Google

I have been searching for ways to import delicious bookmarks into Google. There are some scripts out there that you can use to achieve this, but it requires you to give your google password.

I don't know about you, but I'm not too comfortable running a script with my password in it, so here is what I did:
  • Export your delicious bookmarks into an html file (go to settings, export)
  • Import this into your IE- Install Google toolbar
  • Import IE favourites using the toolbar

There is actually one downside: The delicious tags are actually in the html bookmark file, but when importing it to IE, they are lost, hence my bookmarks in Google don't have tags/labels.

Share |