Tuesday, September 14, 2010

Using Hibernate, Spring, Maven, oracle all together

This tutorial will give an overview how can you wire up spring and hibernate together. The spring framework comes with ability to inject dependencies through the spring configuration file, we can leverage that to create the hibernate SessionFactory. Some code samples are given below. Also, we'll use the java persistence api so that we don't need to specify the hibernate mapping files.

The User class :


Entity
@Table(name="My_USER")
public class User {

private Long id;
private String name;
private String password;


@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator = "user_id_seq")
@SequenceGenerator(name="user_id_seq", sequenceName = "MY_USER_SEQ")
@Column(name="USER_ID")
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}

@Column(name="USER_NAME")
public String getName() {
return name;
}
}
Replace the GeneratedValue annotation with strategy=GenerationType.AUTO if you are using any other database and no need to have sequencegenerator.

The DAO interface and implementation :




public interface UserDAO {

public void saveUser(User user) ;
public List<User> listUser() ;
}

public class UserDAOImpl implements UserDAO {

private HibernateTemplate hibernateTemplate;

public void setSessionFactory(SessionFactory sessionFactory) {
this.hibernateTemplate = new HibernateTemplate(sessionFactory);
}

public void saveUser(User user) {
hibernateTemplate.saveOrUpdate(user);
}

@SuppressWarnings("unchecked")
public List<User> listUser() {
return hibernateTemplate.find("from User");
}

}
The main application class:




public class App
{
public static void main( String[] args )
{


BeanFactory factory = new XmlBeanFactory(
new ClassPathResource("application-context.xml"));

UserDAO dao = factory.getBean("myUserDAO");

User user=new User();
user.setName("ABc");
user.setPassword("password");


dao.saveUser(user);
....
Spring configuration file : application-context.xml




<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"
"http://www.springframework.org/dtd/spring-beans.dtd">

<bean id="myDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"/>
<property name="url" value="jdbc:oracle:thin:user/password@localhost:1521:XE"/>
</bean>

<bean id="mySessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="myDataSource" />
<property name="annotatedClasses">
<list>
<value>ca.co.fusionapp.domain.User</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect"> org.hibernate.dialect.OracleDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
</props>
</property>
</bean>

<bean id="myUserDAO" class="ca.co.fusionapp.dao.UserDAOImpl">
<property name="sessionFactory" ref="mySessionFactory"/>
</bean>
</beans>
The above configuration uses setter dependency injection (i.e, the UserDAO has a setSessionFactory method, which sets up the hibernate session factory).

Download the entire code from here, which contains the pom.xml and run the above example using following command : mvn clean compile exec:java -e

I've oracle express installed and set up a username/password which needs to be updated in application-context.xml file.

Tuesday, August 31, 2010

Introduction to JSF

Java Server Faces is View in MVC (Model, View, Controller).

Get started with JSF

1. Download jsf latest jar files (https://javaserverfaces.dev.java.net/servlets/ProjectDocumentList?folderID=10411)
2. Set up the
3. Set up your project by modifying web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

4. Write the jsp files, java source code, faces-config.xml and deploy on a webserver
For e.g converter.jsp
<f:view>

<h:form>
<h:panelGrid border="1" columns="2">
<f:facet name="header">
<h:outputText value="Temperature Conversion"></h:outputText>
</f:facet>

<f:facet name="footer">
<h:commandButton value="Convert" action="#{conversion.convert}"></h:commandButton>


</f:facet>

<h:outputText value="Celcius"></h:outputText>
<h:inputText value="#{conversion.celcius}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

<h:outputText value="Fahrenheit "></h:outputText>
<h:inputText value="#{conversion.fahrenheit}"><f:convertNumber type="number" maxFractionDigits="2"/></h:inputText>

</h:panelGrid>
</h:form>

</f:view>

the conversion data bean class:

package proj;

public class Conversion {
..

public Float getCelcius()
{
return celcius;
}

public void setCelcius(Float c)
{
System.out.println("Celcius="+c);
celcius=c;
}
public Float getFahrenheit()
{
return fahrenheit;
}

public void setFahrenheit(Float f)
{
System.out.println("Fahrenheit="+f);
fahrenheit=f;
}

public String convert()
{
//conversion logic
return "convert";
}

..
}
faces-config.xml
<faces-config
    xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd"
version="1.2">
<managed-bean>
<managed-bean-name>
conversion</managed-bean-name>
<managed-bean-class>
proj.Conversion</managed-bean-class>
<managed-bean-scope>
session</managed-bean-scope>
</managed-bean>
<navigation-rule>
<from-view-id>/converter.jsp</from-view-id>
<navigation-case>
<from-outcome>convert</from-outcome>
<to-view-id>/result.jsp</to-view-id>
</navigation-case>
</navigation-rule>

</faces-config>

Download the full source code

Wednesday, May 12, 2010

UML Integration

There are several tools available which can generate class diagrams, but I found this one very useful, which can generate class diagrams when you build your java project using ant.

Download the UmlGraph from http://www.umlgraph.org/

and also download the Graphviz from http://www.graphviz.org/

Modify your build.xml and add following javadoc


<target name="javadocuml" depends="init, init-compile-classpath" description="generates javadoc and also UML Diagram">
<mkdir dir="${DIST_DIR}/report/javadoc">
   <javadoc sourcepath="${SRC_DIR}" packagenames="test.*" destdir="${DIST_DIR}/report/javadoc" classpathref="compile.classpath" private="true">
     <doclet name="org.umlgraph.doclet.UmlGraphDoc" path="${LIB_DIR}/UMLGraph-5.2.jar">
        <param name="-inferrel"/>
           <param name="-inferdep"/>
           <param name="-hide" value="java.*"/>
          <param name="-collpackages" value="java.util.*"/>
           <param name="-qualify"/>
           <param name="-postfixpackage"/>
           <param name="-nodefontsize" value="9"/>
           <param name="-nodefontpackagesize" value="7"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5.0/docs/guide/javadoc/doclet/spec"/>
           <param name="-link" value="http://java.sun.com/j2se/1.5/docs/api"/>
       </doclet>
   </javadoc>
<apply executable="dot" dest="${DIST_DIR}/report" parallel="false">
    <arg value="-Tpng">
  <arg value="-o">
   <targetfile>
   <srcfile>
   <fileset dir="${DIST_DIR}/report" includes="*.dot">
   <mapper type="glob" from="*.dot" to="*.png">
   </mapper></fileset>
   </srcfile>
   </targetfile>
  </arg>
 </arg>
</apply>
</mkdir>
</target>


Run your build.xml with javadocuml ant-task and look for report dir. You can see some class diagrams in your javadoc. Refer to the umlgraph website for more information about things you can do with the class diagrams.


Maven configuration




<dependency>
   <groupId>gr.spinellis</groupId>
   <artifactId>UmlGraph</artifactId>
   <version>5.2</version>
</dependency>   


<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-javadoc-plugin</artifactId>
  <version>2.7</version>
  <configuration>
  <doclet>org.umlgraph.doclet.UmlGraphDoc</doclet>

  <!-- <docletPath>/path/to/UmlGraph.jar</docletPath> -->
  <docletArtifact>
      <groupId>org.umlgraph</groupId>
      <artifactId>doclet</artifactId>
      <version>5.1</version>
  </docletArtifact>
  <additionalparam>-inferrel -inferdep -quiet -hide java.*
 -collpackages java.util.* -qualify
 -postfixpackage -nodefontsize 9
 -nodefontpackagesize 7 -outputencoding utf8
  </additionalparam>
  <useStandardDocletOptions>true</useStandardDocletOptions>
  </configuration>
</plugin>

Tuesday, April 27, 2010

Oracle Tips and tricks

SELECT query has limitations when you have more then 1000 fields to compare in the list.
One alternative is to use SQL Loader as follows :
1. Create a file called /tmp/test.dat :
100001
100002
100003
100004
100005
100006

2. create table temp
(number varchar2(10));

or truncate table temp

3. Create a file test.ctl in /tmp dir with following contents
LOAD DATA
INFILE test.dat
INTO TABLE temp
(number position(1:6) CHAR)

run command from the unix box where oracle client is installed from the /tmp dir:
sqlldr username/password@serviceid/sid control=test.ctl

Now, you can use the temp table in your query as follows :
For IN clause:
Select * from table_a a, temp t
where a.number = t.number;
for NOT IN clause:
Select * from table_a a, temp t
where a.number = t.number(+) and t.number is null;

Saturday, October 10, 2009

Introduction to Flex

What is Flex?

It is a powerful markup language, can be combined with ActionScript to design RIA

Important features of Flex :

Controls :

TextInput:
<mx:textinput id="searchTxt"></mx:textinput>

Combo Box:
<mx:ComboBox x="53" y="479" id="lstTheme" selectedIndex="1" editable="false" enabled="true">
<mx:ArrayCollection>
<mx:Object label="Toys"/>
<mx:Object label="SunFlower"/>
<mx:Object label="Alphabet"/>
</mx:ArrayCollection>
</mx:ComboBox>

TileList:
<mx:TileList width="200" height="491"
dataProvider="{imageFeed}"
itemRenderer="FlickrThumbnail" x="522" y="10" itemClick="saveItem(event)">
</mx:TileList>
It displays data as a small tiles. dataProvider serves as a input. It can read data from a ArrayCollection.

Tree:
<mx:Tree id="tree" dataProvider="{xml}"
labelFunction="tree_labelFunc"
showRoot="false"
width="250"
height="100%"
itemClick="tree_itemClick(event);">
</mx:Tree>

The above code displays tree, reads the data from xml and relies on tree_labelFunc and tree_itemClick functions for labeling the tree nodes and take action when a user clicks on a tree node respectively.

Code for example 1 (ImageViewer)

Code for example 2 (TreeDemo) (stuff.xml)

Screen-shot 1 or Live Demo

Screen-shot 2 or Live Demo

Thursday, November 6, 2008

Technical Interview Questions: Java & C++

Which sorting algorithm is fastest?
Quicksort, Merge-sort

How much time it will take to find largest number in a array
O(n)

What will happen to the lock object when the thread is in sleep state.
the thread will hold the lock and it will not do anything until it explicitly releases the lock by calling notify or exiting from the synchronized block.

How to make a Java program faster?
one possible answer is use the java's concurrent apis

In a given connection object in a client-server application, there are 2 client session open simultaneously, but the 2nd client is not able to connect, getting connection failure message. Assume that singleton pattern is used here. What might be the problem?
The problem can be the singleton pattern will only work per JVM, assuming the connection object is singleton, the 2 clients might be running in two separate JVMs, which might be causing 2nd client unable to connect with connection failure message.

Write in-order or post order traversal program of a binary tree.
Quick solution is to implement it through stack.
For e.g.,
struct {
struct node* left;
struct node* right;
int value;
}node;

struct node* root;
//initialize with some elements;
//initialize a stack

void traverse(struct node* anode) {

struct node* next;
while ((next=stack.pop())!=null) {
if(next!=null)
{
stack.push(anode);
traverse(next->left);
printf("%d,",anode->value);
traverse(next->right);
}
}

printf("%d,",anode->value);

}


Traversing without recursion, can be done using stack

Sample code:
      public void visit(Node node)
{
 if(!node.visit)
 {
  sb.append(node.val + " ");
  node.visit=true;
  stack.pop();
 }
}

public String traverse(Node node)
{
 stack.push(node);
 while((node=(Node) stack.top())!=null)
 {
  if(node.left == null && node.visit==false)
  {
   visit(node);
  
  }
  else if(!node.left.visit)
  {
   stack.push(node.left);
   continue;
  }
  visit(node);
  if(node.right !=null)
  {
   stack.push(node.right);
  }
 }
 return sb.toString();
}




What are marker interface in Java?
Null interfaces, they do not have any method declarations, used for naming a set of classes. Examples are Serializable, Clonable

What is difference between hashmap and hashtable?

Describe singleton design pattern.

Monday, October 1, 2007

Threading II

Deadlock Example


The following class is example of a java program which leads to a deadlock. Basically a person a is bowing to his friend b. and b in turn bows back to friend a. The problem is Person a and Person b both have obtained lock on their objects. When person b tries to bowback to a and at the same time, a tries to bowback to person b. In this case, both will wait endlessly to obtain a lock to bow to each other. This situation is refered as deadlock.


class Person extends Thread {

protected String myName;
Person friend;
public Person(String name)
{
super(name);
myName=name;
//do nothing
}

public synchronized void bow()
{
System.out.println(myName+" is bowing to "+friend.toStr());
friend.bowBack();
}

public synchronized void bowBack()
{
System.out.println(myName+" is bowing back to " +friend.toStr());
}

public void setFriend(Person p)
{
this.friend=p;
}
public String toStr()
{
return myName;
}
public void run() {
bow();
}
}
public class Deadlock {

public static void main(String[] args) {
Person a=new Person("A");
Person b=new Person("B");
a.setFriend(b);
b.setFriend(a);
a.start();
b.start();

}
}




There are various techniques by which you can synchronize sequence of events.

In the above example, instead of synchronizing the entire method, just synchronize a block, so that the deadlock doesn't happen.

E.g,

public void bow()
{
Synchronized(this) {
System.out.println(myName+" is bowing to "+friend.toStr());
}
friend.bowBack();
}

public synchronized void bowBack()
{
Synchronized(this) {
System.out.println(myName+" is bowing back to " +friend.toStr());
}
}