Subversion Repositories SmartDukaan

Rev

Rev 4408 | Blame | Last modification | View Log | RSS feed

/**
 * 
 */

package in.shop2020.support.controllers;

import in.shop2020.model.v1.catalog.InventoryServiceException;
import in.shop2020.model.v1.catalog.Vendor;
import in.shop2020.purchase.PurchaseOrder;
import in.shop2020.purchase.PurchaseService.Client;
import in.shop2020.purchase.PurchaseServiceException;
import in.shop2020.purchase.Supplier;
import in.shop2020.support.utils.ReportsUtils;
import in.shop2020.thrift.clients.CatalogClient;
import in.shop2020.thrift.clients.PurchaseClient;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Calendar;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.InterceptorRefs;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.thrift.TException;
import org.apache.thrift.transport.TTransportException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@InterceptorRefs({
    @InterceptorRef("defaultStack"),
    @InterceptorRef("login")
})
@Results({
    @Result(name = "index", location = "raisePO-index.vm"),
    @Result(name = "result", location = "raisePO-result.vm")
})

public class RaisePOController implements ServletResponseAware, ServletRequestAware {

    private static Logger log = LoggerFactory.getLogger(RaisePOController.class);
    
    private File purchaseOrderDetails;
    private String vendorId;
    private String result;
    private List<Vendor> vendors;

    private HttpServletResponse response;

    private HttpServletRequest request;

    private HttpSession session;

    @Override
    public void setServletRequest(HttpServletRequest req) {
        this.request = req;
        this.session = req.getSession();
    }
    
    
    public String index() {
        if (!ReportsUtils.canAccessReport((Long) session.getAttribute(ReportsUtils.ROLE), request.getServletPath()))    {
            return "authfail";
        }
        CatalogClient csc;
        try {
            csc = new CatalogClient();
            in.shop2020.model.v1.catalog.InventoryService.Client catalogClient= csc.getClient();
            setVendors(catalogClient.getAllVendors());
        } catch (TTransportException e) {
            e.printStackTrace();
            setResult(e.getMessage());
        } catch (TException e) {
            e.printStackTrace();
            setResult(e.getMessage());
        }
        return "index";
    }

    /* MAIN METHOD TO TEST THE CODE 
     * 
     * public static void main(String[] args) {
        RaisePOController rpc = new RaisePOController();
        rpc.setPurchaseOrderDetails(new File("/home/anupam/Desktop/po.xls"));
        rpc.setVendorId("3");
        rpc.create();
        System.out.println(rpc.getResult());
    }*/
    
    public String create() {
        try {
            /*
             * Save the uploaded file to disk
             * 
             */
            FileInputStream is = new FileInputStream(purchaseOrderDetails);
            String filename = "/tmp/po-" +  Calendar.getInstance().getTime().toString() + ".xls";
            File f = new File(filename);
            FileOutputStream fos = null;
            fos = new FileOutputStream(f);
            byte[] buf = new byte[4096];
            int bytesRead;

            while((bytesRead = is.read(buf)) != -1) {
                fos.write(buf, 0, bytesRead);
            }
            fos.close();

            int vendor = Integer.parseInt(vendorId);
            CatalogClient csc = new CatalogClient();
            in.shop2020.model.v1.catalog.InventoryService.Client catalogClient= csc.getClient();
            setVendors(catalogClient.getAllVendors());
            if (vendor < 1 || vendor > vendors.size()) {
                setResult("Select a valid Vendor");
                return "result";
            }
            /*
             * Try to create the purchase order for given vendor
             * 
             */
             
            Long purchaseOrderId = null;
            String output = catalogClient.processPurchaseOrder(filename, vendor);
            
            /*
             * If PO is generated then create the PDF receipt for it
             * 
             */
            if(output.contains("POId:")) {
                String [] arr = output.split(":");
                purchaseOrderId = Long.parseLong(arr[1]);
                PurchaseClient warehouseServiceClient = new PurchaseClient();
                Client client = warehouseServiceClient.getClient();
                PurchaseOrder purchaseOrder = client.getPurchaseOrder(purchaseOrderId);
                Supplier supplier = client.getSupplier(purchaseOrder.getSupplierId());
                String pdfFilename = in.shop2020.support.services.PdfPoSheetGenerator.generatePdfSheet(purchaseOrder, supplier);
                
                /*
                 * Put pdf file in a buffer to send it in response 
                 * 
                 */
                File file = new File(pdfFilename);
                byte[] buffer = new byte[(int)file.length()];
                try {
                    InputStream input = null;
                    try {
                        int totalBytesRead = 0;
                        input = new BufferedInputStream(new FileInputStream(file));
                        while(totalBytesRead < buffer.length){
                            int bytesRemaining = buffer.length - totalBytesRead;
                            //input.read() returns -1, 0, or more :
                            int bytesRead1 = input.read(buffer, totalBytesRead, bytesRemaining); 
                            if (bytesRead1 > 0){
                                totalBytesRead = totalBytesRead + bytesRead1;
                            }
                        }
                        /*
                         the above style is a bit tricky: it places bytes into the 'buffer' array; 
                         'buffer' is an output parameter;
                         the while loop usually has a single iteration only.
                         */
                    }
                    finally {
                        input.close();
                    }
                }
                catch (FileNotFoundException ex) {
                    log.info("FILE NOT FOUND : " + pdfFilename, ex);
                    setResult(ex.getMessage());
                }
                catch (IOException ex) {
                    log.info("FILE NOT FOUND : " + pdfFilename);
                    setResult(ex.getMessage());
                }
                response.setHeader("Content-disposition", "attachment; filename=" + pdfFilename );
                /*
                 * Send the pdf file in response  
                 * 
                 */
                ServletOutputStream sos;
                sos = response.getOutputStream();
                sos.write(buffer);
                sos.flush();
            }

        } catch (TTransportException e) {
            e.printStackTrace();
            setResult(e.getMessage());
            
        } catch (NumberFormatException e) {
            e.printStackTrace();
            setResult(e.getMessage());
            
        } catch (TException e) {
            e.printStackTrace();
            setResult(e.getMessage());
            
        } catch (InventoryServiceException e) {
            setResult(e.getMessage());
            
        } catch(IOException e) {
            log.error("Error occured");
            setResult(e.getMessage());
        } catch (PurchaseServiceException e) {
            setResult(e.getMessage());
        }
        return "result";
    }

    public File getPurchaseOrderDetails() {
        return purchaseOrderDetails;
    }

    public void setPurchaseOrderDetails(File purchaseOrderDetails) {
        this.purchaseOrderDetails = purchaseOrderDetails;
    }

    public String getVendorId() {
        return vendorId;
    }

    public void setVendorId(String vendorId) {
        this.vendorId = vendorId;
    }

    public void setResult(String result) {
        this.result = result;
    }

    public String getResult() {
        return result;
    }

    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }


    public List<Vendor> getVendors() {
        return vendors;
    }


    public void setVendors(List<Vendor> vendors) {
        this.vendors = vendors;
    }
    
}