How to load a properties file from a servlet

config.properties

I wanted to read a properties file from a servlet without using a hard-coded, absolute path. I tried to search on the web for a portable solution, but I couldn’t find anything.

Here is the trick: use ServletContext.getRealPath(String). For instance, a file called “config.properties” located in “WEB-INF”, can be loaded like this:

public void init(ServletConfig config) throws ServletException {
	String pathToFile = config.getServletContext().getRealPath("")
		+ "/WEB-INF/config.properties";
	Properties properties = new Properties();
	properties.load(new FileInputStream(pathToPropertiesFile));
}

Aspect-oriented programming with AspectJ

In one of the courses I took this session I was introduced to aspect-oriented programming. For those who are not familiar with it, an aspect can be used to implement a concern that is crosscutting among different components. (There are a few such concerns that are commonly affected by crosscutting, namely: authentication, persistence, logging and contract checking.) It is argued that with object-oriented programming, even after proper refactoring, it is not always possible to map a requirement to a single component. When a requirement is implemented by more than one component, scattering occurs. AOP allows you to localize the scattered requirement into an aspect.

AspectJ is an extension to the Java language that adds support to AOP. An aspect in AspectJ is composed of pointcuts and advices. A pointcut defines the condition that needs to be met in order for the logic in an advice to be executed. A pointcut could be, for instance, the execution of a method in a particular class.

How AspectJ can be useful

Let’s look at an example. Say we want to log when horses drink water and when cows eat grass. Assume we have a class Logger with a static method log(). Here’s what the implementation could look like:

public class Horse {
	private int consumedWaterInLitres;

	public void drink() {
		consumedWaterInLitres++;
		Logger.log("A horse is drinking water.");
	}
}

public class Cow {
	private int consumedGrassInGrams;

	public void eat() {
		consumedGrassInGrams++;
		Logger.log("A cow is eating grass.");
	}
}

The argument is that the concern of logging is now crosscut among the Horse and Cow components. In addition, it can be said that Horse.drink() and Cow.eat() are responsible for more core logic (eating and drinking) than they should have been. Let’s try to fix this problem with an aspect:

public aspect Logging {
	pointcut logHorseDrinking() : call(public void Horse.drink());
	pointcut logCowEating() : call(public void Cow.eat());

	void after() : logHorseDrinking() {
		Logger.log("A horse is drinking water.");
	}

	void after() : logCowEating() {
		Logger.log("A cow is eating grass.");
	}
}

Here we defined two pointcuts that capture calls to Horse.drink() and to Cow.eat(). We’ve attached these pointcuts to two advices that will run after these methods are executed. With the Logging aspect in place, we can now remove all calls to Logger.log() from Horse and Cow. Isn’t that great?

How AspectJ can be dangerous

Dog before DogAspect

Dog before DogAspect

Aspects can also add state, behaviour and inheritance to a component. Privileged aspects have access to all features in a system—including private ones. Does that raise a red flag? Let’s look at the class Dog below.

public class Dog {
}

It has no features—no attributes nor methods—and doesn’t extend from any class, right? Wrong:

public aspect DogAspect {
	declare parents: Dog extends Animal;
	private String Dog.ownersName = "Bobert";

	public String Dog.getOwnwersName() {
		return ownersName;
	}
}
Dog after DogAspect

Dog after DogAspect

The aspect above has completely changed the class Dog. It has made it an Animal, it has added an attribute ownersName and a getter for it. The worst part is that Dog is completely oblivious to the aspect—it will never know about it. In fact, unless you as a developer look at all aspects on the system, you will never know about it either.

That is not completely true because some IDEs will provide a visual clue as to when a class is affected by an aspect. The AspectJ Developement Tools add-on for Eclipse (a great IDE by the way) is supposed to show a marker on the editor margin whenever a component is being advised by an aspect. I have the latest version installed (ADJT 1.6.4) but for some reason the marker is not showing up, unfortunately.

There are also other issues one might encounter when using AspectJ. It is not an easy task to document the impact aspects have on a system—UML has no support for aspects at this moment, and how are you going to show that on a sequence diagram? Also, the debugging and tracing of execution of a class that is being advised by an aspect can get pretty tricky.

In conclusion

I believe that the application of AOP could indeed improve the quality of a system through the localization of crosscutting concerns. However, its Java implementation—AspectJ—provides a level of control that is too risky to be used in industrial medium- to large-scale projects. Its supporting technologies and documenting tools have not yet reached the desired maturity level.

Mediawiki Database Schema

Since last summer I’ve been working with three other Software Engineering undergraduates on a web enterprise application that will eventually replace a legacy ERP system. We used patterns from Martin Fowler’s Patterns of Enterprise Application Architecture (a great book, by the way), and the well-known three-layered architecture.

One day we had a discussion related to the persistence of Domain Models and whether we should enforce foreign-key constraints at the database level. My first reaction was that the very use of a relational database implied the enforcement of such constraints, but some of my colleagues argued that the database should be seen as nothing but a persistence mechanism and therefore we should avoid placing any business logic in it. We ended up by not using foreign-key constraints.

Would you have done otherwise? I would like to hear what other software engineers/developers have to say about this.

Mighty Putty

Hey guys, sorry for the lack of updates. My last semester has been a little bit hectic, but in three months I’ll be a (Junior) Software Engineer! :)

Here’s a little video I just sumbled upon on reddit. It’s pure gold.

Obama’s acceptance speech

Thanks to my friend Gabx for sending me this great artwork by pluckylump from deviantArt.

Barack Obama 2008

I support Barack Obama. That is all.
Edit: Obama is the new elect-president! Congratulations!

Google Chrome, a new web browser

Google confirmed tomorrow’s launch of Google Chrome beta, a new open source web browser that borrows the rendering engine from Apple’s WebKit and components from Mozilla Firefox.

An important design aspect behind Google Chrome is that each tab will be assigned an entire process instead of a thread within a process. This means that if a particular website causes the page to hang, only its tab will have to be closed. In addition, a task manager will allow the user to see which page, plug-in or web application is consuming system resources, a feature available in all modern OSs.

Google has published a comic that explains in 38 pages their web browser project.

How will this affect the battle for market share between existing web browsers? Will Google Chrome be adopted by Firefox or IE users?

Google Chrome Comic page 38 A screenshot Google Chrome

Update 1: added a screenshot (found at TechCrunch).
Update 2: The Google Chrome webpage is up.

Goodbye PensCMS, hello Wordpress!

After realizing that I would never match the power of hundreds of developers behind Wordpress’ success, I decided to ditch my own custom, ad hoc content management system. PensCMS had been around for eight years, and I had just successfully solved the spam problem with reCAPTCHA (I know, I should have thought about that before!). The other thing that really bothered me with my own blogging software is that in order to add images to a post, I had to manually resize, upload via FTP and paste the code for them, which was a painful process to say the least.

I prefer to always include at least an image with my posts, so this was a big issue for me.  As I thought about a solution, I had a sudden spark of humbleness: maybe it’s OK to use other people’s work instead of doing it all myself from the ground up.

Wordpress

Wordpress

After some research, I narrowed down to two options: Wordpress and Blogger. The reason why I chose the former is that I wanted to transfer all my posts and comments from my old blog. The easiest way of doing so (although a bit long and tedious) was to manually add them to the database. The other option was to convert all posts and comments to XML—which I did—but I was unable to import into Blogger. Besides, there is no way of creating the about and thoughts pages on the Google-maintained blogging system.

I spent the whole day yesterday moving posts and comments, customizing the Simpla theme and installing plug-ins. I left behind some posts that were either too old or too silly—I did keep the ones that were chronologically interesting such as the post on how Firebird (now “Firefox”) was good alternative to IE.

I am happy with the results and I will try to write more often now that I don’t have to open Paint.NET and FileZilla in order to post an article!

Applying the Chinese Remainder Theorem

In public-key Cryptography, especially with the RSA algorithm, the Chinese Remainder Theorem is often used. Say you have a system of simultaneous congruences as follows

x a1 mod m1
x a3 mod m2


x ak mod mk ,

where m1, m2, …, mk are coprime, i.e. gcd(m1, m2, …, mk) = 1. How can we solve for x? The solution is quite straight forward, but could involve a fair amount of calculations. I find that breaking down the method into smaller steps makes it easier to find and fix mistakes. By the Chinese Remainder Theorem, the solution to that system of equations is

x = (a1M1y1 + a2M2y2 + … + akMkyk) mod M ,

where Mi is the product of all m’s except for mi

,

yi is the multiplicative inverse of Mi modulo mi

yi Mi-1 mod mi ,

and M = m1 * m2 * … * mk .

Let us try a numeric example. Here is a system of simultaneous congruences:

x 12 mod 25
x 9 mod 26
x 23 mod 27

We start by calculating M1 and y1:

M1 = m2 * m3 = 26 * 27 = 702

y1 = M1-1 mod m1 = 702-1 mod 25 .

We apply the Extended Euclidean Algorithm to find the multiplicative inverse of 702 relative to 25:

702 = 28 * 25 + 2 → 2 = 702 – 28 * 25
25   = 12 * 2 + 1 → 1 = 25 – 12 * 2
= 25 – 12 * (702 – 28 * 25)
= 337 * 25 – 12 * 702

Then y1 = 702-1 mod 25 -12 13.

The same calculations can be carried on to find M2 = 675, y2 = 25, M3 = 650 and y3 = 14. Now it is just a matter of plugging in the values into the equation:

x = (a1M1y1 + a2M2y2 + a3M3y3) mod M
= (12*702*13 + 9*675*25 + 23*650*14) mod 17550 470687 14387

To verify our answer we can plug that number back into the system:

470687 mod 25 12
470687 mod 26 9
470687 mod 27 23

Support peaceful protest by monks in Burma

Related links: