Project

General

Profile

« Previous | Next » 

Revision ec02b2a3

Added by Andreas Müller almost 13 years ago

newest developments for document markup (including success -> state)

View differences:

cdmlib-io/src/main/java/eu/etaxonomy/cdm/io/markup/MarkupDocumentImport.java
12 12
import java.util.ArrayList;
13 13
import java.util.HashMap;
14 14
import java.util.HashSet;
15
import java.util.Iterator;
15 16
import java.util.LinkedList;
16 17
import java.util.List;
17 18
import java.util.Map;
......
24 25
import javax.xml.stream.FactoryConfigurationError;
25 26
import javax.xml.stream.XMLEventReader;
26 27
import javax.xml.stream.XMLStreamException;
28
import javax.xml.stream.events.StartElement;
27 29
import javax.xml.stream.events.XMLEvent;
28 30

  
29 31
import org.apache.commons.lang.CharUtils;
......
31 33
import org.apache.log4j.Logger;
32 34
import org.jdom.Attribute;
33 35
import org.jdom.Element;
36
import org.springframework.beans.factory.annotation.Autowired;
37
import org.springframework.security.access.PermissionEvaluator;
38
import org.springframework.security.authentication.AuthenticationManager;
39
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
40
import org.springframework.security.core.Authentication;
41
import org.springframework.security.core.context.SecurityContext;
42
import org.springframework.security.core.context.SecurityContextHolder;
34 43
import org.springframework.stereotype.Component;
35 44

  
36 45
import eu.etaxonomy.cdm.common.CdmUtils;
......
83 92
import eu.etaxonomy.cdm.model.taxon.Taxon;
84 93
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
85 94
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
95
import eu.etaxonomy.cdm.permission.CdmPermissionEvaluator;
86 96
import eu.etaxonomy.cdm.strategy.exceptions.UnknownCdmTypeException;
87 97
import eu.etaxonomy.cdm.strategy.parser.NonViralNameParserImpl;
88 98

  
......
102 112
	private UnmatchedLeads unmatchedLeads;
103 113

  
104 114
	
115
	//TODO remove preliminary
116
	@Autowired
117
	private AuthenticationManager authenticationManager;
118
	private Authentication authentication;
119
	private PermissionEvaluator permissionEvaluator;
120
	
105 121
	public MarkupDocumentImport(){
106 122
		super();
123
		System.out.println("TODO remove preliminary authentication");
124
//		UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken("admin", "0000");
125
//		authentication = authenticationManager.authenticate(token);
126
//		SecurityContext context = SecurityContextHolder.getContext();
127
//		context.setAuthentication(authentication);
128
//		permissionEvaluator = new CdmPermissionEvaluator();
107 129
	}
108 130
	
109 131
	
110 132
	@Override
111 133
	public boolean doCheck(MarkupImportState state){
112 134
		state.setCheck(true);
113
		boolean result = doInvoke(state);
135
		doInvoke(state);
114 136
		state.setCheck(false);
115
		return result;
137
		return state.isSuccess();
116 138
	}
117 139
	
118 140
	@Override
119
	public boolean doInvoke(MarkupImportState state){
141
	public void doInvoke(MarkupImportState state){
120 142
		fireProgressEvent("Start import markup document", "Before start of document");
121 143
		fireWarningEvent("Test a warning", "At start", 17);
122
		boolean success = false;
123 144
		
124 145
		Queue<CdmBase> outputStream = new LinkedList<CdmBase>();
125 146
		
......
133 154
			state.setReader(reader);
134 155
			//start document
135 156
			if (! validateStartOfDocument(reader)){
136
				return false;
157
				state.setUnsuccessfull();
158
				return;
137 159
			}
138 160
			
139 161
			//publication
140 162
			String elName = "publication";
141 163
			while (reader.hasNext()) {
142
				if (isStartingElement(reader, elName)){
143
					success &= handlePublication(reader, elName);
164
				XMLEvent nextEvent = reader.nextEvent();
165
				if (isStartingElement(nextEvent, elName)){
166
					handlePublication(state, reader, nextEvent, elName);
144 167
				}else{
145 168
					fireSchemaConflictEventExpectedStartTag(elName, reader);
146 169
				}
......
151 174
//			parseSAX(state, handler);
152 175
			
153 176
		} catch (FactoryConfigurationError e1) {
154
			// TODO Auto-generated catch block
155 177
			fireWarningEvent("Some error occurred while setting up xml factory. Data can't be imported", "Start", 16);
156
			success = false;
178
			state.setUnsuccessfull();
157 179
		} catch (XMLStreamException e1) {
158
			// TODO Auto-generated catch block
159 180
			fireWarningEvent("An XMLStreamException occurred while parsing. Data can't be imported", "Start", 16);
160
			success = false;
181
			state.setUnsuccessfull();
161 182
//		} catch (ParserConfigurationException e) {
162 183
//			fireWarningEvent("A ParserConfigurationException occurred while parsing. Data can't be imported", "Start", 16);
163 184
//		} catch (SAXException e) {
......
168 189
		}
169 190
		 
170 191
	
171
		return success;
192
		return;
172 193
		
173 194
	}
174 195

  
196
	
175 197

  
176
	private boolean handlePublication(XMLEventReader reader, String elName) throws XMLStreamException {
177
		boolean success = true;
178
		XMLEvent event = reader.nextEvent();
179
		if (isEndingElement(event, elName)){
180
			//TODO cardinality of alternative
181
			return success;
182
		}else if(isStartingElement(event, "metaData")){
183
			
184
		}else if(isStartingElement(event, "treatment")){
185
			
186
		}else if(isStartingElement(event, "biographies")){
187
			
188
		}else if(isStartingElement(event, "references")){
189
			
190
		}else if(isStartingElement(event, "metaData")){
191
			
192
		}else if(isStartingElement(event, "metaData")){
193
			
194
		}else if(isStartingElement(event, "metaData")){
198

  
199
	private void handlePublication(MarkupImportState state, XMLEventReader reader, XMLEvent currentEvent, String elName) throws XMLStreamException {
195 200
			
201
		//attributes
202
		StartElement element = currentEvent.asStartElement().asStartElement();
203
		Map<String, javax.xml.stream.events.Attribute> attributes = getAttributes(element);
204
//		if (attributes.hasNext()){
205
//			handleUnexpectedAttributes(element.getLocation(), attributes);
206
//		}
207
		
208
		while (reader.hasNext()){
209
			XMLEvent event = readNoWhitespace(reader);
210
			//TODO cardinality of alternative
211
			if (event.isEndElement()){
212
				if (isEndingElement(event, elName)){
213
					return;
214
				}else{
215
					if(isEndingElement(event, "metaData")){
216
						//NOT YET IMPLEMENTED
217
					}else if(isStartingElement(event, "treatment")){
218
						//NOT YET IMPLEMENTED
219
					}else if(isStartingElement(event, "biographies")){
220
						//NOT YET IMPLEMENTED
221
					}else if(isStartingElement(event, "references")){
222
						//NOT YET IMPLEMENTED
223
					}else if(isStartingElement(event, "textSection")){
224
						//NOT YET IMPLEMENTED
225
					}else if(isStartingElement(event, "addenda")){
226
						//NOT YET IMPLEMENTED
227
					}else{
228
						handleUnexpectedEndElement(event);
229
					}
230
				}
231
			}else if (event.isStartElement()){
232
				if(isStartingElement(event, "metaData")){
233
					handleNotYetImplementedElement(event);
234
				}else if(isStartingElement(event, "treatment")){
235
					handleTreatment(state, reader, event);
236
				}else if(isStartingElement(event, "biographies")){
237
					handleNotYetImplementedElement(event);
238
				}else if(isStartingElement(event, "references")){
239
					handleNotYetImplementedElement(event);
240
				}else if(isStartingElement(event, "textSection")){
241
					handleNotYetImplementedElement(event);
242
				}else if(isStartingElement(event, "addenda")){
243
					handleNotYetImplementedElement(event);
244
				}else{
245
					handleUnexpectedStartElement(event);
246
				}
247
			}else{
248
				handleUnexpectedElement(event);
249
			}
196 250
		}
197
		return success;
251
		return;
198 252
	}
199
	
200 253

  
254

  
255

  
256

  
257
	/**
258
	 * Read next event. Ignore whitespace events.
259
	 * @param reader
260
	 * @return
261
	 * @throws XMLStreamException
262
	 */
263
	private XMLEvent readNoWhitespace(XMLEventReader reader) throws XMLStreamException {
264
		XMLEvent event = reader.nextEvent();
265
		while (event.isCharacters() && event.asCharacters().isWhiteSpace()){
266
			event = reader.nextEvent();
267
		}
268
		return event;
269
	}
201 270
	
271
	private boolean handleTreatment(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {
272
		boolean success = true;
273
		while (reader.hasNext()){
274
			XMLEvent next = readNoWhitespace(reader);
275
			if (isStartingElement(next, "taxon")){
276
				handleTaxon(state, reader, next.asStartElement());
277
			}else if(isMyEndingElement(next, parentEvent)){
278
				return success;
279
			}else{
280
				fireSchemaConflictEventExpectedStartTag("taxon", reader);
281
				success = false;
282
			}
283
		}
284
		return success;
285
	}
286

  
287

  
288
	private void handleTaxon(MarkupImportState state, XMLEventReader reader, StartElement parentEvent) throws XMLStreamException {
289
		boolean hasTitle = false;
290
		boolean hasNomenclature = false;
291
		while (reader.hasNext()){
292
			XMLEvent next = readNoWhitespace(reader);
293
			if (next.isEndElement()){
294
				if (isMyEndingElement(next, parentEvent)){
295
					handleMandatoryElement(hasTitle, parentEvent, "taxontitle");
296
					handleMandatoryElement(hasNomenclature, parentEvent, "nomenclature");
297
					//TODO check title and nomenclature exists
298
					return;
299
				}else{
300
					if(isEndingElement(next, "heading")){
301
						//NOT YET IMPLEMENTED
302
					}else if(isStartingElement(next, "taxontitle")){
303
						//NOT YET IMPLEMENTED
304
					}else if(isStartingElement(next, "biographies")){
305
						//NOT YET IMPLEMENTED
306
					}else if(isStartingElement(next, "references")){
307
						//NOT YET IMPLEMENTED
308
					}else if(isStartingElement(next, "textSection")){
309
						//NOT YET IMPLEMENTED
310
					}else if(isStartingElement(next, "addenda")){
311
						//NOT YET IMPLEMENTED
312
					}else{
313
						handleUnexpectedEndElement(next);
314
					}
315
				}
316
			}else if (next.isStartElement()){
317
				if(isStartingElement(next, "heading")){
318
					handleNotYetImplementedElement(next);
319
				}else if(isStartingElement(next, "taxontitle")){
320
					handleTaxonTitle(state, reader, next);
321
				}else if(isStartingElement(next, "writer")){
322
					handleNotYetImplementedElement(next);
323
				}else if(isStartingElement(next, "textsection")){
324
					handleNotYetImplementedElement(next);
325
				}else if(isStartingElement(next, "key")){
326
					handleNotYetImplementedElement(next);
327
				}else if(isStartingElement(next, "feature")){
328
					handleNotYetImplementedElement(next);
329
				}else if(isStartingElement(next, "notes")){
330
					handleNotYetImplementedElement(next);
331
				}else if(isStartingElement(next, "references")){
332
					handleNotYetImplementedElement(next);
333
				}else if(isStartingElement(next, "figure")){
334
					handleNotYetImplementedElement(next);
335
				}else if(isStartingElement(next, "footnote")){
336
					handleNotYetImplementedElement(next);
337
				}else{
338
					handleUnexpectedStartElement(next);
339
				}
340
			}else{
341
				handleUnexpectedElement(next);
342
			}
343
		}
344
		return;
345
	}
346

  
347
	private void handleTaxonTitle(MarkupImportState state, XMLEventReader reader, XMLEvent parentEvent) throws XMLStreamException {
348
		boolean hasTitle = false;
349
		
350
		//TODO handle attributes
351
		while (reader.hasNext()){
352
			XMLEvent next = readNoWhitespace(reader);
353
			if (next.isEndElement()){
354
				if (isMyEndingElement(next, parentEvent)){
355
					//TODO check title exists
356
					return;
357
				}else{
358
					if(isEndingElement(next, "footnoteString")){
359
						//NOT YET IMPLEMENTED
360
					}else{
361
						handleUnexpectedEndElement(next);
362
						state.setSuccessToFalse();
363
					}
364
				}
365
			}else if (next.isStartElement()){
366
				if(isStartingElement(next, "footnoteString")){
367
					handleNotYetImplementedElement(next);
368
				}else{
369
					handleUnexpectedStartElement(next);
370
					state.setSuccessToFalse();
371
				}
372
			}else{
373
				handleUnexpectedElement(next);
374
				state.setSuccessToFalse();
375
			}
376
		}
377
		return;
378
		
379
		
380
	}
381

  
382

  
383
	private boolean isMyEndingElement(XMLEvent next, XMLEvent event) throws XMLStreamException {
384
		return isEndingElement(next, event.asStartElement().getName().getLocalPart());
385
	}
386

  
387

  
202 388
	/**
203 389
	 * This comes from the old version, needs to be checked on need
204 390
	 * @param state

Also available in: Unified diff