Friday, July 16, 2010

Online Shopping Cart: JSP

Hey Ppl!! I am glad to finally get the time to post on my blog again..... As a part of my curriculum I had to create an online shopping cart. Since I thought of doing it in JSP where in I could some AJAX to make it fancier :).  Well the choice of  IDE for me was to go for RAD (Rational Application Developer) 7.5 with WAS (Websphere Application Server)  CE and DB2 as the back end.This is a basic project but is a good learner for those who are new to JSP, servlets or AJAX. This is also be useful if you are looking to get familiarized with the IDE.

Overview :

Lets draw an outline of the project. We have 2 use cases to the project viz Administrator and Customer. We take them one by one. ADMIN end:
  • Ability to add products
  • Managing the categories that these products belong to
  • Search Transaction
  • Search Customer
  • Search for product and ability to edit product inf
Next, On the Customer End:
  • View product and its details
  • Register
  • Login
  • Add product to cart and checkout
  • Viewing transaction records
Lets take up the database for such a system. I have taken the snapshot right out of DB2 listing the tables there in (click to expand).






Snapshots :

Lets look at the snapshots of the project first and then we will discuss the problems faced and their solutions.











Hurdles :

Creating & calling stored procedures on DB2.
With RAD thats very easy!! Follow the steps:
  1. Switch to Data Perspective.
  2. If haven't already create a new project data development proj say 'ShopDev'. While doing so you will be asked to connect to the DB2 database please make sure you enter the DB2 credentials correctly and dont forget to test the connection.
  3. Right click on the ShopDev in the project navigator and select new stored procedure. 
  4. Make sure you choose java as the language (unless you want to use sqlj) and create the query, set up I/O parameters and you will have a stored procedure created for you. This might not be exactly you want so you can edit it now. (for eg look in folder /workspace/ShoppingDev/JavaSource/com/db2admin/db2admin/*.java)
  5. Once done, you can right click on the procedure and select the option generate JavaBean class to get the .java file in your dynamic web project. (these can be found in  /workspace/ShoppingCart/src/genbeans/ )
  6. Now you can use this class to instantiate it in JSP or as Beans..
Image/File Uploads for products
I have seen a lot of posts over the internet for this. But it was difficult to find one good solution. Our objective was to upload the file to database so the approach that we follow is to first upload the file to a temporary folder on the server then onto the database. Uploading To FileSystem On Server: To do so the Apache Commons FileUpload package will do the work for us. Just include the library in your path or add it as a reference. First lets see the jsp page with form that is going to submit both variables and upload data. (important to note enctype)
<form id="addProduct" enctype="multipart/form-data" action="AddProduct" method="post">
The code snippet shows the use we make of it in a servlet. Here the form sends some variables and 3 image files:
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

/**
 * Servlet implementation class AddProduct
 */
public class AddProduct extends HttpServlet {
    private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
    public AddProduct() {
        super();
        // TODO Auto-generated constructor stub
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Create a factory for disk-based file items
        
        DiskFileItemFactory factory = new DiskFileItemFactory();
        String SUBCAT = null,Name = null,BRAND = null,Description = null;
        int Price = 0,Qty = 0;
        byte[][] Image=new byte[3][5*1024*1024];
        // Set factory constraints
        factory.setSizeThreshold(5*1024*1024);
        factory.setRepository(new File("/tmp"));
        
        // Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
        int cnt=0;
        // Parse the request
        List items;
        try {
            items = upload.parseRequest(request);
        
        Iterator iter = items.iterator();
        
        while (iter.hasNext()) 
        {
            FileItem item = (FileItem) iter.next();
            // Process a file upload
            if (item.isFormField()) {
                String name = item.getFieldName();
                if(name.equals("SubCat"))
                    SUBCAT = item.getString();
                else if(name.equals("PName"))
                    Name= item.getString();
                else if(name.equals("Brand"))
                    BRAND = item.getString();
                else if(name.equals("Quantity"))
                    Qty = Integer.parseInt(item.getString());      
                else if(name.equals("Price"))
                    Price= Integer.parseInt(item.getString());        
                else if(name.equals("Description"))
                    Description = item.getString();
            }
            if (!item.isFormField()) 
            {
                String fieldName = item.getFieldName();
                String fileName = item.getName();
                String contentType = item.getContentType();
                boolean isInMemory = item.isInMemory();
                long sizeInBytes = item.getSize();
                if (sizeInBytes<=10)
                    continue;
                File uploadedFile = new File("/tmp/up" + ++cnt +".jpg");
                try {
                    
                    item.write(uploadedFile);
                } catch (Exception e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                    return;
                }                
            }
        }
        } catch (FileUploadException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
            return;
        }
        AddProductBean apb=new AddProductBean();
        System.out.println("CNT= " + cnt);

        FileInputStream[] fis=new FileInputStream[3];
        for(int i=1;i<=cnt;i++)
        {
            File f=new File("/tmp/up" + i +".jpg");
            fis[i-1]=new FileInputStream("/tmp/up" + i +".jpg");
            Image[i-1]=new byte[(int) f.length()];
            System.out.println(fis[i-1].read(Image[i-1], 0, (int)f.length()));
        }
        String str="khali";
        byte[] n=str.getBytes();
        System.out.println("Len= " + Image[0].length + " "+ Image[1].length + " "+ Image[2].length + " ");
        try {
            if(cnt==3)
                apb.execute(SUBCAT, Name, BRAND, Price, Qty, Description, Image[0], Image[1], Image[2]);
            else if(cnt==2)
                apb.execute(SUBCAT, Name, BRAND, Price, Qty, Description, Image[0], Image[1], n);
            else if(cnt==1)
                apb.execute(SUBCAT, Name, BRAND, Price, Qty, Description, Image[0], n, n);
            else
                apb.execute(SUBCAT, Name, BRAND, Price, Qty, Description, n, n, n);
            for(int i=0;i<3;i++)
            {
                if(fis[i]!=null)
                    fis[i].close();            
            }
            if(apb.getRes()>=0)
            {
                response.sendRedirect("AddedProduct.jsp");
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
A very common question was getting servlets to work. The error is that httpservlet is not found.
To correct that you need to add reference to j2ee.jar that can be found here

Extensions :

  1. Add provision for product offers or discount offers.
  2. Support for preview of multimedia products and downloadable products like games/softwares.
  3. Recommended products can be evaluated via Apriori algorithm.

Download :

Finally, here you can download the complete workspace for the project.
Download Workspace

Thursday, February 4, 2010

Digital Image Processing

I undertook a project on digital image processing (DIP) during May-June 2009 at Indian Space And Research Organization (ISRO). We learned a lot about the working of the great organization and also understood the concepts behind remote sensing and Geographical Information Systems (GIS). We also learnt the implementation of image processing algorithms and were planning to tweak them a little to align them with our project.

The Project:

I was to lead a team of 6 responsible for creating a project on the various techniques of image processing viz Classification, Enhancement & Filtering. We used Visual Studio 2008 as the IDE and created a MFC based project that provided a wide variety of DIP functions. We used the IGIS SDK to achieve our goal.

The next question that arises is :
Q) What is the IGIS SDK ?
A) Well it is a under construction project that is a join venture of ISRO and a company named Scanpoint Geomatics. So we were provided a dll that was exporting functions to do the processing in the background. Our task was massively reduced due to the high level of abstraction provided by the dll. But then again, since all this was under development (hence poorly documented) we had to write our own interface and handle events and a GUI (Graphical User Interface) which could make the image processing tasks easy.

Q) Is this IGIS SDK available as a free download and can anyone use it?
A) Well it is a proprietary software and has to be bought (obviously we were provided with keys for the development of project).

There are a lot of dimensions to the project.... its better that we read the complete documentation of the project. Well I was asked to present my project at both ISRO and my college. So here is the ppt I used.

As always, here are the sources to the project. But then again, you would require IGIS to be preinstalled for this to run.

On the whole, I can say that it was a great learning experience at ISRO. I am grateful to our project guide Mr. Vinod Bothale and would like to thank him for being there whenever needed.

Here for a quick preview of the project











Wednesday, January 13, 2010

Dragon Naturally Speaking : Step Up Your Work

I was just browsing the Internet yesterday and I happened to stumble upon this beautiful peice of software named Dragon NaturallySpeaking 10.0. It is a text-to-speech and speech to text conversion software. The best part of it is the speech to text conversion. It is different from the others and takes much less in training. In fact it has different options for different kind of people. It is specialized for Indians who speak in Indian accent and for Americans who speak in American English and so on and so forth. Well most of us think that these are just games to play with. But Dragon NaturallySpeaking is truly different.
It can control windows command buttons, mouse clicks and type in keyboard shortcuts as and when you say. This makes up for a great feature as you can use this to speed up your work. You could be writing an e-mail to a friend or you could be typing in your text editor, you might be needing to align your text, capitalize or even italicize it while you might be busy with something else.
I have composed the video of me using the software and I totally feel it is worth the money. It is common thinking that you can type too fast and typing is the best way to do it. But to those who think so I say you've seen nothing until you've seen this software.


And guess what this post has been created using the same. Enjoy.