This blog is supposed to keep track of all the small fixes, good tutorials and cheat-sheets I encounter in my binary life so I won't have to seek them on the web again.
Tuesday, November 30, 2010
A little insight on Java's 'type erasure' terminology
Monday, November 15, 2010
[Spring Framework] Constructor vs. Setter injection
"There are certain things that most people can agree upon: the fact that the sky
is blue, that Michael Jordan is the greatest player to touch a basketball, and that
Star Trek V should have never happened. And then there are those things that
should never be discussed in polite company, such as politics, religion, and the
eternal “tastes great/less filling” debates.
Likewise, the choice between constructor injection and setter injection stirs up
as much discourse as the arguments surrounding creamy versus crunchy peanut
butter. Both have their merits and their weaknesses. Which should you choose?
Those on the constructor-injection side of the debate will tell you that:
• Constructor injection enforces a strong dependency contract. In short, a
bean cannot be instantiated without being given all of its dependencies. It is
perfectly valid and ready to use upon instantiation. Of course, this assumes
that the bean’s constructor has all of the bean’s dependencies in its param-
eter list.
• Because all of the bean’s dependencies are set through its constructor,
there’s no need for superfluous setter methods. This helps keep the lines of
code at a minimum.
• By only allowing properties to be set through the constructor, you are, effec-
tively, making those properties immutable, preventing accidental change in
the course of application flow.
However, the setter injection-minded will be quick to respond with:
• If a bean has several dependencies, the constructor’s parameter list can be
quite lengthy.
• If there are several ways to construct a valid object, it can be hard to come
up with unique constructors, since constructor signatures vary only by the
number and type of parameters.
• If a constructor takes two or more parameters of the same type, it may be
difficult to determine what each parameter’s purpose is.
• Constructor injection does not lend itself readily to inheritance. A bean’s con-
structor will have to pass parameters to super() in order to set private
properties in the parent object.
Fortunately, Spring doesn’t take sides in this debate and will let you choose the
injection model that suits you best. In fact, you can even mix-and-match construc-
tor and setter injection in the same application... or even in the same bean."
Saturday, October 9, 2010
Simple Apache Lucene tutorial courtesy of "Java Code Geeks"
Thursday, September 16, 2010
Change the GRUB Menu Timeout on Ubuntu
When your Ubuntu system boots, you will see the GRUB menu if you hit the Esc key, or if you’ve enabled the menu to show by default.
The only issue with this is that the default timeout is only 3 seconds.
You may want to increase this amount… or you may even want to decrease
it. Either one is simple.
Open up the /boot/grub/menu.lst file in your favorite text editor. I’m using gedit:
sudo gedit /boot/grub/menu.lst
Now find the section that looks like this:
## timeout sec
# Set a timeout, in SEC seconds, before automatically booting the default entry
# (normally the first entry defined).
timeout 3
The timeout value is in seconds. Save the file, and when you reboot
you will have that many seconds to choose the menu item you want.
show the GRUB menu by default on Ubuntu
When Ubuntu boots, you normally briefly see a screen that says “GRUB loading. please wait… Press Esc to enter the menu…”
If you are hacking around your system and would prefer to always see
the GRUB menu (to enter command-line options, for instance), there’s an
easy fix.
Open up the /boot/grub/menu.lst file in your favorite text editor. I’m using gedit:
sudo gedit /boot/grub/menu.lst
Now find the section that looks like this:
## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
hiddenmenu
Put a # before hiddenmenu to comment that line out:
## hiddenmenu
# Hides the menu by default (press ESC to see the menu)
#hiddenmenu
Save the file, and you should see the menu the next time you reboot.
SOURCE: www.howtogeek.com
Adding windows XP to grub menu after intalling this OS AFTER Ubuntu
As root:
# nano /boot/grub/menu.lst
Add the following lines in wherever you would like the entry to show up:
title MS Windows XP
root (hd0,0) [note below]
*
savedefault
makeactive
chainloader +1
*(hd0,0) means /dev/hda1
*(hd0,1) means /dev/hda2
Wednesday, July 7, 2010
SCDJWS 5, web service design patterns notes
Web Service Design Patterns
The
design patterns related to Web Service help to enhance
maintainability of the solution or to minimize QoS impact associated
with building applications using web service frameworks. Web Services
based interaction might be expensive because of
- operation
is expensive in term of server-side processing - communication
overhead (amount of data transfer/bandwidth) - encoding/decoding
may be expensive
Application
designers should look for alternatives in this situation.
Asynchronous Interaction Pattern
Goals
of this pattern are:
- decouple
input and output. - deliver
output from server to client. - Associate
output message with corresponding input message
This
can be achieved with various application level designs to achieve the
above goals which are Server-side push, Client-side pull. JMS-based
and JAX-WS based which are described below.
Server-side
push
Approach
1: Client supplies the address of a web service dedicated to
process specific response to the request, as part of request and the
server contacts the dedicated web service to reply to the query back
to the client.
Approach
2: Client supplies address of a generic web service that can be
invoked to supply the result of operation back to client, along with
unique token to identify this request, The server later invokes this
generic web service to deliver an answer to this client the server
uses the same token as part of response message to identify the
response to client. WS-Addressing defines a way to create these
tokens portably.
Client-side
pull
Client
issues a request along with a unique token to server, the server
accepts the request, allowing client to continue processing. server
process each request to obtain response and stores all responses
indexed by tokens supplied by client in each request in a data
structure accessible as a new Response web service. Each client
queries the new web service for answer to earlier requests using the
same token. Enough storage required on server side to store all
response, until the client retrieves it. For reliability the storage
might need to be persistence. Increases network overhead as client
may poll periodically for it's response.
JMS
based
Non-portable
web service solution, uses JMS as message transport instead of HTTP.
Both Client-side pull and Server-side push can be implemented using
JMS. In case of Client-side pull the client uses multiple requests
first being a JMS message and the subsequent ones being synchronous
and portable.
JAX-WS
based
JAX-WS
introduces Dispatch<T> and Provider<T> interfaces to
describe client and server side of the interaction. On client side it
introduced the ability to indicate whether the interaction is
synchronous or asynchronous, whether it's Client-side pull or
Server-side push or one way.
Dispatch<T>{ // client-side
T invoke(T
msg);
Response<T>
invokeAsync(T msg);
Future<?>
invokeAsync(T msg, AsyncHandler<T> h);
void
invikeOneWay(T msg);
}
interface
Provider<T>{ // server-side
T invoke(T msg,
Map<String, Object> context);
}
Example
MessagingAPIMessagerequest = new MessagingAPIMessage( "sayHello", "Tracy"
);
MessagingAPIMessage
response = MessagingAPIMessage) port.invoke( request );
System.out.println("Response:
" + response.getResult());
AsyncHandler<Object>
responseHandler = new AsyncHandler<Object>() {
public void
handleResponse(Response<Object> resp){
try {
MessagingAPIMessage
result = (MessagingAPIMessage) response.get();
System.out.println(
"Response: " + result.getResult() );
} catch(
Exception e ) {
}
}
};
port.invokeAsync(
request, responseHandler );
Advantages:
More responsive application, JAX-WS provides transparent
implementation
Disadvantages: Other
than JAX-WS requires more complex designs
JMS Bridge
The
Characteristics of JMS Bridge pattern are as follow:
- Keep
different subsystems using their own JMS implementation - Introduce
a client which can relay messages from one JMS implementation to
next - the
JMS clients should be implemented as Web Services
Advantages:
No need to develop vendor specific to bridge two underlying
middle-ware vendor. It's vendor and JMS independent.
Disadvantage:
Overhead XML encoding/transmission and decoding
Web Service Cache
Cache
can be introduced at two places which will be transparent to client
(as Endpoint Handlers). The overhead is reduced by short-circuiting
requests that do not need to be executed.
Advantages:
Reduce communication and processing overhead
Disadvantage:
Increased memory
footprint, application must realize when to invalidate or refresh
cache.
Web Service Broker
Can
be used implement some services as Web Service and still address the
concerns that web services don't address like transaction
propagation. Web Service broker is introduced as a middle-man between
the client and the remote service in which the client is interested.
Can be implemented as a state-full session bean.
Advantage:
Simpler client design
Disadvantage:
Complex to implement (not guaranteed)
Web Service Logger
A
common approach to introduce logging into the design of an
application involves the application of Decorator pattern as follows:
An additional object is
introduced as a wrapper around the actual service provider.- The logging functionality is
captured in the wrapper.