<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1180241783606995786</id><updated>2011-11-27T17:03:21.209-08:00</updated><title type='text'>Technology... Innovation... Automation</title><subtitle type='html'>I love Automation!!!!
AUTOMATION: a buzz word which is always used. What automation requires is identifying what can be automated and applying innovative ways to implement it...</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://hbtechs.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://hbtechs.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Husain Basrawala</name><uri>http://www.blogger.com/profile/00234867743754484033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_dvffPGRY-A4/SNfF9cZswfI/AAAAAAAACo0/dwXG9C9f-Io/S220/ATYAAAAIlU4CGnoraelGFKbonfEigr1SmhOEBpp7ibufVLrXvk0xf97b6hqrT7L7d0w5jiWyzo6w9bTOMZOx9d8JarSYAJtU9VCcN-KZj9qKMH3oDr24VA_HlNnvBA.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>3</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1180241783606995786.post-1278579942968462854</id><published>2009-03-06T18:41:00.000-08:00</published><updated>2010-05-13T04:32:24.927-07:00</updated><title type='text'>Struts 2</title><content type='html'>I am back after a long time with Struts 2 framework. Struts 1.x has been quite old and I never thought it was necessary to write about it as it always has enough tutorials in the net. But with the latest struts 2 framework, I have tried few things and came up with this blog.&lt;br /&gt;&lt;br /&gt;Without any hesitation, just download the &lt;a href="http://struts.apache.org/download.cgi#struts2012"&gt;struts2-blank project&lt;/a&gt; and there you have everything required to start with.&lt;br /&gt;&lt;br /&gt;Most of the information that is required for starting with struts 2 can be obtained from the &lt;a href="http://struts.apache.org/2.x/docs/home.html"&gt;official documentation of struts 2&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Before you start with some real development, there are some notable differences between Struts 1.x and Struts2&lt;br /&gt;If you have not use struts 1.x earlier, well and good for you because anyways the basic concepts on which struts 2 is built are quite different.&lt;br /&gt;&lt;br /&gt;First of all There are no more formbeans. But do not wonder where you'll capture your form data, it all resides in your Action class. You can define all the attributes of your forms in Action class itself and framework will take care of populating them to and fro.&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;Action Class:&lt;/span&gt;&lt;br /&gt;Now when I speak of Action classes, these are nothing but POJOs. The new framework does not need you to extend to class org.apache.struts.action.Action. But since this is a POJO, you cannot directly access the request or session object. Remember in old version these were provided by the framework through super Action class.&lt;br /&gt;&lt;br /&gt;But dont be frowned, you can still access everything, with a little efforts. Struts 2 heavily uses Dependency Injection. That is, it will provide you with the stuff if you need, you dont have to get them. And there are interceptors for this. In our case, if you need a request object, just implement org.apache.struts2.interceptor.RequestAware; and for session object, implement org.apache.struts2.interceptor.SessionAware.&lt;br /&gt;Implementing those two interfaces will let the framework know that you need this objects and the framework would inject the respective objects. So there you go, ready with an Action class.&lt;br /&gt;&lt;br /&gt;Let's see a simple action class for login:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;package mypkg;&lt;br /&gt;&lt;br /&gt;import java.util.Map;&lt;br /&gt;&lt;br /&gt;import org.apache.commons.logging.Log;&lt;br /&gt;import org.apache.commons.logging.LogFactory;&lt;br /&gt;import org.apache.struts2.interceptor.SessionAware;&lt;br /&gt;&lt;br /&gt;import com.myapp.delegate.BusinessDelegate;&lt;br /&gt;import com.myapp.vo.UserInfoVO;&lt;br /&gt;import com.myapp.web.UserInfo;&lt;br /&gt;&lt;br /&gt;/**&lt;br /&gt; * Sample Login Action Class in Struts 2.&lt;br /&gt; * &lt;br /&gt; * @author Husain Basrawala&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;public class LoginAction implements SessionAware {&lt;br /&gt;&lt;br /&gt; private static Log logger = LogFactory.getLog(LoginAction.class);&lt;br /&gt;&lt;br /&gt; // Form attributes&lt;br /&gt; private String username = null;&lt;br /&gt; private String password = null;&lt;br /&gt;&lt;br /&gt; public String getUsername() {&lt;br /&gt;  return username;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setUsername(String username) {&lt;br /&gt;  this.username = username;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String getPassword() {&lt;br /&gt;  return password;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public void setPassword(String password) {&lt;br /&gt;  this.password = password;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; // Map representing the Session object&lt;br /&gt;&lt;br /&gt; private Map session = null;&lt;br /&gt;&lt;br /&gt; public void setSession(Map session_) {&lt;br /&gt;  this.session = session_;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * Execute method called on action.&lt;br /&gt;  */&lt;br /&gt; public String execute() throws Exception {&lt;br /&gt;  session.put("PROCESS_ID", "ABC");&lt;br /&gt;&lt;br /&gt;  BusinessDelegate delegate = new BusinessDelegate();&lt;br /&gt;  UserInfoVO userInfoVO = delegate.getUserInfo(username);&lt;br /&gt;&lt;br /&gt;  UserInfo userInfo = new UserInfo();&lt;br /&gt;  userInfo.setCode(userInfoVO.getCode());&lt;br /&gt;  userInfo.setName(userInfoVO.getName());&lt;br /&gt;  userInfo.setLevel(userInfoVO.getLevel());&lt;br /&gt;  session.put("USER_INFO", userInfo);&lt;br /&gt;  return SUCCESS;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; /**&lt;br /&gt;  * &lt;br /&gt;  * Before calling each action method, framework looks for a validate method&lt;br /&gt;  * in the class.&lt;br /&gt;  * &lt;br /&gt;  * The validate mehod should follow a naming convention such as&lt;br /&gt;  * validateMethodName()&lt;br /&gt;  * &lt;br /&gt;  * or doValidateMethodName.&lt;br /&gt;  * &lt;br /&gt;  * The framework will call the validate method and if it does not add any&lt;br /&gt;  * &lt;br /&gt;  * error using addActionError then only the action method is called.&lt;br /&gt;  * &lt;br /&gt;  */&lt;br /&gt; public void validateExecute() throws BaseException {&lt;br /&gt;&lt;br /&gt;  if (FWUtilities.isBlank(username)) {&lt;br /&gt;   addFieldError("username", "username " + getText("error.required"));&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  if (FWUtilities.isBlank(password)) {&lt;br /&gt;   addFieldError("password", "password " + getText("error.required"));&lt;br /&gt;   return;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;  BusinessDelegate delegate = new BusinessDelegate();&lt;br /&gt;  if (!delegate.isUserAuthentic(username, password)) {&lt;br /&gt;   addActionError(getText("error.invalidlogin"));&lt;br /&gt;   logger.debug("Invalid user login tried");&lt;br /&gt;  }&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; public String load() throws Exception {&lt;br /&gt;  return SUCCESS;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1180241783606995786-1278579942968462854?l=hbtechs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hbtechs.blogspot.com/feeds/1278579942968462854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://hbtechs.blogspot.com/2009/03/using-struts-2.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/1278579942968462854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/1278579942968462854'/><link rel='alternate' type='text/html' href='http://hbtechs.blogspot.com/2009/03/using-struts-2.html' title='Struts 2'/><author><name>Husain Basrawala</name><uri>http://www.blogger.com/profile/00234867743754484033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_dvffPGRY-A4/SNfF9cZswfI/AAAAAAAACo0/dwXG9C9f-Io/S220/ATYAAAAIlU4CGnoraelGFKbonfEigr1SmhOEBpp7ibufVLrXvk0xf97b6hqrT7L7d0w5jiWyzo6w9bTOMZOx9d8JarSYAJtU9VCcN-KZj9qKMH3oDr24VA_HlNnvBA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1180241783606995786.post-7421124306460704787</id><published>2009-01-13T23:20:00.000-08:00</published><updated>2009-01-13T23:22:44.652-08:00</updated><title type='text'>Log4j for Developers</title><content type='html'>Log4j has proven to be very simple and useful tool for logging.&lt;br /&gt;&lt;br /&gt;Log4j is quite easy to integrate with your application. Follow these two simple steps and you are ready to use the power of logging.&lt;br /&gt;&lt;br /&gt;1. Include commons logging api in your classes.&lt;br /&gt;&lt;br /&gt;org.commons.logging.Log logger = org.commons.logging.LogFactory.getLog(ThisClass.class);&lt;br /&gt;&lt;br /&gt;Now you are ready to use the logging by using following methods...&lt;br /&gt;&lt;br /&gt;logger.debug("Logging statement");&lt;br /&gt;logger.info("Logging statement");&lt;br /&gt;logger.fatal("Logging statement");&lt;br /&gt;&lt;br /&gt;2. Add the following file to your classpath: log4j.properties&lt;br /&gt;log4j.logger.com.mypkg=DEBUG, LOG_NAME&lt;br /&gt;log4j.appender.LOG_NAME.File=C:\\log\\file.log&lt;br /&gt;log4j.appender.LOG_NAME=org.apache.log4j.DailyRollingFileAppender&lt;br /&gt;log4j.appender.LOG_NAME.layout=org.apache.log4j.PatternLayout&lt;br /&gt;log4j.appender.LOG_NAME.Append=true&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There are some more properties that you can specify. Refer Log4j documentation available on the net.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1180241783606995786-7421124306460704787?l=hbtechs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hbtechs.blogspot.com/feeds/7421124306460704787/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://hbtechs.blogspot.com/2009/01/log4j-for-developers.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/7421124306460704787'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/7421124306460704787'/><link rel='alternate' type='text/html' href='http://hbtechs.blogspot.com/2009/01/log4j-for-developers.html' title='Log4j for Developers'/><author><name>Husain Basrawala</name><uri>http://www.blogger.com/profile/00234867743754484033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_dvffPGRY-A4/SNfF9cZswfI/AAAAAAAACo0/dwXG9C9f-Io/S220/ATYAAAAIlU4CGnoraelGFKbonfEigr1SmhOEBpp7ibufVLrXvk0xf97b6hqrT7L7d0w5jiWyzo6w9bTOMZOx9d8JarSYAJtU9VCcN-KZj9qKMH3oDr24VA_HlNnvBA.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1180241783606995786.post-9129325579011563093</id><published>2007-06-25T06:25:00.000-07:00</published><updated>2007-07-04T22:10:22.095-07:00</updated><title type='text'></title><content type='html'>&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 102, 255);font-size:130%;" &gt;ANT as a automation tool&lt;/span&gt;&lt;p&gt;When it come to build automations, ANT is one of the most powerful tool that can be used. There might be other tools too, but ANT is most widely available and usable. If you are new to ANT then visit &lt;a href="http://ant.apache.org/"&gt;http://ant.apache.org&lt;/a&gt;. If you want to explore the power of ANT then visit &lt;a href="http://ant.apache.org/manual/index.html"&gt;http://ant.apache.org/manual/index.html&lt;/a&gt;.&lt;br /&gt;To write or use ANT first you will have to install it. To find out from where to download and how to isntall ANT please visit &lt;a href="http://ant.apache.org/manual/install.html"&gt;http://ant.apache.org/manual/install.html&lt;/a&gt;.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Here I will take an process as an example and we'll see how we can automate the process using ANT and make our life easier.&lt;br /&gt;&lt;/p&gt;Consider the following process:&lt;br /&gt;You have some bunch of programmers working on a project and you are using a central repository; CVS or VSS. At the end of the day when all the programmers are done with their devlopment/bug fixing task for the day a monotonous process is required to be followed. All the source code from the repository needs to be taken and sent to your team at other end (Onsite) through ftp. This process can be broken down in to following steps:&lt;br /&gt;1. Get the latest source code from the repository.&lt;br /&gt;2. Label the source code appropriately to indicate today's work.&lt;br /&gt;3. Filter the files that need to be send.&lt;br /&gt;4. Archive your source code to zip or gzip.&lt;br /&gt;5. Upload the zip file to ftp.&lt;br /&gt;6. And finally send a mail to all the stakeholders stating the upload path and a release note.&lt;br /&gt;&lt;br /&gt;Now if we perform this process manually, it will take considerable time and might also cause problems due to human errors.&lt;br /&gt;But if we automate this process, believe me it will not take more than 30 secs to release a project with around 500 source files. What we need to do is identify the atomic tasks to be performed and automate them.&lt;br /&gt;&lt;br /&gt;As you can see, the steps mentioned above are atomic tasks that needs to be performed. ANT provides a huge set of core as well as optional tasks [].&lt;br /&gt;I hope that you have basic knowledge about targets, tasks, taskdef etc.&lt;br /&gt;&lt;br /&gt;We will define each step or set of steps as a target. Though the complete script can be writting in one target, I prefer it former way for obvious reasons.&lt;br /&gt;&lt;br /&gt;The paramters specified in the code snippets are explained in the end.&lt;br /&gt;Considering the above process;&lt;br /&gt;&lt;br /&gt;1. Get the latest source code from the repository.&lt;br /&gt;If you are using CVS, ANT provides core task to perform CVS operations.&lt;br /&gt;This can be written in ANT as:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;  &lt;/span&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;cvspass cvsRoot="${cvs.root}" password="${cvs.pass}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvs command="login" cvsRoot="${cvs.root}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;          &amp;lt;cvs dest="${base.dir}" cvsRoot="${cvs.root}" command="update -A -dPC" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you are using VSS, ANT provides optional task for the same.&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;vssget serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" localpath="${base.dir}" login="${vss.username},${vss.pass}" recursive="true" /&amp;gt;&lt;/span&gt;&lt;br /&gt;The piece of code above will get the latest version of code from repository into the specified destination folder.&lt;br /&gt;&lt;br /&gt;2. Label the source code appropriately to indicate released work.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;echo message="Tag ${vss.path}/${app.name} with ${app.name}-${timestamp}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;      &amp;lt;cvs cvsRoot="${cvs.root}" command="tag ${app.name}-${timestamp}" package="${app.name}" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If you are using VSS, ANT provides optional task for the same.&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&amp;lt;echo message="Label ${vss.path}/${app.name} with ${app.name}-${timestamp}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;   &amp;lt;vsslabel serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" login="${vss.username},${vss.pass}" label="${app.name}-${timestamp}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The above two tasks can be specified in one target for modularity and hence the reaulting target will be:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- CVS  task Starts--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="cvs" description="get the latest source code from CVS" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvspass cvsRoot="${cvs.root}" password="${cvs.pass}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvs command="login" cvsRoot="${cvs.root}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvs dest="${base.dir}" cvsRoot="${cvs.root}" command="update -A -dPC" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;          &amp;lt;cvs cvsRoot="${cvs.root}" command="tag ${app.name}-${timestamp}" package="${app.name}" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- CVS task ends --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- VSS task starts --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="vss" description="get the latest source code from VSS" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;vssget serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" localpath="${base.dir}" login="${vss.username},${vss.pass}" recursive="true" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Label ${vss.path}/${app.name} with ${app.name}-${timestamp}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;vsslabel serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" login="${vss.username},${vss.pass}" label="${app.name}-${timestamp}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- VSS task ends --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Now moving to next steps:&lt;br /&gt;3. Filter the files that need to be send.&lt;br /&gt;4. Archive your source code to zip or gzip.&lt;br /&gt;These two steps include filtering out those files which need to be sent and bundle those files.&lt;br /&gt;The target to accomplish this task would look something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;target name="package" description="Package the source code and Contextroot" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;property name="target.filename" value="${app.name}-${timestamp}.zip"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;zip zipfile="${zip.dir}/${app.name}/${target.filename}" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;fileset dir="${base.dir}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="src/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="ContextRoot/jsp/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="ContextRoot/WEB-INF/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="src/META_INF/ejb-jar.xml"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;exclude name="ContextRoot/WEB-INF/classes/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;exclude name="ContextRoot/WEB-INF/lib/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;exclude name="ContextRoot/jsp/**/*.gif"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;exclude name="ContextRoot/jsp/image/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;exclude name="src/META_INF/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/zip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;We have used here ANT task to zip a set of files. The set of files can be specified&lt;br /&gt;Here you need to specify the parameters like the target path and name of the zip file, the source files to be zipped, etc.&lt;br /&gt;&lt;br /&gt;5. Upload the zip file to ftp server.&lt;br /&gt;ANT provides a task that allows you to upload files to ftp server. The ANT target for the same is:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;target name="upload" description="uploads to FTP"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Uploading file to ftp : ${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;ftp server="${ftp.url}" userid="${ftp.username}" password="${ftp.password}" binary="yes" remotedir="${ftp.remotedir}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;fileset dir="${zip.dir}/${app.name}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;/ftp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;echo message="Release uploaded successfully "/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see, the parameters that needs to be provided are connection details for ftp server, transfer mode, files upload path and source file.&lt;br /&gt;&lt;br /&gt;The next and final step:&lt;br /&gt;6. And finally send a mail to all the stakeholders stating the upload path and a release note.&lt;br /&gt;ANT provides a optional task for sending MIME mail. But this task highly depends on what contents you require in your mail.&lt;br /&gt;For this task, I have written a class that generates a release note for me which I attach to my mail. Though this highly depends on your requirement but here I have used a very important feature of ANT that is developing custom tasks.&lt;br /&gt;To know how to develop a custoom task, please visit ant.apache.org/manual/develop.html&lt;br /&gt;Here taskdef is used to declare a new Task to ANT and which class should be loaded to implement this task.&lt;br /&gt;The below code declares a new task which is named as releasenote and then this task is to create the release note.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;taskdef name="releasenote" classname="com.note.ReleaseNoteCreator"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;releasenote appName="${app.name}" noteName="${note.name}" releasedFile="ftp://ftp.zensar.com/${ftp.remotedir}/${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Once the release note is created, the following task will release a mail for you according to the paramters provided.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt; &amp;lt;mail from="${mail.from}" tolist="${mail.to}" cclist="${mail.cc}" files="${note.name}" user="${mail.user}" password="${mail.pass}" ssl="no" replyto="${mail.reply}" subject="${mail.subject}" mailhost="${mail.host}" mailport="${mail.port}" messagefile="${mail.message}"/&amp;gt; &amp;lt;!--message="${mail.message}"/--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;The complete target will look something like this:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;target name="mail" description="Send release mail" depends="init"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Generating Release Note"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;property name="note.name" value="${zip.dir}/${app.name}/ReleaseNote-${timestamp}.txt"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;mail from="${mail.from}" tolist="${mail.to}" cclist="${mail.cc}" files="${note.name}" user="${mail.user}" password="${mail.pass}" ssl="no" replyto="${mail.reply}" subject="${mail.subject}" mailhost="${mail.host}" mailport="${mail.port}" messagefile="${mail.message}"/&amp;gt; &amp;lt;!--message="${mail.message}"/--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;As you can see each target depends on a "init" target. This "init" target is used to perform some chores before starting the reelase process. Here it defines a timestamp variable which is used to generate distinct filesnames. The init target will look something like this&lt;br /&gt;Here the record task is used for ANT logging.&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;target name="init" description="Create password file and try Login"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;tstamp/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;     &amp;lt;property name="timestamp" value="${DSTAMP}-${TSTAMP}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;     &amp;lt;record name="${log.file}-${timestamp}.log" action="start" append="yes" loglevel="debug"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Update, Tag, Package, Upload, and release latest source code from ${rep.type} for ${app.name}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And finally you can either define a target which will call other targets or set the target execution sequence while executing ANT build file.&lt;br /&gt;&lt;br /&gt;My final ANT build file for this process comes out to be:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;?xml version="1.0" encoding="ISO-8859-1"?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;project name="RELEASE_BUILD" default="getsource" basedir="."&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;property file="${arg-app}-build.properties"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;property name="rep.type" value="${arg-rep}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;property name="base.dir" value="${ws.dir}/${app.name}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;     &amp;lt;taskdef name="releasenote" classname="com.note.CreateReleaseNote"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="init" description="Create password file and try Login"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;tstamp/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;         &amp;lt;property name="timestamp" value="${DSTAMP}-${TSTAMP}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;         &amp;lt;record name="${log.file}-${timestamp}.log" action="start" append="yes" loglevel="debug"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Update, Tag, Package, Upload, and release latest source code from ${rep.type} for ${app.name}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- CVS  Starts--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="cvs" description="get the latest source code from CVS" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvspass cvsRoot="${cvs.root}" password="${cvs.pass}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvs command="login" cvsRoot="${cvs.root}" passfile=".cvs-pass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;cvs dest="${base.dir}" cvsRoot="${cvs.root}" command="update -A -dPC" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;          &amp;lt;cvs cvsRoot="${cvs.root}" command="tag ${app.name}-${timestamp}" package="${app.name}" passfile=".cvspass"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- CVS ends --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- VSS starts --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="vss" description="get the latest source code from VSS" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;vssget serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" localpath="${base.dir}" login="${vss.username},${vss.pass}" recursive="true" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Label ${vss.path}/${app.name} with ${app.name}-${timestamp}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;vsslabel serverpath="${vss.server}" vsspath="${vss.path}/${app.name}" ssdir="${vss.ssdir}" login="${vss.username},${vss.pass}" label="${app.name}-${timestamp}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- VSS ends --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- Common Packaging, uploading and mail starts --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;     &amp;lt;taskdef name="releasenote" classname="com.note.CreateReleaseNote"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="package" description="Package the source code and Contextroot" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;         &amp;lt;property name="target.filename" value="${app.name}-${timestamp}.zip"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;zip zipfile="${zip.dir}/${app.name}/${target.filename}" &amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;fileset dir="${base.dir}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;include name="src/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;include name="ContextRoot/jsp/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;include name="ContextRoot/WEB-INF/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;include name="src/META_INF/ejb-jar.xml"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;exclude name="ContextRoot/WEB-INF/classes/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;exclude name="ContextRoot/WEB-INF/lib/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;exclude name="ContextRoot/jsp/**/*.gif"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;exclude name="ContextRoot/jsp/image/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;               &amp;lt;exclude name="src/META_INF/**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;/zip&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="upload" description="uploads to FTP"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Uploading file to ftp : ${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;ftp server="${ftp.url}" userid="${ftp.username}" password="${ftp.password}" binary="yes" remotedir="${ftp.remotedir}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;fileset dir="${zip.dir}/${app.name}"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;include name="${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;           &amp;lt;/fileset&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;/ftp&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message=" Release uploaded successfully "/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="mail" description="Send release mail" depends="init"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Generating Release Note"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;property name="note.name" value="${zip.dir}/${app.name}/ReleaseNote-${timestamp}.txt"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;releasenote appName="${app.name}" noteName="${note.name}" releasedFile="ftp://ftp.zensar.com/${ftp.remotedir}/${target.filename}"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;mail from="${mail.from}" tolist="${mail.to}" cclist="${mail.cc}" files="${note.name}" user="${mail.user}" password="${mail.pass}" ssl="no" replyto="${mail.reply}" subject="${mail.subject}" mailhost="${mail.host}" mailport="${mail.port}" messagefile="${mail.message}"/&amp;gt; &amp;lt;!--message="${mail.message}"/--&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;!-- Common Packaging, uploading and mail ends --&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="getsource" description="Update, Tag, Package, Upload, and release latest source code from repository" depends="init"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;antcall target="${rep.type}" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="Update Latest Source code completed"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;antcall target="release" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;   &amp;lt;target name="release" description="Package, Upload, and release Mail" depends="package,upload,mail"&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;       &amp;lt;echo message="**Release of ${app.name} latest source code completed successfully**"/&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;  &amp;lt;/target&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;&amp;lt;/project&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;And the properties file that specifies all the paramters required is...&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;# Application Name as used in APWORKS.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;app=MyProject&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;app.name=MyProject&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;###### CVS Path (Optional) ########&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;cvs.root=:pserver:husain@192.168.1.155:/app/cvs/cvsroot&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#CVS Password&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;cvs.pass=&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;# The cvs module path of the application required for checkout operation.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;cvs.module=DEVELOPMENT/MyProject&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;######## VSS Details #########&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;# As specified in VSS server path&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;vss.server=\\\\servername\\repository\\&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;vss.path=$/VSS/DEVELOPMENT&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;vss.ssdir=D:/VSS Client&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;vss.username=vssuser&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;vss.pass=vssuserpass&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;####### Workspace Details ##########&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Workspace location. The code from CVS is updated at ws.dir/app.name&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;ws.dir=D:/ide/workspace&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Target local as well as backup Directory to store zip files to be uploaded to ftp server. Used as parent dir to app.name dir.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;zip.dir=D:/BackUp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;######## ftp Details ########&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;ftp.url=ftp.ind.zensar.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Target ftp directory&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;ftp.remotedir=SOURCE/MyProject&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;ftp.username=user&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#ftp password.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;ftp.password=password&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;##############Mail Settings. Used to mail the release note.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.message=mailBody.txt&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.host=mail.mailserver.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.port=25&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;# list of mail ids&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.to=target1@domain.com,cm@domain.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.cc=target3@domain.com,cm2@domain.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Senders mail-id&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.user=myself@domain.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.from=myreplymail@domain.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Reply mail-id&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.reply=myreplymail@domain.com&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Senders mail-id password.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.pass=mypassword&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;mail.subject=Source Code Release [Auto-Generated]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;#Logger&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:georgia;" &gt;log.file=D:/BackUp/buildlog&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Resources:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ant Home Page:&lt;/span&gt; &lt;a href="http://ant.apache.org"&gt;http://ant.apache.org&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ant installation Manual:&lt;/span&gt; &lt;a href="http://ant.apache.org/manual/install.html"&gt;http://ant.apache.org/manual/install.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;a href="http://www.onjava.com/pub/a/onjava/2002/07/24/antauto.html"&gt;&lt;br /&gt;&lt;/a&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;Ant Manual:&lt;/span&gt; &lt;a href="http://ant.apache.org/manual/index.html"&gt;http://ant.apache.org/manual/index.html&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:trebuchet ms;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;A good article on ANT Automation:&lt;/span&gt; &lt;a href="http://www.onjava.com/pub/a/onjava/2002/07/24/antauto.html"&gt;http://www.onjava.com/pub/a/onjava/2002/07/24/antauto.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/1180241783606995786-9129325579011563093?l=hbtechs.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://hbtechs.blogspot.com/feeds/9129325579011563093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://hbtechs.blogspot.com/2007/06/automation-using-innovative-tools.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/9129325579011563093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1180241783606995786/posts/default/9129325579011563093'/><link rel='alternate' type='text/html' href='http://hbtechs.blogspot.com/2007/06/automation-using-innovative-tools.html' title=''/><author><name>Husain Basrawala</name><uri>http://www.blogger.com/profile/00234867743754484033</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='24' height='32' src='http://3.bp.blogspot.com/_dvffPGRY-A4/SNfF9cZswfI/AAAAAAAACo0/dwXG9C9f-Io/S220/ATYAAAAIlU4CGnoraelGFKbonfEigr1SmhOEBpp7ibufVLrXvk0xf97b6hqrT7L7d0w5jiWyzo6w9bTOMZOx9d8JarSYAJtU9VCcN-KZj9qKMH3oDr24VA_HlNnvBA.jpg'/></author><thr:total>5</thr:total></entry></feed>
