Subversion Repositories SmartDukaan

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
17 naveen 1
/**
2
 * 
3
 */
4
package in.shop2020.metamodel.util;
5
 
18 naveen 6
import java.io.BufferedReader;
7
import java.io.FileReader;
19 naveen 8
import java.io.IOException;
18 naveen 9
import java.io.LineNumberReader;
10
import java.util.ArrayList;
19 naveen 11
import java.util.Collection;
18 naveen 12
import java.util.HashMap;
13
import java.util.Iterator;
14
import java.util.List;
15
import java.util.Map;
19 naveen 16
import java.util.TreeMap;
18 naveen 17
import java.util.logging.Level;
18
 
19 naveen 19
import in.shop2020.metamodel.definitions.BulletDefinition;
17 naveen 20
import in.shop2020.metamodel.definitions.Catalog;
21
import in.shop2020.metamodel.definitions.Category;
19 naveen 22
import in.shop2020.metamodel.definitions.CompositeDefinition;
18 naveen 23
import in.shop2020.metamodel.definitions.DatatypeDefinition;
17 naveen 24
import in.shop2020.metamodel.definitions.DefinitionsContainer;
18 naveen 25
import in.shop2020.metamodel.definitions.EditorialImportance;
19 naveen 26
import in.shop2020.metamodel.definitions.EnumDefinition;
18 naveen 27
import in.shop2020.metamodel.definitions.FeatureDefinition;
28
import in.shop2020.metamodel.definitions.SlideDefinition;
29
import in.shop2020.metamodel.definitions.Unit;
30
import in.shop2020.util.Utils;
17 naveen 31
 
32
import org.apache.commons.lang.ArrayUtils;
33
import org.apache.commons.lang.StringUtils;
34
 
35
/**
36
 * CN - Content Tool
37
 * Imports and exports content. Validates against content model
38
 * 
39
 * @author naveen
40
 *
41
 */
42
public class CN {
43
	public static final String CONTENT_SRC_TXT_PATH = 
44
		"/home/naveen/workspace/eclipse/webapp/src/content/txt/";
45
	public static final String CONTENT_SRC_HTML_PATH = 
46
		"/home/naveen/workspace/eclipse/webapp/src/content/html/";
47
	public static final String CONTENT_SRC_XML_PATH = 
48
		"/home/naveen/workspace/eclipse/webapp/src/content/xml/";
49
	public static final String CONTENT_DB_PATH =  
50
		"/home/naveen/workspace/eclipse/webapp/db/entities/";
18 naveen 51
 
17 naveen 52
	// Known patterns
53
	public static final String PATTERN_LEVEL_1 = "* ";
54
	public static final String PATTERN_LEVEL_2 = "   * ";
55
	public static final String PATTERN_LEVEL_3 = "      * ";
56
	public static final String PATTERN_LEVEL_4 = "         * ";
57
 
58
	private long categoryID;
59
	private String srcFile;
60
	private String dbFile;
61
 
19 naveen 62
	private Map<String, Long> slideNameToSlideDefID = 
63
		new HashMap<String, Long>();
64
 
65
	private Map<String, Long> slideNameFeatureNameToFeatureDefID =
66
		new HashMap<String, Long>();
67
 
68
	private Map<String, Long> slideNameFeatureNameToEnumValueID =
69
		new HashMap<String, Long>();
70
 
17 naveen 71
	/**
72
	 * @param args
73
	 */
74
	public static void main(String[] args) throws Exception {
75
		String[] commands = new String[] {"show", "import"};
76
 
77
		String usage = "Usage: CN ["+ StringUtils.join(commands, "|") +
78
			"] {Category ID} {Content file name}\n" + 
79
			"Note:Only text files for now";
80
 
81
		if(args.length < 3) {
82
			System.out.println(usage);
83
			System.exit(-1);
84
		}
18 naveen 85
		Utils.logger.info("CN "+ args[0] + " " + args[1]+ " " + args[2]);
86
 
17 naveen 87
		String inputCommand = args[0];
88
		String inputCategoryID = args[1];
89
		String inputFilename = args[2];
90
 
91
		if(!ArrayUtils.contains(commands, inputCommand)) {
92
			System.out.println(usage);
93
			System.exit(-1);
94
		}
95
 
96
		long categoryID = new Long(inputCategoryID).longValue();
97
		CN cn = new CN(categoryID, inputFilename);
98
		if(inputCommand.equals("import")) {
99
			cn.importEntity();
100
		}
101
		else if(inputCommand.equals("show")) {
102
			cn.showEntity();
103
		}
104
	}
105
 
106
	/**
107
	 * 
108
	 * @param categoryID
109
	 * @param fileName
110
	 */
111
	public CN(long categoryID, String fileName) {
112
		this.categoryID = categoryID;
113
 
114
		this.srcFile = CONTENT_SRC_TXT_PATH + fileName + ".txt";
115
		this.dbFile = CONTENT_DB_PATH + "entities" + ".ser";
116
	}
117
 
118
	/**
119
	 * 
120
	 * @throws Exception
121
	 */
18 naveen 122
	public void importEntity() throws Exception {		
123
		//this.test();
124
		Utils.logger.info(this.srcFile);
17 naveen 125
 
18 naveen 126
		FileReader fileReader = new FileReader(this.srcFile);
127
		BufferedReader lineReader = new BufferedReader(fileReader);
128
		LineNumberReader reader = new LineNumberReader(lineReader);
17 naveen 129
 
19 naveen 130
		List<String> allLines = new ArrayList<String>();
131
 
18 naveen 132
		// 1 Collect all candidate slide names
19 naveen 133
		// Order of keys need to be restored
134
		Map<Integer, String> candidateSlideNames = 
135
			new TreeMap<Integer, String>();
136
 
137
		int lineCount = 0;
18 naveen 138
		while(true) {
19 naveen 139
			String line = reader.readLine();			
18 naveen 140
			if(line == null) {
141
				break;
142
			}
143
 
19 naveen 144
			allLines.add(line);
145
			lineCount++;
146
 
18 naveen 147
			if(line.isEmpty()) {
148
				continue;
149
			}
150
 
151
			int lineNumber = reader.getLineNumber();
152
 
153
			//Utils.logger.info(line);
154
			//Utils.logger.info("lineNumber="+lineNumber);
155
 
156
			// RE-VISIT
157
			// 1.1 Slide names starting with Alpha
158
			//Utils.logger.info(line.substring(0, 1));
159
			if(StringUtils.isAlpha((line.substring(0, 1)))) {
160
				//Utils.logger.info(line);
161
				//Utils.logger.info("Level 0");
162
 
163
				candidateSlideNames.put(new Integer(lineNumber), line);
164
			}
165
		}
19 naveen 166
 
167
		lineReader.close();
168
 
169
		Utils.logger.info("lineCount=" + lineCount);
18 naveen 170
		Utils.logger.info(candidateSlideNames.toString());
17 naveen 171
 
18 naveen 172
		// 2 Filter and validate parent slide names
173
		Map<Integer, String> slideNames = 
174
			this.processSlides(candidateSlideNames);
175
 
176
		Utils.logger.info(slideNames.toString());
177
 
19 naveen 178
		// 3 Collect all children slides
179
		// 4 Filter and validate children slide names
18 naveen 180
		// TODO
181
 
19 naveen 182
		// 5 Collect all Features for a slide
183
		// 5.1 Find line number range between which content for feature is found
184
		Map<String, int[]> featureLineNumberRangePerSlide = 
185
			new HashMap<String, int[]>();
186
 
187
		Utils.logger.info("slideNames.keySet=" + 
188
				slideNames.keySet().toString());
18 naveen 189
 
19 naveen 190
		Integer[] slideLineNumbers = slideNames.keySet().toArray(
191
				new Integer[0]);
18 naveen 192
 
19 naveen 193
		for(int i=0; i<slideLineNumbers.length-1; i++) {
194
			int from = slideLineNumbers[i]+1;
195
			int to = slideLineNumbers[i+1]-1;
196
			Utils.logger.info("from=" + from + " to=" + to);
197
 
198
			String tSlideName = slideNames.get(
199
					new Integer(slideLineNumbers[i]));
200
 
201
			Utils.logger.info("tSlideName=" + tSlideName);
202
 
203
			featureLineNumberRangePerSlide.put(tSlideName, 
204
					new int[] {from, to});
205
		}
206
 
207
		// For last slide
208
		Utils.logger.info("tSlideName=" + 
209
				slideNames.get(new Integer(
210
						slideLineNumbers[slideLineNumbers.length-1])));
211
 
212
		Utils.logger.info("lineNumbers[lineNumbers.length-1]=" + 
213
				slideLineNumbers[slideLineNumbers.length-1]);
214
 
215
		Utils.logger.info(
216
			"from=" + (slideLineNumbers[slideLineNumbers.length-1]+1) + " to=" +
217
			(lineCount-1));
218
 
219
		featureLineNumberRangePerSlide.put(
220
			slideNames.get(
221
				new Integer(slideLineNumbers[slideLineNumbers.length-1])), 
222
				new int[] {(slideLineNumbers[slideLineNumbers.length-1] + 1), 
223
				(lineCount-1)});
224
 
225
		Utils.logger.info("featureLineNumberRangePerSlide=" + 
226
				featureLineNumberRangePerSlide.toString());
227
 
228
		// 6 Filter and validate features
229
		DefinitionsContainer defs = 
230
			Catalog.getInstance().getDefinitionsContainer();
231
 
232
		Map<String, Map> slideFeatureLabels = 
233
			new HashMap<String, Map>();
234
 
235
		for(String slideName : slideNames.values()) {
236
			//Utils.logger.info("slideName=" + slideName);
237
			List<SlideDefinition> slideDefs = 
238
				defs.getSlideDefinition(slideName);
239
 
240
			if(slideDefs == null) {
241
				continue;
242
			}
243
 
244
			if (slideDefs.isEmpty()) {
245
				continue;
246
			} 
247
 
248
			// RE-VISIT
249
			// Pick the first
250
			Utils.logger.info("slideDef=" + slideDefs.get(0));
251
			Long slideID = slideDefs.get(0).getID();
252
			this.slideNameToSlideDefID.put(slideName, slideID);
253
 
254
			Map<Integer, String> featureLabels = 
255
				this.processFeature(allLines, slideDefs.get(0), 
256
					featureLineNumberRangePerSlide.get(slideName));
257
 
258
			// Find feature definition IDs
259
			for(String featureLabel : featureLabels.values()) {
260
				FeatureDefinition featureDef = defs.getFeatureDefinition(
261
						slideID.longValue(), featureLabel);
262
 
263
				this.slideNameFeatureNameToFeatureDefID.put(
264
						(slideName + "_" + featureLabel), 
265
						new Long(featureDef.getID()));
266
			}
267
 
268
			slideFeatureLabels.put(slideName, featureLabels);
269
		}
270
 
271
		Utils.logger.info("slideFeatureLabels=" + slideFeatureLabels);
272
 
273
		Utils.logger.info("slideNameToSlideDefID=" + 
274
				this.slideNameToSlideDefID);
275
 
276
		Utils.logger.info("slideNameFeatureNameToFeatureDefID=" + 
277
				this.slideNameFeatureNameToFeatureDefID);
278
 
279
		// 7 Bullets
280
		// Collect all bullets
281
		for(String slideName : slideFeatureLabels.keySet()) {
282
			Map<Integer, String> featureLabels = 
283
				slideFeatureLabels.get(slideName);
284
 
285
			// 7.1 Find line number range between which content for bullets 
286
			// is found (per feature on this slide)
287
			Map<String, int[]> bulletLineNumberRangePerFeature = 
288
				this.getBulletLineRange(allLines, featureLabels);
289
 
290
			for(String featureLabel : bulletLineNumberRangePerFeature.keySet()){
291
 
292
				String key = slideName + "_" + featureLabel;
293
				Long featureDefID = 
294
					this.slideNameFeatureNameToFeatureDefID.get(key);
295
				FeatureDefinition featureDef = 
296
					defs.getFeatureDefinition(featureDefID.longValue());
297
 
298
				Long slideDefID = this.slideNameToSlideDefID.get(slideName);
299
				SlideDefinition slideDef = defs.getSlideDefinition(slideDefID);
300
 
301
				this.processBullets(allLines, 
302
						bulletLineNumberRangePerFeature.get(featureLabel), 
303
						featureDef, slideDef);
304
			}
305
		}
306
 
17 naveen 307
	}
308
 
309
	/**
310
	 * 
311
	 * @throws Exception
312
	 */
313
	public void showEntity() throws Exception {
314
	}
19 naveen 315
 
316
	/**
317
	 * 
318
	 * @param allLines
319
	 * @param bulletLineNumberRange
320
	 * @param featureDef
321
	 * @throws Exception 
322
	 */
323
	private void processBullets(List<String> allLines, 
324
			int[] bulletLineNumberRange, FeatureDefinition featureDef, 
325
			SlideDefinition slideDef) throws Exception {
326
 
327
		int from = bulletLineNumberRange[0];
328
		int to = bulletLineNumberRange[1];
329
 
330
		BulletDefinition bulletDef = featureDef.getBulletDefinition();
331
		Utils.logger.info("bulletDefinition=" + bulletDef);
332
 
333
		DefinitionsContainer defs = 
334
			Catalog.getInstance().getDefinitionsContainer();
335
 
336
		String crumb = "\"" + slideDef.getLabel() + "\" > \"" + 
337
			featureDef.getLabel() + "\"";
338
 
339
		// Enforce isMultivalue
340
		if(!bulletDef.isMultivalue() && (from != to)) {
341
			Utils.logger.severe("Only one bullet is allowed for " + crumb);
342
			return;
343
		}
18 naveen 344
 
19 naveen 345
		// If unit is defined
346
		Unit unitDef =  null;
347
		if(bulletDef.getUnitID() != 0L) {
348
			long unitID = bulletDef.getUnitID();
349
			unitDef = defs.getUnit(unitID);
350
			Utils.logger.info("unitDef=" + unitDef);
351
		}
352
 
353
		long datatypeDefID = bulletDef.getDatatypeDefinitionID();
354
		DatatypeDefinition datatypeDef = 
355
			defs.getDatatypeDefinition(datatypeDefID);
356
		Utils.logger.info("datatypeDef=" + datatypeDef);
357
 
358
		// If primitive
359
		boolean isEnum = false;
360
		boolean isComposite = false;
361
		boolean isPrimitive = false;
362
		if(datatypeDef instanceof EnumDefinition) {
363
			isEnum = true;
364
		}
365
		else if(datatypeDef instanceof CompositeDefinition) {
366
			isComposite = true;
367
		}
368
		else {
369
			isPrimitive = true;
370
		}
371
 
372
		Utils.logger.info("isEnum=" + isEnum + " isComposite=" + isComposite +
373
				" isPrimitive=" + isPrimitive);
374
 
375
		for(int i=from; i<to+1; i++) {
376
			String line = allLines.get(i);
377
 
378
			if(!StringUtils.startsWith(line, CN.PATTERN_LEVEL_2)) {
379
				continue;
380
			}
381
 
382
			String bulletText = StringUtils.strip(StringUtils.stripStart(line, 
383
					CN.PATTERN_LEVEL_2));
384
			Utils.logger.info("bulletText=" + bulletText);
385
 
386
			// if no unit is defined for this bullet whole is treated as value
387
			String bulletValue = bulletText;
388
 
389
			// If unit is defined
390
			if(bulletDef.getUnitID() != 0L) {
391
 
392
				// Validate unit
393
				String[] parts = StringUtils.split(bulletText, " ");
394
				if(parts.length < 2) {
395
					Utils.logger.severe("Unit is missing, " + crumb + " = " + 
396
							bulletText);
397
 
398
					continue;
399
				}
400
 
401
				if(parts.length > 2) {
402
					Utils.logger.severe("Invalid value, " + crumb + " = " + 
403
							bulletText);
404
 
405
					continue;
406
				}
407
 
408
				bulletValue = parts[0];
409
				String unitValue = parts[1];
410
				Utils.logger.info("unitValue="+unitValue);
411
 
412
				if(!(unitValue.equalsIgnoreCase(unitDef.getShortForm()) ||
413
						unitValue.equalsIgnoreCase(unitDef.getFullForm()))) {
414
					Utils.logger.severe("Invalid unit, " + crumb + " = " + 
415
							bulletText);
416
 
417
					continue;
418
				}
419
			}
420
 
421
			// Validate bullet value
422
			Utils.logger.info("bulletValue=" + bulletValue);
423
			if(isPrimitive) {
424
				String dt = datatypeDef.getName();
425
 
426
				// integer
427
				if(dt.equals("integer")) {
428
					try {
429
						Integer.parseInt(bulletValue);
430
					}
431
					catch(NumberFormatException nfe) {
432
						Utils.logger.severe("Invalide integer value, " + crumb +
433
								" = " + bulletValue);
434
					}
435
				}
436
 
437
				// decimal
438
				else if(dt.endsWith("decimal")) {
439
					try {
440
						Float.parseFloat(bulletValue);
441
					}
442
					catch(NumberFormatException nfe) {
443
						Utils.logger.severe("Invalide decimal value, " + crumb +
444
								" = " + bulletValue);
445
					}
446
				}
447
 
448
				// string
449
				// any thing goes
450
			}
451
 
452
			// Enum and fixed
453
			else if(isEnum && !bulletDef.isLearned()) {
454
				long enumValueID = defs.getEnumValueID(datatypeDef.getID(), 
455
						bulletValue);
456
 
457
				if(enumValueID == -1L) {
458
					Utils.logger.severe("Invalid value, " + crumb + " = " + 
459
							bulletValue);
460
 
461
					continue;
462
				}
463
 
464
				String key = slideDef.getLabel() + "_" + featureDef.getLabel() +
465
					"_" + bulletValue;
466
 
467
				this.slideNameFeatureNameToEnumValueID.put(key, 
468
						new Long(enumValueID));
469
			}
470
 
471
			// Composite
472
			else if(isComposite) {
473
 
474
			}
475
		}
476
 
477
		Utils.logger.info("slideNameFeatureNameToEnumValueID=" + 
478
				this.slideNameFeatureNameToEnumValueID);
479
	}
480
 
18 naveen 481
	/**
19 naveen 482
	 * 
483
	 * @param allLines
484
	 * @param featureLabels
485
	 * @return
486
	 */
487
	private Map<String, int[]> getBulletLineRange(List<String> allLines, 
488
			Map<Integer, String> featureLabels) {
489
		Utils.logger.info("allLines=" + allLines);
490
		Utils.logger.info("featureLabels=" + featureLabels);
491
 
492
		// 5.1 Find line number range between which content for feature is found
493
		Map<String, int[]> bulletLineNumberRangePerFeature = 
494
			new HashMap<String, int[]>();
495
 
496
		Utils.logger.info("featureLabels.keySet=" + 
497
				featureLabels.keySet().toString());
498
 
499
		Integer[] featureLineNumbers = featureLabels.keySet().toArray(
500
				new Integer[0]);
501
 
502
		for(int i=0; i<featureLineNumbers.length-1; i++) {
503
			String tFeatureLabel = featureLabels.get(
504
					new Integer(featureLineNumbers[i]));
505
 
506
			Utils.logger.info("tFeatureLabel=" + tFeatureLabel);
507
 
508
			int from = featureLineNumbers[i]+1;
509
			int to = featureLineNumbers[i+1]-1;
510
			Utils.logger.info("from=" + from + " to=" + to);
511
 
512
			bulletLineNumberRangePerFeature.put(tFeatureLabel, 
513
					new int[] {from, to});
514
		}
515
 
516
		// For last feature
517
		String lastFeatureLabel = featureLabels.get(
518
			new Integer(featureLineNumbers[featureLineNumbers.length-1]));
519
		Utils.logger.info("lastFeatureLabel=" + lastFeatureLabel);
520
 
521
		int lastFrom = featureLineNumbers[featureLineNumbers.length-1] + 1;
522
		Utils.logger.info("lastFrom=" + lastFrom);
523
 
524
		// First empty line from "lastFrom"
525
		int lastTo = lastFrom;
526
		while(true) {
527
			if(lastTo == (allLines.size() - 1)) {
528
				break;
529
			}
530
 
531
			String tLastLine = allLines.get(lastTo + 1);
532
			Utils.logger.info("tLastLine=" + tLastLine);
533
			if(tLastLine == null) {
534
				break;
535
			}
536
 
537
			if(!StringUtils.startsWith(tLastLine, CN.PATTERN_LEVEL_2)) {
538
				break;
539
			}
540
			lastTo++;
541
			Utils.logger.info("running lastTo=" + lastTo);
542
		}
543
 
544
		Utils.logger.info("lastFrom=" + lastFrom + " lastTo=" + lastTo);
545
 
546
		bulletLineNumberRangePerFeature.put(lastFeatureLabel, 
547
				new int[] {lastFrom, lastTo});
548
 
549
		Utils.logger.info("featureLineNumberRangePerSlide=" + 
550
				bulletLineNumberRangePerFeature.toString());		
551
 
552
		return bulletLineNumberRangePerFeature;
553
	}
554
 
555
 
556
	/**
557
	 * 
558
	 * @param allLines
559
	 * @param slideDef
560
	 * @param lineNumberRange
561
	 * @throws Exception
562
	 */
563
	private Map<Integer, String> processFeature(List<String> allLines, 
564
			SlideDefinition slideDef, 
565
			int[] lineNumberRange) throws Exception {
566
 
567
		int from = lineNumberRange[0];
568
		int to = lineNumberRange[1];
569
 
570
		Utils.logger.info("from=" + from + " to=" + to);
571
 
572
		int numberOfLines = (to - from);
573
		Utils.logger.info("numberOfLines=" + numberOfLines);
574
 
575
		Map<Integer, String> candidateFeatures = new TreeMap<Integer, String>();
576
		for(int i=from; i<(to+1); i++) {
577
			String line = allLines.get(i);
578
 
579
			if(StringUtils.startsWith(line, CN.PATTERN_LEVEL_1)) {
580
				//Utils.logger.info(line);
581
				//Utils.logger.info("Level 1");
582
				candidateFeatures.put(new Integer(i), 
583
						StringUtils.strip(StringUtils.strip(line, 
584
								CN.PATTERN_LEVEL_1)));
585
			}
586
		}
587
 
588
		Utils.logger.info("candidateFeatures=" + candidateFeatures);
589
 
590
		// Get all feature definitions for the slide
591
		DefinitionsContainer defs = 
592
			Catalog.getInstance().getDefinitionsContainer();
593
 
594
		List<FeatureDefinition> featureDefs = 
595
			defs.getFeatureDefinitions(slideDef.getID());
596
		Utils.logger.info("featureDefs=" + featureDefs);
597
 
598
		List<String> validFeatureLabels = new ArrayList<String>();
599
		for(int i=0; i<featureDefs.size(); i++) {
600
			validFeatureLabels.add(featureDefs.get(i).getLabel());
601
		}
602
		Utils.logger.info("validFeatureLabels=" + validFeatureLabels);
603
 
604
		// Filter valid features
605
		Map<Integer, String> featureLabels = new TreeMap<Integer, String>();
606
 
607
		// Discard if feature is not one of the valids
608
		// RE-VISIT
609
		for(Integer lineNumber : candidateFeatures.keySet()) {
610
			if(validFeatureLabels.contains(candidateFeatures.get(lineNumber))) {
611
				featureLabels.put(lineNumber, 
612
						candidateFeatures.get(lineNumber));
613
			}
614
		}
615
		Utils.logger.info("featureLabels=" + featureLabels);
616
 
617
		// Fetch all mandatory features
618
		List<FeatureDefinition> mandatoryFeatureDefs = 
619
			defs.getFeatureDefinitions(slideDef.getID(),
620
			EditorialImportance.MANDATORY);
621
 
622
		Utils.logger.info("mandatoryFeatureDefs=" + mandatoryFeatureDefs);
623
 
624
		// Severe error if mandatory features are not included
625
		for(FeatureDefinition featureDef : mandatoryFeatureDefs) {
626
			if(!featureLabels.values().contains(featureDef.getLabel())) {
627
				Utils.logger.severe("Mandatory feature \"" + 
628
						featureDef.getLabel() + "\" is missing");
629
			}
630
		}
631
 
632
		// Fetch all recommended features
633
		List<FeatureDefinition> recommendedFeatureDefs = 
634
			defs.getFeatureDefinitions(slideDef.getID(),
635
			EditorialImportance.RECOMMENDED);
636
 
637
		Utils.logger.info("recommendedFeatureDefs=" + recommendedFeatureDefs);
638
 
639
		// Warn if recommended features are not included
640
		for(FeatureDefinition featureDef : recommendedFeatureDefs) {
641
			if(!featureLabels.values().contains(featureDef.getLabel())) {
642
				Utils.logger.warning("Recommended feature \"" + 
643
						featureDef.getLabel() + "\" is missing");
644
			}
645
		}
646
 
647
		return featureLabels;
648
	}
649
 
650
	/**
18 naveen 651
	 * Filter and validate parent slide names
652
	 * 
653
	 * @param candidateSlideNames
654
	 * @return List<LineInfo>
655
	 * @throws Exception 
656
	 */
657
	private Map<Integer, String> processSlides(
658
			Map<Integer, String> candidateSlideLines) throws Exception {
659
 
19 naveen 660
		// Order of keys need to be restored
18 naveen 661
		Map<Integer, String> processedSlideLines = 
19 naveen 662
			new TreeMap<Integer, String>();
18 naveen 663
 
664
		// 1 Retrieve meta-data
665
		// 1.1 Retrieve all valid slide names in the content model
666
		DefinitionsContainer defs = 
667
			Catalog.getInstance().getDefinitionsContainer();
668
 
669
		Map<Long, SlideDefinition> slideDefs = defs.getSlideDefinitions();
670
		Iterator<SlideDefinition> itSlideDefs = slideDefs.values().iterator();
671
 
672
		List<String> validSlideNames = new ArrayList<String>();
673
		while(itSlideDefs.hasNext()) {
674
			SlideDefinition slideDef = itSlideDefs.next();
675
 
676
			// To avoid Introduction slide
677
			if(!slideDef.getLabel().isEmpty()) {
678
				validSlideNames.add(slideDef.getLabel());
679
			}
680
		}
681
		Utils.logger.info("validSlideNames=" + validSlideNames.toString());
682
 
683
		// 2 Rules
684
		// 2.1 Discard if slide is not one of the valids
685
		// REVISIT
686
		for(Integer lineNumber : candidateSlideLines.keySet()) {
687
			if(validSlideNames.contains(candidateSlideLines.get(lineNumber))) {
688
				processedSlideLines.put(lineNumber, 
689
						candidateSlideLines.get(lineNumber));
690
			}
691
		}
692
 
693
		Utils.logger.info("processedSlideLines=" + 
694
				processedSlideLines.toString());
695
 
696
		// 3 Retrieve "Mandatory" slide names for the category
697
		List<SlideDefinition> mandatorySlideDefs = 
698
			defs.getSlides(this.categoryID, EditorialImportance.MANDATORY);
699
 
700
		Utils.logger.info("mandatorySlideDefs=" + 
701
				mandatorySlideDefs.toString());
702
 
703
		// 3.1 All mandatory slides exist - Severe
704
		for(SlideDefinition mandatorySlideDef : mandatorySlideDefs) {
705
 
706
			// Avoid introduction slide
707
			if(mandatorySlideDef.getLabel().isEmpty()) {
708
				continue;
709
			}
710
 
711
			if(!processedSlideLines.values().contains(
712
					mandatorySlideDef.getLabel())) {
713
				Utils.logger.severe("Mandatory slide \"" + 
714
						mandatorySlideDef.getLabel() + "\" is missing");
715
			}
716
		}
717
 
718
		// 4 Retrieve "Recommended" slide names for the category
719
		List<SlideDefinition> recommendedSlideDefs = 
720
			defs.getSlides(this.categoryID, EditorialImportance.RECOMMENDED);
721
 
722
		Utils.logger.info("recommendedSlideDefs=" + 
723
				recommendedSlideDefs.toString());
724
 
725
		// 4.1 All recommended slides exist - Warn	
726
		for(SlideDefinition recommendedSlideDef : recommendedSlideDefs) {
727
			if(!processedSlideLines.values().contains(
728
					recommendedSlideDef.getLabel())) {
729
				Utils.logger.warning("Recommended slide \"" + 
730
						recommendedSlideDef.getLabel() + "\" is missing");
731
			}
732
		}
733
 
734
		return processedSlideLines;
735
	}
736
 
737
	/**
738
	 * @throws Exception 
739
	 * 
740
	 */
741
	@SuppressWarnings("unused")
742
	private void test() throws Exception {
743
		// test category
744
		DefinitionsContainer allDefs = 
745
			Catalog.getInstance().getDefinitionsContainer();
746
 
747
		Category category = allDefs.getCategory(this.categoryID);
748
		Utils.logger.info(category.toString());
749
 
750
		// test data type defs
751
		DatatypeDefinition datatypeDef = allDefs.getDatatypeDefinition(70004L);
752
		Utils.logger.info(datatypeDef.toString());
753
 
754
		// test units
755
		Unit unit = allDefs.getUnit(50004L);
756
		Utils.logger.info(unit.toString());
757
 
758
		// test slide defs
759
		SlideDefinition slideDef = allDefs.getSlideDefinition(130002L);
760
		Utils.logger.info(slideDef.toString());
761
 
762
		// test feature defs
763
		FeatureDefinition featureDef = allDefs.getFeatureDefinition(120002L);
764
		Utils.logger.info(featureDef.toString());
765
	}
17 naveen 766
}