Subversion Repositories SmartDukaan

Rev

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

Rev Author Line No. Line
17 naveen 1
/**
2
 * 
3
 */
4
package in.shop2020.metamodel.util;
5
 
18 naveen 6
import java.io.BufferedReader;
7
import java.io.FileReader;
8
import java.io.LineNumberReader;
9
import java.util.ArrayList;
10
import java.util.HashMap;
11
import java.util.Iterator;
12
import java.util.List;
13
import java.util.Map;
14
import java.util.logging.Level;
15
 
17 naveen 16
import in.shop2020.metamodel.definitions.Catalog;
17
import in.shop2020.metamodel.definitions.Category;
18 naveen 18
import in.shop2020.metamodel.definitions.DatatypeDefinition;
17 naveen 19
import in.shop2020.metamodel.definitions.DefinitionsContainer;
18 naveen 20
import in.shop2020.metamodel.definitions.EditorialImportance;
21
import in.shop2020.metamodel.definitions.FeatureDefinition;
22
import in.shop2020.metamodel.definitions.SlideDefinition;
23
import in.shop2020.metamodel.definitions.Unit;
24
import in.shop2020.util.Utils;
17 naveen 25
 
26
import org.apache.commons.lang.ArrayUtils;
27
import org.apache.commons.lang.StringUtils;
28
 
29
/**
30
 * CN - Content Tool
31
 * Imports and exports content. Validates against content model
32
 * 
33
 * @author naveen
34
 *
35
 */
36
public class CN {
37
	public static final String CONTENT_SRC_TXT_PATH = 
38
		"/home/naveen/workspace/eclipse/webapp/src/content/txt/";
39
	public static final String CONTENT_SRC_HTML_PATH = 
40
		"/home/naveen/workspace/eclipse/webapp/src/content/html/";
41
	public static final String CONTENT_SRC_XML_PATH = 
42
		"/home/naveen/workspace/eclipse/webapp/src/content/xml/";
43
	public static final String CONTENT_DB_PATH =  
44
		"/home/naveen/workspace/eclipse/webapp/db/entities/";
18 naveen 45
 
17 naveen 46
	// Known patterns
47
	public static final String PATTERN_LEVEL_1 = "* ";
48
	public static final String PATTERN_LEVEL_2 = "   * ";
49
	public static final String PATTERN_LEVEL_3 = "      * ";
50
	public static final String PATTERN_LEVEL_4 = "         * ";
51
 
52
	private long categoryID;
53
	private String srcFile;
54
	private String dbFile;
55
 
56
	/**
57
	 * @param args
58
	 */
59
	public static void main(String[] args) throws Exception {
60
		String[] commands = new String[] {"show", "import"};
61
 
62
		String usage = "Usage: CN ["+ StringUtils.join(commands, "|") +
63
			"] {Category ID} {Content file name}\n" + 
64
			"Note:Only text files for now";
65
 
66
		if(args.length < 3) {
67
			System.out.println(usage);
68
			System.exit(-1);
69
		}
18 naveen 70
		Utils.logger.info("CN "+ args[0] + " " + args[1]+ " " + args[2]);
71
 
17 naveen 72
		String inputCommand = args[0];
73
		String inputCategoryID = args[1];
74
		String inputFilename = args[2];
75
 
76
		if(!ArrayUtils.contains(commands, inputCommand)) {
77
			System.out.println(usage);
78
			System.exit(-1);
79
		}
80
 
81
		long categoryID = new Long(inputCategoryID).longValue();
82
		CN cn = new CN(categoryID, inputFilename);
83
		if(inputCommand.equals("import")) {
84
			cn.importEntity();
85
		}
86
		else if(inputCommand.equals("show")) {
87
			cn.showEntity();
88
		}
89
	}
90
 
91
	/**
92
	 * 
93
	 * @param categoryID
94
	 * @param fileName
95
	 */
96
	public CN(long categoryID, String fileName) {
97
		this.categoryID = categoryID;
98
 
99
		this.srcFile = CONTENT_SRC_TXT_PATH + fileName + ".txt";
100
		this.dbFile = CONTENT_DB_PATH + "entities" + ".ser";
101
	}
102
 
103
	/**
104
	 * 
105
	 * @throws Exception
106
	 */
18 naveen 107
	public void importEntity() throws Exception {		
108
		//this.test();
109
		Utils.logger.info(this.srcFile);
17 naveen 110
 
18 naveen 111
		FileReader fileReader = new FileReader(this.srcFile);
112
		BufferedReader lineReader = new BufferedReader(fileReader);
113
		LineNumberReader reader = new LineNumberReader(lineReader);
17 naveen 114
 
18 naveen 115
		// 1 Collect all candidate slide names
116
		Map<Integer, String> candidateSlideNames = new HashMap<Integer, String>();
117
		while(true) {
118
			String line = reader.readLine();
119
 
120
			if(line == null) {
121
				break;
122
			}
123
 
124
			if(line.isEmpty()) {
125
				continue;
126
			}
127
 
128
			int lineNumber = reader.getLineNumber();
129
 
130
			//Utils.logger.info(line);
131
			//Utils.logger.info("lineNumber="+lineNumber);
132
 
133
			// RE-VISIT
134
			// 1.1 Slide names starting with Alpha
135
			//Utils.logger.info(line.substring(0, 1));
136
			if(StringUtils.isAlpha((line.substring(0, 1)))) {
137
				//Utils.logger.info(line);
138
				//Utils.logger.info("Level 0");
139
 
140
				candidateSlideNames.put(new Integer(lineNumber), line);
141
			}
142
		}
143
		Utils.logger.info(candidateSlideNames.toString());
17 naveen 144
 
18 naveen 145
		// 2 Filter and validate parent slide names
146
		Map<Integer, String> slideNames = 
147
			this.processSlides(candidateSlideNames);
148
 
149
		Utils.logger.info(slideNames.toString());
150
 
151
		// 3 Children slides
152
		// TODO
153
 
154
		// 4 Features
155
		// TODO
156
 
157
		// 5 Bullets
158
		// TODO
159
 
160
		lineReader.close();
17 naveen 161
	}
162
 
163
	/**
164
	 * 
165
	 * @throws Exception
166
	 */
167
	public void showEntity() throws Exception {
168
	}
18 naveen 169
 
170
	/**
171
	 * Filter and validate parent slide names
172
	 * 
173
	 * @param candidateSlideNames
174
	 * @return List<LineInfo>
175
	 * @throws Exception 
176
	 */
177
	private Map<Integer, String> processSlides(
178
			Map<Integer, String> candidateSlideLines) throws Exception {
179
 
180
		Map<Integer, String> processedSlideLines = 
181
			new HashMap<Integer, String>();
182
 
183
		// 1 Retrieve meta-data
184
		// 1.1 Retrieve all valid slide names in the content model
185
		DefinitionsContainer defs = 
186
			Catalog.getInstance().getDefinitionsContainer();
187
 
188
		Map<Long, SlideDefinition> slideDefs = defs.getSlideDefinitions();
189
		Iterator<SlideDefinition> itSlideDefs = slideDefs.values().iterator();
190
 
191
		List<String> validSlideNames = new ArrayList<String>();
192
		while(itSlideDefs.hasNext()) {
193
			SlideDefinition slideDef = itSlideDefs.next();
194
 
195
			// To avoid Introduction slide
196
			if(!slideDef.getLabel().isEmpty()) {
197
				validSlideNames.add(slideDef.getLabel());
198
			}
199
		}
200
		Utils.logger.info("validSlideNames=" + validSlideNames.toString());
201
 
202
		// 2 Rules
203
		// 2.1 Discard if slide is not one of the valids
204
		// REVISIT
205
		for(Integer lineNumber : candidateSlideLines.keySet()) {
206
			if(validSlideNames.contains(candidateSlideLines.get(lineNumber))) {
207
				processedSlideLines.put(lineNumber, 
208
						candidateSlideLines.get(lineNumber));
209
			}
210
		}
211
 
212
		Utils.logger.info("processedSlideLines=" + 
213
				processedSlideLines.toString());
214
 
215
		// 3 Retrieve "Mandatory" slide names for the category
216
		List<SlideDefinition> mandatorySlideDefs = 
217
			defs.getSlides(this.categoryID, EditorialImportance.MANDATORY);
218
 
219
		Utils.logger.info("mandatorySlideDefs=" + 
220
				mandatorySlideDefs.toString());
221
 
222
		// 3.1 All mandatory slides exist - Severe
223
		for(SlideDefinition mandatorySlideDef : mandatorySlideDefs) {
224
 
225
			// Avoid introduction slide
226
			if(mandatorySlideDef.getLabel().isEmpty()) {
227
				continue;
228
			}
229
 
230
			if(!processedSlideLines.values().contains(
231
					mandatorySlideDef.getLabel())) {
232
				Utils.logger.severe("Mandatory slide \"" + 
233
						mandatorySlideDef.getLabel() + "\" is missing");
234
			}
235
		}
236
 
237
		// 4 Retrieve "Recommended" slide names for the category
238
		List<SlideDefinition> recommendedSlideDefs = 
239
			defs.getSlides(this.categoryID, EditorialImportance.RECOMMENDED);
240
 
241
		Utils.logger.info("recommendedSlideDefs=" + 
242
				recommendedSlideDefs.toString());
243
 
244
		// 4.1 All recommended slides exist - Warn	
245
		for(SlideDefinition recommendedSlideDef : recommendedSlideDefs) {
246
			if(!processedSlideLines.values().contains(
247
					recommendedSlideDef.getLabel())) {
248
				Utils.logger.warning("Recommended slide \"" + 
249
						recommendedSlideDef.getLabel() + "\" is missing");
250
			}
251
		}
252
 
253
		return processedSlideLines;
254
	}
255
 
256
	/**
257
	 * @throws Exception 
258
	 * 
259
	 */
260
	@SuppressWarnings("unused")
261
	private void test() throws Exception {
262
		// test category
263
		DefinitionsContainer allDefs = 
264
			Catalog.getInstance().getDefinitionsContainer();
265
 
266
		Category category = allDefs.getCategory(this.categoryID);
267
		Utils.logger.info(category.toString());
268
 
269
		// test data type defs
270
		DatatypeDefinition datatypeDef = allDefs.getDatatypeDefinition(70004L);
271
		Utils.logger.info(datatypeDef.toString());
272
 
273
		// test units
274
		Unit unit = allDefs.getUnit(50004L);
275
		Utils.logger.info(unit.toString());
276
 
277
		// test slide defs
278
		SlideDefinition slideDef = allDefs.getSlideDefinition(130002L);
279
		Utils.logger.info(slideDef.toString());
280
 
281
		// test feature defs
282
		FeatureDefinition featureDef = allDefs.getFeatureDefinition(120002L);
283
		Utils.logger.info(featureDef.toString());
284
	}
17 naveen 285
}