Subversion Repositories SmartDukaan

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
10 shop2020 1
/**
2
 * 
3
 */
4
package in.shop2020.metamodel.util;
5
 
16 naveen 6
import in.shop2020.metamodel.definitions.BulletDefinition;
10 shop2020 7
import in.shop2020.metamodel.definitions.Category;
8
import in.shop2020.metamodel.definitions.CategorySlideDefinition;
16 naveen 9
import in.shop2020.metamodel.definitions.CompositeDefinition;
10
import in.shop2020.metamodel.definitions.CompositePartDefinition;
11
import in.shop2020.metamodel.definitions.DatatypeDefinition;
10 shop2020 12
import in.shop2020.metamodel.definitions.EditorialImportance;
16 naveen 13
import in.shop2020.metamodel.definitions.EnumDefinition;
14
import in.shop2020.metamodel.definitions.EnumValue;
15
import in.shop2020.metamodel.definitions.FeatureDefinition;
16
import in.shop2020.metamodel.definitions.SlideDefinition;
17
import in.shop2020.metamodel.definitions.SlideFeatureDefinition;
10 shop2020 18
import in.shop2020.metamodel.definitions.Unit;
16 naveen 19
import in.shop2020.metamodel.jaxb.BulletDefinitionType;
10 shop2020 20
import in.shop2020.metamodel.jaxb.CategorySlideDefinitionType;
21
import in.shop2020.metamodel.jaxb.CategoryType;
16 naveen 22
import in.shop2020.metamodel.jaxb.CompositeDefinitionType;
23
import in.shop2020.metamodel.jaxb.CompositePartDefinitionType;
24
import in.shop2020.metamodel.jaxb.DatatypeDefinitionType;
10 shop2020 25
import in.shop2020.metamodel.jaxb.DefinitionType;
26
import in.shop2020.metamodel.jaxb.EditorialImportanceType;
16 naveen 27
import in.shop2020.metamodel.jaxb.EnumDefinitionType;
28
import in.shop2020.metamodel.jaxb.EnumValueType;
29
import in.shop2020.metamodel.jaxb.FeatureDefinitionType;
30
import in.shop2020.metamodel.jaxb.SlideDefinitionType;
31
import in.shop2020.metamodel.jaxb.SlideFeatureDefinitionType;
10 shop2020 32
import in.shop2020.metamodel.jaxb.UnitType;
33
 
34
import java.io.FileInputStream;
16 naveen 35
import java.util.ArrayList;
10 shop2020 36
import java.util.HashMap;
37
import java.util.Iterator;
38
import java.util.List;
39
import java.util.Map;
40
 
41
import javax.xml.bind.JAXBContext;
42
import javax.xml.bind.JAXBElement;
43
import javax.xml.bind.Unmarshaller;
44
 
45
import org.apache.commons.lang.ArrayUtils;
46
import org.apache.commons.lang.StringUtils;
47
 
48
/**
17 naveen 49
 * MM - Meta-Model Tool
50
 * Imports and exports model definitions. Validates against meta model
10 shop2020 51
 * 
52
 * @author naveen
53
 *
54
 */
55
public class MM {
16 naveen 56
	public static final String DEFINITIONS_SRC_PATH = 
57
		"/home/naveen/workspace/eclipse/webapp/src/xml/model/";
58
	public static final String DEFINITIONS_DB_PATH = 
59
		"/home/naveen/workspace/eclipse/webapp/db/definitions/";
60
	public static final String ENTITIES_DB_PATH = 
61
		"/home/naveen/workspace/eclipse/webapp/db/entities/";
10 shop2020 62
 
63
	private String definitionSetName;
64
	private String srcFile;
65
	private String dbFile;
66
 
67
	/**
68
	 * @param args
69
	 */
70
	public static void main(String[] args) throws Exception {
16 naveen 71
		String[] definitionSetNames = new String[] {"units", 
72
				"datatypedefinitions", "featuredefinitions", "slidedefinitions", 
73
				"categories"};
10 shop2020 74
 
75
		String[] commands = new String[] {"show", "import"};
76
 
16 naveen 77
		String usage = "Usage: MM ["+ StringUtils.join(commands, "|") +"] ["+ 
78
			StringUtils.join(definitionSetNames, "|") +"]";
79
 
10 shop2020 80
		if(args.length < 2) {
81
			System.out.println(usage);
82
			System.exit(-1);
83
		}
17 naveen 84
		System.out.println("MM "+ args[0] + " " + args[1]);
85
 
10 shop2020 86
		String inputCommand = args[0];
87
		String inputDefinitionSet = args[1];
88
 
89
		if(!ArrayUtils.contains(commands, inputCommand)) {
90
			System.out.println(usage);
91
			System.exit(-1);
92
		}
93
 
94
		if(!ArrayUtils.contains(definitionSetNames, inputDefinitionSet)) {
95
			System.out.println(usage);
96
			System.exit(-1);
97
		}
98
 
99
		MM mm = new MM(inputDefinitionSet);
100
		if(inputCommand.equals("import")) {
101
			mm.importDefinitionSet();
102
		}
103
		else if(inputCommand.equals("show")) {
104
			mm.showDefinitionSet();
105
		}
106
	}
107
 
108
	/**
109
	 * 
110
	 * @param definitionSet
111
	 */
112
	public MM(String definitionSetName) {
113
		this.definitionSetName = definitionSetName;
114
		this.srcFile = DEFINITIONS_SRC_PATH + this.definitionSetName + ".xml";
115
		this.dbFile = DEFINITIONS_DB_PATH + this.definitionSetName + ".ser";
116
	}
117
 
118
	/**
119
	 * 
120
	 */
121
	@SuppressWarnings("unchecked")
122
	public void importDefinitionSet() throws Exception {
123
		System.out.println("importDefinitionSet()");
124
 
125
		DefinitionType defType = this.unmarshallSrcFile(this.srcFile);
16 naveen 126
		Object objectToStore = null;
10 shop2020 127
 
128
		// Units
129
		if(this.definitionSetName.equals("units")) {
130
			Map unitsMap = this.convertUnits(defType);
16 naveen 131
			objectToStore = unitsMap;
10 shop2020 132
		}
133
 
134
		// Categories
135
		else if(this.definitionSetName.equals("categories")) {
136
			Map<Long, Category> categoriesMap = new HashMap<Long, Category>();
137
			Category root = this.convertCategories(defType, categoriesMap);
138
			//System.out.println(categoriesMap);
139
			//System.out.println(root);
140
			//System.exit(0);
141
 
142
			// Tree
16 naveen 143
			String categoryTreeDBFile = DEFINITIONS_DB_PATH + "categorytree" + 
144
				".ser";
145
 
10 shop2020 146
			if(root != null) {
17 naveen 147
				DBUtils.store(root, categoryTreeDBFile);
10 shop2020 148
			}
149
 
150
			// Map
16 naveen 151
			objectToStore = categoriesMap;
10 shop2020 152
		}
16 naveen 153
 
154
		// Datatype Definitions
155
		else if(this.definitionSetName.equals("datatypedefinitions")) {
156
			Map datatypeDefsMap = this.convertDatatypeDefinition(defType);
157
 
158
			objectToStore = datatypeDefsMap;
159
		}
160
 
161
		// Feature Definitions
162
		else if(this.definitionSetName.equals("featuredefinitions")) {
163
			Map featureDefsMap = this.convertFeatureDefinitions(defType);
164
 
165
			objectToStore = featureDefsMap;
166
		}
167
 
168
		// Slide Definitions
169
		else if(this.definitionSetName.equals("slidedefinitions")) {
170
			Map slideDefsMap = this.convertSlideDefinitions(defType);
171
 
172
			objectToStore = slideDefsMap;
173
		}
174
 
175
		if(objectToStore != null) {
17 naveen 176
			DBUtils.store(objectToStore, this.dbFile);
16 naveen 177
		}
10 shop2020 178
	}
179
 
180
	/**
181
	 * 
182
	 */
183
	public void showDefinitionSet() throws Exception {
184
		System.out.println("showDefinitionSet()");
185
 
17 naveen 186
		Object obj = DBUtils.read(this.dbFile);
10 shop2020 187
		System.out.println(obj);
188
 
189
		if(this.definitionSetName.equals("categories")) {
16 naveen 190
			String categoryTreeDBFile = DEFINITIONS_DB_PATH + "categorytree" + 
191
				".ser";
192
 
17 naveen 193
			Category root = (Category)DBUtils.read(categoryTreeDBFile);
10 shop2020 194
			System.out.println(root);
16 naveen 195
			System.out.println("root.getChildrenCategory().size: " + 
196
					root.getChildrenCategory().size());
10 shop2020 197
		}
198
	}
199
 
200
	/**
201
	 * 
202
	 * @return Map
203
	 */
16 naveen 204
	private Map<Long, SlideDefinition> convertSlideDefinitions(
205
			DefinitionType defType) {
206
 
207
		System.out.println("convertSlideDefinitions()");
208
 
209
		Map<Long, SlideDefinition> defs = 
210
			new HashMap<Long, SlideDefinition>();
211
 
212
		List<SlideDefinitionType> jaxbDefs = defType.getSlideDefinition();
213
		Iterator<SlideDefinitionType> itjaxbDefs = jaxbDefs.iterator();
214
 
215
		// Slide definitions
216
		while(itjaxbDefs.hasNext()) {
217
			SlideDefinitionType jaxbDef = itjaxbDefs.next();
218
 
219
			System.out.println("Slide label=" + jaxbDef.getLabel());
220
			SlideDefinition def = new SlideDefinition(jaxbDef.getID(),
221
					jaxbDef.getLabel());
222
			def.setDescription(jaxbDef.getDescription());
223
 
224
			// Slide Feature Definition
225
			List<SlideFeatureDefinitionType> jaxbSlideFeatureDefs = 
226
				jaxbDef.getSlideFeatureDefinition();
227
 
228
			if(jaxbSlideFeatureDefs != null) {
229
				def.setSlideFeatureDefinitions((
230
						this.convertSlideFeatureDefinitions(
231
								jaxbSlideFeatureDefs)));
232
			}
233
			System.out.println(def);
234
 
235
			defs.put(new Long(jaxbDef.getID()), def);
236
		}
237
 
238
		return defs;
239
	}
240
 
241
	/**
242
	 * 
243
	 * @param jaxbDefs
244
	 * @return List<SlideFeatureDefinition>
245
	 */
246
	private List<SlideFeatureDefinition> convertSlideFeatureDefinitions(
247
			List<SlideFeatureDefinitionType> jaxbDefs) {
248
 
249
		System.out.println("convertSlideFeatureDefinitions()");
250
 
251
		List<SlideFeatureDefinition> defs = 
252
			new ArrayList<SlideFeatureDefinition>();
253
 
254
		Iterator<SlideFeatureDefinitionType> itjaxbDefs = jaxbDefs.iterator();
255
 
256
		// Slide-feature definitions
257
		while(itjaxbDefs.hasNext()) {
258
			SlideFeatureDefinitionType jaxbDef = itjaxbDefs.next();
259
			SlideFeatureDefinition def = new SlideFeatureDefinition(
260
					jaxbDef.getFeatureDefinitionID());
261
 
262
			def.setEditorialImportance(this.convertEditorialImportance(
263
					jaxbDef.getEditorialImportance()));
264
 
265
			def.setDescription(jaxbDef.getDescription());
266
 
267
			defs.add(def);
268
		}
269
 
270
		return defs;
271
	}
272
 
273
	/**
274
	 * 
275
	 * @return Map
276
	 */
277
	private Map<Long, FeatureDefinition> convertFeatureDefinitions(
278
			DefinitionType defType) {
279
 
280
		System.out.println("convertFeatureDefinitions()");
281
 
282
		Map<Long, FeatureDefinition> defs = 
283
			new HashMap<Long, FeatureDefinition>();
284
 
285
		List<FeatureDefinitionType> jaxbDefs = defType.getFeatureDefinition();
286
		Iterator<FeatureDefinitionType> itjaxbDefs = jaxbDefs.iterator();
287
 
288
		// Feature definitions
289
		while(itjaxbDefs.hasNext()) {
290
			FeatureDefinitionType jaxbDef = itjaxbDefs.next();
291
 
292
			//System.out.println("Feature label=" + jaxbDef.getLabel());
293
			FeatureDefinition def = new FeatureDefinition(jaxbDef.getID(),
294
					jaxbDef.getLabel());
295
			def.setAllowsBlank(jaxbDef.isCanbeBlank());
296
			def.setDescription(jaxbDef.getDescription());
297
 
298
			// Bullet Definition
299
			BulletDefinitionType jaxbBulletDef = jaxbDef.getBulletDefinition();
300
			if(jaxbBulletDef != null) {
301
				def.setBulletDefinition(this.convertBulletDefinition(
302
						jaxbBulletDef));
303
			}
304
			System.out.println(def);
305
 
306
			defs.put(new Long(jaxbDef.getID()), def);
307
		}
308
 
309
		return defs;
310
	}
311
 
312
	/**
313
	 * 
314
	 * @param jaxbDef BulletDefinitionType
315
	 * @return BulletDefinition
316
	 */
317
	private BulletDefinition convertBulletDefinition(
318
			BulletDefinitionType jaxbDef) {
319
 
320
		System.out.println("convertBulletDefinition()");
321
 
322
		BulletDefinition def = new BulletDefinition(
323
				jaxbDef.getDatatypeDefinitionID());
324
 
325
		Long unitID = jaxbDef.getUnitID();
326
		if(unitID != null) {
327
			def.setUnitID(unitID.longValue());
328
		}
329
		def.setMultivalue(jaxbDef.isIsMultivalue());
330
		def.setLearned(jaxbDef.isIsLearned());
331
		def.setDescription(jaxbDef.getDescription());
332
 
333
		return def;
334
	}
335
 
336
	/**
337
	 * 
338
	 * @return Map
339
	 */
340
	private Map<Long, DatatypeDefinition> convertDatatypeDefinition(
341
			DefinitionType defType) {
342
 
343
		System.out.println("convertDatatypeDefinition()");
344
 
345
		Map<Long, DatatypeDefinition> defs = 
346
			new HashMap<Long, DatatypeDefinition>();
347
 
348
		List<DatatypeDefinitionType> jaxbDefs = defType.getDatatypeDefinition();
349
		Iterator<DatatypeDefinitionType> it = jaxbDefs.iterator();
350
 
351
		while(it.hasNext()) {
352
			DatatypeDefinitionType jaxbDef = it.next();
353
 
354
			DatatypeDefinition def = null;
355
			CompositeDefinitionType compositeDefType = 
356
				jaxbDef.getCompositeDefinition();
357
 
358
			EnumDefinitionType enumDefType = 
359
				jaxbDef.getEnumDefinition();
360
 
361
			// Composite data type
362
			if(compositeDefType != null) {
363
				CompositeDefinition compDef = new CompositeDefinition(
364
						jaxbDef.getID(), jaxbDef.getName());
365
 
366
				List<CompositePartDefinitionType> jaxbPartDefs = 
367
					compositeDefType.getCompositePartDefinition();
368
 
369
				Iterator<CompositePartDefinitionType> itPartDefs = 
370
					jaxbPartDefs.iterator();
371
 
372
				// Collect parts
373
				while(itPartDefs.hasNext()) {
374
					CompositePartDefinitionType jaxbPartDef = itPartDefs.next();
375
					CompositePartDefinition partDef = 
376
						this.convertCompositePartDefinition(jaxbPartDef);
377
 
378
					compDef.addCompositePartDefinition(partDef);
379
				}
380
 
381
				def = compDef;
382
			}
383
 
384
			// Enumerated values
385
			else if(enumDefType != null) {
386
				EnumDefinition enumDef = new EnumDefinition(jaxbDef.getID(), 
387
						jaxbDef.getName());
388
 
389
				List<EnumValueType> jaxbEnumValues = 
390
					enumDefType.getEnumValue();
391
 
392
				Iterator<EnumValueType> itEnumValues = 
393
					jaxbEnumValues.iterator();
394
 
395
				// Collect individual value
396
				while(itEnumValues.hasNext()) {
397
					EnumValueType jaxbEnumValue = itEnumValues.next();
398
					EnumValue enumValue = 
399
						this.convertEnumValueDefinition(jaxbEnumValue);
400
 
401
					enumDef.addEnumValue(enumValue);
402
				}
403
 
404
				def = enumDef;
405
			}
406
 
407
			// Primitive
408
			else {
409
				def = new DatatypeDefinition(jaxbDef.getID(), 
410
						jaxbDef.getName());
411
			}
412
 
413
			def.setDescription(jaxbDef.getDescription());
414
			System.out.println(def);
415
 
416
			defs.put(new Long(jaxbDef.getID()), def);
417
		}
418
 
419
		return defs;
420
	}
421
 
422
	/**
423
	 * 
424
	 * @param jaxbEnumValue
425
	 * @return EnumValue
426
	 */
427
	private EnumValue convertEnumValueDefinition(EnumValueType jaxbEnumValue) {
428
		System.out.println("convertEnumValueDefinition()");
429
 
430
		EnumValue enumValue = new EnumValue(jaxbEnumValue.getID(), 
431
				jaxbEnumValue.getValue());
432
 
433
		return enumValue;
434
	}
435
	/**
436
	 * 
437
	 * @param jaxbPartDef
438
	 * @return CompositePartDefinition
439
	 */
440
	private CompositePartDefinition convertCompositePartDefinition(
441
			CompositePartDefinitionType jaxbPartDef) {
442
		System.out.println("convertCompositePartDefinition()");
443
 
444
		CompositePartDefinition partDef = new CompositePartDefinition(
445
				jaxbPartDef.getLabel(), jaxbPartDef.getDatatypeDefinitionID(), 
446
				jaxbPartDef.getUnitID());
447
 
448
		partDef.setDescription(jaxbPartDef.getDescription());
449
 
450
		return partDef;
451
	}
452
 
453
	/**
454
	 * 
455
	 * @return Map
456
	 */
457
	private Category convertCategories(DefinitionType defType, 
458
			Map<Long, Category> catMap) {
10 shop2020 459
		System.out.println("convertCategories()");
460
 
461
		List<CategoryType> jaxbCats = defType.getCategory();
462
		Iterator<CategoryType> it = jaxbCats.iterator();
463
 
464
		// Get root category
465
		CategoryType jaxbCat = it.next();
466
		if(jaxbCat == null) {
467
			System.out.println("Invalid file: " + this.srcFile);
468
			return null;
469
		}
470
 
471
		Category root = this.convertCategoryType(jaxbCat, null, catMap);
472
		return root;
473
	}
474
 
475
	/**
476
	 * 
477
	 * @param jaxbCat
478
	 * @return Category
479
	 */
16 naveen 480
	private Category convertCategoryType(CategoryType jaxbCat, 
481
			Category parentCat, Map<Long, Category> catMap) {
10 shop2020 482
		Category cat = new Category(jaxbCat.getID());
483
		cat.setLabel(jaxbCat.getName());
484
		cat.setDescription(jaxbCat.getDescription());
485
		if(parentCat != null) {
486
			cat.setParentCategory(parentCat);
487
		}
488
 
489
		// Category Slide Definition
490
		List<CategorySlideDefinitionType> jaxbDefs = jaxbCat.getCategorySlideDefinition();
491
		Iterator<CategorySlideDefinitionType> it = jaxbDefs.iterator();
492
		while(it.hasNext()) {
493
			CategorySlideDefinitionType jaxbDef = it.next();
494
			CategorySlideDefinition catSlideDef = this.convertCategorySlideDefinitionType(jaxbCat.getID(), jaxbDef);
495
			cat.addCategorySlideDefintion(catSlideDef);
496
		}
497
 
498
		// Children
499
		List<CategoryType> jaxbChildren = jaxbCat.getChildCategory();
500
		//System.out.println("jaxbChildren.size: " + jaxbChildren.size());
501
 
502
		Iterator<CategoryType> itChildren = jaxbChildren.iterator();
503
		while(itChildren.hasNext()) {
504
			CategoryType jaxbChildCat = itChildren.next();
505
			Category childCat = this.convertCategoryType(jaxbChildCat, cat, catMap);
506
			cat.addChild(childCat);
507
		}
508
		//System.out.println("Parent cat: " + cat);
509
		catMap.put(new Long(jaxbCat.getID()), cat);
510
		return cat;
511
	}
512
 
513
	/**
514
	 * 
515
	 * @param jaxbDef
516
	 * @return
517
	 */
16 naveen 518
	private CategorySlideDefinition convertCategorySlideDefinitionType(
519
			long categoryID, CategorySlideDefinitionType jaxbDef) {
520
 
10 shop2020 521
		CategorySlideDefinition catSlideDef = new CategorySlideDefinition(
522
				categoryID, jaxbDef.getSlideDefinitionID());
523
 
524
		catSlideDef.setDescription(jaxbDef.getDescription());
525
 
526
		EditorialImportanceType jaxbEdImp = jaxbDef.getEditorialImportance();
527
		EditorialImportance edImp = this.convertEditorialImportance(jaxbEdImp);
528
		catSlideDef.setEditorialImportance(edImp);
529
 
530
		return catSlideDef;
531
	}
532
 
533
	/**
534
	 * 
535
	 * @return Map
536
	 */
537
	private Map<Long, Unit> convertUnits(DefinitionType defType) {
538
		System.out.println("convertUnits()");
539
 
540
		Map<Long, Unit> allUnits = new HashMap<Long, Unit>();
541
		List<UnitType> jaxbUnits = defType.getUnit();
542
		Iterator<UnitType> it = jaxbUnits.iterator();
543
 
544
		while(it.hasNext()) {
545
			UnitType jaxbUnit = it.next();
546
 
547
			Unit unit = new Unit(jaxbUnit.getID());
548
			unit.setDescription(jaxbUnit.getDescription());
549
			unit.setFullForm(jaxbUnit.getFullform());
550
			unit.setShortForm(jaxbUnit.getShortform());
551
			System.out.println(unit);
552
 
553
			allUnits.put(new Long(jaxbUnit.getID()), unit);
554
		}
555
 
556
		return allUnits;
557
	}
558
 
559
	/**
560
	 * 
561
	 * @return DefinitionType
562
	 */
563
	private DefinitionType unmarshallSrcFile(String srcFile) throws Exception {
564
		System.out.println("unmarshallSrcFile()");
565
 
16 naveen 566
        JAXBContext jc = JAXBContext.newInstance("in.shop2020.metamodel.jaxb");
10 shop2020 567
 
568
        // create an Unmarshaller
569
        Unmarshaller u = jc.createUnmarshaller();
570
 
16 naveen 571
        JAXBElement<?> element = (JAXBElement<?>)u.unmarshal(
572
        		new FileInputStream(srcFile));
10 shop2020 573
 
574
        return (DefinitionType)element.getValue();
575
	}
576
 
577
	/**
578
	 * 
16 naveen 579
	 * @param jaxbEdImp
580
	 * @return EditorialImportance
581
	 */
582
	private EditorialImportance convertEditorialImportance(
583
			EditorialImportanceType jaxbEdImp) {
584
 
585
		String strEdImp = jaxbEdImp.value();
586
		EditorialImportance edImp = null;
587
 
588
		if(strEdImp.equals("Mandatory"))
589
			edImp = EditorialImportance.MANDATORY;
590
		else if(strEdImp.equals("Optional"))
591
			edImp = EditorialImportance.OPTIONAL;
592
		else 
593
			edImp = EditorialImportance.RECOMMENDED;
594
 
595
		return edImp;
596
	}
10 shop2020 597
}