Subversion Repositories SmartDukaan

Rev

Rev 2944 | Rev 5322 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

package in.shop2020.serving.controllers;

import in.shop2020.datalogger.EventType;
import in.shop2020.serving.utils.FileUtils;
import in.shop2020.serving.utils.Utils;
import in.shop2020.utils.DataLogger;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Result;

/**
 * 
 * @author rajveer
 * 
 */

@Result(name = "show", location = "compare-show.vm")
public class CompareController extends BaseController {

    private static final long serialVersionUID = 1L;

    private static Logger logger = Logger.getLogger(Class.class);
    
    List<String> slides = new ArrayList<String>();
    
    private List<String> productList;
    private List<String> productNames;
    private Map<String, String> snippets;
    private List<String> unComparedSlides;
    private List<String> commonSlides;
    
    private Map<String, String> slideNameImportanceMap;
    
    private Map<String, Map<String, Double>> productSlideScores;
    
    private List<String> importances = new ArrayList<String>();
    
    public CompareController() {
        super();
        importances.add("V. Imp");
        importances.add("Imp");
        importances.add("Not Imp");
    }

    @Actions({
        @Action("/compare-mobile-phones"),
        @Action("/compare")
    })
    
    public String index() throws SecurityException, IOException {
        productList = new ArrayList<String>();
        if(request.getParameter("p1") != null){
            this.productList.add(request.getParameter("p1"));
        }
        if(request.getParameter("p2") != null){
            this.productList.add(request.getParameter("p2"));
        }
        if(request.getParameter("p3") != null){
            this.productList.add(request.getParameter("p3"));
        }
        if(request.getParameter("p4") != null){
            this.productList.add(request.getParameter("p4"));
        }
        if(request.getParameter("p5") != null){
            this.productList.add(request.getParameter("p5"));
        }
        
        DataLogger.logData(EventType.PRODUCT_COMPARE, getSessionId(), userinfo.getUserId(), userinfo.getEmail(),
                StringUtils.join(productList, ", "));
        return "show";
    }
    
    public List<String> getSlideNames() {
        productNames = new ArrayList<String>();
        slideNameImportanceMap = new LinkedHashMap<String, String>();
        productSlideScores = new LinkedHashMap<String, Map<String, Double>>();
        
        for (String productId : productList) {
            File f = new File(Utils.EXPORT_ENTITIES_PATH + productId + File.separator + "SlideNamesSnippet.html");
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(f);
                BufferedReader br = new BufferedReader(new InputStreamReader(fis));
                String line;
                boolean isProductName = true;;
                Map<String, Double> slideScores = new LinkedHashMap<String, Double>();
                while((line = br.readLine()) != null){
                    if(isProductName){
                        productNames.add(line);
                        productSlideScores.put(line, slideScores);
                        isProductName = false;
                        continue;
                    }
                    
                    String[] parts = line.split("!!!");
                    String slideName = parts[0];
                    String importance = parts[1];
                    double score = Double.parseDouble(parts[2]);
                    if(score > 0){
                        if(!slideNameImportanceMap.containsKey(slideName)){
                            if(!importance.equals("None")){
                                slideNameImportanceMap.put(slideName, importance);
                            }
                        }
                        if(!slideScores.containsKey(slideName)){
                            slideScores.put(slideName, score);
                        }
                    }
                    if(!slides.contains(slideName)){
                        slides.add(slideName);
                    }
                    
                }
            } catch (IOException e) {
                logger.error("Error while reading snippet", e);
            }
        }
        logger.info(productNames);
        
        unComparedSlides = new ArrayList<String>();
        for(String slideName: slides){
            if(!slideNameImportanceMap.containsKey(slideName)){
                unComparedSlides.add(slideName);
            }
        }
        return slides;
    }
    
    public List<String> getUncomparedSlides(){
        return this.unComparedSlides;
    }
    
    public List<String> getcommonSlides(){
        return this.commonSlides;
    }
    
    public List<Double> getOverallScores(){
        List<Double> overallScores = new ArrayList<Double>();
        for(String productId : productSlideScores.keySet()){
            Map<String, Double> slideScores = productSlideScores.get(productId);
            double commulativeWeightedScore = 0.0;
            double commulativeWeights = 0.0;
            
            for(String slideName: slideNameImportanceMap.keySet()){
                double score = 0.0;
                if(slideScores.get(slideName) != null){
                    score = slideScores.get(slideName);
                }
                String importance = slideNameImportanceMap.get(slideName);
                if(importance.equals("V. Imp")){
                    commulativeWeightedScore += score*55;
                    commulativeWeights += 55;
                }
                if(importance.equals("Imp")){
                    commulativeWeightedScore += score*30;
                    commulativeWeights += 30;
                }
                if(importance.equals("Not Imp")){
                    commulativeWeightedScore += score*15;
                    commulativeWeights += 15;
                }
            }
            double weightedScore = commulativeWeightedScore/commulativeWeights;
            
            DecimalFormat oneDForm = new DecimalFormat("#.#");
            weightedScore = Double.valueOf(oneDForm.format(weightedScore));
            
            overallScores.add(weightedScore);
        }
        
         
        return overallScores;
    }
    
    public Map<String, String> getSnippets(){
        if (productList != null) {
            snippets = new LinkedHashMap<String, String>();
            for (String productId : productList) {
                try {
                    snippets.put(productId, FileUtils.read(Utils.EXPORT_ENTITIES_PATH + productId + File.separator + "ComparisonSnippet.html"));
                } catch (IOException e) {
                    logger.error(e);
                }
            }
        }
        this.commonSlides = new ArrayList<String>();
        
        return snippets;
    }

    public Map<String, String> getProductSummarySnippets(){
        if (productList != null) {
            snippets = new LinkedHashMap<String, String>();
            for (String productId : productList) {
                try {
                    snippets.put(productId, FileUtils.read(Utils.EXPORT_ENTITIES_PATH + productId + File.separator + "CompareProductSummarySnippet.html"));
                } catch (IOException e) {
                    logger.error(e);
                }
            }
        }
        return snippets;
    }
    public Map<String, String> getProductSnippets(){
        if (productList != null) {
            snippets = new LinkedHashMap<String, String>();
            for (String productId : productList) {
                try {
                    snippets.put(productId, FileUtils.read(Utils.EXPORT_ENTITIES_PATH + productId + File.separator + "CompareProductSnippet.html"));
                } catch (IOException e) {
                    logger.error(e);
                }
            }

        }
        return snippets;
    }
    
    public List<String> getProductList(){
        return this.productList;
    }
    
    public List<String> getProductNames(){
        return this.productNames;
    }

    public Map<String, String> getSlideNameImportanceMap(){
        return this.slideNameImportanceMap;
    }
    
    public Map<String, Map<String, Double>> getProductSlideScores(){
        return this.productSlideScores;
    }
    
    public List<String> getImportances(){
        return this.importances;
    }
}