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