Subversion Repositories SmartDukaan

Rev

Rev 79 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 79 Rev 80
Line 2... Line 2...
2
 * 
2
 * 
3
 */
3
 */
4
package in.shop2020.metamodel.util;
4
package in.shop2020.metamodel.util;
5
 
5
 
6
import in.shop2020.metamodel.core.Bullet;
6
import in.shop2020.metamodel.core.Bullet;
7
import in.shop2020.metamodel.core.CompositeDataObject;
-
 
8
import in.shop2020.metamodel.core.Entity;
7
import in.shop2020.metamodel.core.Entity;
9
import in.shop2020.metamodel.core.EnumDataObject;
-
 
10
import in.shop2020.metamodel.core.Feature;
8
import in.shop2020.metamodel.core.Feature;
11
import in.shop2020.metamodel.core.FreeformContent;
-
 
12
import in.shop2020.metamodel.core.PrimitiveDataObject;
-
 
13
import in.shop2020.metamodel.core.Slide;
9
import in.shop2020.metamodel.core.Slide;
14
import in.shop2020.metamodel.definitions.BulletDefinition;
10
import in.shop2020.metamodel.definitions.BulletDefinition;
15
import in.shop2020.metamodel.definitions.Catalog;
11
import in.shop2020.metamodel.definitions.Catalog;
16
import in.shop2020.metamodel.definitions.Category;
-
 
17
import in.shop2020.metamodel.definitions.CompositeDefinition;
-
 
18
import in.shop2020.metamodel.definitions.CompositePartDefinition;
-
 
19
import in.shop2020.metamodel.definitions.DatatypeDefinition;
-
 
20
import in.shop2020.metamodel.definitions.DefinitionsContainer;
12
import in.shop2020.metamodel.definitions.DefinitionsContainer;
21
import in.shop2020.metamodel.definitions.EditorialImportance;
-
 
22
import in.shop2020.metamodel.definitions.EntityContainer;
13
import in.shop2020.metamodel.definitions.EntityContainer;
23
import in.shop2020.metamodel.definitions.EnumDefinition;
-
 
24
import in.shop2020.metamodel.definitions.FeatureDefinition;
14
import in.shop2020.metamodel.definitions.FeatureDefinition;
25
import in.shop2020.metamodel.definitions.SlideDefinition;
-
 
26
import in.shop2020.metamodel.definitions.SlideFeatureDefinition;
-
 
27
import in.shop2020.metamodel.definitions.Unit;
-
 
28
import in.shop2020.util.DBUtils;
15
import in.shop2020.util.DBUtils;
29
import in.shop2020.util.Utils;
16
import in.shop2020.util.Utils;
30
 
17
 
31
import java.io.BufferedReader;
-
 
32
import java.io.FileReader;
-
 
33
import java.io.LineNumberReader;
-
 
34
import java.util.ArrayList;
18
import java.util.ArrayList;
35
import java.util.Collection;
-
 
36
import java.util.HashMap;
19
import java.util.HashMap;
37
import java.util.List;
20
import java.util.List;
38
import java.util.Map;
21
import java.util.Map;
39
import java.util.TreeMap;
-
 
40
 
22
 
41
import org.apache.commons.lang.ArrayUtils;
23
import org.apache.commons.lang.ArrayUtils;
42
import org.apache.commons.lang.StringUtils;
-
 
43
 
24
 
44
/**
25
/**
45
 * NO LONGER USED - POI BASED DATA EXTRACTION FROM MS PPT FILE HAS REPLACED IT
-
 
46
 * 
26
 * 
47
 * CN - Content Tool
27
 * CN - Content Tool
-
 
28
 * 
48
 * Imports content from text and exports content. Validates against content model
29
 * Currently only has learning logic
49
 * 
30
 * 
50
 * @author naveen
31
 * @author naveen
51
 *
32
 *
52
 */
33
 */
53
public class CN {
34
public class CN {
54
	public static final String CONTENT_SRC_TXT_PATH = 
-
 
55
		"/home/naveen/workspace/eclipse/content/txt/";
-
 
56
	public static final String CONTENT_SRC_HTML_PATH = 
-
 
57
		"/home/naveen/workspace/eclipse/content/html/";
-
 
58
	public static final String CONTENT_SRC_XML_PATH = 
-
 
59
		"/home/naveen/workspace/eclipse/content/xml/";
-
 
60
	
-
 
61
	//** LOCAL
-
 
62
	public static final String CONTENT_DB_PATH =  
-
 
63
		"/home/naveen/workspace/eclipse/db/entities/";
-
 
64
	
-
 
65
	/** WEB
-
 
66
	public static final String CONTENT_DB_PATH =  
-
 
67
		"/var/lib/tomcat6/webapps/shop2020/db/entities/";
-
 
68
	*/
-
 
69
	
-
 
70
	
-
 
71
	// Known patterns
-
 
72
	public static final String PATTERN_LEVEL_1 = "* ";
-
 
73
	public static final String PATTERN_LEVEL_2 = "   * ";
-
 
74
	public static final String PATTERN_LEVEL_3 = "      * ";
-
 
75
	public static final String PATTERN_LEVEL_4 = "         * ";
-
 
76
 
-
 
77
	private long categoryID;
-
 
78
	private String srcFile;
-
 
79
	private String dbFile;
-
 
80
	
-
 
81
	private String introductionTitle;
-
 
82
	
-
 
83
	// Slide names in sequence
-
 
84
	private List<String> slideNames = new ArrayList<String>();
-
 
85
	
-
 
86
	private Map<String, Collection<String>> slideNameToFeatureLabels = 
-
 
87
		new HashMap<String, Collection<String>>();
-
 
88
	
-
 
89
	private Map<String, Long> slideNameToSlideDefID = 
-
 
90
		new HashMap<String, Long>();
-
 
91
	
-
 
92
	private Map<String, Long> slideNameFeatureNameToFeatureDefID =
-
 
93
		new HashMap<String, Long>();
-
 
94
 
-
 
95
	private Map<String, List<Bullet>> slideNameFeatureNameToBullets =
-
 
96
		new HashMap<String, List<Bullet>>();
-
 
97
	
-
 
98
	private Map<String, String> slideNameToFreeformContent = 
-
 
99
		new HashMap<String, String>();
-
 
100
		
35
		
101
	/**
36
	/**
102
	 * @param args
37
	 * @param args
103
	 */
38
	 */
104
	public static void main(String[] args) throws Exception {
39
	public static void main(String[] args) throws Exception {
105
		String[] commands = new String[] {"show", "import", "learn"};
40
		String[] commands = new String[] {"learn"};
106
		
-
 
107
		String usage = "Usage: CN ["+ StringUtils.join(commands, "|") +
-
 
108
			"] [{Entity ID}|{Category ID} {Content file name}]\n";
-
 
109
		
41
		
-
 
42
		String usage = "Usage: CN learn";
110
		
43
		
111
		String inputCommand = args[0];
44
		String inputCommand = args[0];
112
		
45
		
113
		if(!ArrayUtils.contains(commands, inputCommand)) {
46
		if(!ArrayUtils.contains(commands, inputCommand)) {
114
			System.out.println(usage);
47
			System.out.println(usage);
115
			System.exit(-1);
48
			System.exit(-1);
116
		}
49
		}
117
 
50
 
118
		if (inputCommand.equals("show")) {
-
 
119
			if(args.length < 2) {
-
 
120
				System.out.println(usage);
-
 
121
				System.exit(-1);
-
 
122
			}
-
 
123
			
-
 
124
			String entityID = args[1];
-
 
125
			CN cn = new CN();
-
 
126
			cn.showEntity(new Long(entityID).longValue());
-
 
127
			System.exit(0);
-
 
128
		}
-
 
129
		
-
 
130
		if (inputCommand.equals("import")) {
-
 
131
			if(args.length < 2) {
-
 
132
				System.out.println(usage);
-
 
133
				System.exit(-1);
-
 
134
			}
-
 
135
			
-
 
136
			String inputCategoryID = args[1];
-
 
137
			if(args.length < 3) {
-
 
138
				System.out.println(usage);
-
 
139
				System.exit(-1);
-
 
140
			}
-
 
141
 
-
 
142
			String inputFilename = args[2];
-
 
143
			long categoryID = new Long(inputCategoryID).longValue();
-
 
144
			CN cn = new CN(categoryID, inputFilename);
-
 
145
			cn.importEntity();
-
 
146
			System.exit(0);
-
 
147
		}
-
 
148
		
-
 
149
		if (inputCommand.equals("learn")) {
51
		if (inputCommand.equals("learn")) {
150
			CN cn = new CN();
52
			CN cn = new CN();
151
			cn.learn();
53
			cn.learn();
152
		}
54
		}
153
	}
55
	}
Line 157... Line 59...
157
	 */
59
	 */
158
	public CN() {
60
	public CN() {
159
	}
61
	}
160
	
62
	
161
	/**
63
	/**
162
	 * 
-
 
163
	 * @param categoryID
-
 
164
	 * @param fileName
-
 
165
	 */
-
 
166
	public CN(long categoryID, String fileName) {
-
 
167
		this.categoryID = categoryID;
-
 
168
		
-
 
169
		this.srcFile = CONTENT_SRC_TXT_PATH + fileName + ".txt";
-
 
170
		this.dbFile = CONTENT_DB_PATH + "entities" + ".ser";
-
 
171
	}
-
 
172
	
-
 
173
	/**
-
 
174
	 * Learns all features where definition is marked "learned=true"
64
	 * Learns all features where definition is marked "learned=true"
175
	 * @throws Exception 
65
	 * @throws Exception 
176
	 */
66
	 */
177
	public void learn() throws Exception {
67
	public void learn() throws Exception {
178
		Map<Long, List<Bullet>> learnedBullets = 
68
		Map<Long, List<Bullet>> learnedBullets = 
Line 191... Line 81...
191
			}
81
			}
192
		}
82
		}
193
		
83
		
194
		Utils.info("learnedBullets=" + learnedBullets);
84
		Utils.info("learnedBullets=" + learnedBullets);
195
		
85
		
196
		String learnedBulletsDBFile = CN.CONTENT_DB_PATH + "learnedbullets.ser";
86
		String learnedBulletsDBFile = Utils.ENTITIES_DB_PATH + 
-
 
87
			"learnedbullets.ser";
-
 
88
		
197
		DBUtils.store(learnedBullets, learnedBulletsDBFile);
89
		DBUtils.store(learnedBullets, learnedBulletsDBFile);
198
	}
90
	}
199
	
91
	
200
	/**
92
	/**
201
	 * 
93
	 * 
Line 255... Line 147...
255
			for(Slide childSlide : childrenSlides) {
147
			for(Slide childSlide : childrenSlides) {
256
				this.learn(childSlide, learnedBullets);
148
				this.learn(childSlide, learnedBullets);
257
			}
149
			}
258
		}
150
		}
259
	}
151
	}
260
	
-
 
261
	/**
-
 
262
	 * 
-
 
263
	 * @throws Exception
-
 
264
	 */
-
 
265
	public void showEntity(long entityID) throws Exception {
-
 
266
		EntityContainer entContainer = 
-
 
267
			Catalog.getInstance().getEntityContainer();
-
 
268
		
-
 
269
		ExpandedEntity expandedEntity = 
-
 
270
			entContainer.getExpandedEntity(entityID);
-
 
271
		
-
 
272
		Utils.logger.info("expandedEntity=" + expandedEntity);
-
 
273
		
-
 
274
		/*
-
 
275
		Entity entity = entContainer.getEntity(entityID);
-
 
276
		Utils.logger.info("Entity=" + entity);
-
 
277
		*/
-
 
278
		List<ExpandedSlide> expslides = expandedEntity.getExpandedSlides();
-
 
279
 
-
 
280
		for(ExpandedSlide expslide : expslides) {
-
 
281
			String slidelabel = expslide.getSlideDefinition().getLabel();
-
 
282
			System.out.println(slidelabel);
-
 
283
			
-
 
284
			List<ExpandedFeature> expfeatures = expslide.getExpandedFeatures();
-
 
285
			
-
 
286
			for(ExpandedFeature expfeature : expfeatures ) {
-
 
287
				String featurelabel = expfeature.getFeatureDefinition().getLabel();
-
 
288
				System.out.println("\t"+featurelabel);
-
 
289
				
-
 
290
				List<ExpandedBullet> expbullets = 
-
 
291
						expfeature.getExpandedBullets();
-
 
292
				
-
 
293
				if(expbullets == null) continue;
-
 
294
				
-
 
295
				for (ExpandedBullet expbullet : expbullets) {
-
 
296
					System.out.println("\t\t" + expbullet.displayText());
-
 
297
				}
-
 
298
			}
-
 
299
		}
-
 
300
	}
-
 
301
	
-
 
302
	/**
-
 
303
	 * 
-
 
304
	 * @throws Exception
-
 
305
	 */
-
 
306
	public void importEntity() throws Exception {		
-
 
307
		//this.test();
-
 
308
		Utils.logger.info(this.srcFile);
-
 
309
		
-
 
310
		FileReader fileReader = new FileReader(this.srcFile);
-
 
311
		BufferedReader lineReader = new BufferedReader(fileReader);
-
 
312
		LineNumberReader reader = new LineNumberReader(lineReader);
-
 
313
		
-
 
314
		List<String> allLines = new ArrayList<String>();
-
 
315
		
-
 
316
		// 1 Collect all candidate slide names
-
 
317
		// Order of keys need to be restored
-
 
318
		Map<Integer, String> candidateSlideNames = 
-
 
319
			new TreeMap<Integer, String>();
-
 
320
		
-
 
321
		int lineCount = 0;
-
 
322
		boolean first = true;
-
 
323
		while(true) {
-
 
324
			String line = reader.readLine();			
-
 
325
			if(line == null) {
-
 
326
				break;
-
 
327
			}
-
 
328
			
-
 
329
			allLines.add(line);
-
 
330
			lineCount++;
-
 
331
			
-
 
332
			if(line.isEmpty()) {
-
 
333
				continue;
-
 
334
			}
-
 
335
			
-
 
336
 
-
 
337
			int lineNumber = reader.getLineNumber();
-
 
338
			
-
 
339
			Utils.logger.info(line);
-
 
340
			//Utils.logger.info("lineNumber="+lineNumber);
-
 
341
 
-
 
342
			// First non-empty line is introduction title - brand, model
-
 
343
			if(first) {
-
 
344
				this.introductionTitle = StringUtils.strip(line);
-
 
345
				first = false;
-
 
346
			}
-
 
347
			
-
 
348
			// RE-VISIT
-
 
349
			// 1.1 Slide names starting with Alpha
-
 
350
			//Utils.logger.info(line.substring(0, 1));
-
 
351
			if(StringUtils.isAlpha((line.substring(0, 1)))) {
-
 
352
				//Utils.logger.info(line);
-
 
353
				//Utils.logger.info("Level 0");
-
 
354
				candidateSlideNames.put(new Integer(lineNumber), 
-
 
355
						StringUtils.strip(line));
-
 
356
			}
-
 
357
		}
-
 
358
		Utils.logger.info("introductionTitle=" + this.introductionTitle);
-
 
359
		//System.exit(0);
-
 
360
 
-
 
361
		lineReader.close();
-
 
362
		
-
 
363
		Utils.logger.info("lineCount=" + lineCount);
-
 
364
		Utils.logger.info(candidateSlideNames.toString());
-
 
365
		
-
 
366
		// 2 Filter and validate parent slide names
-
 
367
		Map<Integer, String> slideNames = 
-
 
368
			this.processSlides(candidateSlideNames);
-
 
369
		
-
 
370
		Utils.logger.info(slideNames.toString());
-
 
371
		
-
 
372
		// 3 Collect all children slides
-
 
373
		// 4 Filter and validate children slide names
-
 
374
		// TODO
-
 
375
		
-
 
376
		// 5 Collect all Features for a slide
-
 
377
		// 5.1 Find line number range between which content for feature is found
-
 
378
		Map<String, int[]> featureLineNumberRangePerSlide = 
-
 
379
			new HashMap<String, int[]>();
-
 
380
			
-
 
381
		Utils.logger.info("slideNames.keySet=" + 
-
 
382
				slideNames.keySet().toString());
-
 
383
		
-
 
384
		Integer[] slideLineNumbers = slideNames.keySet().toArray(
-
 
385
				new Integer[0]);
-
 
386
		
-
 
387
		for(int i=0; i<slideLineNumbers.length-1; i++) {
-
 
388
			int from = slideLineNumbers[i]+1;
-
 
389
			int to = slideLineNumbers[i+1]-1;
-
 
390
			Utils.logger.info("from=" + from + " to=" + to);
-
 
391
			
-
 
392
			String tSlideName = slideNames.get(
-
 
393
					new Integer(slideLineNumbers[i]));
-
 
394
			
-
 
395
			Utils.logger.info("tSlideName=" + tSlideName);
-
 
396
			
-
 
397
			featureLineNumberRangePerSlide.put(tSlideName, 
-
 
398
					new int[] {from, to});
-
 
399
		}
-
 
400
 
-
 
401
		// For last slide
-
 
402
		Utils.logger.info("tSlideName=" + 
-
 
403
				slideNames.get(new Integer(
-
 
404
						slideLineNumbers[slideLineNumbers.length-1])));
-
 
405
		
-
 
406
		Utils.logger.info("lineNumbers[lineNumbers.length-1]=" + 
-
 
407
				slideLineNumbers[slideLineNumbers.length-1]);
-
 
408
		
-
 
409
		Utils.logger.info(
-
 
410
			"from=" + (slideLineNumbers[slideLineNumbers.length-1]+1) + " to=" +
-
 
411
			(lineCount-1));
-
 
412
		
-
 
413
		featureLineNumberRangePerSlide.put(
-
 
414
			slideNames.get(
-
 
415
				new Integer(slideLineNumbers[slideLineNumbers.length-1])), 
-
 
416
				new int[] {(slideLineNumbers[slideLineNumbers.length-1] + 1), 
-
 
417
				(lineCount-1)});
-
 
418
		
-
 
419
		Utils.logger.info("featureLineNumberRangePerSlide=" + 
-
 
420
				featureLineNumberRangePerSlide.toString());
-
 
421
		
-
 
422
		// 6 Filter and validate features
-
 
423
		DefinitionsContainer defs = 
-
 
424
			Catalog.getInstance().getDefinitionsContainer();
-
 
425
		
-
 
426
		Map<String, Map<Integer, String>> slideFeatureLabels = 
-
 
427
			new HashMap<String, Map<Integer, String>>();
-
 
428
		
-
 
429
		for(String slideName : slideNames.values()) {
-
 
430
			//Utils.logger.info("slideName=" + slideName);
-
 
431
			List<SlideDefinition> slideDefs = 
-
 
432
				defs.getSlideDefinitions(this.categoryID, slideName);
-
 
433
			
-
 
434
			if(slideDefs == null) {
-
 
435
				continue;
-
 
436
			}
-
 
437
			
-
 
438
			if (slideDefs.isEmpty()) {
-
 
439
				continue;
-
 
440
			} 
-
 
441
			
-
 
442
			// RE-VISIT
-
 
443
			// Pick the first
-
 
444
			SlideDefinition slideDef = slideDefs.get(0);
-
 
445
			Utils.logger.info("slideDef=" + slideDef);
-
 
446
			
-
 
447
			Long slideID = slideDef.getID();
-
 
448
			this.slideNameToSlideDefID.put(slideName, slideID);
-
 
449
			
-
 
450
			// If there are NO children slides or features defined for the slide
-
 
451
			// Every under it is free-form content
-
 
452
			List<Long> childrenSlideDefIDs = 
-
 
453
				slideDef.getChildrenSlideDefinitionIDs();
-
 
454
			
-
 
455
			List<SlideFeatureDefinition> slideFeatureDef = 
-
 
456
				slideDef.getSlideFeatureDefinitions();
-
 
457
			
-
 
458
			if((childrenSlideDefIDs == null || childrenSlideDefIDs.size() == 0) 
-
 
459
				&& (slideFeatureDef == null || slideFeatureDef.size() == 0)){
-
 
460
				
-
 
461
				int[] slideFFCRange = 
-
 
462
					featureLineNumberRangePerSlide.get(slideName);
-
 
463
				
-
 
464
				StringBuffer ffcSB = new StringBuffer();
-
 
465
				Utils.logger.info("slideFFCRange[0]=" + slideFFCRange[0]);
-
 
466
				Utils.logger.info("slideFFCRange[1]=" + slideFFCRange[1]);
-
 
467
				
-
 
468
				for(int i=slideFFCRange[0]; i<slideFFCRange[1]; i++) {
-
 
469
					ffcSB.append(allLines.get(i));
-
 
470
				}
-
 
471
				
-
 
472
				Utils.logger.info(slideName + " " + " ffcSB.toString()=" + 
-
 
473
						ffcSB.toString());
-
 
474
				
-
 
475
				this.slideNameToFreeformContent.put(slideName, 
-
 
476
						ffcSB.toString());
-
 
477
				
-
 
478
				continue;
-
 
479
			}
-
 
480
			
-
 
481
			Map<Integer, String> featureLabels = 
-
 
482
				this.processFeature(allLines, slideDef, 
-
 
483
					featureLineNumberRangePerSlide.get(slideName));
-
 
484
			
-
 
485
			// Find feature definition IDs
-
 
486
			for(String featureLabel : featureLabels.values()) {
-
 
487
				FeatureDefinition featureDef = defs.getFeatureDefinition(
-
 
488
						slideID.longValue(), featureLabel);
-
 
489
				
-
 
490
				this.slideNameFeatureNameToFeatureDefID.put(
-
 
491
						(slideName + "_" + featureLabel), 
-
 
492
						new Long(featureDef.getID()));
-
 
493
			}
-
 
494
			
-
 
495
			slideFeatureLabels.put(slideName, featureLabels);
-
 
496
			this.slideNameToFeatureLabels.put(slideName, 
-
 
497
					featureLabels.values());
-
 
498
		}
-
 
499
		
-
 
500
		Utils.logger.info("slideFeatureLabels=" + slideFeatureLabels);
-
 
501
		Utils.logger.info("slideNameToFeatureLabels=" + 
-
 
502
				this.slideNameToFeatureLabels);
-
 
503
		
-
 
504
		Utils.logger.info("slideNameToSlideDefID=" + 
-
 
505
				this.slideNameToSlideDefID);
-
 
506
		
-
 
507
		Utils.logger.info("slideNameFeatureNameToFeatureDefID=" + 
-
 
508
				this.slideNameFeatureNameToFeatureDefID);
-
 
509
		
-
 
510
		// 7 Bullets
-
 
511
		// Collect all bullets
-
 
512
		for(String slideName : slideFeatureLabels.keySet()) {
-
 
513
			Map<Integer, String> featureLabels = 
-
 
514
				slideFeatureLabels.get(slideName);
-
 
515
			
-
 
516
			if(featureLabels == null || featureLabels.size() == 0) {
-
 
517
				continue;
-
 
518
			}
-
 
519
			
-
 
520
			// 7.1 Find line number range between which content for bullets 
-
 
521
			// is found (per feature on this slide)
-
 
522
			Map<String, int[]> bulletLineNumberRangePerFeature = 
-
 
523
				this.getBulletLineRange(allLines, featureLabels);
-
 
524
			
-
 
525
			for(String featureLabel : bulletLineNumberRangePerFeature.keySet()){
-
 
526
 
-
 
527
				String key = slideName + "_" + featureLabel;
-
 
528
				Long featureDefID = 
-
 
529
					this.slideNameFeatureNameToFeatureDefID.get(key);
-
 
530
				FeatureDefinition featureDef = 
-
 
531
					defs.getFeatureDefinition(featureDefID.longValue());
-
 
532
				
-
 
533
				Long slideDefID = this.slideNameToSlideDefID.get(slideName);
-
 
534
				SlideDefinition slideDef = defs.getSlideDefinition(slideDefID);
-
 
535
				
-
 
536
				this.processBullets(allLines, 
-
 
537
						bulletLineNumberRangePerFeature.get(featureLabel), 
-
 
538
						featureDef, slideDef);
-
 
539
			}
-
 
540
		}
-
 
541
		
-
 
542
		// Construct Content Model
-
 
543
		Entity entity = this.contructEntityObject();
-
 
544
		Utils.logger.info("entity="+entity);
-
 
545
		
-
 
546
		EntityContainer entContainer = 
-
 
547
			Catalog.getInstance().getEntityContainer();
-
 
548
		
-
 
549
		entContainer.addEntity(entity);
-
 
550
		
-
 
551
		// RE-VISIT
-
 
552
		// Store it back
-
 
553
		DBUtils.store(entContainer.getEntities(), this.dbFile);
-
 
554
		
-
 
555
		// Store the index separately
-
 
556
		String entitiesbycategoryDBFile = CN.CONTENT_DB_PATH + 
-
 
557
			"entitiesbycategory" + ".ser";
-
 
558
		
-
 
559
		DBUtils.store(entContainer.getEntitiesbyCategory(), 
-
 
560
				entitiesbycategoryDBFile);
-
 
561
	}
-
 
562
	
-
 
563
	/**
-
 
564
	 * 
-
 
565
	 * @return Entity 
-
 
566
	 * @throws Exception 
-
 
567
	 */
-
 
568
	private Entity contructEntityObject() throws Exception {
-
 
569
		SequenceGenerator sg = SequenceGenerator.getInstance();
-
 
570
		long entityID = sg.getNextSequence(SequenceGenerator.ENTITY);
-
 
571
		
-
 
572
		Entity entity = new Entity(entityID, this.categoryID);
-
 
573
		String brandModel[] = StringUtils.split(this.introductionTitle, " ");
-
 
574
		
-
 
575
		if(brandModel.length == 1) {
-
 
576
			entity.setBrand(StringUtils.strip(brandModel[0]));
-
 
577
		}
-
 
578
		else if(brandModel.length == 2) {
-
 
579
			entity.setBrand(StringUtils.strip(brandModel[0]));
-
 
580
			entity.setModelName(StringUtils.strip(brandModel[1]));
-
 
581
		}
-
 
582
		else if(brandModel.length == 3) {
-
 
583
			entity.setBrand(StringUtils.strip(brandModel[0]));
-
 
584
			entity.setModelNumber(StringUtils.strip(brandModel[1]));
-
 
585
			entity.setModelName(StringUtils.strip(brandModel[2]));
-
 
586
		}
-
 
587
		else if(brandModel.length == 4) {
-
 
588
			entity.setBrand(StringUtils.strip(brandModel[0]) + " " + 
-
 
589
					StringUtils.strip(brandModel[1]));
-
 
590
			
-
 
591
			entity.setModelNumber(StringUtils.strip(brandModel[2]));
-
 
592
			entity.setModelName(StringUtils.strip(brandModel[3]));
-
 
593
		}
-
 
594
			
-
 
595
		for(String slideName : this.slideNames) {
-
 
596
			Collection<String> featureNames = 
-
 
597
				this.slideNameToFeatureLabels.get(slideName);
-
 
598
			
-
 
599
			Long slideDefID = this.slideNameToSlideDefID.get(slideName);
-
 
600
			Slide slide = new Slide(slideDefID.longValue());
-
 
601
			
-
 
602
			// Only if there are features
-
 
603
			if(featureNames != null) {
-
 
604
				List<Feature> features = new ArrayList<Feature>();
-
 
605
				
-
 
606
	 			for(String featureName : featureNames) {
-
 
607
					Long featureDefID = this.slideNameFeatureNameToFeatureDefID.get(
-
 
608
							slideName + "_" + featureName);
-
 
609
					
-
 
610
					List<Bullet> bullets = this.slideNameFeatureNameToBullets.get(
-
 
611
							slideName + "_" + featureName);
-
 
612
					
-
 
613
					Feature feature = new Feature(featureDefID.longValue());
-
 
614
					feature.setBullets(bullets);
-
 
615
					
-
 
616
					features.add(feature);
-
 
617
				}
-
 
618
				
-
 
619
				slide.setFeatures(features);
-
 
620
			}
-
 
621
			
-
 
622
			// Add free-form content is collect above
-
 
623
			String ffc = this.slideNameToFreeformContent.get(slideName);
-
 
624
			Utils.logger.info("slideName=" + slideName + " ffc=" + ffc);
-
 
625
			
-
 
626
			if(ffc != null) {
-
 
627
				slide.setFreeformContent(new FreeformContent(ffc));
-
 
628
			}
-
 
629
			
-
 
630
			entity.addSlide(slide);
-
 
631
		}
-
 
632
		
-
 
633
		return entity;
-
 
634
	}
-
 
635
	
-
 
636
	/**
-
 
637
	 * 
-
 
638
	 * @param allLines
-
 
639
	 * @param bulletLineNumberRange
-
 
640
	 * @param featureDef
-
 
641
	 * @throws Exception 
-
 
642
	 */
-
 
643
	private void processBullets(List<String> allLines, 
-
 
644
			int[] bulletLineNumberRange, FeatureDefinition featureDef, 
-
 
645
			SlideDefinition slideDef) throws Exception {
-
 
646
		
-
 
647
		int from = bulletLineNumberRange[0];
-
 
648
		int to = bulletLineNumberRange[1];
-
 
649
		
-
 
650
		BulletDefinition bulletDef = featureDef.getBulletDefinition();
-
 
651
		Utils.logger.info("bulletDefinition=" + bulletDef);
-
 
652
		
-
 
653
		DefinitionsContainer defs = 
-
 
654
			Catalog.getInstance().getDefinitionsContainer();
-
 
655
		
-
 
656
		String crumb = "\"" + slideDef.getLabel() + "\" > \"" + 
-
 
657
			featureDef.getLabel() + "\"";
-
 
658
		
-
 
659
		// Enforce isMultivalue
-
 
660
		// RE-VISIT - This validation should be inside for loop below
-
 
661
		// Skipping for now this may not be a common error
-
 
662
		/*
-
 
663
		if(!bulletDef.isMultivalue() && (from != to)) {
-
 
664
			Utils.logger.severe("Only one bullet is allowed for " + crumb);
-
 
665
			return;
-
 
666
		}
-
 
667
		*/
-
 
668
 
-
 
669
		// If unit is defined
-
 
670
		Unit unitDef =  null;
-
 
671
		if(bulletDef.getUnitID() != 0L) {
-
 
672
			long unitID = bulletDef.getUnitID();
-
 
673
			unitDef = defs.getUnit(unitID);
-
 
674
			Utils.logger.info("unitDef=" + unitDef);
-
 
675
		}
-
 
676
 
-
 
677
		long datatypeDefID = bulletDef.getDatatypeDefinitionID();
-
 
678
		DatatypeDefinition datatypeDef = 
-
 
679
			defs.getDatatypeDefinition(datatypeDefID);
-
 
680
		Utils.logger.info("datatypeDef=" + datatypeDef);
-
 
681
 
-
 
682
		
-
 
683
		String key = StringUtils.lowerCase(slideDef.getLabel()) + "_" + 
-
 
684
			StringUtils.lowerCase(featureDef.getLabel());
-
 
685
		
-
 
686
		List<Bullet> bullets = 
-
 
687
			this.slideNameFeatureNameToBullets.get(key);
-
 
688
		
-
 
689
		if(bullets == null) {
-
 
690
			bullets = new ArrayList<Bullet>();
-
 
691
			this.slideNameFeatureNameToBullets.put(key, bullets);
-
 
692
		}
-
 
693
		
-
 
694
		// If primitive
-
 
695
		boolean isEnum = false;
-
 
696
		boolean isComposite = false;
-
 
697
		boolean isPrimitive = false;
-
 
698
		if(datatypeDef instanceof EnumDefinition) {
-
 
699
			isEnum = true;
-
 
700
		}
-
 
701
		else if(datatypeDef instanceof CompositeDefinition) {
-
 
702
			isComposite = true;
-
 
703
		}
-
 
704
		else {
-
 
705
			isPrimitive = true;
-
 
706
		}
-
 
707
		
-
 
708
		Utils.logger.info("isEnum=" + isEnum + " isComposite=" + isComposite +
-
 
709
				" isPrimitive=" + isPrimitive);
-
 
710
		
-
 
711
		Utils.logger.info("from=" + from + " to=" + to);
-
 
712
		for(int i=from; i<to+1; i++) {
-
 
713
			String line = allLines.get(i);
-
 
714
			Utils.logger.info("Line " + i + ": " + line);
-
 
715
 
-
 
716
			// VALIDATE
-
 
717
			// It means free-form content formatted at feature level
-
 
718
			// Assume there are no more bullets
-
 
719
			if(StringUtils.startsWith(line, CN.PATTERN_LEVEL_1)) {
-
 
720
				break;
-
 
721
			}
-
 
722
			
-
 
723
			if(!StringUtils.startsWith(line, CN.PATTERN_LEVEL_2)) {
-
 
724
				continue;
-
 
725
			}
-
 
726
			
-
 
727
			String bulletText = StringUtils.strip(StringUtils.stripStart(line, 
-
 
728
					CN.PATTERN_LEVEL_2));
-
 
729
			Utils.logger.info("bulletText=" + bulletText);
-
 
730
			
-
 
731
			// if no unit is defined for this bullet whole is treated as value
-
 
732
			String bulletValue = bulletText;
-
 
733
			
-
 
734
			// If unit is defined
-
 
735
			if(bulletDef.getUnitID() != 0L) {
-
 
736
				
-
 
737
				// Validate unit
-
 
738
				String[] parts = StringUtils.split(bulletText, " ");
-
 
739
				if(parts.length < 2) {
-
 
740
					Utils.logger.severe("Unit is missing, " + crumb + " = " + 
-
 
741
							bulletText);
-
 
742
					
-
 
743
					continue;
-
 
744
				}
-
 
745
				
-
 
746
				if(parts.length > 2) {
-
 
747
					Utils.logger.severe("Invalid value, " + crumb + " = " + 
-
 
748
							bulletText);
-
 
749
					
-
 
750
					continue;
-
 
751
				}
-
 
752
				
-
 
753
				bulletValue = parts[0];
-
 
754
				String unitValue = parts[1];
-
 
755
				Utils.logger.info("unitValue="+unitValue);
-
 
756
				
-
 
757
				if(!(unitValue.equalsIgnoreCase(unitDef.getShortForm()) ||
-
 
758
						unitValue.equalsIgnoreCase(unitDef.getFullForm()))) {
-
 
759
					Utils.logger.severe("Invalid unit, " + crumb + " = " + 
-
 
760
							bulletText);
-
 
761
					
-
 
762
					continue;
-
 
763
				}
-
 
764
			}
-
 
765
			
-
 
766
			// Validate bullet value
-
 
767
			Utils.logger.info("bulletValue=" + bulletValue);
-
 
768
			if(isPrimitive) {
-
 
769
				if(!this.validatePrimitive(bulletValue, datatypeDef, crumb)) {
-
 
770
					continue;
-
 
771
				}
-
 
772
				
-
 
773
				bullets.add(new Bullet(new PrimitiveDataObject(bulletValue)));
-
 
774
			}
-
 
775
			
-
 
776
			// Enum and fixed
-
 
777
			else if(isEnum && !bulletDef.isLearned()) {
-
 
778
				long enumValueID = defs.getEnumValueID(datatypeDef.getID(), 
-
 
779
						bulletValue);
-
 
780
				Utils.logger.info("enumValueID=" + enumValueID);
-
 
781
				
-
 
782
				// Treat it to be free-form
-
 
783
				if(enumValueID == -1L) {
-
 
784
					Utils.logger.warning("Not one of the valid enum values, " +
-
 
785
							"treating it like free-form content - " + crumb + 
-
 
786
							" = " + bulletValue);
-
 
787
					
-
 
788
					continue;
-
 
789
				}
-
 
790
				
-
 
791
				EnumDataObject enumDataObject = new EnumDataObject(enumValueID);
-
 
792
				bullets.add(new Bullet(enumDataObject));
-
 
793
			}
-
 
794
			
-
 
795
			// Composite
-
 
796
			else if(isComposite) {
-
 
797
				CompositeDefinition compositeDef = 
-
 
798
					(CompositeDefinition)datatypeDef;
-
 
799
				
-
 
800
				String separator = compositeDef.getSeparator();
-
 
801
				String[] compositeParts = 
-
 
802
					StringUtils.split(bulletValue, separator);
-
 
803
				
-
 
804
				List<CompositePartDefinition> compositePartDefs = 
-
 
805
					compositeDef.getCompositePartDefinitions();
-
 
806
				
-
 
807
				// Validate number of parts
-
 
808
				if(compositeParts.length != compositePartDefs.size()) {
-
 
809
					Utils.logger.severe("Invalid value, " + crumb + " = " + 
-
 
810
							bulletValue);
-
 
811
					
-
 
812
					continue;
-
 
813
				}
-
 
814
				
-
 
815
				// Remove spurious whitespaces
-
 
816
				boolean validPart = true;
-
 
817
				for(int j=0;j<compositeParts.length;j++) {
-
 
818
					compositeParts[j] = StringUtils.strip(compositeParts[j]);
-
 
819
					Utils.logger.info("compositeParts[j]=" + compositeParts[j]);
-
 
820
					
-
 
821
					// Validate each part
-
 
822
					// Each part can be enum or composite in itself
-
 
823
					// We will stick to primitive for now
-
 
824
					long partDatatypeDefID = 
-
 
825
						compositePartDefs.get(j).getDatatypeDefinitionID();
-
 
826
					
-
 
827
					DatatypeDefinition partDatatypeDef = 
-
 
828
						defs.getDatatypeDefinition(partDatatypeDefID);
-
 
829
					Utils.logger.info("partDatatypeDef=" + partDatatypeDef);
-
 
830
					
-
 
831
					if(!this.validatePrimitive(compositeParts[j], 
-
 
832
							partDatatypeDef, crumb)) {
-
 
833
						validPart = false;
-
 
834
						break;
-
 
835
					}
-
 
836
				}
-
 
837
				
-
 
838
				if(!validPart) {
-
 
839
					continue;
-
 
840
				}
-
 
841
 
-
 
842
				CompositeDataObject compositeDataObject = 
-
 
843
					new CompositeDataObject();
-
 
844
 
-
 
845
				for(int j=0;j<compositeParts.length;j++) {
-
 
846
					compositeDataObject.addPrimitiveDataObject(
-
 
847
							new PrimitiveDataObject(compositeParts[j]));
-
 
848
				}
-
 
849
				
-
 
850
				bullets.add(new Bullet(compositeDataObject));
-
 
851
			}
-
 
852
		}
-
 
853
		
-
 
854
		Utils.logger.info("slideNameFeatureNameToBullets=" + 
-
 
855
				this.slideNameFeatureNameToBullets);
-
 
856
	}
-
 
857
	
-
 
858
	/**
-
 
859
	 * 
-
 
860
	 * @param bulletValue
-
 
861
	 * @param datatypeDef
-
 
862
	 * @param crumb
-
 
863
	 */
-
 
864
	private boolean validatePrimitive(String bulletValue, 
-
 
865
			DatatypeDefinition datatypeDef, String crumb) {
-
 
866
		String dt = datatypeDef.getName();
-
 
867
		boolean valid = true;
-
 
868
		
-
 
869
		// integer
-
 
870
		if(dt.equals("integer")) {
-
 
871
			try {
-
 
872
				Integer.parseInt(bulletValue);
-
 
873
			}
-
 
874
			catch(NumberFormatException nfe) {
-
 
875
				Utils.logger.severe("Invalid integer value, " + crumb +
-
 
876
						" = " + bulletValue);
-
 
877
				valid = false;
-
 
878
			}
-
 
879
		}
-
 
880
		
-
 
881
		// decimal
-
 
882
		else if(dt.endsWith("decimal")) {
-
 
883
			try {
-
 
884
				Float.parseFloat(bulletValue);
-
 
885
			}
-
 
886
			catch(NumberFormatException nfe) {
-
 
887
				Utils.logger.severe("Invalid decimal value, " + crumb +
-
 
888
						" = " + bulletValue);
-
 
889
				valid = false;
-
 
890
			}
-
 
891
		}
-
 
892
		
-
 
893
		return valid;
-
 
894
	}
-
 
895
	
-
 
896
	// string
-
 
897
	// any thing goes
-
 
898
	/**
-
 
899
	 * 
-
 
900
	 * @param allLines
-
 
901
	 * @param featureLabels
-
 
902
	 * @return
-
 
903
	 */
-
 
904
	private Map<String, int[]> getBulletLineRange(List<String> allLines, 
-
 
905
			Map<Integer, String> featureLabels) {
-
 
906
		Utils.logger.info("allLines=" + allLines);
-
 
907
		Utils.logger.info("featureLabels=" + featureLabels);
-
 
908
		
-
 
909
		// 5.1 Find line number range between which content for feature is found
-
 
910
		Map<String, int[]> bulletLineNumberRangePerFeature = 
-
 
911
			new HashMap<String, int[]>();
-
 
912
			
-
 
913
		Utils.logger.info("featureLabels.keySet=" + 
-
 
914
				featureLabels.keySet().toString());
-
 
915
		
-
 
916
		Integer[] featureLineNumbers = featureLabels.keySet().toArray(
-
 
917
				new Integer[0]);
-
 
918
		
-
 
919
		for(int i=0; i<featureLineNumbers.length-1; i++) {
-
 
920
			String tFeatureLabel = featureLabels.get(
-
 
921
					new Integer(featureLineNumbers[i]));
-
 
922
			
-
 
923
			Utils.logger.info("tFeatureLabel=" + tFeatureLabel);
-
 
924
			
-
 
925
			int from = featureLineNumbers[i]+1;
-
 
926
			int to = featureLineNumbers[i+1]-1;
-
 
927
			Utils.logger.info("from=" + from + " to=" + to);
-
 
928
			
-
 
929
			bulletLineNumberRangePerFeature.put(tFeatureLabel, 
-
 
930
					new int[] {from, to});
-
 
931
		}
-
 
932
 
-
 
933
		// For last feature
-
 
934
		String lastFeatureLabel = featureLabels.get(
-
 
935
			new Integer(featureLineNumbers[featureLineNumbers.length-1]));
-
 
936
		Utils.logger.info("lastFeatureLabel=" + lastFeatureLabel);
-
 
937
		
-
 
938
		int lastFrom = featureLineNumbers[featureLineNumbers.length-1] + 1;
-
 
939
		Utils.logger.info("lastFrom=" + lastFrom);
-
 
940
		
-
 
941
		// First empty line from "lastFrom"
-
 
942
		int lastTo = lastFrom;
-
 
943
		while(true) {
-
 
944
			if(lastTo == (allLines.size() - 1)) {
-
 
945
				break;
-
 
946
			}
-
 
947
			
-
 
948
			String tLastLine = allLines.get(lastTo + 1);
-
 
949
			Utils.logger.info("tLastLine=" + tLastLine);
-
 
950
			if(tLastLine == null) {
-
 
951
				break;
-
 
952
			}
-
 
953
			
-
 
954
			if(!StringUtils.startsWith(tLastLine, CN.PATTERN_LEVEL_2)) {
-
 
955
				break;
-
 
956
			}
-
 
957
			lastTo++;
-
 
958
			Utils.logger.info("running lastTo=" + lastTo);
-
 
959
		}
-
 
960
		
-
 
961
		Utils.logger.info("lastFrom=" + lastFrom + " lastTo=" + lastTo);
-
 
962
			
-
 
963
		bulletLineNumberRangePerFeature.put(lastFeatureLabel, 
-
 
964
				new int[] {lastFrom, lastTo});
-
 
965
		
-
 
966
		Utils.logger.info("featureLineNumberRangePerSlide=" + 
-
 
967
				bulletLineNumberRangePerFeature.toString());		
-
 
968
		
-
 
969
		return bulletLineNumberRangePerFeature;
-
 
970
	}
-
 
971
 
-
 
972
	
-
 
973
	/**
-
 
974
	 * 
-
 
975
	 * @param allLines
-
 
976
	 * @param slideDef
-
 
977
	 * @param lineNumberRange
-
 
978
	 * @throws Exception
-
 
979
	 */
-
 
980
	private Map<Integer, String> processFeature(List<String> allLines, 
-
 
981
			SlideDefinition slideDef, 
-
 
982
			int[] lineNumberRange) throws Exception {
-
 
983
		
-
 
984
		int from = lineNumberRange[0];
-
 
985
		int to = lineNumberRange[1];
-
 
986
		
-
 
987
		Utils.logger.info("from=" + from + " to=" + to);
-
 
988
		
-
 
989
		int numberOfLines = (to - from);
-
 
990
		Utils.logger.info("numberOfLines=" + numberOfLines);
-
 
991
 
-
 
992
		Map<Integer, String> candidateFeatures = new TreeMap<Integer, String>();
-
 
993
		for(int i=from; i<(to+1); i++) {
-
 
994
			String line = allLines.get(i);
-
 
995
 
-
 
996
			if(StringUtils.startsWith(line, CN.PATTERN_LEVEL_1)) {
-
 
997
				//Utils.logger.info(line);
-
 
998
				//Utils.logger.info("Level 1");
-
 
999
				candidateFeatures.put(new Integer(i), 
-
 
1000
						StringUtils.strip(StringUtils.strip(line, 
-
 
1001
								CN.PATTERN_LEVEL_1)));
-
 
1002
			}
-
 
1003
		}
-
 
1004
		
-
 
1005
		Utils.logger.info("candidateFeatures=" + candidateFeatures);
-
 
1006
		
-
 
1007
		// Get all feature definitions for the slide
-
 
1008
		DefinitionsContainer defs = 
-
 
1009
			Catalog.getInstance().getDefinitionsContainer();
-
 
1010
		
-
 
1011
		Utils.logger.info("slideDef.getID=" + slideDef.getID());
-
 
1012
		
-
 
1013
		List<FeatureDefinition> featureDefs = 
-
 
1014
			defs.getFeatureDefinitions(slideDef.getID());
-
 
1015
		Utils.logger.info("featureDefs=" + featureDefs);
-
 
1016
		
-
 
1017
		List<String> validFeatureLabels = new ArrayList<String>();
-
 
1018
		for(int i=0; i<featureDefs.size(); i++) {
-
 
1019
			validFeatureLabels.add(
-
 
1020
					StringUtils.lowerCase(featureDefs.get(i).getLabel()));
-
 
1021
		}
-
 
1022
		Utils.logger.info("validFeatureLabels=" + validFeatureLabels);
-
 
1023
		
-
 
1024
		// Filter valid features
-
 
1025
		Map<Integer, String> featureLabels = new TreeMap<Integer, String>();
-
 
1026
 
-
 
1027
		// Discard if feature is not one of the valids
-
 
1028
		// RE-VISIT
-
 
1029
		for(Integer lineNumber : candidateFeatures.keySet()) {
-
 
1030
			if(validFeatureLabels.contains(StringUtils.lowerCase(
-
 
1031
					candidateFeatures.get(lineNumber)))) {
-
 
1032
				featureLabels.put(lineNumber, StringUtils.lowerCase(
-
 
1033
						candidateFeatures.get(lineNumber)));
-
 
1034
			}
-
 
1035
		}
-
 
1036
		Utils.logger.info("featureLabels=" + featureLabels);
-
 
1037
		
-
 
1038
		// Fetch all mandatory features
-
 
1039
		List<FeatureDefinition> mandatoryFeatureDefs = 
-
 
1040
			defs.getFeatureDefinitions(slideDef.getID(),
-
 
1041
			EditorialImportance.MANDATORY);
-
 
1042
 
-
 
1043
		Utils.logger.info("mandatoryFeatureDefs=" + mandatoryFeatureDefs);
-
 
1044
		
-
 
1045
		// Severe error if mandatory features are not included
-
 
1046
		for(FeatureDefinition featureDef : mandatoryFeatureDefs) {
-
 
1047
			if(!featureLabels.values().contains(StringUtils.lowerCase(
-
 
1048
					featureDef.getLabel()))) {
-
 
1049
				Utils.logger.severe("Mandatory feature \"" + slideDef.getLabel() 
-
 
1050
						+ " > " + featureDef.getLabel() + "\" is missing");
-
 
1051
			}
-
 
1052
		}
-
 
1053
		
-
 
1054
		// Fetch all recommended features
-
 
1055
		List<FeatureDefinition> recommendedFeatureDefs = 
-
 
1056
			defs.getFeatureDefinitions(slideDef.getID(),
-
 
1057
			EditorialImportance.RECOMMENDED);
-
 
1058
 
-
 
1059
		Utils.logger.info("recommendedFeatureDefs=" + recommendedFeatureDefs);
-
 
1060
		
-
 
1061
		// Warn if recommended features are not included
-
 
1062
		for(FeatureDefinition featureDef : recommendedFeatureDefs) {
-
 
1063
			if(!featureLabels.values().contains(StringUtils.lowerCase(
-
 
1064
					featureDef.getLabel()))) {
-
 
1065
				Utils.logger.warning("Recommended feature \"" + 
-
 
1066
						featureDef.getLabel() + "\" is missing");
-
 
1067
			}
-
 
1068
		}
-
 
1069
		
-
 
1070
		return featureLabels;
-
 
1071
	}
-
 
1072
	
-
 
1073
	/**
-
 
1074
	 * Filter and validate parent slide names
-
 
1075
	 * 
-
 
1076
	 * @param candidateSlideNames
-
 
1077
	 * @return List<LineInfo>
-
 
1078
	 * @throws Exception 
-
 
1079
	 */
-
 
1080
	private Map<Integer, String> processSlides(
-
 
1081
			Map<Integer, String> candidateSlideLines) throws Exception {
-
 
1082
		
-
 
1083
		// Order of keys need to be restored
-
 
1084
		Map<Integer, String> processedSlideLines = 
-
 
1085
			new TreeMap<Integer, String>();
-
 
1086
		
-
 
1087
		// 1 Retrieve meta-data
-
 
1088
		// 1.1 Retrieve all valid slide names in the content model
-
 
1089
		DefinitionsContainer defs = 
-
 
1090
			Catalog.getInstance().getDefinitionsContainer();
-
 
1091
		
-
 
1092
		List<SlideDefinition> slideDefs = defs.getSlideDefinitions(
-
 
1093
				this.categoryID);
-
 
1094
		
-
 
1095
		List<String> validSlideNames = new ArrayList<String>();
-
 
1096
		for (SlideDefinition slideDef : slideDefs) {
-
 
1097
			
-
 
1098
			// To avoid Introduction slide
-
 
1099
			if(!slideDef.getLabel().isEmpty()) {
-
 
1100
				validSlideNames.add(StringUtils.lowerCase(slideDef.getLabel()));
-
 
1101
			}
-
 
1102
		}
-
 
1103
		Utils.logger.info("validSlideNames=" + validSlideNames.toString());
-
 
1104
		
-
 
1105
		// 2 Rules
-
 
1106
		// 2.1 Discard if slide is not one of the valids
-
 
1107
		// REVISIT
-
 
1108
		for(Integer lineNumber : candidateSlideLines.keySet()) {
-
 
1109
			if(validSlideNames.contains(StringUtils.lowerCase(
-
 
1110
					candidateSlideLines.get(lineNumber)))) {
-
 
1111
				
-
 
1112
				processedSlideLines.put(lineNumber, StringUtils.lowerCase(
-
 
1113
								candidateSlideLines.get(lineNumber)));
-
 
1114
				
-
 
1115
				this.slideNames.add(StringUtils.lowerCase(
-
 
1116
						candidateSlideLines.get(lineNumber)));
-
 
1117
			}
-
 
1118
		}
-
 
1119
		
-
 
1120
		Utils.logger.info("processedSlideLines=" + 
-
 
1121
				processedSlideLines.toString());
-
 
1122
 
-
 
1123
		// 3 Retrieve "Mandatory" slide names for the category
-
 
1124
		List<SlideDefinition> mandatorySlideDefs = 
-
 
1125
			defs.getSlides(this.categoryID, EditorialImportance.MANDATORY);
-
 
1126
		
-
 
1127
		Utils.logger.info("mandatorySlideDefs=" + 
-
 
1128
				mandatorySlideDefs.toString());
-
 
1129
 
-
 
1130
		// 3.1 All mandatory slides exist - Severe
-
 
1131
		for(SlideDefinition mandatorySlideDef : mandatorySlideDefs) {
-
 
1132
			
-
 
1133
			// Avoid introduction slide
-
 
1134
			if(mandatorySlideDef.getLabel().isEmpty()) {
-
 
1135
				continue;
-
 
1136
			}
-
 
1137
			
-
 
1138
			if(!processedSlideLines.values().contains(
-
 
1139
					StringUtils.lowerCase(mandatorySlideDef.getLabel()))) {
-
 
1140
				Utils.logger.severe("Mandatory slide \"" + 
-
 
1141
						mandatorySlideDef.getLabel() + "\" is missing");
-
 
1142
			}
-
 
1143
		}
-
 
1144
 
-
 
1145
		// 4 Retrieve "Recommended" slide names for the category
-
 
1146
		List<SlideDefinition> recommendedSlideDefs = 
-
 
1147
			defs.getSlides(this.categoryID, EditorialImportance.RECOMMENDED);
-
 
1148
 
-
 
1149
		Utils.logger.info("recommendedSlideDefs=" + 
-
 
1150
				recommendedSlideDefs.toString());
-
 
1151
		
-
 
1152
		// 4.1 All recommended slides exist - Warn	
-
 
1153
		for(SlideDefinition recommendedSlideDef : recommendedSlideDefs) {
-
 
1154
			if(!processedSlideLines.values().contains(
-
 
1155
					StringUtils.lowerCase(recommendedSlideDef.getLabel()))) {
-
 
1156
				Utils.logger.warning("Recommended slide \"" + 
-
 
1157
						recommendedSlideDef.getLabel() + "\" is missing");
-
 
1158
			}
-
 
1159
		}
-
 
1160
		
-
 
1161
		return processedSlideLines;
-
 
1162
	}
-
 
1163
	
-
 
1164
	/**
-
 
1165
	 * @throws Exception 
-
 
1166
	 * 
-
 
1167
	 */
-
 
1168
	@SuppressWarnings("unused")
-
 
1169
	private void test() throws Exception {
-
 
1170
		// test category
-
 
1171
		DefinitionsContainer allDefs = 
-
 
1172
			Catalog.getInstance().getDefinitionsContainer();
-
 
1173
		
-
 
1174
		Category category = allDefs.getCategory(this.categoryID);
-
 
1175
		Utils.logger.info(category.toString());
-
 
1176
		
-
 
1177
		// test data type defs
-
 
1178
		DatatypeDefinition datatypeDef = allDefs.getDatatypeDefinition(70004L);
-
 
1179
		Utils.logger.info(datatypeDef.toString());
-
 
1180
		
-
 
1181
		// test units
-
 
1182
		Unit unit = allDefs.getUnit(50004L);
-
 
1183
		Utils.logger.info(unit.toString());
-
 
1184
		
-
 
1185
		// test slide defs
-
 
1186
		SlideDefinition slideDef = allDefs.getSlideDefinition(130002L);
-
 
1187
		Utils.logger.info(slideDef.toString());
-
 
1188
		
-
 
1189
		// test feature defs
-
 
1190
		FeatureDefinition featureDef = allDefs.getFeatureDefinition(120002L);
-
 
1191
		Utils.logger.info(featureDef.toString());
-
 
1192
	}
-
 
1193
}
152
}