Subversion Repositories SmartDukaan

Rev

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

/**
 * 
 */
package in.shop2020.ui.util;

import in.shop2020.metamodel.core.Bullet;
import in.shop2020.metamodel.core.Entity;
import in.shop2020.metamodel.core.Feature;
import in.shop2020.metamodel.core.PrimitiveDataObject;
import in.shop2020.metamodel.definitions.Catalog;
import in.shop2020.metamodel.definitions.DefinitionsContainer;
import in.shop2020.metamodel.definitions.EntityContainer;
import in.shop2020.metamodel.definitions.SlideDefinition;
import in.shop2020.metamodel.util.ExpandedCategory;
import in.shop2020.metamodel.util.ExpandedEntity;
import in.shop2020.metamodel.util.ExpandedSlide;
import in.shop2020.util.Utils;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import org.apache.velocity.app.Velocity;

/**
 * Driver class to merge Java data objects with VTL script
 * 
 * @author naveen
 *
 */
public class VUI {

        /**
         * Usage: VUI [entity|category|category_carousal|diff] [Entity ID|Category ID|EntityID1_EntityID2] {Template file name}
         * 
         * @param args
         */
        public static void main(String[] args) throws Exception {
                //diffAll();
                //System.exit(0);
                
                String[] commands = new String[] {"entity", "category", 
                                "category_carousal", "diff"};
                String[] datatypes = new String[] {"Entity ID", "Category ID", 
                                "EntityID1_EntityID2"};

                String usage = "Usage: VUI ["+ StringUtils.join(commands, "|") +"] ["+ 
                        StringUtils.join(datatypes, "|") + "] {Template file name}";
                
                if(args.length < 3) {
                        System.out.println(usage);
                        System.exit(-1);
                }
                String inputCommand = args[0];
                String inputID = args[1];
                String templateFilename = args[2];
                
                
                long id = 0;
                if(inputCommand.equals("entity") || inputCommand.equals("category") || 
                                inputCommand.equals("category_carousal")) {
                        try {
                                id = Long.parseLong(inputID);
                        }
                        catch (NumberFormatException nfe) {
                                System.out.println("Invalid ID - " + inputID);
                                System.exit(-1);
                        }
                }
                
                // Setup
                Velocity.init("src/in/shop2020/ui/util/velocity.properties");
                VelocityContext context = new VelocityContext();

                String templateFile = Utils.VTL_SRC_PATH + templateFilename + ".vm";
                
                Template template = null;
                String exportFileName = null;
                
                DefinitionsContainer defs = 
                        Catalog.getInstance().getDefinitionsContainer();
                
                EntityContainer ents = 
                        Catalog.getInstance().getEntityContainer();
                
                // Entities
                if(inputCommand.equals("entity")) {
                        EntityContainer entContainer = 
                                Catalog.getInstance().getEntityContainer();
                        
                        ExpandedEntity expEntity = entContainer.getExpandedEntity(id);
                        Utils.logger.info("expEntity=" + expEntity);
                        
                        context.put("expentity", expEntity);
                        template = Velocity.getTemplate(templateFile);
                        
                        exportFileName = Utils.EXPORT_ENTITIES_PATH + id + ".html";
                }
                
                // Category definitions
                else if(inputCommand.equals("category")) {                      
                        ExpandedCategory expCategory = defs.getExpandedCategory(id);
                        Utils.info("expCategory=" + expCategory);
                        
                        context.put("expcategory", expCategory);
                        template = Velocity.getTemplate(templateFile);
                        
                        exportFileName = Utils.EXPORT_DEFINITIONS_PATH + id + ".html";
                }

                // Category carousal
                else if(inputCommand.equals("category_carousal")) {
                        String categoryName = defs.getCategory(id).getLabel();
                        List<Entity> entities = ents.getEntities(id);
                        
                        
                        List<String[]> entitiesToShow = new ArrayList<String[]>();
                        
                        for(Entity entity : entities) {
                                String snippets[] = new String[4];
                                
                                // Entity ID
                                snippets[0] = new Long(entity.getID()).toString();
                                
                                Feature feature = ents.getFeature(entity.getID(), 
                                                Utils.SNIPPETS_FEATURE_DEFINITIONID);
                                
                                List<Bullet> bullets = feature.getBullets();
                                
                                if(bullets.size() > 0) {
                                        snippets[1] = ((PrimitiveDataObject)bullets.get(0).
                                                        getDataObject()).getValue();
                                }
                                
                                if(bullets.size() > 1) {
                                        snippets[2] = ((PrimitiveDataObject)bullets.get(1).
                                                        getDataObject()).getValue();
                                }
                                
                                if(bullets.size() > 2) {
                                        snippets[3] = ((PrimitiveDataObject)bullets.get(2).
                                                        getDataObject()).getValue();
                                }

                                Utils.info("snippets=" + Arrays.toString(snippets));
                                entitiesToShow.add(snippets);
                        }
                        
                        Utils.info("categoryName=" + categoryName);
                        Utils.info("entitiesToShow=" + entitiesToShow);
                        
                        context.put("categoryName", categoryName);
                        context.put("entitiesToShow", entitiesToShow);
                        
                        template = Velocity.getTemplate(templateFile);
                        exportFileName = Utils.EXPORT_CATEGORY_HOMES_PATH + id + ".html";
                }

                // Difference
                else if(inputCommand.equals("diff")) {
                        String[] entityIDs = StringUtils.split(inputID, "_");
                        if(entityIDs.length < 2) {
                                System.out.println("Invalid IDs - " + inputID);
                                System.exit(-1);
                        }
                        
                        long entityID1 = 0L;
                        long entityID2 = 0L;
                        try {
                                entityID1 = Long.parseLong(entityIDs[0]);
                                entityID2 = Long.parseLong(entityIDs[1]);
                        } catch(NumberFormatException nfe) {
                                System.out.println("Invalid IDs - " + inputID);
                                System.exit(-1);
                        }
                        
                        Utils.info("entityIDs=" + Arrays.toString(entityIDs));
                        
                        ExpandedEntity expEntity1 = ents.getExpandedEntity(entityID1);
                        ExpandedEntity expEntity2 = ents.getExpandedEntity(entityID2);
                        
                        List<ExpandedSlide[]> mergedSlides = 
                                getMergedSlides(expEntity1, expEntity2);
                        Utils.info("mergedSlides=" + mergedSlides);
                        
                        Collection<String[]> mergedComparisonScores = 
                                getMergedComparisonScores(expEntity1, expEntity2);
                        Utils.info("mergedComparisonScores=" + mergedComparisonScores);

                        int scoreEntity1 = ents.getEntityComparisonScore(
                                        expEntity1.getID());

                        int scoreEntity2 = ents.getEntityComparisonScore(
                                        expEntity2.getID());

                        context.put("expEntity1", expEntity1);
                        context.put("expEntity2", expEntity2);
                        context.put("mergedSlides", mergedSlides);
                        context.put("mergedComparisonScores", mergedComparisonScores);
                        context.put("scoreEntity1", scoreEntity1);
                        context.put("scoreEntity2", scoreEntity2);
                        
                        template = Velocity.getTemplate(templateFile);
                        exportFileName = Utils.EXPORT_DIFF_PATH + entityIDs[0] + "_" +
                                entityIDs[1] + ".html";
                }
                
                if(template != null) { 
                        File exportFile = new File(exportFileName);
                        if(!exportFile.exists()) {
                                exportFile.createNewFile();
                        }
                        
                        BufferedWriter writer = new BufferedWriter(
                            new OutputStreamWriter(new FileOutputStream(exportFile)));
                        
                        template.merge(context, writer);
                        
                        writer.flush();
                        writer.close();
                        Utils.info("Export Complete!");
                }
        }

        /**
         * 
         * @param expEntity1
         * @param expEntity2
         * @return
         * @throws Exception 
         */
        private static Collection<String[]> getMergedComparisonScores(
                        ExpandedEntity expEntity1, ExpandedEntity expEntity2) 
                        throws Exception {
                EntityContainer ents = Catalog.getInstance().getEntityContainer();
                DefinitionsContainer defs = 
                        Catalog.getInstance().getDefinitionsContainer();
                
                Map<String, String[]> mergedSlideScores = 
                        new LinkedHashMap<String, String[]>();
                
                Map<Long, Integer> cmpSlideScores1 = ents.getSlideComparisonScores(
                                expEntity1.getID());
                
                for(Long slideID : cmpSlideScores1.keySet()) {
                        SlideDefinition slideDef = defs.getSlideDefinition(
                                        slideID.longValue());
                        
                        String slideLabel = slideDef.getLabel();
                        String[] details = new String[3];
                        
                        details[0] = slideLabel;
                        
                        Integer score = cmpSlideScores1.get(slideID);
                        if(score != null) {
                                details[1] = score.toString();
                        }
                        else {
                                details[1] = "-1";
                        }
                        
                        // To be determined in loop over 2nd entity's scores
                        details[2] = "-1";
                        
                        mergedSlideScores.put(slideLabel, details);
                }

                Map<Long, Integer> cmpSlideScores2 = ents.getSlideComparisonScores(
                                expEntity2.getID());

                for(Long slideID : cmpSlideScores2.keySet()) {
                        SlideDefinition slideDef = defs.getSlideDefinition(
                                        slideID.longValue());
                        
                        String slideLabel = slideDef.getLabel();

                        String[] details = null;
                        if(mergedSlideScores.containsKey(slideLabel)) {
                                details = mergedSlideScores.get(slideLabel);
                        }
                        else {
                                details = new String[3];
                                
                                details[0] = slideLabel;
                                details[1] = "-1";
                                
                                mergedSlideScores.put(slideLabel, details);
                        }

                        Integer score = cmpSlideScores2.get(slideID);
                        if(score != null) {
                                details[2] = score.toString();
                        }
                        else {
                                details[2] = "-1";
                        }
                }
                
                return mergedSlideScores.values();
        }

        /**
         * 
         * @param expEntity1
         * @param expEntity2
         */
        private static List<ExpandedSlide[]> getMergedSlides(
                        ExpandedEntity expEntity1, ExpandedEntity expEntity2) {
                List<ExpandedSlide[]> mergedSlides = new ArrayList<ExpandedSlide[]>();
                
                EntityContainer ents = Catalog.getInstance().getEntityContainer();
                
                List<ExpandedSlide> expSlidesEntity1 = expEntity1.getExpandedSlides();
                
                for(ExpandedSlide expSlide1 : expSlidesEntity1) {
                        String slideLabel = expSlide1.getSlideDefinition().getLabel();
                        
                        ExpandedSlide expSlide2 = ents.getParentExpandedSlide(
                                        expEntity2, slideLabel);
                        
                        if(expSlide2 != null) {
                                ExpandedSlide[] comparisonSlides = new ExpandedSlide[2];
                                comparisonSlides[0] = expSlide1;
                                comparisonSlides[1] = expSlide2;
                                        
                                mergedSlides.add(comparisonSlides);
                        }
                }
                
                return mergedSlides;
        }
        
        public static void diffAll() throws Exception {
                long[] entityIDs = new long[] {
                                1000001,
                                1000002,
                                1000003,
                                1000004,
                                1000005,
                                1000006,
                                1000007,
                                1000008,
                                1000009,
                                1000010,
                                1000011,
                                1000012,
                                1000013,
                                1000014,
                                1000015
                };
                
                for(int i=0;i<entityIDs.length;i++) {
                        for(int j=0;j<entityIDs.length;j++) {
                                diff(entityIDs[i], entityIDs[j]);
                        }
                }
        }
        
        public static void diff(long entityID1, long entityID2) throws Exception {
                // Setup
                Velocity.init("src/in/shop2020/ui/util/velocity.properties");
                VelocityContext context = new VelocityContext();

                String templateFile = Utils.VTL_SRC_PATH + "jquery_diff_slideguide.vm";
                
                Template template = null;
                String exportFileName = null;
                
                EntityContainer ents = Catalog.getInstance().getEntityContainer();
                
                ExpandedEntity expEntity1 = ents.getExpandedEntity(entityID1);
                ExpandedEntity expEntity2 = ents.getExpandedEntity(entityID2);
                
                List<ExpandedSlide[]> mergedSlides = 
                        getMergedSlides(expEntity1, expEntity2);
                Utils.info("mergedSlides=" + mergedSlides);
                
                Collection<String[]> mergedComparisonScores = 
                        getMergedComparisonScores(expEntity1, expEntity2);
                Utils.info("mergedComparisonScores=" + mergedComparisonScores);
        
                int scoreEntity1 = ents.getEntityComparisonScore(
                                expEntity1.getID());
        
                int scoreEntity2 = ents.getEntityComparisonScore(
                                expEntity2.getID());
        
                context.put("expEntity1", expEntity1);
                context.put("expEntity2", expEntity2);
                context.put("mergedSlides", mergedSlides);
                context.put("mergedComparisonScores", mergedComparisonScores);
                context.put("scoreEntity1", scoreEntity1);
                context.put("scoreEntity2", scoreEntity2);
                
                template = Velocity.getTemplate(templateFile);
                exportFileName = Utils.EXPORT_DIFF_PATH + entityID1 + "_" + entityID2 + 
                        ".html";

                File exportFile = new File(exportFileName);
                if(!exportFile.exists()) {
                        exportFile.createNewFile();
                }
                
                BufferedWriter writer = new BufferedWriter(
                    new OutputStreamWriter(new FileOutputStream(exportFile)));
                
                template.merge(context, writer);
                
                writer.flush();
                writer.close();
                Utils.info("Export Complete!");
        }
}