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);
137
			//System.out.println(categoriesMap);
138
			//System.out.println(root);
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
 
214
			System.out.println("Slide label=" + jaxbDef.getLabel());
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
			}
228
			System.out.println(def);
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
 
283
			//System.out.println("Feature label=" + jaxbDef.getLabel());
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
			}
295
			System.out.println(def);
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(
351
						jaxbDef.getID(), jaxbDef.getName());
352
 
353
				List<CompositePartDefinitionType> jaxbPartDefs = 
354
					compositeDefType.getCompositePartDefinition();
355
 
356
				Iterator<CompositePartDefinitionType> itPartDefs = 
357
					jaxbPartDefs.iterator();
358
 
359
				// Collect parts
360
				while(itPartDefs.hasNext()) {
361
					CompositePartDefinitionType jaxbPartDef = itPartDefs.next();
362
					CompositePartDefinition partDef = 
363
						this.convertCompositePartDefinition(jaxbPartDef);
364
 
365
					compDef.addCompositePartDefinition(partDef);
366
				}
367
 
368
				def = compDef;
369
			}
370
 
371
			// Enumerated values
372
			else if(enumDefType != null) {
373
				EnumDefinition enumDef = new EnumDefinition(jaxbDef.getID(), 
374
						jaxbDef.getName());
375
 
376
				List<EnumValueType> jaxbEnumValues = 
377
					enumDefType.getEnumValue();
378
 
379
				Iterator<EnumValueType> itEnumValues = 
380
					jaxbEnumValues.iterator();
381
 
382
				// Collect individual value
383
				while(itEnumValues.hasNext()) {
384
					EnumValueType jaxbEnumValue = itEnumValues.next();
385
					EnumValue enumValue = 
386
						this.convertEnumValueDefinition(jaxbEnumValue);
387
 
388
					enumDef.addEnumValue(enumValue);
389
				}
390
 
391
				def = enumDef;
392
			}
393
 
394
			// Primitive
395
			else {
396
				def = new DatatypeDefinition(jaxbDef.getID(), 
397
						jaxbDef.getName());
398
			}
399
 
400
			def.setDescription(jaxbDef.getDescription());
401
			System.out.println(def);
402
 
403
			defs.put(new Long(jaxbDef.getID()), def);
404
		}
405
 
406
		return defs;
407
	}
408
 
409
	/**
410
	 * 
411
	 * @param jaxbEnumValue
412
	 * @return EnumValue
413
	 */
414
	private EnumValue convertEnumValueDefinition(EnumValueType jaxbEnumValue) {
415
 
416
		EnumValue enumValue = new EnumValue(jaxbEnumValue.getID(), 
417
				jaxbEnumValue.getValue());
418
 
419
		return enumValue;
420
	}
421
	/**
422
	 * 
423
	 * @param jaxbPartDef
424
	 * @return CompositePartDefinition
425
	 */
426
	private CompositePartDefinition convertCompositePartDefinition(
427
			CompositePartDefinitionType jaxbPartDef) {
428
 
429
		CompositePartDefinition partDef = new CompositePartDefinition(
430
				jaxbPartDef.getLabel(), jaxbPartDef.getDatatypeDefinitionID(), 
431
				jaxbPartDef.getUnitID());
432
 
433
		partDef.setDescription(jaxbPartDef.getDescription());
434
 
435
		return partDef;
436
	}
437
 
438
	/**
439
	 * 
440
	 * @return Map
441
	 */
442
	private Category convertCategories(DefinitionType defType, 
443
			Map<Long, Category> catMap) {
10 shop2020 444
 
445
		List<CategoryType> jaxbCats = defType.getCategory();
446
		Iterator<CategoryType> it = jaxbCats.iterator();
447
 
448
		// Get root category
449
		CategoryType jaxbCat = it.next();
450
		if(jaxbCat == null) {
451
			System.out.println("Invalid file: " + this.srcFile);
452
			return null;
453
		}
454
 
455
		Category root = this.convertCategoryType(jaxbCat, null, catMap);
456
		return root;
457
	}
458
 
459
	/**
460
	 * 
461
	 * @param jaxbCat
462
	 * @return Category
463
	 */
16 naveen 464
	private Category convertCategoryType(CategoryType jaxbCat, 
465
			Category parentCat, Map<Long, Category> catMap) {
18 naveen 466
 
10 shop2020 467
		Category cat = new Category(jaxbCat.getID());
468
		cat.setLabel(jaxbCat.getName());
469
		cat.setDescription(jaxbCat.getDescription());
470
		if(parentCat != null) {
471
			cat.setParentCategory(parentCat);
472
		}
473
 
474
		// Category Slide Definition
475
		List<CategorySlideDefinitionType> jaxbDefs = jaxbCat.getCategorySlideDefinition();
476
		Iterator<CategorySlideDefinitionType> it = jaxbDefs.iterator();
477
		while(it.hasNext()) {
478
			CategorySlideDefinitionType jaxbDef = it.next();
479
			CategorySlideDefinition catSlideDef = this.convertCategorySlideDefinitionType(jaxbCat.getID(), jaxbDef);
480
			cat.addCategorySlideDefintion(catSlideDef);
481
		}
482
 
483
		// Children
484
		List<CategoryType> jaxbChildren = jaxbCat.getChildCategory();
485
		//System.out.println("jaxbChildren.size: " + jaxbChildren.size());
486
 
487
		Iterator<CategoryType> itChildren = jaxbChildren.iterator();
488
		while(itChildren.hasNext()) {
489
			CategoryType jaxbChildCat = itChildren.next();
490
			Category childCat = this.convertCategoryType(jaxbChildCat, cat, catMap);
491
			cat.addChild(childCat);
492
		}
493
		//System.out.println("Parent cat: " + cat);
494
		catMap.put(new Long(jaxbCat.getID()), cat);
495
		return cat;
496
	}
497
 
498
	/**
499
	 * 
500
	 * @param jaxbDef
501
	 * @return
502
	 */
16 naveen 503
	private CategorySlideDefinition convertCategorySlideDefinitionType(
504
			long categoryID, CategorySlideDefinitionType jaxbDef) {
505
 
10 shop2020 506
		CategorySlideDefinition catSlideDef = new CategorySlideDefinition(
507
				categoryID, jaxbDef.getSlideDefinitionID());
508
 
509
		catSlideDef.setDescription(jaxbDef.getDescription());
510
 
511
		EditorialImportanceType jaxbEdImp = jaxbDef.getEditorialImportance();
512
		EditorialImportance edImp = this.convertEditorialImportance(jaxbEdImp);
513
		catSlideDef.setEditorialImportance(edImp);
514
 
515
		return catSlideDef;
516
	}
517
 
518
	/**
519
	 * 
520
	 * @return Map
521
	 */
522
	private Map<Long, Unit> convertUnits(DefinitionType defType) {
523
 
524
		Map<Long, Unit> allUnits = new HashMap<Long, Unit>();
525
		List<UnitType> jaxbUnits = defType.getUnit();
526
		Iterator<UnitType> it = jaxbUnits.iterator();
527
 
528
		while(it.hasNext()) {
529
			UnitType jaxbUnit = it.next();
530
 
531
			Unit unit = new Unit(jaxbUnit.getID());
532
			unit.setDescription(jaxbUnit.getDescription());
533
			unit.setFullForm(jaxbUnit.getFullform());
534
			unit.setShortForm(jaxbUnit.getShortform());
535
			System.out.println(unit);
536
 
537
			allUnits.put(new Long(jaxbUnit.getID()), unit);
538
		}
539
 
540
		return allUnits;
541
	}
542
 
543
	/**
544
	 * 
545
	 * @return DefinitionType
546
	 */
547
	private DefinitionType unmarshallSrcFile(String srcFile) throws Exception {
548
 
16 naveen 549
        JAXBContext jc = JAXBContext.newInstance("in.shop2020.metamodel.jaxb");
10 shop2020 550
 
551
        // create an Unmarshaller
552
        Unmarshaller u = jc.createUnmarshaller();
553
 
16 naveen 554
        JAXBElement<?> element = (JAXBElement<?>)u.unmarshal(
555
        		new FileInputStream(srcFile));
10 shop2020 556
 
557
        return (DefinitionType)element.getValue();
558
	}
559
 
560
	/**
561
	 * 
16 naveen 562
	 * @param jaxbEdImp
563
	 * @return EditorialImportance
564
	 */
565
	private EditorialImportance convertEditorialImportance(
566
			EditorialImportanceType jaxbEdImp) {
567
 
568
		String strEdImp = jaxbEdImp.value();
569
		EditorialImportance edImp = null;
570
 
571
		if(strEdImp.equals("Mandatory"))
572
			edImp = EditorialImportance.MANDATORY;
573
		else if(strEdImp.equals("Optional"))
574
			edImp = EditorialImportance.OPTIONAL;
575
		else 
576
			edImp = EditorialImportance.RECOMMENDED;
577
 
578
		return edImp;
579
	}
10 shop2020 580
}