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());
}
}

Monday, September 24, 2007

MISC (Shell scripts, Java)

Shell script to remove ^M charactors from a file ftped through pc.

sed 's/^M//;s/^Z//' $1 > $1.new

To type ^M, manually enter with (ctrl+v, ctrl+m). Same for ^Z.

Customize SQLExeption's e.getMessage()

catch(SQLException e)
{
if(e.getErrorCode()==1 && e.getMessage().contains("unique constraint")) {
SQLException se=new SQLException("YOUR CUSTOMIZED MESSAGE");
se.setStackTrace(e.getStackTrace());
throw se;
}
else throw e;
}



Connection Pooling configuration and sample usage using JNDI-DBCP

context.xml :

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/appname" docBase="appname">
<Resource name="jdbc/myoracle" auth="Container" type="javax.sql.DataSource" username="user" password="pass" driverClassName="oracle.jdbc.OracleDriver" url="jdbc:oracle:thin:@ipaddr:1521:sid" maxActive="8" maxIdle="4" />
</Context>


web.xml :

<resource-ref>
<description>Oracle Datasource example</description>
<res-ref-name>jdbc/myoracle</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>

Code sample :

Context initContext = new InitialContext();
Context envContext = (Context)initContext.lookup("java:/comp/env");
DataSource ds = (DataSource)envContext.lookup("jdbc/myoracle");
Connection conn = ds.getConnection();

Also, some useful parameters you can use to avoid the resource leaks due to connection pooling
removeAbandoned="true"
removeAbandonedTimeout="600"
logAbandoned="true"
The above can be configured in context.xml along with maxActive and maxIdle parameters.

Refer to following links for detail explanations:
http://commons.apache.org/dbcp/
http://tomcat.apache.org/tomcat-4.1-doc/jndi-datasource-examples-howto.html
http://commons.apache.org/dbcp/configuration.html

Tuesday, September 4, 2007

Web Application Development

Creating a simple web application using maven, eclipse and apache-tomcat

Pre-requisites:

1. Download and install maven 2
2. Download and install eclipse
3. Install maven 2 eclipse plugin from http://m2eclipse.codehaus.org/ update site from eclipse. Also, eclipse needs to know where maven repository is, which can be set using following command:
mvn -Declipse.workspace= eclipse:add-maven-repo 

3. Download and install apache tomcat 5.5.23 (make sure you have jdk 1.5 or higher installed before installing tomcat)

Steps :
1. Now, go to eclipse-workspace directory and create a web application maven project using following command.

mvn archetype:create -DgroupId=org.test.webapp -DartifactId=HelloWorldWebApp -Dpackagename=org.test.webapp -DarchetypeArtifactId=maven-archetype-webapp

2. Go to HelloWorldWebApp directory
-open pom.xml add any necessary dependencies. for e.g
<dependency>
<groupid>jdbc</groupid>
<artifactid>oracle</artifactid>
<version>1.4</version>
</dependency>

- run following commands from command line to create an eclipse project :
mvn install
mvn eclipse:eclipse

3. Start a eclipse project with HelloWorldWebApp and now, you are ready to go.
You may add following in your .classpath file
<classpathentry kind="src" path="src/main/java">

4. Create a new class name it HelloWorldServlet:

Write your code :

package org.test.webapp;

import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;


public class HelloWorldServlet extends HttpServlet{

public void doPost(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException
{

res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.write("Hello World:doPost");
out.flush();
out.close();
return;
}

public void doGet(HttpServletRequest req, HttpServletResponse res)throws IOException, ServletException
{

res.setContentType("text/html");
PrintWriter out = res.getWriter();
out.write("Hello World:doGet");
out.flush();
out.close();
return;
}
}
5.Modify wrc\main\webapp\WEB-INF\web.xml
For e.g :

<web-app>
<display-name>Hello World </display-name>
<description>
Provides Portlet Application
</description>

<servlet>
<servlet-name>HelloWorld</servlet-name>
<servlet-class>org.test.webapp.HelloWorldServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>HelloWorld</servlet-name>
<url-pattern>/hello</url-pattern>
</servlet-mapping>

</web-app>


6. To deploy :
compile using maven :
mvn clean compile war:war

deploy on tomcat
start tomcat
open a browser point to localhost:8080/manager/html
deploy the war file
try in your browser url : http://localhost:8080/hello