Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
62 naveen 1
/**
2
 * 
3
 */
4
package in.shop2020.util;
5
 
102 naveen 6
import in.shop2020.metamodel.core.Bullet;
63 naveen 7
import in.shop2020.metamodel.core.Entity;
8
import in.shop2020.metamodel.core.Feature;
102 naveen 9
import in.shop2020.metamodel.core.PrimitiveDataObject;
63 naveen 10
import in.shop2020.metamodel.core.Slide;
102 naveen 11
import in.shop2020.metamodel.definitions.BulletDefinition;
63 naveen 12
import in.shop2020.metamodel.definitions.Catalog;
64 naveen 13
import in.shop2020.metamodel.definitions.Category;
83 naveen 14
import in.shop2020.metamodel.definitions.DatatypeDefinition;
63 naveen 15
import in.shop2020.metamodel.definitions.DefinitionsContainer;
16
import in.shop2020.metamodel.definitions.EntityContainer;
82 naveen 17
import in.shop2020.metamodel.definitions.FacetDefinition;
88 naveen 18
import in.shop2020.metamodel.definitions.FacetRuleDefinition;
63 naveen 19
import in.shop2020.metamodel.definitions.FeatureDefinition;
20
import in.shop2020.metamodel.definitions.SlideDefinition;
67 naveen 21
import in.shop2020.metamodel.util.ExpandedBullet;
83 naveen 22
import in.shop2020.metamodel.util.ExpandedBulletDefinition;
63 naveen 23
import in.shop2020.metamodel.util.ExpandedCategoryFacetDefinition;
64 naveen 24
import in.shop2020.metamodel.util.ExpandedEntity;
82 naveen 25
import in.shop2020.metamodel.util.ExpandedFacetDefinition;
81 naveen 26
import in.shop2020.metamodel.util.ExpandedFacetRuleDefinition;
65 naveen 27
import in.shop2020.metamodel.util.ExpandedFeature;
83 naveen 28
import in.shop2020.metamodel.util.ExpandedFeatureDefinition;
65 naveen 29
import in.shop2020.metamodel.util.ExpandedSlide;
451 rajveer 30
import in.shop2020.model.v1.catalog.CatalogService.Client;
31
import in.shop2020.model.v1.catalog.Item;
32
import in.shop2020.thrift.clients.CatalogServiceClient;
63 naveen 33
 
341 rajveer 34
import java.io.File;
35
import java.io.FileOutputStream;
81 naveen 36
import java.util.ArrayList;
91 naveen 37
import java.util.HashMap;
81 naveen 38
import java.util.List;
82 naveen 39
import java.util.Map;
451 rajveer 40
import java.util.Map.Entry;
81 naveen 41
 
341 rajveer 42
import javax.xml.transform.TransformerConfigurationException;
43
import javax.xml.transform.TransformerFactory;
44
import javax.xml.transform.Transformer;
45
import javax.xml.transform.stream.StreamResult;
46
import javax.xml.transform.stream.StreamSource;
47
 
81 naveen 48
import org.apache.commons.lang.ArrayUtils;
49
import org.apache.commons.lang.StringEscapeUtils;
50
import org.apache.commons.lang.StringUtils;
51
 
341 rajveer 52
 
62 naveen 53
/**
54
 * Command line utility to convert IR Definitions into IR Data and IR Meta-data
55
 * 
81 naveen 56
 * Usage: IR [irmetadata|irdata] {Category ID}
57
 * 
62 naveen 58
 * @author naveen
59
 *
60
 */
61
public class IR {
63 naveen 62
 
62 naveen 63
	/**
64 naveen 64
	 * 
65
	 */
63 naveen 66
	private long categoryID;
67
 
68
	/**
64 naveen 69
	 * Level - 4, 8, 12, 16
70
	 */
71
	private String[] xmlIndentation = {"", "    ", "        ", "            ", 
72
			"                "};
83 naveen 73
 
74
	private String[] xmlTabIndentation = {"", "\t", "\t\t", "\t\t\t", 
75
			"\t\t\t\t", "\t\t\t\t\t", "\t\t\t\t\t\t"};
91 naveen 76
 
77
	private Map<Long, List<String>> facetIDFacetValues = 
78
		new HashMap<Long, List<String>>();
64 naveen 79
 
80
	/**
62 naveen 81
	 * @param args
63 naveen 82
	 * @throws Exception 
62 naveen 83
	 */
63 naveen 84
	public static void main(String[] args) throws Exception {
81 naveen 85
		String[] commands = new String[] {"irmetadata", "irdata"};
62 naveen 86
 
81 naveen 87
		String usage = "Usage: IR ["+ StringUtils.join(commands, "|") +
88
			"] {Category ID}\n";
89
 
90
		if(args.length < 1) {
63 naveen 91
			System.out.println(usage);
92
			System.exit(-1);
93
		}
81 naveen 94
 
95
		String inputCommand = args[0];
96
 
97
		if(!ArrayUtils.contains(commands, inputCommand)) {
98
			System.out.println(usage);
99
			System.exit(-1);
100
		}
64 naveen 101
 
102
		long categoryID = 0L;
81 naveen 103
		if(args.length > 1) {
64 naveen 104
			try {
81 naveen 105
				categoryID = Long.parseLong(args[1]);
64 naveen 106
			}
107
			catch (NumberFormatException nfe) {
108
				System.out.println(usage);
109
				System.exit(-1);
110
			}
63 naveen 111
		}
112
 
113
		IR ir = new IR(categoryID);
81 naveen 114
 
115
		if (inputCommand.equals("irdata")) {
116
			ir.exportIRData();
341 rajveer 117
			ir.transformIrDataXMLtoSolrXML();
81 naveen 118
			return;
119
		}
120
 
121
		if (inputCommand.equals("irmetadata")) {
122
			ir.exportIRMetaData();
341 rajveer 123
			ir.transformIrMetaDataXMLSolrSchemaXML();
81 naveen 124
			return;
125
		}
126
 
62 naveen 127
	}
63 naveen 128
 
129
	/**
130
	 * 
131
	 * @param categoryID
132
	 */
133
	public IR(long categoryID) {
134
		this.categoryID = categoryID;
135
	}
136
 
341 rajveer 137
 
63 naveen 138
	/**
81 naveen 139
	 * 
341 rajveer 140
	 * @param inXMLFilename
141
	 * @param xslFilename
142
	 * @param outXMLFilename
143
	 * @throws Exception 
144
	 */
145
 
146
	public void xsltTransformation(String inXMLFilename, String xslFilename, String outXMLFilename) throws Exception{
147
		// Use the static TransformerFactory.newInstance() method to instantiate 
148
		  // a TransformerFactory. The javax.xml.transform.TransformerFactory 
149
		  // system property setting determines the actual class to instantiate --
150
		  // org.apache.xalan.transformer.TransformerImpl.
151
		TransformerFactory tFactory = TransformerFactory.newInstance();
152
 
153
			// Use the TransformerFactory to instantiate a Transformer that will work with  
154
			// the stylesheet you specify. This method call also processes the stylesheet
155
		  // into a compiled Templates object.
156
		Transformer transformer = tFactory.newTransformer(new StreamSource(xslFilename));
157
 
158
			// Use the Transformer to apply the associated Templates object to an XML document
159
			// (foo.xml) and write the output to a file (foo.out).
160
		transformer.transform(new StreamSource(inXMLFilename), new StreamResult(new FileOutputStream(outXMLFilename)));
161
 
162
	}
163
 
164
	/**
165
	 * 
81 naveen 166
	 * @throws Exception
167
	 */
341 rajveer 168
	public void transformIrDataXMLtoSolrXML() throws Exception {
169
		String irDataFilename = Utils.EXPORT_IR_PATH + "irdata.xml";
170
		String irSolrDataFilename = Utils.EXPORT_SOLR_PATH + "irdata_solr.xml";
171
		String irXslFilename = "src/xsl/irdata_solrdata.xsl";
172
		System.out.println(irSolrDataFilename);
173
		File solrFile = new File(irSolrDataFilename);
174
		if(!solrFile.exists()){
175
			solrFile.createNewFile();
176
		}
177
		xsltTransformation(irDataFilename, irXslFilename, irSolrDataFilename);
178
	}
179
 
180
 
181
	/**
182
	 * 
183
	 * @throws Exception
184
	 */
185
	public void transformIrMetaDataXMLSolrSchemaXML() throws Exception {
186
		String irDataFilename = Utils.EXPORT_IR_PATH + "irmetadata.xml";
187
		String irSolrDataFilename = Utils.EXPORT_SOLR_PATH + "irmetadata_solrschema.xml";
188
		String irXslFilename = "src/xsl/irmetadata_solrschema.xsl";
189
		System.out.println(irSolrDataFilename);
190
		File solrFile = new File(irSolrDataFilename);
191
		if(!solrFile.exists()){
192
			solrFile.createNewFile();
193
		}
194
		xsltTransformation(irDataFilename, irXslFilename, irSolrDataFilename);
195
	}
196
 
197
 
198
 
199
	/**
200
	 * 
201
	 * @throws Exception
202
	 */
81 naveen 203
	public void exportIRMetaData() throws Exception {
204
		DefinitionsContainer defs = 
205
			Catalog.getInstance().getDefinitionsContainer();
82 naveen 206
 
81 naveen 207
		// <IRMetaData>
82 naveen 208
		List<String> xmlSnippets = new ArrayList<String>();
209
		xmlSnippets.add("<IRMetaData>");
83 naveen 210
		xmlSnippets.add("\t<Facets>");
81 naveen 211
 
82 naveen 212
		IRMetaDataJythonWrapper jy = new IRMetaDataJythonWrapper();
81 naveen 213
 
83 naveen 214
		List<Long> facetFeatures = new ArrayList<Long>();
215
 
81 naveen 216
		// Iterate over all facet definitions
82 naveen 217
		Map<Long, FacetDefinition> facetDefs = defs.getFacetDefinitions();
218
		for(FacetDefinition facetDef : facetDefs.values()) {
219
 
220
			jy.reset();
221
			jy.initialize();
222
 
223
			ExpandedFacetDefinition expFacetDef = 
224
				new ExpandedFacetDefinition(facetDef);
225
 
226
			jy.setExpandedFacetDefinition(expFacetDef);
227
 
228
			jy.executeRule();
229
 
230
			String facetXMLSnip = jy.getXMLSnippet();
231
			Utils.info("facetXMLSnip=" + facetXMLSnip);
232
 
233
			xmlSnippets.add(facetXMLSnip);
83 naveen 234
 
235
			facetFeatures.add(new Long(expFacetDef.getFeatureDefinitionID()));
82 naveen 236
		}
83 naveen 237
		xmlSnippets.add("\t</Facets>");
81 naveen 238
 
83 naveen 239
		Utils.info("facetFeatures=" + facetFeatures);
240
 
241
		xmlSnippets.add("\n\t<Properties>");
242
 
81 naveen 243
		// Iterate over all feature definitions
83 naveen 244
		Map<Long, FeatureDefinition> featureDefs = defs.getFeatureDefinitions();
245
		for(FeatureDefinition featureDef : featureDefs.values()) {
246
			if(facetFeatures.contains(new Long(featureDef.getID()))) {
247
				// Ignore, is already covered as facet
248
				continue;
249
			}
250
			String propertyXMLSnip = this.getPropertyXMLSnippet(featureDef);
251
			Utils.info("propertyXMLSnip=" + propertyXMLSnip);
252
 
253
			xmlSnippets.add(propertyXMLSnip);
254
		}
81 naveen 255
 
83 naveen 256
		xmlSnippets.add("\t</Properties>");
257
 
258
		xmlSnippets.add("\n\t<Categories>");
259
 
260
		// Iterate over all categories
580 rajveer 261
		/*
83 naveen 262
		Category rootCategory = defs.getCategory(10000);
263
		List<Category> children = rootCategory.getChildrenCategory();
264
		for (Category child : children) {
516 rajveer 265
 
83 naveen 266
			String categoryXMLSnip = this.getCategoryXMLSnippet(child, 2);
267
			Utils.info("categoryXMLSnip=" + categoryXMLSnip);
268
 
269
			xmlSnippets.add(categoryXMLSnip);
270
		}
580 rajveer 271
		*/
272
 
273
		Category rootCategory = defs.getCategory(10000);
274
		String categoryXMLSnip = this.getCategoryXMLSnippet(rootCategory, 2);
275
		Utils.info("categoryXMLSnip=" + categoryXMLSnip);
276
 
277
		xmlSnippets.add(categoryXMLSnip);
278
 
279
 
83 naveen 280
		xmlSnippets.add("\t</Categories>");
281
 
81 naveen 282
		// </IRMetaData>
82 naveen 283
		xmlSnippets.add("</IRMetaData>");
81 naveen 284
 
82 naveen 285
		String irMetaDataXML = StringUtils.join(xmlSnippets, "\n");
81 naveen 286
		Utils.info(irMetaDataXML);
287
 
288
		// Write it to file
289
		String irMetaDataFilename = Utils.EXPORT_IR_PATH + "irmetadata.xml";
290
		DBUtils.store(irMetaDataXML, irMetaDataFilename);
291
	}
292
 
293
	/**
83 naveen 294
	 * 
295
	 * @param category
296
	 * @return
63 naveen 297
	 * @throws Exception 
83 naveen 298
	 */
299
	private String getCategoryXMLSnippet(Category category, int indent) 
300
		throws Exception {
301
 
302
		DefinitionsContainer defs = 
303
			Catalog.getInstance().getDefinitionsContainer();
304
 
305
		String xmlSnip = this.xmlTabIndentation[indent] + "<Category";
306
 
307
		xmlSnip += " ID=\"" + category.getID() + "\"";
308
		xmlSnip += " label=\"" + category.getLabel() + "\"";
309
		xmlSnip += ">\n";
310
 
311
		List<Category> children = category.getChildrenCategory();
312
 
313
		if(children != null) {
314
			for(Category child : children) {
315
				xmlSnip += this.getCategoryXMLSnippet(child, indent+1);
316
			}
317
		}
318
		else {
319
			// Only leaf category will have entities
320
			// Facet IDs
321
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Facets>\n";
322
 
323
			List<Long> facetDefIDs = 
324
				defs.getFacetDefinitionIDs(category.getID());
325
			Utils.info("facetDefIDs=" + facetDefIDs);
326
 
516 rajveer 327
 
328
 
329
			if( facetDefIDs != null && !facetDefIDs.isEmpty() ){
330
					for(Long facetDefID : facetDefIDs) {
331
					xmlSnip += this.xmlTabIndentation[indent+2] + 
332
						"<FacetID>" + facetDefID + "</FacetID>\n";
333
				}
83 naveen 334
			}
335
 
516 rajveer 336
 
83 naveen 337
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Facets>\n\n";
338
 
339
			// Feature IDs
340
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Properties>\n";
341
 
342
			List<Long> featureDefIDs = 
343
				defs.getFeatureDefinitionIDs(category.getID());
344
			Utils.info("featureDefIDs=" + featureDefIDs);
345
 
346
			for(Long featureDefID : featureDefIDs) {
347
				xmlSnip += this.xmlTabIndentation[indent+2] + 
348
					"<FeatureID>" + featureDefID + "</FeatureID>\n";
349
			}
350
 
351
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Properties>\n";
352
		}
353
 
354
		xmlSnip += this.xmlTabIndentation[indent] + "</Category>\n";
355
 
356
		return xmlSnip;
357
	}
358
 
359
	/**
63 naveen 360
	 * 
83 naveen 361
	 * @param featureDef
362
	 * @return
363
	 * @throws Exception 
63 naveen 364
	 */
83 naveen 365
	private String getPropertyXMLSnippet(FeatureDefinition featureDef) 
366
		throws Exception {
367
		String xmlSnip = "\t\t<Property";
368
 
369
		xmlSnip += " ID=\"" + featureDef.getID() + "\"";
370
		xmlSnip += " label=\"" + featureDef.getLabel() + "\"";
371
 
372
		ExpandedFeatureDefinition expFeatureDef = 
373
			new ExpandedFeatureDefinition(featureDef);
374
 
375
		ExpandedBulletDefinition expBulletDef = 
376
			expFeatureDef.getExpandedBulletDefinition();
377
 
378
		String datatype = "string";
379
		if(expBulletDef.isComposite() || expBulletDef.isEnumerated()) {
380
			datatype = "string";
381
		}
382
		else {
383
			DatatypeDefinition datatypeDef = 
384
				expBulletDef.getDatatypeDefinition();
385
 
386
			datatype = datatypeDef.getName();
387
 
388
			// REVISIT
389
			if(datatype.equals("hours_mins") || datatype.equals("days_hours") ||
390
					datatype.equals("hours_mins") || 
391
					datatype.equals("days_hours")) {
392
				datatype = "string";
393
			}
394
		}
395
		xmlSnip += " datatype=\"" + datatype + "\"";
396
 
397
		String multivalue = "false";
398
		if (expBulletDef.isMultivalue()) {
399
			multivalue = "true";
400
		}
401
		xmlSnip += " isMultivalue=\"" + multivalue + "\"";
402
 
403
		xmlSnip += "/>";
404
		return xmlSnip;
405
	}
406
 
407
	/**
408
	 * @throws Exception 
409
	 * 
410
	 */
63 naveen 411
	public void exportIRData() throws Exception {
412
		DefinitionsContainer defs = 
413
			Catalog.getInstance().getDefinitionsContainer();
414
 
415
		EntityContainer ents = 
416
			Catalog.getInstance().getEntityContainer();
417
 
64 naveen 418
		// <IRData>
419
		List<String> entityXMLSnippets = new ArrayList<String>();
420
		entityXMLSnippets.add("<IRData>");
63 naveen 421
 
64 naveen 422
		List<Category> categories = null;
423
		if(this.categoryID != 0L) {
424
			categories = new ArrayList<Category>();
425
			categories.add(defs.getCategory(this.categoryID));
426
		}
427
		else {
428
			// Get all categories
429
			categories = defs.getChildrenCategories(10001);
430
		}
63 naveen 431
 
580 rajveer 432
		int i=0;
64 naveen 433
		for(Category cat : categories) {
434
			long catID = cat.getID();
580 rajveer 435
			if(i>0){
436
				continue;
437
			}
438
			i++;
64 naveen 439
			// Get all facets for the category
440
			ExpandedCategoryFacetDefinition expCategoryFacetDef = 
441
				defs.getExpandedCategoryFacetDefinition(catID);
442
 
81 naveen 443
			List<ExpandedFacetRuleDefinition> expFacetRuleDefs = 
444
				expCategoryFacetDef.getExpandedFacetRuleDefinitions();
64 naveen 445
 
446
			// Get all entities for the category
447
			List<Entity> entities = ents.getEntities(catID);
448
 
449
			if(entities == null) {
450
				continue;
451
			}
452
 
516 rajveer 453
 
454
			//Modified by Rajveer, Now it will search according to each catalog item.
455
			// For each entity in catalog
456
 
457
			CatalogServiceClient catalogServiceClient = new CatalogServiceClient();
458
			in.shop2020.model.v1.catalog.InventoryService.Client client = catalogServiceClient.getClient();
459
			List<Item> items = client.getAllItems(false);
460
 
461
			for(Item item : items){
462
				long entityID = item.getCatalogItemId();
463
				ExpandedEntity expEntity = 
464
					ents.getExpandedEntity(entityID);
465
				//Skip if entity doesnt exist
466
				if(expEntity == null){
467
					continue;
468
				}
469
				List<String> facetXMLSnippets = new ArrayList<String>();
470
 
471
				// Collect features which have become FACETs
472
				List<Long> facetFeatureIDs = new ArrayList<Long>();
473
 
474
				// For each facet execute Rule
475
				for(ExpandedFacetRuleDefinition expFacetRuleDef : 
476
						expFacetRuleDefs) {
477
					String facetXMLSnip = 
478
						this.processFacet(expEntity, expFacetRuleDef);
479
 
480
					if(facetXMLSnip != null && 
481
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
482
						facetXMLSnippets.add(facetXMLSnip);
483
						Utils.info("1 facetXMLSnip=" + facetXMLSnip);
484
					}
485
 
486
					// Collect features already covered as Facet
487
					if(expFacetRuleDef.getFeatureDefinition() != null) {
488
						facetFeatureIDs.add(new Long(
489
								expFacetRuleDef.getFeatureDefinitionID()));
490
					}
491
				}
492
				Entity entity = Catalog.getInstance().getEntityContainer().getEntity(entityID);
493
				// Handle borrowed slides
494
				List<Slide> borrowedSlides = ents.getBorrowedSlides(entity);
495
 
496
				for (Slide borrowedSlide : borrowedSlides) {
497
					if(borrowedSlide.getBorrowedCategoryID() == -1){
498
						continue;
499
					}
500
					String facetXMLSnip = this.processBorrowedSlide(expEntity,
501
							borrowedSlide);
502
 
503
					if(facetXMLSnip != null && 
504
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
505
						facetXMLSnippets.add(facetXMLSnip);
506
					}
507
 
508
					Utils.info("2 facetXMLSnip=" + facetXMLSnip);
509
				}
510
 
511
				String facetXMLSnippetsStr = 
512
					StringUtils.join(facetXMLSnippets, "\n");
513
 
514
				Utils.info("facetXMLSnippetsStr=" + facetXMLSnippetsStr);
515
 
516
				// Collect PROPERTIES
517
				String propertiesXMLSnippetsStr = 
518
					this.getPropertiesXMLSnippet(expEntity, facetFeatureIDs, 2);
519
 
520
				Utils.info(propertiesXMLSnippetsStr);
521
 
522
				String entityXMLSnip = this.getEntityXMLSnippet(expEntity, 
523
						facetXMLSnippetsStr, propertiesXMLSnippetsStr, 1);
524
 
525
				Utils.info(entityXMLSnip);
526
 
527
				entityXMLSnippets.add(entityXMLSnip);
528
			}
529
		}
530
 
531
 
532
			/*
64 naveen 533
			// For each entity 
63 naveen 534
			for(Entity entity : entities) {
64 naveen 535
				ExpandedEntity expEntity = 
536
					ents.getExpandedEntity(entity.getID());
346 rajveer 537
				//Skip if entity doesnt exist
538
				if(expEntity == null){
539
					continue;
540
				}
64 naveen 541
				List<String> facetXMLSnippets = new ArrayList<String>();
542
 
88 naveen 543
				// Collect features which have become FACETs
67 naveen 544
				List<Long> facetFeatureIDs = new ArrayList<Long>();
545
 
63 naveen 546
				// For each facet execute Rule
81 naveen 547
				for(ExpandedFacetRuleDefinition expFacetRuleDef : 
548
						expFacetRuleDefs) {
64 naveen 549
					String facetXMLSnip = 
81 naveen 550
						this.processFacet(expEntity, expFacetRuleDef);
63 naveen 551
 
88 naveen 552
					if(facetXMLSnip != null && 
553
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
64 naveen 554
						facetXMLSnippets.add(facetXMLSnip);
88 naveen 555
						Utils.info("1 facetXMLSnip=" + facetXMLSnip);
63 naveen 556
					}
67 naveen 557
 
558
					// Collect features already covered as Facet
81 naveen 559
					if(expFacetRuleDef.getFeatureDefinition() != null) {
88 naveen 560
						facetFeatureIDs.add(new Long(
561
								expFacetRuleDef.getFeatureDefinitionID()));
67 naveen 562
					}
63 naveen 563
				}
564
 
88 naveen 565
				// Handle borrowed slides
566
				List<Slide> borrowedSlides = ents.getBorrowedSlides(entity);
567
 
568
				for (Slide borrowedSlide : borrowedSlides) {
569
					String facetXMLSnip = this.processBorrowedSlide(expEntity,
570
							borrowedSlide);
571
 
572
					if(facetXMLSnip != null && 
573
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
574
						facetXMLSnippets.add(facetXMLSnip);
575
					}
576
 
577
					Utils.info("2 facetXMLSnip=" + facetXMLSnip);
578
				}
579
 
64 naveen 580
				String facetXMLSnippetsStr = 
581
					StringUtils.join(facetXMLSnippets, "\n");
582
 
88 naveen 583
				Utils.info("facetXMLSnippetsStr=" + facetXMLSnippetsStr);
64 naveen 584
 
67 naveen 585
				// Collect PROPERTIES
586
				String propertiesXMLSnippetsStr = 
587
					this.getPropertiesXMLSnippet(expEntity, facetFeatureIDs, 2);
64 naveen 588
 
67 naveen 589
				Utils.info(propertiesXMLSnippetsStr);
590
 
591
				String entityXMLSnip = this.getEntityXMLSnippet(expEntity, 
592
						facetXMLSnippetsStr, propertiesXMLSnippetsStr, 1);
593
 
64 naveen 594
				Utils.info(entityXMLSnip);
595
 
596
				entityXMLSnippets.add(entityXMLSnip);
63 naveen 597
			}
598
		}
516 rajveer 599
		*/
600
 
64 naveen 601
		// </IRData>
602
		entityXMLSnippets.add("</IRData>");
603
 
604
		String irDataXML = StringUtils.join(entityXMLSnippets, "\n");
605
		Utils.info(irDataXML);
606
 
607
		// Write it to file
70 naveen 608
		String irDataFilename = Utils.EXPORT_IR_PATH + "irdata.xml";
64 naveen 609
		DBUtils.store(irDataXML, irDataFilename);
91 naveen 610
 
611
		// Store facet values
457 rajveer 612
		String facetValuesFilename = Utils.CONTENT_DB_PATH + "entities" + File.separator + "facetvalues.ser";
91 naveen 613
 
614
		Utils.info("this.facetIDFacetValues=" + this.facetIDFacetValues);
615
		DBUtils.store(this.facetIDFacetValues, facetValuesFilename);
63 naveen 616
	}
64 naveen 617
 
618
	/**
619
	 * 
88 naveen 620
	 * @param borrowedSlides
621
	 * @return
622
	 */
623
	private String processBorrowedSlide(ExpandedEntity expEntity, 
624
			Slide borrowedSlide) throws Exception {
625
		// Borrowed category ID
626
		long borrowedCategoryID = borrowedSlide.getBorrowedCategoryID();
627
		Utils.info("borrowedCategoryID=" + borrowedCategoryID);
628
 
629
		// Slide definition ID
630
		long slideDefID = borrowedSlide.getSlideDefinitionID();
631
		Utils.info("borrowed slideDefID=" + slideDefID);
632
 
633
		DefinitionsContainer defs = 
634
			Catalog.getInstance().getDefinitionsContainer();
635
 
636
		// Get IR Data Rule
637
		FacetRuleDefinition facetRuleDef = 
638
			defs.getFacetRuleDefinitionForSlide(borrowedCategoryID, slideDefID);
639
 
640
		Utils.info("borrowed facetRuleDef=" + facetRuleDef);
641
		String facetXMLSnippet = null; 
642
 
643
		// If there is direct IR data rule defined for borrowed slide
644
		if(facetRuleDef != null) {
645
			ExpandedFacetRuleDefinition expFacetRuleDef = 
646
				new ExpandedFacetRuleDefinition(facetRuleDef);
647
 
648
			// Return XML snippet
649
			facetXMLSnippet = this.processFacet(expEntity, expFacetRuleDef);
650
		}
651
		else {
652
			List<String> facetXMLSnippets = new ArrayList<String>();
653
 
654
			// Get FacetRuleDefinition objects for all features in 
655
			// borrowed slide for which IR rule is defined
656
			List<Feature> features = borrowedSlide.getFeatures();
657
			for (Feature feature : features) {
658
				String featureFacetXMLSnippet = 
659
					this.processBorrowedFeature(borrowedCategoryID, expEntity, 
660
						feature);
661
 
662
				if(featureFacetXMLSnippet != null && !StringUtils.trim(
663
						featureFacetXMLSnippet).isEmpty()) {
664
					facetXMLSnippets.add(featureFacetXMLSnippet);
665
				}
666
			}
667
 
668
			// Get FacetRuleDefinition objects for all children slides in 
669
			// borrowed slide for which IR rule is defined
670
			if(borrowedSlide.hasChildrenSlides()) {
671
				String childrenSlidesFacetXMLSnippet = 
672
					this.processBorrowedChildrenSlides(borrowedCategoryID, 
673
							expEntity, borrowedSlide);
674
 
675
				if(childrenSlidesFacetXMLSnippet != null && !StringUtils.trim(
676
						childrenSlidesFacetXMLSnippet).isEmpty()) {
677
					facetXMLSnippets.add(childrenSlidesFacetXMLSnippet);
678
				}
679
			}
680
 
681
			facetXMLSnippet = StringUtils.join(facetXMLSnippets, "\n");
682
		}
683
 
684
		if(StringUtils.trim(facetXMLSnippet).isEmpty()) {
685
			return null;
686
		}
687
 
688
		return facetXMLSnippet;
689
	}
690
 
691
	/**
692
	 * 
693
	 * @param borrowedCategoryID
64 naveen 694
	 * @param expEntity
88 naveen 695
	 * @param feature
696
	 * @return
697
	 * @throws Exception 
698
	 */
699
	private String processBorrowedFeature(long borrowedCategoryID, 
700
			ExpandedEntity expEntity, Feature feature) throws Exception {
701
 
702
		long featureDefID = feature.getFeatureDefinitionID();
703
		Utils.info("borrowed featureDefID=" + featureDefID);
704
 
705
		DefinitionsContainer defs = 
706
			Catalog.getInstance().getDefinitionsContainer();
707
 
708
		FacetRuleDefinition facetRuleDefForFeature = 
709
			defs.getFacetRuleDefinitionForFeature(borrowedCategoryID, 
710
				featureDefID);
711
 
712
		List<String> facetXMLSnippets = new ArrayList<String>();
713
 
714
		Utils.info("borrowed facetRuleDefForFeature=" + 
715
				facetRuleDefForFeature);
716
 
717
		if(facetRuleDefForFeature != null) {
718
			ExpandedFacetRuleDefinition expFacetRuleDefForFeature = 
719
				new ExpandedFacetRuleDefinition(facetRuleDefForFeature);
720
 
721
			String snip = this.processFacet(expEntity, 
722
					expFacetRuleDefForFeature);
723
 
724
			if(snip != null) {
725
				facetXMLSnippets.add(snip);
726
			}
727
		}
728
 
729
 
730
		String xmlSnip =  StringUtils.join(facetXMLSnippets, "\n");
731
 
732
		if(StringUtils.trim(xmlSnip).isEmpty()) {
733
			return null;
734
		}
735
 
736
		return xmlSnip;
737
	}
738
 
739
	/**
740
	 * 
741
	 * @param expEntity
742
	 * @param borrowedSlide
743
	 * @return
744
	 * @throws Exception 
745
	 */
746
	private String processBorrowedChildrenSlides(long borrowedCategoryID, 
747
			ExpandedEntity expEntity, Slide borrowedSlide) throws Exception {
748
		DefinitionsContainer defs = 
749
			Catalog.getInstance().getDefinitionsContainer();
750
 
751
		List<Slide> childrenSlides = borrowedSlide.getChildrenSlides();
752
		List<String> facetXMLSnippets = new ArrayList<String>();
753
 
754
		for (Slide childSlide : childrenSlides) {
755
			long childSlideDefID = childSlide.getSlideDefinitionID();
756
			Utils.info("borrowed childSlideDefID=" + childSlideDefID);
757
 
758
			FacetRuleDefinition facetRuleDefForSlide = 
759
				defs.getFacetRuleDefinitionForSlide(borrowedCategoryID, 
760
						childSlideDefID);
761
 
762
			Utils.info("borrowed facetRuleDefForSlide=" + 
763
					facetRuleDefForSlide);
764
 
765
			if(facetRuleDefForSlide != null) {
766
				ExpandedFacetRuleDefinition expFacetRuleDefForSlide = 
767
					new ExpandedFacetRuleDefinition(
768
							facetRuleDefForSlide);
769
 
770
				String snip = this.processFacet(expEntity, 
771
						expFacetRuleDefForSlide);
772
 
773
				if(snip != null && !StringUtils.trim(snip).isEmpty()) {
774
					facetXMLSnippets.add(snip);
775
				}
776
			}
777
 
778
			// Features?
779
			if(childSlide.hasFeatures()) {
780
				List<Feature> features = childSlide.getFeatures();
781
				for(Feature feature : features) {
782
					String childrenSlideFeatureFacetXMLSnippet = 
783
						this.processBorrowedFeature(borrowedCategoryID, expEntity, 
784
							feature);
785
 
786
					if(childrenSlideFeatureFacetXMLSnippet != null &&
787
						!StringUtils.trim(childrenSlideFeatureFacetXMLSnippet).
788
							isEmpty()) {
789
 
790
						facetXMLSnippets.add(
791
								childrenSlideFeatureFacetXMLSnippet);
792
 
793
					}
794
				}
795
			}
796
 
797
			// Children slides
798
			if(childSlide.hasChildrenSlides()) {
799
				String childrenSlidesFacetXMLSnippet = 
800
					this.processBorrowedChildrenSlides(borrowedCategoryID, 
801
							expEntity, childSlide);
802
 
803
				if(childrenSlidesFacetXMLSnippet != null &&
804
					!StringUtils.trim(childrenSlidesFacetXMLSnippet).
805
						isEmpty()) {
806
 
807
					facetXMLSnippets.add(childrenSlidesFacetXMLSnippet);
808
				}
809
			}
810
		}
811
 
812
		String xmlSnip =  StringUtils.join(facetXMLSnippets, "\n");
813
 
814
		if(StringUtils.trim(xmlSnip).isEmpty()) {
815
			return null;
816
		}
817
 
818
		return xmlSnip;
819
	}
820
 
821
 
822
	/**
823
	 * 
824
	 * @param expEntity
64 naveen 825
	 * @param expFacetDef
826
	 * @return
827
	 * @throws Exception 
828
	 */
829
	@SuppressWarnings("unchecked")
830
	private String processFacet(ExpandedEntity expEntity, 
81 naveen 831
			ExpandedFacetRuleDefinition expFacetRuleDef) throws Exception {
64 naveen 832
 
81 naveen 833
		Utils.info("expFacetRuleDef=" + expFacetRuleDef);
516 rajveer 834
 
835
		Utils.info("expEntity.getID()=" + expEntity.getID());
81 naveen 836
 
451 rajveer 837
		// to get the price from services and pass it on to fill in solr
838
 
839
		CatalogServiceClient catalogServiceClient = new CatalogServiceClient();
840
		in.shop2020.model.v1.catalog.InventoryService.Client client = catalogServiceClient.getClient();
841
 
516 rajveer 842
		double itemPrice = 0;
843
		Item item = client.getItemByCatalogId(expEntity.getID());
844
		if(item == null){
845
 
846
		}else{
847
			itemPrice = item.getSellingPrice();
451 rajveer 848
		}
849
 
850
 
64 naveen 851
		EntityContainer ents = 
852
			Catalog.getInstance().getEntityContainer();
853
 
102 naveen 854
		DefinitionsContainer defs = 
855
			Catalog.getInstance().getDefinitionsContainer();
856
 
81 naveen 857
		IRDataJythonWrapper jw = new IRDataJythonWrapper();
64 naveen 858
 
859
		jw.setExpandedEntity(expEntity);
82 naveen 860
		jw.setExpandedFacetRuleDefinition(expFacetRuleDef);
451 rajveer 861
		jw.setEntityPrice(itemPrice);
64 naveen 862
 
863
		// Set FeatureDefinition
864
		FeatureDefinition featureDef = 
81 naveen 865
			expFacetRuleDef.getFeatureDefinition();
866
 
64 naveen 867
		if(featureDef != null) {
868
			jw.setFeatureDefinition(featureDef);
869
 
870
			// Set Feature
871
			Utils.info("featureDef.getID()=" + featureDef.getID());
872
 
873
			Feature feature = 
874
				ents.getFeature(expEntity.getID(), featureDef.getID());
875
 
90 naveen 876
			// Special case for Brand
580 rajveer 877
			if(expFacetRuleDef.getFacetDefinitionID() == 50001 ||
878
			   expFacetRuleDef.getFacetDefinitionID() == 50010 ||
879
				expFacetRuleDef.getFacetDefinitionID() == 50011) {
90 naveen 880
 
881
				// Execute Python script
882
				jw.executeRule();
883
 
884
			}
885
 
886
			// Can happen when to slide's feature which is dropped in favor 
887
			// of a borrowed slide
888
			else if(feature != null) {
102 naveen 889
 
890
				// Normalize
891
				if(defs.needsNormalization(feature.getFeatureDefinitionID())) {
892
					Utils.info("needsNormalization feature=" + feature);
893
 
894
					feature = this.normalize(feature);
895
				}
896
 
81 naveen 897
				ExpandedFeature expFeature = new ExpandedFeature(feature);
898
 
899
				jw.setExpandedFeature(expFeature);
88 naveen 900
 
901
				// Execute Python script
902
				jw.executeRule();
81 naveen 903
			}
64 naveen 904
		}
905
 
346 rajveer 906
 
907
 
908
 
64 naveen 909
		// Set SlideDefinition
81 naveen 910
		SlideDefinition slideDef = expFacetRuleDef.getSlideDefinition();
64 naveen 911
		if(slideDef != null) {
912
			jw.setSlideDefinition(slideDef);
913
 
914
			// Set Slide
915
			Utils.info("slideDef.getID()=" + slideDef.getID());
916
 
917
			Slide slide = ents.getSlide(expEntity.getID(), slideDef.getID());
88 naveen 918
 
919
			// Slide may not have been included infavor of a borrowed slide
920
			if(slide == null) {
921
				return null;
922
			}
923
 
65 naveen 924
			ExpandedSlide expSlide = new ExpandedSlide(slide);
64 naveen 925
 
65 naveen 926
			jw.setExpandedSlide(expSlide);
88 naveen 927
 
928
			// Execute Python script
929
			jw.executeRule();
64 naveen 930
		}
931
 
346 rajveer 932
		//
64 naveen 933
 
346 rajveer 934
		if(slideDef == null && featureDef == null){
935
			if(expFacetRuleDef.getIRDataRuleDefinition().getScript() != null){
936
				jw.executeRule();
937
			}
938
		}
939
 
940
 
64 naveen 941
		List<Object> values = (List<Object>)jw.getValues();
942
		Utils.info("values=" + values);
943
 
91 naveen 944
		// Append to facet values
945
		long facetDefID = expFacetRuleDef.getFacetDefinitionID();
946
		Utils.info("facetDefID=" + facetDefID);
947
 
948
		List<String> facetValues = this.facetIDFacetValues.get(
949
				new Long(facetDefID));
950
 
951
		if(facetValues == null) {
952
			facetValues = new ArrayList<String>();
953
			this.facetIDFacetValues.put(new Long(facetDefID), facetValues);
954
		}
955
 
956
		if(values != null) {
957
			for(Object value : values) {
958
				String strValue = value.toString();
959
 
960
				if(!facetValues.contains(strValue)) {
961
					facetValues.add(strValue);
962
				}
963
			}
964
		}
965
 
966
		// Parse returned Python list
88 naveen 967
		String facetXMLSnip = null;
64 naveen 968
		if(values != null) {
969
 
970
			// Get IR Data XML snippet for this entity and facet
81 naveen 971
			facetXMLSnip = this.getFacetXMLSnippet(expFacetRuleDef, values, 2);
64 naveen 972
		}
973
 
88 naveen 974
		Utils.info("0 facetXMLSnip=" + facetXMLSnip);
64 naveen 975
		return facetXMLSnip;
976
	}
102 naveen 977
 
978
	/**
979
	 * 
980
	 * @param feature
981
	 * @return Feature
982
	 * @throws Exception 
983
	 */
984
	private Feature normalize(Feature feature) throws Exception {
985
		ExpandedFeature expFeature = new ExpandedFeature(feature);
67 naveen 986
 
102 naveen 987
		BulletDefinition bulletDef = 
988
			expFeature.getFeatureDefinition().getBulletDefinition();
989
 
990
		ExpandedBulletDefinition expBulletDef = new ExpandedBulletDefinition(
991
				bulletDef);
992
 
993
		if(expBulletDef.isPrimitive()) {
994
			PrimitiveNormalizationJythonWrapper jy = 
995
				new PrimitiveNormalizationJythonWrapper();
996
 
997
			jy.setExpandedFeature(expFeature);
998
 
999
			jy.excuteRule();
1000
 
1001
			String newValue = jy.getNewValue();
1002
			long newUnitID = jy.getNewUnitID();
1003
 
1004
			List<Bullet> newBullets = new ArrayList<Bullet>();
1005
			Bullet newBullet = new Bullet(new PrimitiveDataObject(newValue));
1006
			newBullet.setUnitID(newUnitID);
1007
 
1008
			newBullets.add(newBullet);
1009
 
1010
			feature.setBullets(newBullets);
1011
		}
1012
		else {
1013
			Utils.severe("Normalization not defined for non-primitives");
1014
		}
1015
 
1016
		return feature;
1017
	}
1018
 
67 naveen 1019
	/**
1020
	 * 
1021
	 * @param expEntity
1022
	 * @param facetFeatureIDs
1023
	 * @param indent
1024
	 * @return
1025
	 */
1026
	private String getPropertiesXMLSnippet(ExpandedEntity expEntity, 
1027
			List<Long> facetFeatureIDs, int indent) {
1028
 
1029
		List<String> xmlSnippet = new ArrayList<String>();
1030
 
1031
		// Collect all free-form content here
1032
		List<String> ffc = new ArrayList<String>();
1033
 
1034
		// Features
1035
		List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
1036
 
1037
		for(ExpandedSlide expSlide : expSlides) {
1038
			List<ExpandedFeature> expFeatures = expSlide.getExpandedFeatures();
1039
 
1040
			if(expSlide.getFreeformContent() != null) {
199 naveen 1041
				ffc.add(expSlide.getFreeformContent().getFreeformText());
67 naveen 1042
			}
1043
 
1044
			if(expFeatures == null) {
1045
				continue;
1046
			}
1047
 
1048
			for(ExpandedFeature expFeature : expFeatures) {
1049
				Long featureDefID = 
1050
					new Long(expFeature.getFeatureDefinitionID());
1051
 
1052
				// FFC at feature level
1053
				if(expFeature.getFreeformContent() != null) {
199 naveen 1054
					ffc.add(expFeature.getFreeformContent().getFreeformText());
67 naveen 1055
				}
1056
 
1057
				// Exclude those who are already covered as facets
1058
				if(facetFeatureIDs.contains(featureDefID)) {
1059
					continue;
1060
				}
1061
 
1062
				List<ExpandedBullet> expBullets = 
1063
					expFeature.getExpandedBullets();
1064
 
1065
				if(expBullets == null) {
1066
					continue;
1067
				}
1068
 
1069
				//<Property Label="">
1070
				xmlSnippet.add(this.xmlIndentation[indent] + 
83 naveen 1071
						"<Property ID=\"" + expFeature.getFeatureDefinitionID() 
1072
						+ "\" Label=\"" + StringEscapeUtils.escapeXml(
67 naveen 1073
								expFeature.getFeatureDefinition().getLabel()) + 
1074
						"\">");
1075
 
1076
				//<Value></Value>
1077
				for(ExpandedBullet bullet : expBullets) {
1078
 
1079
					// FFC at bullet level
1080
					if(bullet.getFreeformContent() != null) {
199 naveen 1081
						ffc.add(bullet.getFreeformContent().getFreeformText());
67 naveen 1082
					}
1083
 
1084
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
1085
							StringEscapeUtils.escapeXml(bullet.getValue()) + 
1086
							"</Value>");
1087
				}
1088
 
1089
				//</Property>
1090
				xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
1091
			}
1092
		}
1093
 
1094
		// FFC as Label="Free-form Content"
1095
		if(!ffc.isEmpty()) {
1096
			xmlSnippet.add(this.xmlIndentation[indent] + 
108 naveen 1097
					"<Property ID=\"000000\" Label=\"Free-form Content\">");
67 naveen 1098
 
1099
			for(String f : ffc) {
1100
				if(f != null) {
1101
					f = StringEscapeUtils.escapeXml(f);
1102
 
1103
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
1104
						f + "</Value>");
1105
				}
1106
			}
1107
 
1108
			xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
1109
		}
1110
 
1111
		// Children slides
1112
		// TODO
1113
 
1114
		return StringUtils.join(xmlSnippet, "\n");
1115
	}
64 naveen 1116
 
1117
	/**
1118
	 * 
1119
	 * @param expEntity
1120
	 * @param facetXMLSnippets
1121
	 * @param indent
1122
	 * @return
1123
	 */
1124
	private String getEntityXMLSnippet(ExpandedEntity expEntity, 
67 naveen 1125
			String facetXMLSnippets, String propertiesXMLSnippets, int indent) {
64 naveen 1126
 
1127
		//<Entity ID="40001">
1128
		List<String> xmlSnippet = new ArrayList<String>();
1129
 
1130
		String entityID = new Long(expEntity.getID()).toString();
1131
		xmlSnippet.add(this.xmlIndentation[indent] + "<Entity ID=\""+ entityID + 
1132
				"\">");
1133
 
1134
		//<Category>Business Phones</Category>
580 rajveer 1135
		String parentCategory = expEntity.getCategory().getLabel();
64 naveen 1136
		xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Category>" + 
580 rajveer 1137
				StringEscapeUtils.escapeXml(parentCategory) + "</Category>");
64 naveen 1138
 
580 rajveer 1139
		/*
1140
		//<Category>Business Phones</Category>
1141
		String category = expEntity.getCategory().getLabel();
1142
		xmlSnippet.add(this.xmlIndentation[indent + 1] + "<SubCategory>" + 
1143
				StringEscapeUtils.escapeXml(category) + "</SubCategory>");
1144
		 */
1145
 
64 naveen 1146
		//<Title>Nokia E71</Title>
67 naveen 1147
		String title = StringEscapeUtils.escapeXml(expEntity.getBrand()) + " " +
1148
		StringEscapeUtils.escapeXml(expEntity.getModelName()) + 
64 naveen 1149
			((expEntity.getModelNumber() != null) ? 
67 naveen 1150
					(" " + 
1151
						StringEscapeUtils.escapeXml(expEntity.getModelNumber()))
64 naveen 1152
					: "");
1153
 
1154
		xmlSnippet.add(this.xmlIndentation[indent + 1] + 
67 naveen 1155
				"<Title>" + StringEscapeUtils.escapeXml(title) + "</Title>");
64 naveen 1156
 
1157
		xmlSnippet.add(facetXMLSnippets);
67 naveen 1158
 
1159
		xmlSnippet.add(propertiesXMLSnippets);
64 naveen 1160
 
1161
		//</Entity>
1162
		xmlSnippet.add(this.xmlIndentation[indent] + "</Entity>");
1163
 
1164
		return StringUtils.join(xmlSnippet, "\n");
1165
	}
1166
 
1167
	/**
1168
	 * 
1169
	 * @param expFacetDef
1170
	 * @param values
1171
	 * @param indent
1172
	 * @return String XML Snippet
1173
	 */
81 naveen 1174
	private String getFacetXMLSnippet(
1175
			ExpandedFacetRuleDefinition expFacetRuleDef, 
64 naveen 1176
			List<Object> values, int indent) {
81 naveen 1177
 
64 naveen 1178
		// <Facet Label="Form Factor">
1179
		List<String> xmlSnippet = new ArrayList<String>();
81 naveen 1180
		String target = expFacetRuleDef.getFacetDefinition().getTarget();
1181
 
83 naveen 1182
		xmlSnippet.add(this.xmlIndentation[indent] + "<Facet ID=\"" + 
1183
				expFacetRuleDef.getFacetDefinitionID() + "\" Label=\"" + 
64 naveen 1184
				target + "\">");
1185
 
1186
		//<Value>Candybar</Value>
1187
		for(Object value : values) {
1188
			xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
1189
					value.toString() + "</Value>");
1190
		}
1191
 
1192
		//</Facet>
1193
		xmlSnippet.add(this.xmlIndentation[indent] + "</Facet>");
1194
 
1195
		return StringUtils.join(xmlSnippet, "\n");
1196
	}
62 naveen 1197
}