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
 
81 naveen 665
			// Can happen with un-referred features like Brand
88 naveen 666
			// or a slide's feature which is dropped in favor of a borrowed 
667
			// slide
81 naveen 668
			if(feature != null) {
669
				ExpandedFeature expFeature = new ExpandedFeature(feature);
670
 
671
				jw.setExpandedFeature(expFeature);
88 naveen 672
 
673
				// Execute Python script
674
				jw.executeRule();
81 naveen 675
			}
64 naveen 676
		}
677
 
678
		// Set SlideDefinition
81 naveen 679
		SlideDefinition slideDef = expFacetRuleDef.getSlideDefinition();
64 naveen 680
		if(slideDef != null) {
681
			jw.setSlideDefinition(slideDef);
682
 
683
			// Set Slide
684
			Utils.info("slideDef.getID()=" + slideDef.getID());
685
 
686
			Slide slide = ents.getSlide(expEntity.getID(), slideDef.getID());
88 naveen 687
 
688
			// Slide may not have been included infavor of a borrowed slide
689
			if(slide == null) {
690
				return null;
691
			}
692
 
65 naveen 693
			ExpandedSlide expSlide = new ExpandedSlide(slide);
64 naveen 694
 
65 naveen 695
			jw.setExpandedSlide(expSlide);
88 naveen 696
 
697
			// Execute Python script
698
			jw.executeRule();
64 naveen 699
		}
700
 
701
 
70 naveen 702
		// Parse returned Python list
64 naveen 703
		List<Object> values = (List<Object>)jw.getValues();
704
		Utils.info("values=" + values);
705
 
88 naveen 706
		String facetXMLSnip = null;
64 naveen 707
		if(values != null) {
708
 
709
			// Get IR Data XML snippet for this entity and facet
81 naveen 710
			facetXMLSnip = this.getFacetXMLSnippet(expFacetRuleDef, values, 2);
64 naveen 711
		}
712
 
88 naveen 713
		Utils.info("0 facetXMLSnip=" + facetXMLSnip);
64 naveen 714
		return facetXMLSnip;
715
	}
67 naveen 716
 
717
	/**
718
	 * 
719
	 * @param expEntity
720
	 * @param facetFeatureIDs
721
	 * @param indent
722
	 * @return
723
	 */
724
	private String getPropertiesXMLSnippet(ExpandedEntity expEntity, 
725
			List<Long> facetFeatureIDs, int indent) {
726
 
727
		List<String> xmlSnippet = new ArrayList<String>();
728
 
729
		// Collect all free-form content here
730
		List<String> ffc = new ArrayList<String>();
731
 
732
		// Features
733
		List<ExpandedSlide> expSlides = expEntity.getExpandedSlides();
734
 
735
		for(ExpandedSlide expSlide : expSlides) {
736
			List<ExpandedFeature> expFeatures = expSlide.getExpandedFeatures();
737
 
738
			if(expSlide.getFreeformContent() != null) {
739
				ffc.add(expSlide.getFreeformContent().getContent());
740
			}
741
 
742
			if(expFeatures == null) {
743
				continue;
744
			}
745
 
746
			for(ExpandedFeature expFeature : expFeatures) {
747
				Long featureDefID = 
748
					new Long(expFeature.getFeatureDefinitionID());
749
 
750
				// FFC at feature level
751
				if(expFeature.getFreeformContent() != null) {
752
					ffc.add(expFeature.getFreeformContent().getContent());
753
				}
754
 
755
				// Exclude those who are already covered as facets
756
				if(facetFeatureIDs.contains(featureDefID)) {
757
					continue;
758
				}
759
 
760
				List<ExpandedBullet> expBullets = 
761
					expFeature.getExpandedBullets();
762
 
763
				if(expBullets == null) {
764
					continue;
765
				}
766
 
767
				//<Property Label="">
768
				xmlSnippet.add(this.xmlIndentation[indent] + 
83 naveen 769
						"<Property ID=\"" + expFeature.getFeatureDefinitionID() 
770
						+ "\" Label=\"" + StringEscapeUtils.escapeXml(
67 naveen 771
								expFeature.getFeatureDefinition().getLabel()) + 
772
						"\">");
773
 
774
				//<Value></Value>
775
				for(ExpandedBullet bullet : expBullets) {
776
 
777
					// FFC at bullet level
778
					if(bullet.getFreeformContent() != null) {
779
						ffc.add(bullet.getFreeformContent().getContent());
780
					}
781
 
782
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
783
							StringEscapeUtils.escapeXml(bullet.getValue()) + 
784
							"</Value>");
785
				}
786
 
787
				//</Property>
788
				xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
789
			}
790
		}
791
 
792
		// FFC as Label="Free-form Content"
793
		if(!ffc.isEmpty()) {
794
			xmlSnippet.add(this.xmlIndentation[indent] + 
795
					"<Property Label=\"Free-form Content\">");
796
 
797
			for(String f : ffc) {
798
				if(f != null) {
799
					f = StringEscapeUtils.escapeXml(f);
800
 
801
					xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
802
						f + "</Value>");
803
				}
804
			}
805
 
806
			xmlSnippet.add(this.xmlIndentation[indent] + "</Property>");
807
		}
808
 
809
		// Children slides
810
		// TODO
811
 
812
		return StringUtils.join(xmlSnippet, "\n");
813
	}
64 naveen 814
 
815
	/**
816
	 * 
817
	 * @param expEntity
818
	 * @param facetXMLSnippets
819
	 * @param indent
820
	 * @return
821
	 */
822
	private String getEntityXMLSnippet(ExpandedEntity expEntity, 
67 naveen 823
			String facetXMLSnippets, String propertiesXMLSnippets, int indent) {
64 naveen 824
 
825
		//<Entity ID="40001">
826
		List<String> xmlSnippet = new ArrayList<String>();
827
 
828
		String entityID = new Long(expEntity.getID()).toString();
829
		xmlSnippet.add(this.xmlIndentation[indent] + "<Entity ID=\""+ entityID + 
830
				"\">");
831
 
832
		//<Category>Business Phones</Category>
833
		String category = expEntity.getCategory().getLabel();
834
		xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Category>" + 
67 naveen 835
				StringEscapeUtils.escapeXml(category) + "</Category>");
64 naveen 836
 
837
		//<Title>Nokia E71</Title>
67 naveen 838
		String title = StringEscapeUtils.escapeXml(expEntity.getBrand()) + " " +
839
		StringEscapeUtils.escapeXml(expEntity.getModelName()) + 
64 naveen 840
			((expEntity.getModelNumber() != null) ? 
67 naveen 841
					(" " + 
842
						StringEscapeUtils.escapeXml(expEntity.getModelNumber()))
64 naveen 843
					: "");
844
 
845
		xmlSnippet.add(this.xmlIndentation[indent + 1] + 
67 naveen 846
				"<Title>" + StringEscapeUtils.escapeXml(title) + "</Title>");
64 naveen 847
 
848
		xmlSnippet.add(facetXMLSnippets);
67 naveen 849
 
850
		xmlSnippet.add(propertiesXMLSnippets);
64 naveen 851
 
852
		//</Entity>
853
		xmlSnippet.add(this.xmlIndentation[indent] + "</Entity>");
854
 
855
		return StringUtils.join(xmlSnippet, "\n");
856
	}
857
 
858
	/**
859
	 * 
860
	 * @param expFacetDef
861
	 * @param values
862
	 * @param indent
863
	 * @return String XML Snippet
864
	 */
81 naveen 865
	private String getFacetXMLSnippet(
866
			ExpandedFacetRuleDefinition expFacetRuleDef, 
64 naveen 867
			List<Object> values, int indent) {
81 naveen 868
 
64 naveen 869
		// <Facet Label="Form Factor">
870
		List<String> xmlSnippet = new ArrayList<String>();
81 naveen 871
		String target = expFacetRuleDef.getFacetDefinition().getTarget();
872
 
83 naveen 873
		xmlSnippet.add(this.xmlIndentation[indent] + "<Facet ID=\"" + 
874
				expFacetRuleDef.getFacetDefinitionID() + "\" Label=\"" + 
64 naveen 875
				target + "\">");
876
 
877
		//<Value>Candybar</Value>
878
		for(Object value : values) {
879
			xmlSnippet.add(this.xmlIndentation[indent + 1] + "<Value>" + 
880
					value.toString() + "</Value>");
881
		}
882
 
883
		//</Facet>
884
		xmlSnippet.add(this.xmlIndentation[indent] + "</Facet>");
885
 
886
		return StringUtils.join(xmlSnippet, "\n");
887
	}
62 naveen 888
}