Project

General

Profile

Download (6.27 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2007 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
* 
6
* The contents of this file are subject to the Mozilla Public License Version 1.1
7
* See LICENSE.TXT at the top of this package for the full license terms.
8
*/
9

    
10
package eu.etaxonomy.cdm.io.dwca.out;
11

    
12
import java.io.FileNotFoundException;
13
import java.io.IOException;
14
import java.net.URI;
15
import java.util.List;
16

    
17
import javax.xml.stream.XMLStreamException;
18
import javax.xml.stream.XMLStreamWriter;
19

    
20
import org.apache.commons.lang.StringUtils;
21
import org.apache.log4j.Logger;
22
import org.springframework.stereotype.Component;
23

    
24
import eu.etaxonomy.cdm.io.dwca.out.DwcaMetaDataRecord.FieldEntry;
25

    
26
/**
27
 * @author a.mueller
28
 * @created 20.04.2011
29
 */
30
@Component
31
public class DwcaMetaDataExport extends DwcaExportBase {
32
	private static final Logger logger = Logger.getLogger(DwcaMetaDataExport.class);
33

    
34
	private static final String fileName = "meta.xml";
35
	
36
	/**
37
	 * Constructor
38
	 */
39
	public DwcaMetaDataExport() {
40
		super();
41
		this.ioName = this.getClass().getSimpleName();
42
	}
43

    
44
	/** Retrieves the MetaData for a Darwin Core Archive File.
45
	 * @param exImpConfig
46
	 * @param dbname
47
	 * @param filename
48
	 */
49
	@Override
50
	protected void doInvoke(DwcaTaxExportState state){
51
		DwcaTaxExportConfigurator config = state.getConfig();
52

    
53
		DwcaMetaDataRecord metaDataRecord = new DwcaMetaDataRecord(! IS_CORE, fileName, null);
54
		metaDataRecord.setMetaData(true);
55
		state.addMetaRecord(metaDataRecord);
56
    	
57
		XMLStreamWriter writer = null;
58
		try {
59
			writer = createXmlStreamWriter(state, fileName);
60
			
61
			String rootNamespace = "http://rs.tdwg.org/dwc/text/";
62
			String rootName = "archive";
63
			
64
			List<DwcaMetaDataRecord> metaRecords = state.getMetaRecords();
65
			
66
			// create header 
67
			writer.writeStartDocument(); 
68
			writer.setDefaultNamespace(rootNamespace);
69
			
70
				// create root element 
71
				writer.writeStartElement(rootName);
72
				writer.writeNamespace(null, rootNamespace);
73
				
74
				writer.writeNamespace("xsi", "http://www.w3.org/2001/XMLSchema-instance");
75
				writer.writeAttribute("http://www.w3.org/2001/XMLSchema-instance", "schemaLocation", "http://rs.tdwg.org/dwc/text/ http://rs.tdwg.org/dwc/text/tdwg_dwc_text.xsd");
76
				
77
				for (DwcaMetaDataRecord metaRecord : metaRecords){
78
					if (! metaRecord.isMetaData()){
79
						writeMetaDataRecord(writer, config, metaRecord);
80
					}
81
				}
82
				writer.writeEndElement(); 
83
			writer.writeEndDocument(); 
84
			writer.flush();
85
			writer.close();
86
		} catch (FileNotFoundException e) {
87
			throw new RuntimeException(e);
88
		} catch (XMLStreamException e) {
89
			if (e.getNestedException() != null){
90
				throw new RuntimeException(e.getNestedException());
91
			}else{
92
				throw new RuntimeException(e);
93
			}
94
		} catch (IOException e) {
95
			throw new RuntimeException(e);
96
		} finally{
97
			closeWriter(writer, state);
98
		}
99
		
100
		return;
101
	}
102

    
103
	private void writeMetaDataRecord(XMLStreamWriter writer,
104
			DwcaTaxExportConfigurator config, DwcaMetaDataRecord metaRecord) throws XMLStreamException {
105
		if (! metaRecord.hasEntries()){
106
			return; 
107
		}
108
		String encoding = config.getEncoding();
109
		String linesTerminatedBy = config.getLinesTerminatedBy();
110
		String fieldsEnclosedBy = config.getFieldsEnclosedBy();
111
		String ignoreHeaderLines = config.isHasHeaderLines()? "1":"0";
112
		String fieldsTerminatedBy= config.getFieldsTerminatedBy();
113
		
114
		// create core element 
115
		String elementName = metaRecord.isCore()? "core": "extension";
116
		String rowType = metaRecord.getRowType();
117
		writeElementStart(writer, elementName, encoding, linesTerminatedBy,	fieldsEnclosedBy, linesTerminatedBy,ignoreHeaderLines, rowType);
118
			String filename = metaRecord.getFileLocation();
119
			writeFiles(writer, filename );
120
			writeId(writer, metaRecord.isCore());
121
			
122
			List<FieldEntry> entryList = metaRecord.getEntries();
123
			for (FieldEntry fieldEntry : entryList){
124
				if (fieldEntry.index != 0){
125
					writeFieldLine(writer, fieldEntry.index, fieldEntry.term, fieldEntry.defaultValue);
126
				}
127
			}
128
	
129
		writer.writeEndElement();
130
	}
131

    
132
	private void writeFieldLine(XMLStreamWriter writer, int index, URI term, String defaultValue) throws XMLStreamException {
133
		writer.writeStartElement("field");
134
		if (StringUtils.isNotBlank(defaultValue)){
135
			writer.writeAttribute("default", defaultValue);
136
		}else{
137
			writer.writeAttribute("index", String.valueOf(index));
138
		}
139
		writer.writeAttribute("term", term.toString());
140
		writer.writeEndElement();
141
		
142
	}
143

    
144
	private void writeId(XMLStreamWriter writer, boolean isCore) throws XMLStreamException {
145
		String strId = isCore? "id" : "coreid";
146
		writer.writeStartElement(strId);
147
		writer.writeAttribute("index", "0");
148
		writer.writeEndElement();
149
	}
150

    
151

    
152
	private void writeFiles(XMLStreamWriter writer, String filename) throws XMLStreamException {
153
		writer.writeStartElement("files");
154
			writer.writeStartElement("location");
155
			writer.writeCharacters(filename);
156
			writer.writeEndElement();
157
		writer.writeEndElement();
158
		
159
	}
160

    
161
	/**
162
	 * @param writer
163
	 * @param encoding
164
	 * @param linesTerminatedBy
165
	 * @param fieldsEnclosedBy
166
	 * @param ignoreHeaderLines
167
	 * @param rowType
168
	 * @param elementName
169
	 * @throws XMLStreamException
170
	 */
171
	private void writeElementStart(XMLStreamWriter writer, String elementName, String encoding,
172
			String linesTerminatedBy, String fieldsEnclosedBy, String fieldsTerminatedBy,
173
			String ignoreHeaderLines, String rowType)
174
			throws XMLStreamException {
175
		writer.writeStartElement(elementName); 
176
		writer.writeAttribute( "encoding", encoding );
177
		writer.writeAttribute( "linesTerminatedBy", linesTerminatedBy );
178
		writer.writeAttribute( "fieldsEnclosedBy", fieldsEnclosedBy );
179
		writer.writeAttribute("fieldsTerminatedBy", fieldsTerminatedBy);
180
		writer.writeAttribute("ignoreHeaderLines", ignoreHeaderLines);
181
		writer.writeAttribute("rowType", rowType);
182
	}
183
	
184

    
185

    
186
	@Override
187
	protected boolean doCheck(DwcaTaxExportState state) {
188
		boolean result = true;
189
		logger.warn("No check implemented for " + this.ioName);
190
		return result;
191
	}
192

    
193

    
194
	/* (non-Javadoc)
195
	 * @see eu.etaxonomy.cdm.io.common.CdmIoBase#isIgnore(eu.etaxonomy.cdm.io.common.IoStateBase)
196
	 */
197
	@Override
198
	protected boolean isIgnore(DwcaTaxExportState state) {
199
		return ! state.getConfig().isDoMetaData();
200
	}
201
	
202
}
(11-11/30)