Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
162 naveen 1
package in.shop2020.creation.controllers;
2
 
3
import java.io.PrintWriter;
4
import java.io.StringWriter;
5
import java.io.Writer;
198 naveen 6
import java.util.ArrayList;
7
import java.util.Arrays;
162 naveen 8
import java.util.Collection;
198 naveen 9
import java.util.HashMap;
10
import java.util.List;
162 naveen 11
import java.util.Map;
12
 
201 naveen 13
import in.shop2020.metamodel.core.Bullet;
162 naveen 14
import in.shop2020.metamodel.core.Entity;
201 naveen 15
import in.shop2020.metamodel.core.Feature;
198 naveen 16
import in.shop2020.metamodel.core.FreeformContent;
201 naveen 17
import in.shop2020.metamodel.core.PrimitiveDataObject;
198 naveen 18
import in.shop2020.metamodel.core.Slide;
19
import in.shop2020.metamodel.definitions.Category;
20
import in.shop2020.metamodel.definitions.DefinitionsContainer;
162 naveen 21
import in.shop2020.metamodel.definitions.EntityContainer;
201 naveen 22
import in.shop2020.metamodel.definitions.FeatureDefinition;
23
import in.shop2020.metamodel.definitions.SlideDefinition;
24
import in.shop2020.metamodel.definitions.SlideFeatureDefinition;
198 naveen 25
import in.shop2020.metamodel.util.ExpandedBullet;
201 naveen 26
import in.shop2020.metamodel.util.ExpandedBulletDefinition;
162 naveen 27
import in.shop2020.metamodel.util.ExpandedEntity;
201 naveen 28
import in.shop2020.metamodel.util.ExpandedFeature;
29
import in.shop2020.metamodel.util.ExpandedFeatureDefinition;
198 naveen 30
import in.shop2020.metamodel.util.ExpandedSlide;
31
import in.shop2020.metamodel.util.ExpandedSlideDefinition;
162 naveen 32
import in.shop2020.metamodel.util.SequenceGenerator;
33
import in.shop2020.util.DBUtils;
34
import in.shop2020.util.Utils;
35
 
36
import org.apache.juli.logging.Log;
37
import org.apache.juli.logging.LogFactory;
38
import org.apache.struts2.rest.DefaultHttpHeaders;
39
import org.apache.struts2.rest.HttpHeaders;
40
 
41
import org.apache.struts2.convention.annotation.Result;
42
import org.apache.struts2.convention.annotation.Results;
43
import org.apache.struts2.interceptor.ParameterAware;
44
 
198 naveen 45
import org.apache.commons.lang.StringUtils;
46
 
162 naveen 47
@Results({
48
    @Result(name="success", type="redirectAction", 
198 naveen 49
    		params = {"actionName" , "entity"}),
50
    @Result(name="redirect", location="${url}", type="redirect")
162 naveen 51
})
52
public class EntityController implements ParameterAware {
53
 
54
	/**
55
	 * 
56
	 */
57
	private static Log log = LogFactory.getLog(EntityController.class);
58
 
59
	/**
60
	 * 
61
	 */
62
	private String id;
63
 
64
	private ExpandedEntity expEntity;
65
 
66
	private Collection<Entity> entities;
67
 
68
	private Map<String, String[]> reqparams;
69
 
198 naveen 70
	private EntityContainer ents;
71
 
72
	private DefinitionsContainer defs;
73
 
74
	private long firstSlideID;
75
 
76
	private ExpandedSlideDefinition expSlideDef;
77
 
78
	private ExpandedSlide expSlide;
79
 
80
	private String redirectURL;
81
 
82
	private Exception exception;
83
 
84
	private String errorString;
85
 
86
	private long newCurrentSlideDefinitionID;
87
 
88
	private long newNextSlideDefinitionID;
89
 
90
	private long newPrevSlideDefinitionID;
91
 
92
 
162 naveen 93
    // GET /entity
94
    public HttpHeaders index() {
95
    	log.info("EntityController.index");
96
 
97
    	EntityContainer ents = new EntityContainer();
98
 
99
    	try {
100
			this.entities = ents.getEntities().values();
101
		} catch (Exception e) {
102
			log.error(this.getStackTrace(e));
198 naveen 103
			this.setErrorString(this.getStackTrace(e));
104
			return new DefaultHttpHeaders("fatal");
162 naveen 105
		}
106
 
107
        return new DefaultHttpHeaders("index")
108
            .disableCaching();
109
    }
110
 
111
    // GET /entity
112
    public String create() {
113
    	log.info("EntityController.create");
114
 
115
		SequenceGenerator sg;
116
		try {
117
			sg = SequenceGenerator.getInstance();
118
			long entityID = sg.getNextSequence(SequenceGenerator.ENTITY);
119
 
120
			String categoryID = this.reqparams.get("category")[0];
121
			Entity entity = new Entity(entityID, Long.parseLong(categoryID));
122
 
123
			entity.setBrand(this.reqparams.get("brand")[0]);
124
			entity.setModelName(this.reqparams.get("modelname")[0]);
125
			entity.setModelNumber(this.reqparams.get("modelnumber")[0]);
126
 
198 naveen 127
			this.addEntity(entity);
162 naveen 128
 
129
	    	this.setId(new Long(entityID).toString());
130
		} catch (Exception e) {
131
			log.error(this.getStackTrace(e));
198 naveen 132
			this.setErrorString(this.getStackTrace(e));
133
			return "fatal";
162 naveen 134
		}
198 naveen 135
 
136
		this.redirectURL = "entity/" + this.getId() + "/edit";
162 naveen 137
 
198 naveen 138
		return "redirect";
162 naveen 139
    }
140
 
141
    // GET /entity/1/edit
142
    public String edit() {
143
    	log.info("EntityController.edit");
144
 
145
    	long entityID = Long.parseLong(this.getId());
146
    	log.info("entityID:" + entityID);
147
 
198 naveen 148
    	EntityContainer ents = this.getEntityContainer();
149
    	DefinitionsContainer defs = this.getDefinitionsContainer();
162 naveen 150
 
151
    	try {
152
			this.expEntity = ents.getExpandedEntity(entityID);
198 naveen 153
			//log.info("this.expEntity:" + this.expEntity);
154
 
155
			long catID = this.expEntity.getCategoryID();
156
			List<Long> slideIDs = defs.getCategorySlideSequence(catID);
157
 
158
			this.firstSlideID = slideIDs.get(0);
159
 
162 naveen 160
		} catch (Exception e) {
161
			log.error(this.getStackTrace(e));
198 naveen 162
			this.setErrorString(this.getStackTrace(e));
163
			return "fatal";
162 naveen 164
		}
165
 
166
        return "edit";
167
    }
198 naveen 168
 
169
 
170
    public String getUrl() {
171
    	return this.redirectURL;
172
    }
162 naveen 173
 
174
    // GET /entity/new
175
    public String editNew() {
176
    	log.info("EntityController.editNew");
177
 
178
        return "editNew";
179
    }
180
 
181
    // GET /entity/1
182
    public String update() {
183
    	log.info("EntityController.update");
184
 
198 naveen 185
    	long entityID = Long.parseLong(this.getId());
186
    	log.info("entityID:" + entityID);
187
 
188
    	EntityContainer ents = this.getEntityContainer();
189
    	DefinitionsContainer defs = this.getDefinitionsContainer();
190
 
191
    	try {
192
			this.expEntity = ents.getExpandedEntity(entityID);
193
			//log.info("this.expEntity:" + this.expEntity);
194
 
195
			long currentSlideID = 0L;
196
			long nextSlideID = 0L;
197
			long prevSlideID = 0L;
198
 
199
			String[] currentslideIDStrings = 
200
				this.reqparams.get("currentslideID");
201
 
202
			String[] nextslideIDStrings = this.reqparams.get("nextslideID");
203
 
204
			String[] prevslideIDStrings = this.reqparams.get("prevslideID");
205
 
206
			// Current Slide ID
207
			if(currentslideIDStrings != null && 
208
					currentslideIDStrings.length > 0) {
209
				try {
210
					currentSlideID = Long.parseLong(currentslideIDStrings[0]);
211
				}
212
				catch (NumberFormatException nfe) {}
213
			}
214
 
215
			// Next Slide ID
216
			if(nextslideIDStrings != null && 
217
					nextslideIDStrings.length > 0) {
218
				try {
219
					nextSlideID = Long.parseLong(nextslideIDStrings[0]);
220
				}
221
				catch (NumberFormatException nfe) {}
222
			}
223
 
224
			// Prev Slide ID
225
			if(prevslideIDStrings != null && 
226
					prevslideIDStrings.length > 0) {
227
				try {
228
					prevSlideID = Long.parseLong(prevslideIDStrings[0]);
229
				}
230
				catch (NumberFormatException nfe) {}
231
			}
232
			log.info("currentSlideID:" + currentSlideID);
233
			log.info("nextSlideID:" + nextSlideID);
234
			log.info("prevSlideID:" + prevSlideID);
235
 
236
			// Save on basic info page
237
			if (this.reqparams.containsKey("save") && currentSlideID == 0L) {
238
				log.info("Save");
239
 
240
				Entity entity = this.expEntity.getEntity();
241
 
242
				String categoryID = this.reqparams.get("category")[0];
243
 
244
				entity.setCategoryID(Long.parseLong(categoryID));
245
				entity.setBrand(this.reqparams.get("brand")[0]);
246
				entity.setModelName(this.reqparams.get("modelname")[0]);
247
				entity.setModelNumber(this.reqparams.get("modelnumber")[0]);
248
 
249
				this.updateEntity(entity);
250
 
251
				return "success";
252
			}
253
 
254
			long catID = this.expEntity.getCategoryID();
255
			List<Long> slideIDs = defs.getCategorySlideSequence(catID);
256
			log.info("slideIDs:"+slideIDs);
257
 
258
			// Save or Next or Prev - When editing a slide
259
			int currentSlideIndex = 0;
260
			if(currentSlideID != 0L) {
261
				currentSlideIndex = slideIDs.indexOf(new Long(currentSlideID));
262
				log.info("currentSlideIndex:" + currentSlideIndex);
263
 
264
				Entity entity = this.expEntity.getEntity();
265
 
266
				// Update Entity Record
267
				Slide currentSlide = entity.getSlide(currentSlideID);
268
 
269
				// Slide free-form content
201 naveen 270
				FreeformContent slideFFC = this.getFreeformContent("slide");
198 naveen 271
				log.info("slideFFC:" + slideFFC);
272
 
273
				currentSlide.setFreeformContent(slideFFC);
274
				//log.info("currentSlide:" + currentSlide);
275
 
201 naveen 276
				// Collect Feature bullets
277
				List<Feature> features = this.createFeatures(currentSlide);
278
				log.info("features:" + features);
279
 
280
				currentSlide.setFeatures(features);
281
 
198 naveen 282
				// Store
283
				this.updateEntity(entity);
284
				//log.info("entity:" + entity);
285
			}
286
 
287
			boolean showAnotherSlide = false;
288
 
289
			// -2 : Not set
290
			// -1 : Not found
291
			int newCurrentIndex = -2;  
292
			int newNextIndex = -2;
293
			int newPrevIndex = -2;
294
 
295
			// Next
296
			if(this.reqparams.containsKey("next") && nextSlideID != 0L) {
297
				log.info("Next");
298
 
299
				// Decide on next slide ID
300
				int nextSlideIndex = slideIDs.indexOf(new Long(nextSlideID));
301
				log.info("nextSlideIndex:"+nextSlideIndex);
302
 
303
				// New Current
304
				if (nextSlideIndex == -1) {
305
					this.setErrorString("Invalid Next slide ID " + nextSlideID);
306
					return "fatal";
307
				}
308
 
309
				newCurrentIndex = nextSlideIndex;
310
 
311
				// New Next
312
				if (newCurrentIndex != slideIDs.size()-1) {
313
					newNextIndex = newCurrentIndex + 1;
314
				}
315
 
316
				// New Prev.
317
				if(currentSlideID != 0L) {
318
					newPrevIndex = currentSlideIndex;
319
				}
320
 
321
				showAnotherSlide = true;
322
			}
323
 
324
			// Prev
325
			if(this.reqparams.containsKey("prev") && prevSlideID != 0L) {
326
				log.info("Prev");
327
 
328
				// Decide on prev slide ID
329
				int prevSlideIndex = slideIDs.indexOf(new Long(prevSlideID));
330
				log.info("prevSlideIndex:" + prevSlideIndex);
331
 
332
				if (prevSlideIndex == -1) {
333
					this.setErrorString("Invalid Prev slide ID " + prevSlideID);
334
					return "fatal";
335
				}
336
 
337
				// New Next
338
				if(currentSlideID != 0L) {
339
					newNextIndex = currentSlideIndex;
340
				}
341
 
342
				// New Current
343
				newCurrentIndex = prevSlideIndex;
344
 
345
				// New Prev.
346
				if (newCurrentIndex != 0) {
347
					newPrevIndex = newCurrentIndex - 1;
348
				}
349
 
350
				showAnotherSlide = true;
351
			}
352
 
353
			if(showAnotherSlide) {
354
 				log.info("newCurrentIndex:"+newCurrentIndex);
355
				log.info("newNextIndex:"+newNextIndex);
356
				log.info("newPrevIndex:"+newPrevIndex);
357
 
358
				if(newCurrentIndex != -2) {
359
					this.setNewCurrentSlideDefinitionID(
360
							slideIDs.get(newCurrentIndex).longValue());
361
				}
362
 
363
				if(newNextIndex != -2) {
364
					this.setNewNextSlideDefinitionID(
365
							slideIDs.get(newNextIndex).longValue());
366
				}
367
 
368
				if(newPrevIndex != -2) {
369
					this.setNewPrevSlideDefinitionID(
370
							slideIDs.get(newPrevIndex).longValue());
371
				}
372
 
373
				// Current Slide Definition
374
				this.expSlideDef = defs.getExpandedSlideDefinition(
375
						this.getNewCurrentSlideDefinitionID());
376
 
377
				// Current Slide Instance
378
				this.expSlide = this.expEntity.getExpandedSlide(
379
						this.getNewCurrentSlideDefinitionID());
380
				log.info("this.expSlide:" + this.expSlide);
381
 
382
				return "editSlide";
383
			}
384
		}
385
    	catch (Exception e) {
386
			log.error(this.getStackTrace(e));
387
			this.setErrorString(this.getStackTrace(e));
388
			return "fatal";
389
    	}
390
 
391
        return "success";
162 naveen 392
    }
393
 
394
    /**
201 naveen 395
     * 
396
     * @param slide
397
     * @return
398
     * @throws Exception
399
     */
400
    private List<Feature> createFeatures(Slide slide) throws Exception {
401
 
402
		long slideDefID = slide.getSlideDefinitionID();
403
		SlideDefinition slideDef = defs.getSlideDefinition(slideDefID);
404
 
405
		List<SlideFeatureDefinition> slideFeatureDefs = 
406
			slideDef.getSlideFeatureDefinitions();
407
 
408
		DefinitionsContainer defs = this.getDefinitionsContainer();
409
 
410
		List<Feature> features = new ArrayList<Feature>();	
411
		for(SlideFeatureDefinition slideFeatureDef : slideFeatureDefs) {
412
			long featureDefinitionID = slideFeatureDef.getFeatureDefintionID();
413
 
414
			String featureDefIDString = 
415
				new Long(featureDefinitionID).toString();
416
 
417
			String[] bulletValues = this.reqparams.get(featureDefIDString);
418
			if(bulletValues == null || bulletValues.length == 0) {
419
				continue;
420
			}
421
 
422
			Feature feature = new Feature(featureDefinitionID);
423
 
424
			// Bullets
425
			List<Bullet> bullets = new ArrayList<Bullet>();
426
			FeatureDefinition featureDef = defs.getFeatureDefinition(
427
					featureDefinitionID);
428
 
429
			ExpandedFeatureDefinition expFeatureDef = 
430
				new ExpandedFeatureDefinition(featureDef);
431
 
432
			ExpandedBulletDefinition expBulletDef = 
433
				expFeatureDef.getExpandedBulletDefinition();
434
 
435
			// Composite
436
			if(expBulletDef.isComposite()) {
437
 
438
			}
439
 
440
			// Enumerated
441
			else if(expBulletDef.isEnumerated()) {
442
 
443
			}
444
 
445
			// Primitive
446
			else {
447
				Bullet bullet = new Bullet(
448
						new PrimitiveDataObject(bulletValues[0]));
449
 
450
				bullets.add(bullet);
451
			}
452
 
453
			feature.setBullets(bullets);
454
 
455
			// FFC
456
			FreeformContent featureFFC = 
457
				this.getFreeformContent(featureDefIDString);
458
 
459
			feature.setFreeformContent(featureFFC);
460
 
461
			features.add(feature);
462
		}
463
 
464
		return features;
465
	}
466
 
467
	/**
468
     * 
469
     * @param ID
470
     * @return
471
     */
472
    private FreeformContent getFreeformContent(String ID) {
473
		FreeformContent ffc = new FreeformContent();
474
		String[] ffts = this.reqparams.get(ID + "_fft");
475
		if(ffts != null) {
476
			ffc.setFreeformTexts(Arrays.asList(ffts));
477
		}
478
 
479
		String[] imgURLs = this.reqparams.get(ID + "_image_url");
480
		if(imgURLs != null) {
481
			ffc.setImageURLs(Arrays.asList(imgURLs));
482
		}
483
 
484
		String[] youtubeURLs = 
485
			this.reqparams.get(ID + "_youtube_url");
486
		if(youtubeURLs != null) {
487
			ffc.setYoutubeURLs(Arrays.asList(youtubeURLs));
488
		}
489
 
490
		log.info("ffc:" + ffc);
491
		return ffc;
492
	}
493
 
494
	/**
162 naveen 495
	 * @return the entities
496
	 */
497
	public Collection<Entity> getEntities() {
498
		return entities;
499
	}
500
 
501
    /**
502
	 * @return the entities
503
	 */
504
	public ExpandedEntity getEntity() {
505
		return expEntity;
506
	}
507
 
198 naveen 508
    /**
509
	 * @return the current slide to edit
510
	 */
511
	public ExpandedSlideDefinition getExpandedSlideDefinition() {
512
		return expSlideDef;
513
	}
162 naveen 514
 
515
	/**
516
     * 
517
     * @param id
518
     */
519
    public void setId(String id) {
520
        this.id = id;
521
    }
522
 
523
    /**
524
     * 
525
     */
526
    public String getId() {
527
    	return this.id;
528
    }
529
 
198 naveen 530
	/**
531
	 * @return the firstSlideID
532
	 */
533
	public long getFirstSlideID() {
534
		return firstSlideID;
535
	}
536
 
162 naveen 537
	@Override
538
	public void setParameters(Map<String, String[]> reqmap) {
539
		log.info("setParameters:" + reqmap);
540
 
541
		this.reqparams = reqmap;
542
	}
543
 
198 naveen 544
	public Map<String, String> getCategories() throws Exception {
545
		DefinitionsContainer defs = this.getDefinitionsContainer();
546
		Map<String, String> cats = new HashMap<String, String>();
547
 
548
		List<Category> children = defs.getChildrenCategories(10001L);
549
		for(Category child : children) {
550
			cats.put(new Long(child.getID()).toString(), child.getLabel());
551
		}
552
 
553
		return cats;
554
	}
555
 
556
	public String getBrandString() throws Exception {
557
		List<String> brands = this.getBrands();
558
		return "\"" + StringUtils.join(brands, "\", \"") + "\"";
559
	}
560
 
561
	public List<String> getBrands() throws Exception {
562
		EntityContainer ents = this.getEntityContainer();
563
		List<String> brands = new ArrayList<String>();
564
 
565
		List<ExpandedBullet> expBullets;
566
 
567
		expBullets = ents.getLearnedBullets(
568
				Utils.BRAND_FEATURE_DEFINITION_ID);
569
 
570
		for(ExpandedBullet expBullet : expBullets) {
571
			brands.add(expBullet.getValue());
572
		}
573
 
574
		return brands;
575
	}
576
 
577
    private EntityContainer getEntityContainer() {
578
    	if(this.ents == null) {
579
    		this.ents = new EntityContainer();
580
    	}
581
 
582
	    return this.ents;
583
    }
584
 
585
    private DefinitionsContainer getDefinitionsContainer() {
586
    	if(this.defs == null) {
587
    		this.defs = new DefinitionsContainer();
588
    	}
589
 
590
	    return this.defs;
591
    }
592
 
593
    /**
594
     * 
595
     * @param entity
596
     * @throws Exception
597
     */
598
	private void addEntity(Entity entity) throws Exception {			
599
		EntityContainer entContainer = new EntityContainer();
600
 
601
		entContainer.addEntity(entity);
602
 
603
		DBUtils.store(entContainer.getEntities(), Utils.ENTITIES_DB_PATH + 
604
				"entities" + ".ser");
605
 
606
		String entitiesbycategoryDBFile = Utils.ENTITIES_DB_PATH + 
607
			"entitiesbycategory" + ".ser";
608
 
609
		DBUtils.store(entContainer.getEntitiesbyCategory(), 
610
				entitiesbycategoryDBFile);
611
	}
612
 
613
    /**
614
     * 
615
     * @param entity
616
     * @throws Exception
617
     */
618
	private void updateEntity(Entity entity) throws Exception {			
619
		EntityContainer entContainer = new EntityContainer();
620
 
621
		entContainer.updateEntity(entity);
622
 
623
		DBUtils.store(entContainer.getEntities(), Utils.ENTITIES_DB_PATH + 
624
				"entities" + ".ser");
625
 
626
		String entitiesbycategoryDBFile = Utils.ENTITIES_DB_PATH + 
627
			"entitiesbycategory" + ".ser";
628
 
629
		DBUtils.store(entContainer.getEntitiesbyCategory(), 
630
				entitiesbycategoryDBFile);
631
	}
632
 
162 naveen 633
	/**
198 naveen 634
	 * @param exception the exception to set
635
	 */
636
	public void setException(Exception exception) {
637
		this.exception = exception;
638
	}
639
 
640
	/**
641
	 * @return the exception
642
	 */
643
	public Exception getException() {
644
		return exception;
645
	}
646
 
647
	/**
648
	 * @param errorString the exceptionString to set
649
	 */
650
	public void setErrorString(String errorString) {
651
		this.errorString = errorString;
652
	}
653
 
654
	/**
655
	 * @return the exceptionString
656
	 */
657
	public String getErrorString() {
658
		return errorString;
659
	}
660
 
661
	/**
662
	 * @param newCurrentSlideID the newCurrentSlideID to set
663
	 */
664
	public void setNewCurrentSlideDefinitionID(
665
			long newCurrentSlideDefinitionID) {
666
		this.newCurrentSlideDefinitionID = newCurrentSlideDefinitionID;
667
	}
668
 
669
	/**
670
	 * @return the newCurrentSlideID
671
	 */
672
	public long getNewCurrentSlideDefinitionID() {
673
		return newCurrentSlideDefinitionID;
674
	}
675
 
676
	/**
677
	 * @param newNextSlideID the newNextSlideID to set
678
	 */
679
	public void setNewNextSlideDefinitionID(long newNextSlideDefinitionID) {
680
		this.newNextSlideDefinitionID = newNextSlideDefinitionID;
681
	}
682
 
683
	/**
684
	 * @return the newNextSlideID
685
	 */
686
	public long getNewNextSlideDefinitionID() {
687
		return newNextSlideDefinitionID;
688
	}
689
 
690
	/**
691
	 * @param expSlide the expSlide to set
692
	 */
693
	public void setExpandedSlide(ExpandedSlide expSlide) {
694
		this.expSlide = expSlide;
695
	}
696
 
697
	/**
698
	 * @return the expSlide
699
	 */
700
	public ExpandedSlide getExpandedSlide() {
701
		return expSlide;
702
	}
703
 
704
	/**
705
	 * @param newPrevSlideDefinitionID the newPrevSlideDefinitionID to set
706
	 */
707
	public void setNewPrevSlideDefinitionID(long newPrevSlideDefinitionID) {
708
		this.newPrevSlideDefinitionID = newPrevSlideDefinitionID;
709
	}
710
 
711
	/**
712
	 * @return the newPrevSlideDefinitionID
713
	 */
714
	public long getNewPrevSlideDefinitionID() {
715
		return newPrevSlideDefinitionID;
716
	}
717
 
718
	/**
162 naveen 719
	 * 
200 naveen 720
	 * @param featureDefinitionID
721
	 * @return
722
	 * @throws Exception
723
	 */
724
	public String getLearnedValuesString(long featureDefinitionID) 
725
			throws Exception {
726
		EntityContainer ents = this.getEntityContainer();
727
		List<ExpandedBullet> learnedBullets = 
728
			ents.getLearnedBullets(featureDefinitionID);
729
 
201 naveen 730
		if(learnedBullets == null) {
731
			return "";
732
		}
733
 
200 naveen 734
		List<String> learnedValues = new ArrayList<String>();
735
		for(ExpandedBullet expBullet : learnedBullets) {
736
			learnedValues.add(expBullet.getValue());
737
		}
738
 
739
		return "\"" + StringUtils.join(learnedValues, "\", \"") + "\"";
740
	}
741
 
742
	/**
743
	 * 
201 naveen 744
	 * @param featureDefinitionID
745
	 * @return
746
	 * @throws Exception
747
	 */
748
	public ExpandedFeature getFeature(long featureDefinitionID) 
749
		throws Exception {
750
		EntityContainer ents = this.getEntityContainer();
751
 
752
		Feature feature = ents.getFeature(this.expSlide, featureDefinitionID);
753
		if(feature == null) {
754
			return null;
755
		}
756
 
757
		return new ExpandedFeature(feature);
758
	}
759
 
760
	/**
761
	 * 
162 naveen 762
	 * @param aThrowable
763
	 * @return
764
	 */
765
	private String getStackTrace(Throwable aThrowable) {
766
	    final Writer result = new StringWriter();
767
	    final PrintWriter printWriter = new PrintWriter(result);
768
	    aThrowable.printStackTrace(printWriter);
769
	    return result.toString();
770
	}
771
 
772
}