Monday, August 19, 2013

ANT Deploy Tasks using Cargo

I wrote a post some time back on how to stop and start tomcat container using ANT.

Well, while trying to find something about Maven, I found this CARGO thing which can help you achieving the same, in fact better results. 

Interestingly, it has support to do similar task from Maven as well from JUnit as well.

Here is a link to  a sample example for Ant task

http://cargo.codehaus.org/Ant+support#Antsupport-examples

A similar example for doing it via Maven :

http://cargo.codehaus.org/Maven2+plugin

Friday, August 16, 2013

How to prevent JVM from getting terminated or shutdown, even if System.exit(0) is invoked?

Question


Normally, if System.exit(0) is executed, the JVM which is is running the code is stopped/terminated. How to prevent JVM from getting terminated or shutdown, even if System.exit(0) is called?

This was a question asked to one of my fellow developer in some interview. I did a bit of google and this is what I found after my small research on some of the websites.

So, The below code example will help you understand how to do it conceptually.

Another Question..


But, the another question I asked myself why would we ever need to alter the System.exit() sequence? What I could figure out is, some how if some of the existing code (which may be present by mistake in the code base) or some hacker tries to execute such code on your JVM, your JVM will be stopped and you application will be dead and will be a victim of DOS ( Denial of Service) attack. In web application context, this could be a very huge impact and can result in nightmare for production support team first and development team later.

And..the Answer...


Coming back to the example, the trick in below code example is, creating your own SecurityManager class and overriding checkExit() to throw an exception. Please note, when shutdown sequence is executed after System.exit() is executed, checkExit() method is called to check if the caller code is allowed to call System.exit() or not. So, this code example uses this fact to prevent JVM Shutdown sequence to execute properly and there by preventing JVM from getting terminated.

I am not sure though that this is the only way. If you know some other way to do the same, please do share it. :)

Demo Example

package com.test.util;

import java.security.Permission;

public class NoExitTest{

     
    private static class MySecurityManager extends SecurityManager 
     {
              
         public void checkExit(int status) 
         {
             System.out.println("check exit called..");
          super.checkExit(status);
             throw new SecurityException();
         }
    }   

 /**
  * @param args
  */
 public static void main(String[] args) {
    
  NoExitTestCase mngr = new NoExitTestCase();
  
    
  System.setSecurityManager(new MySecurityManager()); 
   // If you comment the code in above line you can see how exit works as it is expected to work normally
   
  try 
   {
    System.out.println("calling exit..");
    System.exit(0);
    
  } catch (SecurityException e) 
  {
    System.out.println("exit exception..exit did not execute properly");
    e.printStackTrace();
  
  }
    
  System.out.println("Exiting Normally...");

 }

}



Tuesday, August 13, 2013

How to display/print current time using Ant


At times, while juggling between lots of things a time, you may forget when the deployment happended or did you actually deployed since you did the last code change!

This small 4 liners can facilitate you with that feature. You can know the last deployed time by looking at the console/terminal.


<tstamp>
    <format property="IST_TIME" pattern="HH:mm:ss:sss zzz" locale="en,In"/>
 </tstamp>
<echo> Build Completed At: ${IST_TIME}</echo>


Add it the last target of your build script that is going to be executed, change the locale to your respective locale, to time in your timezone and you are good to go.

A similar example can be found in my previous post.

       

How to restart (stop/start) the tomcat using Ant

In case you are using tomcat on your local machine and using ant script to deploy your project war to tomcat webserver, this build script can come handy.

Please note, this may not work on your machine just by doing a copy paste. You may need to do a bit of change in the build.properties file to change the parameters there and also little bit of change in the build.xml to suit your exact requirement.

When I wrote this script, this build.xml was kept in the project home directory, which is normally the case for most of the web projects.

Our Goal:


  • Our goal here is to stop the tomcat if already running, then copy the war file to tomcat's webapps directory and after that start the tomcat again.
  • In addition, skip the tomcat stop, if it is not running already. Just copy the war file to tomcat's webapps directory and after that start the tomcat again.

Steps this script does:


  • The ant script, first start executing the target named, tomcat-start (which is meant to start the tomcat).
  • As you can see the depends attribute,  tomcat-start, depends on  deploy-local, so it executes the deploy-local
  • deploy-local in turn depends on tomcat-stop.
  • tomcat-stop depends on the check-port.
  • what check-port does is, it sets the property, "tomcat.running". Sets this parameter to true if it the tomcat is running on localhost, port 8080.
  • Please note that the port can differ depending on your tomcat configuration/installation. So, you might need to change this port to the one on which your tomcat runs.
  • Once this is done, the tomcat-stop, stops the tomcat, if "tomcat.running" sets to true.
  • deploy-local, copies the war file to tomcat's webapps directory.
  • Once the war is copied, tomcat-start starts the tomcat, and you app is ready to be tested on your local machine.

build.properties:


 project.name=MyProject  
 project.dir=C\://My_WorkSpace//MyProject  
 #Tomcat Local setting  
 tomcat.home=C\://Program Files (x86)//Apache Software Foundation//Tomcat 5.0  

 

build.xml



<?xml version="1.0" encoding="UTF-8"?>
<project name="${project.name}" default="tomcat-start" basedir=".">
 <!-- previous default task : tomcat-start -->
 <property file="build.properties" />
 <property environment="env" />


  
 <!--stopping tomcat  , if it is found running -->
 
 <target name="tomcat-stop" if="tomcat.running" depends="check-port" >
  <echo message="Tomcat is running...stopping it"/> 
     <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true" >
         <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
         <arg line="stop"/>
     </java>
 </target>
 

 <!-- Check whether Tomcat is running -->

   <target name="check-port" description="Check whether Tomcat is running">
     <echo message="Checking whether Tomcat is running"/>
     <condition property="tomcat.running">
       <socket server="localhost" port="8080"/> 
     </condition>
   </target>


 <!--    deploy-local: delete and copy ear --> 
 
 <target name="deploy-local" depends="tomcat-stop">
  
  <delete>
   <fileset dir="${tomcat.home}/webapps">
       <include name="${project.name}.war"/>
   </fileset>
  </delete>
  
  <delete dir="${tomcat.home}/webapps/${project.name}"/>
  
  <copy todir="${tomcat.home}/webapps">
   <fileset dir="${dist.dir}">
    <include name="**/${project.name}.war" />
   </fileset>
  </copy>
  
  <tstamp>
   <format property="TODAY_INDIA" pattern="HH:mm:ss:sss zzz" locale="en,In"/>
  </tstamp>
  <echo> Build Completed At: ${TODAY_INDIA}</echo>
  
      
 </target>
 
 <!-- start tomcat, it depends on deploy-local -->
 
 <target name="tomcat-start" depends="deploy-local">
       <java jar="${tomcat.home}/bin/bootstrap.jar" fork="true">
           <jvmarg value="-Dcatalina.home=${tomcat.home}"/>
           <arg line="start"/>
       </java>
 </target>
  
 
</project>

Related Links:

 


Monday, August 12, 2013

replace vs replaceAll in Java (Difference between replace and replace All)



Sometimes we do some silly mistake unintentionally.

Assuming replace() will replace first instance of String found in the entire String, and replaceAll() will replace all the instances of the Strings, is one of them.

When I realized this mistake of mine few years back, I curiously wanted to know what my fellow developers think about it.Interestingly, most of them were living with the same misconception.In fact they are really good Java programmers.
 
Hence, don't go by the name, Java has some other meaning tagged to it.

Both replace() and replaceAll() replaces all the occurrence found. However, there is difference in the type of arguments they accept.

replace() works on CharSequence, where as replaceAll(), accepts regex, so you can do a regular expression based pattern matching. The later is more flexible, but might result in a bit of performance overhead of compiling the regex and then do a matching. For smaller String replacements, you might not need to think much.  


 Quoting Java Doc:


String replace(CharSequence target, CharSequence replacement)
          Replaces each substring of this string that matches the literal target sequence with the specified literal replacement sequence.
 String replaceAll(String regex, String replacement)
          Replaces each substring of this string that matches the given regular expression with the given replacement.
 String replaceFirst(String regex, String replacement)
          Replaces the first substring of this string that matches the given regular expression with the given replacement.
          



PS: CharSequence is one of the interface implemented by String class.

If you see the Java Doc for String class, String implements Serializable, CharSequence and Comparable<String>.
So, dont get confused by CharSequence, normally you can pass String as input to replace() function because of above reason.

And yes, for repacling only the first occurance of a char sequence, you can use replaceFirst(String regex, String replacement) method of String class.
           

Tuesday, August 6, 2013

How to Convert a File Content in a Java String? A Simple Example Using Guava API...

Recently in a project I got into this task of converting an entire file into string. After googling a bit, I got this "guava" API to help. There are other APIs available from Apache etc, but I found Guava easy to use and have been working quite nice so far.

Although writing your own would not be much difficult either, but then why to re-invent the wheel! :)

You can use this for few doing some other interesting stuff as well like Collection, cahcing etc. Details you can find at Guava's home page.

If you are using Maven you can update the dependencies in your project by using snippet given at
http://code.google.com/p/guava-libraries/wiki/UseGuavaInYourBuild

Else, you can download the JAR from its home page : http://code.google.com/p/guava-libraries/


So, once you have added the dependencies/jar you can play with it. Here is a demo code for converting  a file's content into a Java String:


package com.demo.fileops;

import java.io.File;
import java.io.FileNotFoundException;

import java.io.IOException;
import java.nio.charset.Charset;

import com.google.common.io.Files;

public class FiletoStringGuavaStyle{
 
 String fileContent = null;

 /** A function to convert File Content into String **/
 public static String loadFileIntoString() throws IOException{ 
  
  String path = "C:"+ File.separator + "Users" +  File.separator  + "myTextFile.txt";  // location -> C:/Users/myTextFile.txt
  
  this.fileContent = Files.toString(new File(path), Charset.defaultCharset()); // use of Guava here
  
  System.out.println("fileContent=" + this.fileContent);
   
  return this.fileContent; 
 }
 
 public static void main(String args[]){
  
  String content = FiletoStringGuavaStyle.loadFileIntoString() ; 
 }

} 




Friday, August 2, 2013

Unix Tip for cutting last field properly : Use tr to cut the last field


Issue:Cut command giving wrong results on cutting last field

While processing data from a delimited file in bash/shell script using cut command, you might run into peculiar issue. The last field does not cut properly.

The output of cutting the last field will give you some junk character and it might break your code to something quite unexpected.

If you don't know whats causing this, the situation can be very tricky and frustrating.

So, the secret is the file was edited in window mode and it adds carriage return character. So, now you the root cause, the solution is not very difficult either. 

#1. You can use unix to edit the command. This may not help when you are using CSV files with MS excel.

#2. Alternatively, Copy-paste or edit the file in EditPlus or similar text editor, and edit and save in unix mode.

#3. Use tr command to trim the '\r' character. (tr -d '\r'). You should anyway do it to be on the safer side even if you are doing one of the above step. Just in case, some of your friend wanna use your script.

Here is a demo script, showing the example how to use it in a bash script:

#! /bin/bash
#Purpose: Demo Script

 
 echo "Started processing the input file: $1"
 
 INPUT_FILE_NAME=$1
 cat /dev/null > $2

 count=0

 while read LINE
 do
    let count++
  
    cust_id=`echo $LINE | cut -d"," -f1`
    itemName =`echo $LINE | cut -d"," -f2`     
    paymentStatus =`echo $LINE | cut -d"," -f3`
    invoice=`echo $LINE |tr -d '\r'| cut -d"," -f4` 
  
   echo "Record:'$count': cust_id='$cust_id':itemName='$itemName':paymentStatus='$paymentStatus':invoice='$invoice'" 
     
  
 done < $INPUT_FILE_NAME
 
 echo "Finished processing the input file: $1"

fi


Prototype

Prototype is another creation pattern. Intent:  - Intent is to create objects by cloning existing instance  - Specify the kinds of obj...