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
 
63 naveen 6
import in.shop2020.metamodel.core.Entity;
7
import in.shop2020.metamodel.core.Feature;
8
import in.shop2020.metamodel.core.Slide;
9
import in.shop2020.metamodel.definitions.Catalog;
64 naveen 10
import in.shop2020.metamodel.definitions.Category;
83 naveen 11
import in.shop2020.metamodel.definitions.DatatypeDefinition;
63 naveen 12
import in.shop2020.metamodel.definitions.DefinitionsContainer;
13
import in.shop2020.metamodel.definitions.EntityContainer;
82 naveen 14
import in.shop2020.metamodel.definitions.FacetDefinition;
88 naveen 15
import in.shop2020.metamodel.definitions.FacetRuleDefinition;
63 naveen 16
import in.shop2020.metamodel.definitions.FeatureDefinition;
17
import in.shop2020.metamodel.definitions.SlideDefinition;
67 naveen 18
import in.shop2020.metamodel.util.ExpandedBullet;
83 naveen 19
import in.shop2020.metamodel.util.ExpandedBulletDefinition;
63 naveen 20
import in.shop2020.metamodel.util.ExpandedCategoryFacetDefinition;
64 naveen 21
import in.shop2020.metamodel.util.ExpandedEntity;
82 naveen 22
import in.shop2020.metamodel.util.ExpandedFacetDefinition;
81 naveen 23
import in.shop2020.metamodel.util.ExpandedFacetRuleDefinition;
65 naveen 24
import in.shop2020.metamodel.util.ExpandedFeature;
83 naveen 25
import in.shop2020.metamodel.util.ExpandedFeatureDefinition;
65 naveen 26
import in.shop2020.metamodel.util.ExpandedSlide;
63 naveen 27
 
81 naveen 28
import java.util.ArrayList;
29
import java.util.List;
82 naveen 30
import java.util.Map;
81 naveen 31
 
32
import org.apache.commons.lang.ArrayUtils;
33
import org.apache.commons.lang.StringEscapeUtils;
34
import org.apache.commons.lang.StringUtils;
35
 
62 naveen 36
/**
37
 * Command line utility to convert IR Definitions into IR Data and IR Meta-data
38
 * 
81 naveen 39
 * Usage: IR [irmetadata|irdata] {Category ID}
40
 * 
62 naveen 41
 * @author naveen
42
 *
43
 */
44
public class IR {
63 naveen 45
 
62 naveen 46
	/**
64 naveen 47
	 * 
48
	 */
63 naveen 49
	private long categoryID;
50
 
51
	/**
64 naveen 52
	 * Level - 4, 8, 12, 16
53
	 */
54
	private String[] xmlIndentation = {"", "    ", "        ", "            ", 
55
			"                "};
83 naveen 56
 
57
	private String[] xmlTabIndentation = {"", "\t", "\t\t", "\t\t\t", 
58
			"\t\t\t\t", "\t\t\t\t\t", "\t\t\t\t\t\t"};
64 naveen 59
 
60
	/**
62 naveen 61
	 * @param args
63 naveen 62
	 * @throws Exception 
62 naveen 63
	 */
63 naveen 64
	public static void main(String[] args) throws Exception {
81 naveen 65
		String[] commands = new String[] {"irmetadata", "irdata"};
62 naveen 66
 
81 naveen 67
		String usage = "Usage: IR ["+ StringUtils.join(commands, "|") +
68
			"] {Category ID}\n";
69
 
70
		if(args.length < 1) {
63 naveen 71
			System.out.println(usage);
72
			System.exit(-1);
73
		}
81 naveen 74
 
75
		String inputCommand = args[0];
76
 
77
		if(!ArrayUtils.contains(commands, inputCommand)) {
78
			System.out.println(usage);
79
			System.exit(-1);
80
		}
64 naveen 81
 
82
		long categoryID = 0L;
81 naveen 83
		if(args.length > 1) {
64 naveen 84
			try {
81 naveen 85
				categoryID = Long.parseLong(args[1]);
64 naveen 86
			}
87
			catch (NumberFormatException nfe) {
88
				System.out.println(usage);
89
				System.exit(-1);
90
			}
63 naveen 91
		}
92
 
93
		IR ir = new IR(categoryID);
81 naveen 94
 
95
		if (inputCommand.equals("irdata")) {
96
			ir.exportIRData();
97
 
98
			return;
99
		}
100
 
101
		if (inputCommand.equals("irmetadata")) {
102
			ir.exportIRMetaData();
103
 
104
			return;
105
		}
106
 
62 naveen 107
	}
63 naveen 108
 
109
	/**
110
	 * 
111
	 * @param categoryID
112
	 */
113
	public IR(long categoryID) {
114
		this.categoryID = categoryID;
115
	}
116
 
117
	/**
81 naveen 118
	 * 
119
	 * @throws Exception
120
	 */
121
	public void exportIRMetaData() throws Exception {
122
		DefinitionsContainer defs = 
123
			Catalog.getInstance().getDefinitionsContainer();
82 naveen 124
 
81 naveen 125
		// <IRMetaData>
82 naveen 126
		List<String> xmlSnippets = new ArrayList<String>();
127
		xmlSnippets.add("<IRMetaData>");
83 naveen 128
		xmlSnippets.add("\t<Facets>");
81 naveen 129
 
82 naveen 130
		IRMetaDataJythonWrapper jy = new IRMetaDataJythonWrapper();
81 naveen 131
 
83 naveen 132
		List<Long> facetFeatures = new ArrayList<Long>();
133
 
81 naveen 134
		// Iterate over all facet definitions
82 naveen 135
		Map<Long, FacetDefinition> facetDefs = defs.getFacetDefinitions();
136
		for(FacetDefinition facetDef : facetDefs.values()) {
137
 
138
			jy.reset();
139
			jy.initialize();
140
 
141
			ExpandedFacetDefinition expFacetDef = 
142
				new ExpandedFacetDefinition(facetDef);
143
 
144
			jy.setExpandedFacetDefinition(expFacetDef);
145
 
146
			jy.executeRule();
147
 
148
			String facetXMLSnip = jy.getXMLSnippet();
149
			Utils.info("facetXMLSnip=" + facetXMLSnip);
150
 
151
			xmlSnippets.add(facetXMLSnip);
83 naveen 152
 
153
			facetFeatures.add(new Long(expFacetDef.getFeatureDefinitionID()));
82 naveen 154
		}
83 naveen 155
		xmlSnippets.add("\t</Facets>");
81 naveen 156
 
83 naveen 157
		Utils.info("facetFeatures=" + facetFeatures);
158
 
159
		xmlSnippets.add("\n\t<Properties>");
160
 
81 naveen 161
		// Iterate over all feature definitions
83 naveen 162
		Map<Long, FeatureDefinition> featureDefs = defs.getFeatureDefinitions();
163
		for(FeatureDefinition featureDef : featureDefs.values()) {
164
			if(facetFeatures.contains(new Long(featureDef.getID()))) {
165
				// Ignore, is already covered as facet
166
				continue;
167
			}
168
			String propertyXMLSnip = this.getPropertyXMLSnippet(featureDef);
169
			Utils.info("propertyXMLSnip=" + propertyXMLSnip);
170
 
171
			xmlSnippets.add(propertyXMLSnip);
172
		}
81 naveen 173
 
83 naveen 174
		xmlSnippets.add("\t</Properties>");
175
 
176
		xmlSnippets.add("\n\t<Categories>");
177
 
178
		// Iterate over all categories
179
		Category rootCategory = defs.getCategory(10000);
180
		List<Category> children = rootCategory.getChildrenCategory();
181
		for (Category child : children) {
182
			String categoryXMLSnip = this.getCategoryXMLSnippet(child, 2);
183
			Utils.info("categoryXMLSnip=" + categoryXMLSnip);
184
 
185
			xmlSnippets.add(categoryXMLSnip);
186
		}
187
		xmlSnippets.add("\t</Categories>");
188
 
81 naveen 189
		// </IRMetaData>
82 naveen 190
		xmlSnippets.add("</IRMetaData>");
81 naveen 191
 
82 naveen 192
		String irMetaDataXML = StringUtils.join(xmlSnippets, "\n");
81 naveen 193
		Utils.info(irMetaDataXML);
194
 
195
		// Write it to file
196
		String irMetaDataFilename = Utils.EXPORT_IR_PATH + "irmetadata.xml";
197
		DBUtils.store(irMetaDataXML, irMetaDataFilename);
198
	}
199
 
200
	/**
83 naveen 201
	 * 
202
	 * @param category
203
	 * @return
63 naveen 204
	 * @throws Exception 
83 naveen 205
	 */
206
	private String getCategoryXMLSnippet(Category category, int indent) 
207
		throws Exception {
208
 
209
		DefinitionsContainer defs = 
210
			Catalog.getInstance().getDefinitionsContainer();
211
 
212
		String xmlSnip = this.xmlTabIndentation[indent] + "<Category";
213
 
214
		xmlSnip += " ID=\"" + category.getID() + "\"";
215
		xmlSnip += " label=\"" + category.getLabel() + "\"";
216
		xmlSnip += ">\n";
217
 
218
		List<Category> children = category.getChildrenCategory();
219
 
220
		if(children != null) {
221
			for(Category child : children) {
222
				xmlSnip += this.getCategoryXMLSnippet(child, indent+1);
223
			}
224
		}
225
		else {
226
			// Only leaf category will have entities
227
			// Facet IDs
228
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Facets>\n";
229
 
230
			List<Long> facetDefIDs = 
231
				defs.getFacetDefinitionIDs(category.getID());
232
			Utils.info("facetDefIDs=" + facetDefIDs);
233
 
234
			for(Long facetDefID : facetDefIDs) {
235
				xmlSnip += this.xmlTabIndentation[indent+2] + 
236
					"<FacetID>" + facetDefID + "</FacetID>\n";
237
			}
238
 
239
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Facets>\n\n";
240
 
241
			// Feature IDs
242
			xmlSnip += this.xmlTabIndentation[indent+1] + "<Properties>\n";
243
 
244
			List<Long> featureDefIDs = 
245
				defs.getFeatureDefinitionIDs(category.getID());
246
			Utils.info("featureDefIDs=" + featureDefIDs);
247
 
248
			for(Long featureDefID : featureDefIDs) {
249
				xmlSnip += this.xmlTabIndentation[indent+2] + 
250
					"<FeatureID>" + featureDefID + "</FeatureID>\n";
251
			}
252
 
253
			xmlSnip += this.xmlTabIndentation[indent+1] + "</Properties>\n";
254
		}
255
 
256
		xmlSnip += this.xmlTabIndentation[indent] + "</Category>\n";
257
 
258
		return xmlSnip;
259
	}
260
 
261
	/**
63 naveen 262
	 * 
83 naveen 263
	 * @param featureDef
264
	 * @return
265
	 * @throws Exception 
63 naveen 266
	 */
83 naveen 267
	private String getPropertyXMLSnippet(FeatureDefinition featureDef) 
268
		throws Exception {
269
		String xmlSnip = "\t\t<Property";
270
 
271
		xmlSnip += " ID=\"" + featureDef.getID() + "\"";
272
		xmlSnip += " label=\"" + featureDef.getLabel() + "\"";
273
 
274
		ExpandedFeatureDefinition expFeatureDef = 
275
			new ExpandedFeatureDefinition(featureDef);
276
 
277
		ExpandedBulletDefinition expBulletDef = 
278
			expFeatureDef.getExpandedBulletDefinition();
279
 
280
		String datatype = "string";
281
		if(expBulletDef.isComposite() || expBulletDef.isEnumerated()) {
282
			datatype = "string";
283
		}
284
		else {
285
			DatatypeDefinition datatypeDef = 
286
				expBulletDef.getDatatypeDefinition();
287
 
288
			datatype = datatypeDef.getName();
289
 
290
			// REVISIT
291
			if(datatype.equals("hours_mins") || datatype.equals("days_hours") ||
292
					datatype.equals("hours_mins") || 
293
					datatype.equals("days_hours")) {
294
				datatype = "string";
295
			}
296
		}
297
		xmlSnip += " datatype=\"" + datatype + "\"";
298
 
299
		String multivalue = "false";
300
		if (expBulletDef.isMultivalue()) {
301
			multivalue = "true";
302
		}
303
		xmlSnip += " isMultivalue=\"" + multivalue + "\"";
304
 
305
		xmlSnip += "/>";
306
		return xmlSnip;
307
	}
308
 
309
	/**
310
	 * @throws Exception 
311
	 * 
312
	 */
63 naveen 313
	public void exportIRData() throws Exception {
314
		DefinitionsContainer defs = 
315
			Catalog.getInstance().getDefinitionsContainer();
316
 
317
		EntityContainer ents = 
318
			Catalog.getInstance().getEntityContainer();
319
 
64 naveen 320
		// <IRData>
321
		List<String> entityXMLSnippets = new ArrayList<String>();
322
		entityXMLSnippets.add("<IRData>");
63 naveen 323
 
64 naveen 324
		List<Category> categories = null;
325
		if(this.categoryID != 0L) {
326
			categories = new ArrayList<Category>();
327
			categories.add(defs.getCategory(this.categoryID));
328
		}
329
		else {
330
 
331
			// Get all categories
332
			categories = defs.getChildrenCategories(10001);
333
		}
63 naveen 334
 
64 naveen 335
		for(Category cat : categories) {
336
			long catID = cat.getID();
337
 
338
			// Get all facets for the category
339
			ExpandedCategoryFacetDefinition expCategoryFacetDef = 
340
				defs.getExpandedCategoryFacetDefinition(catID);
341
 
81 naveen 342
			List<ExpandedFacetRuleDefinition> expFacetRuleDefs = 
343
				expCategoryFacetDef.getExpandedFacetRuleDefinitions();
64 naveen 344
 
345
			// Get all entities for the category
346
			List<Entity> entities = ents.getEntities(catID);
347
 
348
			if(entities == null) {
349
				continue;
350
			}
351
 
352
			// For each entity 
63 naveen 353
			for(Entity entity : entities) {
64 naveen 354
				ExpandedEntity expEntity = 
355
					ents.getExpandedEntity(entity.getID());
63 naveen 356
 
64 naveen 357
				List<String> facetXMLSnippets = new ArrayList<String>();
358
 
88 naveen 359
				// Collect features which have become FACETs
67 naveen 360
				List<Long> facetFeatureIDs = new ArrayList<Long>();
361
 
63 naveen 362
				// For each facet execute Rule
81 naveen 363
				for(ExpandedFacetRuleDefinition expFacetRuleDef : 
364
						expFacetRuleDefs) {
64 naveen 365
					String facetXMLSnip = 
81 naveen 366
						this.processFacet(expEntity, expFacetRuleDef);
63 naveen 367
 
88 naveen 368
					if(facetXMLSnip != null && 
369
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
64 naveen 370
						facetXMLSnippets.add(facetXMLSnip);
88 naveen 371
						Utils.info("1 facetXMLSnip=" + facetXMLSnip);
63 naveen 372
					}
67 naveen 373
 
374
					// Collect features already covered as Facet
81 naveen 375
					if(expFacetRuleDef.getFeatureDefinition() != null) {
88 naveen 376
						facetFeatureIDs.add(new Long(
377
								expFacetRuleDef.getFeatureDefinitionID()));
67 naveen 378
					}
63 naveen 379
				}
380
 
88 naveen 381
				// Handle borrowed slides
382
				List<Slide> borrowedSlides = ents.getBorrowedSlides(entity);
383
 
384
				for (Slide borrowedSlide : borrowedSlides) {
385
					String facetXMLSnip = this.processBorrowedSlide(expEntity,
386
							borrowedSlide);
387
 
388
					if(facetXMLSnip != null && 
389
							!StringUtils.trim(facetXMLSnip).isEmpty()) {
390
						facetXMLSnippets.add(facetXMLSnip);
391
					}
392
 
393
					Utils.info("2 facetXMLSnip=" + facetXMLSnip);
394
				}
395
 
64 naveen 396
				String facetXMLSnippetsStr = 
397
					StringUtils.join(facetXMLSnippets, "\n");
398
 
88 naveen 399
				Utils.info("facetXMLSnippetsStr=" + facetXMLSnippetsStr);
64 naveen 400
 
67 naveen 401
				// Collect PROPERTIES
402
				String propertiesXMLSnippetsStr = 
403
					this.getPropertiesXMLSnippet(expEntity, facetFeatureIDs, 2);
64 naveen 404
 
67 naveen 405
				Utils.info(propertiesXMLSnippetsStr);
406
 
407
				String entityXMLSnip = this.getEntityXMLSnippet(expEntity, 
408
						facetXMLSnippetsStr, propertiesXMLSnippetsStr, 1);
409
 
64 naveen 410
				Utils.info(entityXMLSnip);
411
 
412
				entityXMLSnippets.add(entityXMLSnip);
63 naveen 413
			}
414
		}
64 naveen 415
 
416
		// </IRData>
417
		entityXMLSnippets.add("</IRData>");
418
 
419
		String irDataXML = StringUtils.join(entityXMLSnippets, "\n");
420
		Utils.info(irDataXML);
421
 
422
		// Write it to file
70 naveen 423
		String irDataFilename = Utils.EXPORT_IR_PATH + "irdata.xml";
64 naveen 424
		DBUtils.store(irDataXML, irDataFilename);
63 naveen 425
	}
64 naveen 426
 
427
	/**
428
	 * 
88 naveen 429
	 * @param borrowedSlides
430
	 * @return
431
	 */
432
	private String processBorrowedSlide(ExpandedEntity expEntity, 
433
			Slide borrowedSlide) throws Exception {
434
		// Borrowed category ID
435
		long borrowedCategoryID = borrowedSlide.getBorrowedCategoryID();
436
		Utils.info("borrowedCategoryID=" + borrowedCategoryID);
437
 
438
		// Slide definition ID
439
		long slideDefID = borrowedSlide.getSlideDefinitionID();
440
		Utils.info("borrowed slideDefID=" + slideDefID);
441
 
442
		DefinitionsContainer defs = 
443
			Catalog.getInstance().getDefinitionsContainer();
444
 
445
		// Get IR Data Rule
446
		FacetRuleDefinition facetRuleDef = 
447
			defs.getFacetRuleDefinitionForSlide(borrowedCategoryID, slideDefID);
448
 
449
		Utils.info("borrowed facetRuleDef=" + facetRuleDef);
450
		String facetXMLSnippet = null; 
451
 
452
		// If there is direct IR data rule defined for borrowed slide
453
		if(facetRuleDef != null) {
454
			ExpandedFacetRuleDefinition expFacetRuleDef = 
455
				new ExpandedFacetRuleDefinition(facetRuleDef);
456
 
457
			// Return XML snippet
458
			facetXMLSnippet = this.processFacet(expEntity, expFacetRuleDef);
459
		}
460
		else {
461
			List<String> facetXMLSnippets = new ArrayList<String>();
462
 
463
			// Get FacetRuleDefinition objects for all features in 
464
			// borrowed slide for which IR rule is defined
465
			List<Feature> features = borrowedSlide.getFeatures();
466
			for (Feature feature : features) {
467
				String featureFacetXMLSnippet = 
468
					this.processBorrowedFeature(borrowedCategoryID, expEntity, 
469
						feature);
470
 
471
				if(featureFacetXMLSnippet != null && !StringUtils.trim(
472
						featureFacetXMLSnippet).isEmpty()) {
473
					facetXMLSnippets.add(featureFacetXMLSnippet);
474
				}
475
			}
476
 
477
			// Get FacetRuleDefinition objects for all children slides in 
478
			// borrowed slide for which IR rule is defined
479
			if(borrowedSlide.hasChildrenSlides()) {
480
				String childrenSlidesFacetXMLSnippet = 
481
					this.processBorrowedChildrenSlides(borrowedCategoryID, 
482
							expEntity, borrowedSlide);
483
 
484
				if(childrenSlidesFacetXMLSnippet != null && !StringUtils.trim(
485
						childrenSlidesFacetXMLSnippet).isEmpty()) {
486
					facetXMLSnippets.add(childrenSlidesFacetXMLSnippet);
487
				}
488
			}
489
 
490
			facetXMLSnippet = StringUtils.join(facetXMLSnippets, "\n");
491
		}
492
 
493
		if(StringUtils.trim(facetXMLSnippet).isEmpty()) {
494
			return null;
495
		}
496
 
497
		return facetXMLSnippet;
498
	}
499
 
500
	/**
501
	 * 
502
	 * @param borrowedCategoryID
64 naveen 503
	 * @param expEntity
88 naveen 504
	 * @param feature
505
	 * @return
506
	 * @throws Exception 
507
	 */
508
	private String processBorrowedFeature(long borrowedCategoryID, 
509
			ExpandedEntity expEntity, Feature feature) throws Exception {
510
 
511
		long featureDefID = feature.getFeatureDefinitionID();
512
		Utils.info("borrowed featureDefID=" + featureDefID);
513
 
514
		DefinitionsContainer defs = 
515
			Catalog.getInstance().getDefinitionsContainer();
516
 
517
		FacetRuleDefinition facetRuleDefForFeature = 
518
			defs.getFacetRuleDefinitionForFeature(borrowedCategoryID, 
519
				featureDefID);
520
 
521
		List<String> facetXMLSnippets = new ArrayList<String>();
522
 
523
		Utils.info("borrowed facetRuleDefForFeature=" + 
524
				facetRuleDefForFeature);
525
 
526
		if(facetRuleDefForFeature != null) {
527
			ExpandedFacetRuleDefinition expFacetRuleDefForFeature = 
528
				new ExpandedFacetRuleDefinition(facetRuleDefForFeature);
529
 
530
			String snip = this.processFacet(expEntity, 
531
					expFacetRuleDefForFeature);
532
 
533
			if(snip != null) {
534
				facetXMLSnippets.add(snip);
535
			}
536
		}
537
 
538
 
539
		String xmlSnip =  StringUtils.join(facetXMLSnippets, "\n");
540
 
541
		if(StringUtils.trim(xmlSnip).isEmpty()) {
542
			return null;
543
		}
544
 
545
		return xmlSnip;
546
	}
547
 
548
	/**
549
	 * 
550
	 * @param expEntity
551
	 * @param borrowedSlide
552
	 * @return
553
	 * @throws Exception 
554
	 */
555
	private String processBorrowedChildrenSlides(long borrowedCategoryID, 
556
			ExpandedEntity expEntity, Slide borrowedSlide) throws Exception {
557
		DefinitionsContainer defs = 
558
			Catalog.getInstance().getDefinitionsContainer();
559
 
560
		List<Slide> childrenSlides = borrowedSlide.getChildrenSlides();
561
		List<String> facetXMLSnippets = new ArrayList<String>();
562
 
563
		for (Slide childSlide : childrenSlides) {
564
			long childSlideDefID = childSlide.getSlideDefinitionID();
565
			Utils.info("borrowed childSlideDefID=" + childSlideDefID);
566
 
567
			FacetRuleDefinition facetRuleDefForSlide = 
568
				defs.getFacetRuleDefinitionForSlide(borrowedCategoryID, 
569
						childSlideDefID);
570
 
571
			Utils.info("borrowed facetRuleDefForSlide=" + 
572
					facetRuleDefForSlide);
573
 
574
			if(facetRuleDefForSlide != null) {
575
				ExpandedFacetRuleDefinition expFacetRuleDefForSlide = 
576
					new ExpandedFacetRuleDefinition(
577
							facetRuleDefForSlide);
578
 
579
				String snip = this.processFacet(expEntity, 
580
						expFacetRuleDefForSlide);
581
 
582
				if(snip != null && !StringUtils.trim(snip).isEmpty()) {
583
					facetXMLSnippets.add(snip);
584
				}
585
			}
586
 
587
			// Features?
588
			if(childSlide.hasFeatures()) {
589
				List<Feature> features = childSlide.getFeatures();
590
				for(Feature feature : features) {
591
					String childrenSlideFeatureFacetXMLSnippet = 
592
						this.processBorrowedFeature(borrowedCategoryID, expEntity, 
593
							feature);
594
 
595
					if(childrenSlideFeatureFacetXMLSnippet != null &&
596
						!StringUtils.trim(childrenSlideFeatureFacetXMLSnippet).
597
							isEmpty()) {
598
 
599
						facetXMLSnippets.add(
600
								childrenSlideFeatureFacetXMLSnippet);
601
 
602
					}
603
				}
604
			}
605
 
606
			// Children slides
607
			if(childSlide.hasChildrenSlides()) {
608
				String childrenSlidesFacetXMLSnippet = 
609
					this.processBorrowedChildrenSlides(borrowedCategoryID, 
610
							expEntity, childSlide);
611
 
612
				if(childrenSlidesFacetXMLSnippet != null &&
613
					!StringUtils.trim(childrenSlidesFacetXMLSnippet).
614
						isEmpty()) {
615
 
616
					facetXMLSnippets.add(childrenSlidesFacetXMLSnippet);
617
				}
618
			}
619
		}
620
 
621
		String xmlSnip =  StringUtils.join(facetXMLSnippets, "\n");
622
 
623
		if(StringUtils.trim(xmlSnip).isEmpty()) {
624
			return null;
625
		}
626
 
627
		return xmlSnip;
628
	}
629
 
630
 
631
	/**
632
	 * 
633
	 * @param expEntity
64 naveen 634
	 * @param expFacetDef
635
	 * @return
636
	 * @throws Exception 
637
	 */
638
	@SuppressWarnings("unchecked")
639
	private String processFacet(ExpandedEntity expEntity, 
81 naveen 640
			ExpandedFacetRuleDefinition expFacetRuleDef) throws Exception {
64 naveen 641
 
81 naveen 642
		Utils.info("expFacetRuleDef=" + expFacetRuleDef);
643
 
64 naveen 644
		EntityContainer ents = 
645
			Catalog.getInstance().getEntityContainer();
646
 
81 naveen 647
		IRDataJythonWrapper jw = new IRDataJythonWrapper();
64 naveen 648
 
649
		jw.setExpandedEntity(expEntity);
82 naveen 650
		jw.setExpandedFacetRuleDefinition(expFacetRuleDef);
64 naveen 651
 
652
		// Set FeatureDefinition
653
		FeatureDefinition featureDef = 
81 naveen 654
			expFacetRuleDef.getFeatureDefinition();
655
 
64 naveen 656
		if(featureDef != null) {
657
			jw.setFeatureDefinition(featureDef);
658
 
659
			// Set Feature
660
			Utils.info("featureDef.getID()=" + featureDef.getID());
661
 
662
			Feature feature = 
663
				ents.getFeature(expEntity.getID(), featureDef.getID());
664
 
90 naveen 665
			// Special case for Brand
666
			if(expFacetRuleDef.getFacetDefinitionID() == 50001) {
667
 
668
				// Execute Python script
669
				jw.executeRule();
670
 
671
			}
672
 
673
			// Can happen when to slide's feature which is dropped in favor 
674
			// of a borrowed slide
675
			else if(feature != null) {
81 naveen 676
				ExpandedFeature expFeature = new ExpandedFeature(feature);
677
 
678
				jw.setExpandedFeature(expFeature);
88 naveen 679
 
680
				// Execute Python script
681
				jw.executeRule();
81 naveen 682
			}
64 naveen 683
		}
684
 
685
		// Set SlideDefinition
81 naveen 686
		SlideDefinition slideDef = expFacetRuleDef.getSlideDefinition();
64 naveen 687
		if(slideDef != null) {
688
			jw.setSlideDefinition(slideDef);
689
 
690
			// Set Slide
691
			Utils.info("slideDef.getID()=" + slideDef.getID());
692
 
693
			Slide slide = ents.getSlide(expEntity.getID(), slideDef.getID());
88 naveen 694
 
695
			// Slide may not have been included infavor of a borrowed slide
696
			if(slide == null) {
697
				return null;
698
			}
699
 
65 naveen 700
			ExpandedSlide expSlide = new ExpandedSlide(slide);
64 naveen 701
 
65 naveen 702
			jw.setExpandedSlide(expSlide);
88 naveen 703
 
704
			// Execute Python script
705
			jw.executeRule();
64 naveen 706
		}
707
 
708
 
70 naveen 709
		// Parse returned Python list
64 naveen 710
		List<Object> values = (List<Object>)jw.getValues();
711
		Utils.info("values=" + values);
712
 
88 naveen 713
		String facetXMLSnip = null;
64 naveen 714
		if(values != null) {
715
 
716
			// Get IR Data XML snippet for this entity and facet
81 naveen 717
			facetXMLSnip = this.getFacetXMLSnippet(expFacetRuleDef, values, 2);
64 naveen 718
		}
719
 
88 naveen 720
		Utils.info("0 facetXMLSnip=" + facetXMLSnip);
64 naveen 721
		return facetXMLSnip;
722
	}
67 naveen 723
 
724
	/**
725
	 * 
726
	 * @param expEntity
727
	 * @param facetFeatureIDs
728
	 * @param indent
729
	 * @return
730
	 */
731
	private String getPropertiesXMLSnippet(ExpandedEntity expEntity, 
732
			List<Long> facetFeatureIDs, int indent) {
733
 
734
		List<String> xmlSnippet = new ArrayList<String>();
735
 
736
		// Collect all free-form content here
737
		List<String> ffc = new ArrayList<String>();
738
 
739
		// Features
740
		List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
741
 
742
		for(ExpandedSlide expSlide : expSlides) {
743
			List<ExpandedFeature> expFeatures = expSlide.getExpandedFeatures();
744
 
745
			if(expSlide.getFreeformContent() != null) {
746
				ffc.add(expSlide.getFreeformContent().getContent());
747
			}
748
 
749
			if(expFeatures == null) {
750
				continue;
751
			}
752
 
753
			for(ExpandedFeature expFeature : expFeatures) {
754
				Long featureDefID = 
755
					new Long(expFeature.getFeatureDefinitionID());
756
 
757
				// FFC at feature level
758
				if(expFeature.getFreeformContent() != null) {
759
					ffc.add(expFeature.getFreeformContent().getContent());
760
				}
761
 
762
				// Exclude those who are already covered as facets
763
				if(facetFeatureIDs.contains(featureDefID)) {
764
					continue;
765
				}
766
 
767
				List<ExpandedBullet> expBullets = 
768
					expFeature.getExpandedBullets();
769
 
770
				if(expBullets == null) {
771
					continue;
772
				}
773
 
774
				//<Property Label="">
775
				xmlSnippet.add(this.xmlIndentation[indent] + 
83 naveen 776
						"<Property ID=\"" + expFeature.getFeatureDefinitionID() 
777
						+ "\" Label=\"" + StringEscapeUtils.escapeXml(
67 naveen 778
								expFeature.getFeatureDefinition().getLabel()) + 
779
						"\">");
780
 
781
				//<Value></Value>
782
				for(ExpandedBullet bullet : expBullets) {
783
 
784
					// FFC at bullet level
785
					if(bullet.getFreeformContent() != null) {
786
						ffc.add(bullet.getFreeformContent().getContent());
787
					}
788
 
789
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
790
							StringEscapeUtils.escapeXml(bullet.getValue()) + 
791
							"</Value>");
792
				}
793
 
794
				//</Property>
795
				xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
796
			}
797
		}
798
 
799
		// FFC as Label="Free-form Content"
800
		if(!ffc.isEmpty()) {
801
			xmlSnippet.add(this.xmlIndentation[indent] + 
802
					"<Property Label=\"Free-form Content\">");
803
 
804
			for(String f : ffc) {
805
				if(f != null) {
806
					f = StringEscapeUtils.escapeXml(f);
807
 
808
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
809
						f + "</Value>");
810
				}
811
			}
812
 
813
			xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
814
		}
815
 
816
		// Children slides
817
		// TODO
818
 
819
		return StringUtils.join(xmlSnippet, "\n");
820
	}
64 naveen 821
 
822
	/**
823
	 * 
824
	 * @param expEntity
825
	 * @param facetXMLSnippets
826
	 * @param indent
827
	 * @return
828
	 */
829
	private String getEntityXMLSnippet(ExpandedEntity expEntity, 
67 naveen 830
			String facetXMLSnippets, String propertiesXMLSnippets, int indent) {
64 naveen 831
 
832
		//<Entity ID="40001">
833
		List<String> xmlSnippet = new ArrayList<String>();
834
 
835
		String entityID = new Long(expEntity.getID()).toString();
836
		xmlSnippet.add(this.xmlIndentation[indent] + "<Entity ID=\""+ entityID + 
837
				"\">");
838
 
839
		//<Category>Business Phones</Category>
840
		String category = expEntity.getCategory().getLabel();
841
		xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Category>" + 
67 naveen 842
				StringEscapeUtils.escapeXml(category) + "</Category>");
64 naveen 843
 
844
		//<Title>Nokia E71</Title>
67 naveen 845
		String title = StringEscapeUtils.escapeXml(expEntity.getBrand()) + " " +
846
		StringEscapeUtils.escapeXml(expEntity.getModelName()) + 
64 naveen 847
			((expEntity.getModelNumber() != null) ? 
67 naveen 848
					(" " + 
849
						StringEscapeUtils.escapeXml(expEntity.getModelNumber()))
64 naveen 850
					: "");
851
 
852
		xmlSnippet.add(this.xmlIndentation[indent + 1] + 
67 naveen 853
				"<Title>" + StringEscapeUtils.escapeXml(title) + "</Title>");
64 naveen 854
 
855
		xmlSnippet.add(facetXMLSnippets);
67 naveen 856
 
857
		xmlSnippet.add(propertiesXMLSnippets);
64 naveen 858
 
859
		//</Entity>
860
		xmlSnippet.add(this.xmlIndentation[indent] + "</Entity>");
861
 
862
		return StringUtils.join(xmlSnippet, "\n");
863
	}
864
 
865
	/**
866
	 * 
867
	 * @param expFacetDef
868
	 * @param values
869
	 * @param indent
870
	 * @return String XML Snippet
871
	 */
81 naveen 872
	private String getFacetXMLSnippet(
873
			ExpandedFacetRuleDefinition expFacetRuleDef, 
64 naveen 874
			List<Object> values, int indent) {
81 naveen 875
 
64 naveen 876
		// <Facet Label="Form Factor">
877
		List<String> xmlSnippet = new ArrayList<String>();
81 naveen 878
		String target = expFacetRuleDef.getFacetDefinition().getTarget();
879
 
83 naveen 880
		xmlSnippet.add(this.xmlIndentation[indent] + "<Facet ID=\"" + 
881
				expFacetRuleDef.getFacetDefinitionID() + "\" Label=\"" + 
64 naveen 882
				target + "\">");
883
 
884
		//<Value>Candybar</Value>
885
		for(Object value : values) {
886
			xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
887
					value.toString() + "</Value>");
888
		}
889
 
890
		//</Facet>
891
		xmlSnippet.add(this.xmlIndentation[indent] + "</Facet>");
892
 
893
		return StringUtils.join(xmlSnippet, "\n");
894
	}
62 naveen 895
}