Subversion Repositories SmartDukaan

Rev

Rev 2656 | Rev 2726 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2171 rajveer 1
package in.shop2020.util;
2367 rajveer 2
import java.io.File;
3
import java.io.IOException;
2171 rajveer 4
import java.util.ArrayList;
5
import java.util.Date;
2367 rajveer 6
import java.util.HashMap;
2171 rajveer 7
import java.util.LinkedHashMap;
8
import java.util.List;
9
import java.util.Map;
10
 
11
import in.shop2020.metamodel.core.Entity;
12
import in.shop2020.metamodel.core.EntityState;
13
import in.shop2020.metamodel.core.EntityStatus;
14
import in.shop2020.metamodel.util.CreationUtils;
15
import in.shop2020.metamodel.util.ExpandedEntity;
16
import in.shop2020.model.v1.catalog.InventoryService.Client;
17
import in.shop2020.model.v1.catalog.Item;
18
import in.shop2020.model.v1.catalog.status;
19
import in.shop2020.thrift.clients.CatalogServiceClient;
2367 rajveer 20
import in.shop2020.ui.util.PriceInsertor;
2171 rajveer 21
import in.shop2020.ui.util.NewVUI;
22
 
23
import org.apache.commons.cli.*;
24
 
25
 
26
 
27
public class ContentGenerationUtility {
28
    private static Options options = null; // Command line options
29
 
2367 rajveer 30
    private static final String UPDATE_TYPE_OPTION = "u";
2171 rajveer 31
    private static final String GENERATION_TYPE_OPTION = "t";
32
    private static final String ENTITY_ID_OPTION = "e";
33
 
2367 rajveer 34
    private static String UPDATE_TYPE = "CONTENT";
2171 rajveer 35
    private static String GENERATION_TYPE = "INCREMENTAL";
36
    private static String ENTITY_ID = "ALL";
37
    Map<Long, Entity> entities;
38
    List<Item> items;
2367 rajveer 39
    List<Item> contentCompleteItems  = new ArrayList<Item>();
40
    List<Item> phasedOutItems;
2171 rajveer 41
    CatalogServiceClient csc;
42
    Client client;
43
    Map<Long, List<Item>> entityIdItemMap = new LinkedHashMap<Long, List<Item>>();
44
    private CommandLine cmd = null; // Command Line arguments
45
    Long lastGenerationTime;
46
 
47
    static{
48
        options = new Options();
49
        options.addOption(GENERATION_TYPE_OPTION, true, "Generation type");
2367 rajveer 50
        options.addOption(UPDATE_TYPE_OPTION, true, "Default is : " + UPDATE_TYPE);
2171 rajveer 51
        options.addOption(ENTITY_ID_OPTION, true, "all entities " + ENTITY_ID + " by default");
52
    }
53
 
54
    public ContentGenerationUtility() throws Exception{
55
        csc = new CatalogServiceClient();
56
        client = csc.getClient();
57
    }
58
 
2367 rajveer 59
 
2171 rajveer 60
    /**
61
     * @param args
62
     * @throws Exception 
63
     */
64
    public static void main(String[] args) throws Exception {
65
        ContentGenerationUtility cgu = new ContentGenerationUtility();
2367 rajveer 66
        //Load arguments
2171 rajveer 67
        cgu.loadArgs(args);
2367 rajveer 68
        //Call method based on arguments
69
        cgu.callMethod();
2171 rajveer 70
    }
2367 rajveer 71
 
2171 rajveer 72
 
2367 rajveer 73
	/**
2171 rajveer 74
     * Validate and set command line arguments.
75
     * Exit after printing usage if anything is astray
76
     * @param args String[] args as featured in public static void main()
77
     */
78
    private void loadArgs(String[] args){
79
        CommandLineParser parser = new PosixParser();
80
        try {
81
            cmd = parser.parse(options, args);
82
        } catch (ParseException e) {
83
            System.err.println("Error parsing arguments");
84
            e.printStackTrace();
85
            System.exit(1);
86
        }
87
 
88
        // Check for mandatory args
89
 
2367 rajveer 90
        if (!( cmd.hasOption(GENERATION_TYPE_OPTION)  &&  cmd.hasOption(UPDATE_TYPE_OPTION))){
2171 rajveer 91
            HelpFormatter formatter = new HelpFormatter();
2367 rajveer 92
            formatter.printHelp("java ContentGenerationUtility.class -t { ALL | INCREMENTAL | ONE } -u { CONTENT | CATALOG } -e {EntityId} ", options);
2171 rajveer 93
            System.exit(1);
94
        }
95
 
96
        GENERATION_TYPE = cmd.getOptionValue(GENERATION_TYPE_OPTION);
2367 rajveer 97
 
98
        UPDATE_TYPE = cmd.getOptionValue(UPDATE_TYPE_OPTION);
99
 
2171 rajveer 100
        // Look for optional args.
101
        if(GENERATION_TYPE.equals("ONE")){
102
            if (cmd.hasOption(ENTITY_ID_OPTION)){
103
                ENTITY_ID = cmd.getOptionValue(ENTITY_ID_OPTION);
104
            }else{
105
                HelpFormatter formatter = new HelpFormatter();
2367 rajveer 106
                formatter.printHelp("java ContentGenerationUtility.class -t { ALL | INCREMENTAL | ONE } -u { CONTENT | CATALOG } -e {EntityId} ", options);
2171 rajveer 107
                System.exit(1);
108
            }
109
        }
2367 rajveer 110
    }
111
 
112
    /**
113
     * Call method based on arguments
114
     * @throws Exception
115
     */
116
    private void callMethod() throws Exception{
117
    	if(UPDATE_TYPE.equals("CONTENT")){
118
    		this.generateContent();	
119
    	}
120
 
121
    	if(UPDATE_TYPE.equals("CATALOG")){
122
    		this.updatePrices();
123
    	}	
124
    }
125
 
126
 
127
 
2369 rajveer 128
	public boolean cleanDir(File dir, boolean deleteSelf) {
2367 rajveer 129
	    if (dir.isDirectory()) {
130
	        String[] children = dir.list();
131
	        for (int i=0; i<children.length; i++) {
2369 rajveer 132
	            boolean success = cleanDir(new File(dir, children[i]), true);
2367 rajveer 133
	            if (!success) {
134
	                return false;
135
	            }
136
	        }
137
	    }
138
	    // The directory is now empty so delete it
2369 rajveer 139
	    if(deleteSelf){
140
	    	return dir.delete();
141
	    }
142
	    return true;
2367 rajveer 143
	}
144
 
145
 
146
	private void removeOldResources() throws IOException{
147
		File f = new File(Utils.EXPORT_SOLR_PATH);
148
		if(f.exists()){
2369 rajveer 149
			cleanDir(f, false);
2367 rajveer 150
		}
151
 
152
		File f1 = new File(Utils.EXPORT_ENTITIES_PATH_LOCALHOST);
153
		if(f1.exists()){
2369 rajveer 154
			cleanDir(f1, false);
2367 rajveer 155
		}
156
 
157
		File f2 = new File(Utils.EXPORT_ENTITIES_PATH_SAHOLIC);
158
		if(f2.exists()){
2369 rajveer 159
			cleanDir(f2, false);
2367 rajveer 160
		}
161
 
162
		File f3 = new File(Utils.EXPORT_ENTITIES_PATH_SHOP2020);
163
		if(f3.exists()){
2369 rajveer 164
			cleanDir(f3, false);
2367 rajveer 165
		}
166
	}
167
 
168
    /**
169
     * Update the prices in the generated content
170
     * @throws Exception
171
     */
172
    private void updatePrices() throws Exception {
173
    	lastGenerationTime = new Long(0);
174
        if(GENERATION_TYPE.equals("ONE")) {
175
            items = client.getItemsByCatalogId(Long.parseLong(ENTITY_ID));
176
        }else{
177
            items = client.getAllItemsByStatus(status.ACTIVE);
178
            items.addAll(client.getAllItemsByStatus(status.PAUSED));
179
 
180
            //Clean up the data from the solr directories.
181
            removeOldResources();
182
 
183
        }
184
        //this still needs to be evolved. Must not be used.
185
        if(GENERATION_TYPE.equals("INCREMENTAL")) {
186
        }
187
 
188
 
2171 rajveer 189
 
2367 rajveer 190
        //Populate the entityIdIemMap 
191
        populateEntityIdItemMap();
192
 
193
        PriceInsertor priceInserter = new PriceInsertor();
194
 
195
        for(Map.Entry<Long, List<Item>> entry: entityIdItemMap.entrySet()){
196
        	long entityId = entry.getKey();
197
        	List<Item> items = entry.getValue();
198
            //TODO Domain name and destination  directory should be read from properties file
199
        	priceInserter.insertPriceInHtml(items, entityId, "saholic.com", Utils.EXPORT_ENTITIES_PATH_SAHOLIC);
200
        	priceInserter.insertPriceInHtml(items, entityId, "shop2020.in", Utils.EXPORT_ENTITIES_PATH_SHOP2020);
201
        	priceInserter.insertPriceInHtml(items, entityId, "localhost:8090", Utils.EXPORT_ENTITIES_PATH_LOCALHOST);
202
        	priceInserter.insertPriceInSolrData(entityId, getMinPrice(items));
203
        }
204
 
205
        //Generate partners and json objects for phones only
206
        if(!GENERATION_TYPE.equals("ONE")) {
207
        	ProductListGenerator generator = new ProductListGenerator(entityIdItemMap);
208
			generator.generateProductsListXML();
209
			generator.generateProductListJavascript();
210
        }
211
 
2171 rajveer 212
    }
213
 
2367 rajveer 214
 
2171 rajveer 215
    /**
2367 rajveer 216
     * 
217
     * @param items
218
     * @return the minimum price of the items
219
     */
220
	private double getMinPrice(List<Item> items){
221
        double minPrice = Double.MAX_VALUE;
222
        for(Item item: items){
223
            if(minPrice > item.getSellingPrice()){
224
                minPrice = item.getSellingPrice();
225
            }
226
        }
227
        return minPrice;
228
    }
229
 
230
 
231
	/**
2171 rajveer 232
     * Generates content for the specified entity embedding links to the
233
     * specified domain name.
234
     * 
2367 rajveer 235
     * The method will not generate content if one of the following conditions is met:
2171 rajveer 236
     * <ol>
237
     * <li>The entity is not ready.
238
     * <li>The category has not been updated yet. (Set to -1).
2367 rajveer 239
     * <li>The content has not been updated.
2171 rajveer 240
     * </ol>
2367 rajveer 241
     *
242
     * @throws
2171 rajveer 243
     */
244
    private void generateContent() throws Exception{
2367 rajveer 245
        if(GENERATION_TYPE.equals("ALL")) {
246
        	entities = CreationUtils.getEntities();
247
            lastGenerationTime = new Long(0);
248
        }else if(GENERATION_TYPE.equals("ONE")) {
249
        	entities = new HashMap<Long, Entity>();
250
        	entities.put(Long.parseLong(ENTITY_ID), CreationUtils.getEntity(Long.parseLong(ENTITY_ID)));
2171 rajveer 251
            lastGenerationTime = new Long(0);   
252
        }else{
2367 rajveer 253
        	entities = CreationUtils.getEntities();
2171 rajveer 254
            lastGenerationTime = CreationUtils.getLastContentGenerationTime();
255
            if(lastGenerationTime==null){
256
                lastGenerationTime = new Long(0);
257
            }    
258
        }
2367 rajveer 259
        //Filter invalid entities here
260
        List<Entity> validEntities = new ArrayList<Entity>();
261
        for(long entityID: entities.keySet()){
262
        	if(isValidEntity(entities.get(entityID))){
263
        		validEntities.add(entities.get(entityID));
264
        	}
2171 rajveer 265
        }
2367 rajveer 266
        //Calculate comparison scores
267
        NewCMP cmp = new NewCMP(validEntities);
2171 rajveer 268
        Map<Long, Map<Long, Double>> slideScoresByEntity = cmp.getSlideScores();
2367 rajveer 269
        CreationUtils.storeSlideScores(slideScoresByEntity);
2658 rajveer 270
 
271
        AccessoriesFinder af = new AccessoriesFinder();
272
		Map<Long, Map<Long, List<Long>>> relatedAccessories = af.findAccessories();
273
		CreationUtils.storeRelatedAccessories(relatedAccessories);
274
 
2171 rajveer 275
        NewVUI vui = new NewVUI(lastGenerationTime);
2367 rajveer 276
        for(Entity entity: validEntities){
2433 rajveer 277
        		vui.generateContentForOneEntity(entity, Utils.EXPORT_VELOCITY_PATH);
2171 rajveer 278
        }
2367 rajveer 279
        CreationUtils.storeLastContentGenerationTime((new Date()).getTime());
280
 
281
 
282
        NewIR ir = new NewIR(validEntities);
2227 rajveer 283
        ir.exportIRData();
2367 rajveer 284
        //ir.transformIrDataXMLtoSolrXML();
2227 rajveer 285
        ir.exportIRMetaData();
286
        ir.transformIrMetaDataXMLSolrSchemaXML();
287
 
2493 rajveer 288
        items = client.getAllItemsByStatus(status.ACTIVE);
289
        items.addAll(client.getAllItemsByStatus(status.PAUSED));
2557 rajveer 290
        items.addAll(client.getAllItemsByStatus(status.CONTENT_COMPLETE));
2493 rajveer 291
        populateEntityIdItemMap();
292
        for(Map.Entry<Long, List<Item>> entry: entityIdItemMap.entrySet()){
293
        	List<Item> items = entry.getValue();
294
        	for(Item item: items){
295
        		if(item.getItemStatus()==status.CONTENT_COMPLETE){
296
                    item.setItemStatus(status.ACTIVE);
297
                    item.setStatus_description("This item is active");
298
                    client.updateItem(item);
299
        		}
300
        	}
301
        }
2171 rajveer 302
    }
2367 rajveer 303
 
2171 rajveer 304
 
305
    /**
2367 rajveer 306
     * Checks weather entity is valid or not. Entity will be invalid in one of these cases:
307
     * <ol>
308
     * <li>The entity is not ready.
309
     * <li>The category has not been updated yet. (Set to -1).
310
     * <li>Content has not been updated after last content generation timestamp.
311
     * </ol>
312
     * 
313
     * @param entity
314
     * @return
315
     * @throws Exception
2171 rajveer 316
     */
2367 rajveer 317
    private boolean isValidEntity(Entity entity) throws Exception{
318
        ExpandedEntity expEntity = new ExpandedEntity(entity);
319
        EntityState state = CreationUtils.getEntityState(entity.getID());
320
        long categoryID = expEntity.getCategoryID();
321
 
322
        if(state.getStatus() != EntityStatus.READY ||  categoryID == -1){
323
            return false;
324
        }
325
        if(state.getMerkedReadyOn().getTime() < this.lastGenerationTime){
326
            return false;
327
        }
328
        return true;
329
    }
330
 
331
 
332
    private void populateEntityIdItemMap(){
2171 rajveer 333
        Date todate = new Date();
2367 rajveer 334
        for(Item item: items){
2171 rajveer 335
            //TODO Can be removed as we are checking in calling function
336
            if(!(item.getItemStatus()==status.ACTIVE || item.getItemStatus()==status.CONTENT_COMPLETE || item.getItemStatus() == status.PAUSED)){
337
                continue;
338
            }
339
            if(todate.getTime() < item.getStartDate()){
340
                continue;
341
            }
2367 rajveer 342
            List<Item> itemList = entityIdItemMap.get(item.getCatalogItemId());
2171 rajveer 343
            if(itemList == null){
344
                itemList = new ArrayList<Item>();
345
            }
346
            itemList.add(item);
347
            entityIdItemMap.put(item.getCatalogItemId(), itemList);
348
        }
2367 rajveer 349
 
350
        //Remove all items which have not been updated since last content generation.
2171 rajveer 351
        List<Long> removeEntities = new ArrayList<Long>();
352
        for(Long entityId:entityIdItemMap.keySet()){
353
            boolean isValidEntity = false;
2367 rajveer 354
            //If any one of the items has been updated before current timestamp, than we generate content for whole entity
2171 rajveer 355
            for(Item item: entityIdItemMap.get(entityId)){
2367 rajveer 356
                if(item.getUpdatedOn() > lastGenerationTime){
2171 rajveer 357
                    isValidEntity = true;
358
                }
359
            }
360
            if(!isValidEntity){
361
                removeEntities.add(entityId);
362
            }
363
        }
364
        for(Long entityId: removeEntities){
365
            entityIdItemMap.remove(entityId);
366
        }
367
    }
368
 
369
}