Project

General

Profile

Download (7.41 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2009 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
package eu.etaxonomy.cdm.io.stream;
10

    
11
import java.util.HashMap;
12
import java.util.HashSet;
13
import java.util.List;
14
import java.util.Map;
15
import java.util.Set;
16

    
17
import org.apache.commons.lang.StringUtils;
18
import org.apache.log4j.Logger;
19

    
20
import eu.etaxonomy.cdm.io.common.events.IIoEvent;
21
import eu.etaxonomy.cdm.io.common.events.IIoObserver;
22
import eu.etaxonomy.cdm.io.common.events.IoProblemEvent;
23
import eu.etaxonomy.cdm.io.dwca.in.DwcaDataImportConfiguratorBase;
24
import eu.etaxonomy.cdm.io.stream.terms.TermUri;
25
import eu.etaxonomy.cdm.model.common.CdmBase;
26
import eu.etaxonomy.cdm.model.common.Language;
27
import eu.etaxonomy.cdm.model.description.TaxonDescription;
28
import eu.etaxonomy.cdm.model.taxon.Taxon;
29
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
30

    
31
/**
32
 * @author a.mueller
33
 * @since 23.11.2011
34
 *
35
 * FIXME URI
36
 */
37
public abstract class PartitionableConverterBase<CONFIG extends DwcaDataImportConfiguratorBase, STATE extends StreamImportStateBase<CONFIG,StreamImportBase>>
38
      implements IPartitionableConverter<StreamItem, IReader<CdmBase>, String> {
39

    
40
	private static final Logger logger = Logger.getLogger(PartitionableConverterBase.class);
41

    
42
	protected STATE state;
43
	protected CONFIG config;  //for convenience only (must always be same as state.getConfig())
44

    
45

    
46

    
47
	public PartitionableConverterBase(STATE state) {
48
		super();
49
		this.state = state;
50
		this.config = state.getConfig();  //for fast access
51
	}
52

    
53
	protected void fireWarningEvent(String message, StreamItem item, Integer severity) {
54
		fireWarningEvent(message, getDataLocation(item), severity, 1);
55
	}
56

    
57
	private String getDataLocation(StreamItem item) {
58
		String location = item.getLocation();
59
		return location;
60
	}
61

    
62
	protected void fireWarningEvent(String message, String dataLocation, Integer severity) {
63
		fireWarningEvent(message, dataLocation, severity, 1);
64
	}
65

    
66
	protected void fireWarningEvent(String message, String dataLocation, Integer severity, int stackDepth) {
67
		stackDepth++;
68
		StackTraceElement[] stackTrace = new Exception().getStackTrace();
69
		int lineNumber = stackTrace[stackDepth].getLineNumber();
70
		String methodName = stackTrace[stackDepth].getMethodName();
71
		String className = stackTrace[stackDepth].getClassName();
72
		Class<?> declaringClass;
73
		try {
74
			declaringClass = Class.forName(className);
75
		} catch (ClassNotFoundException e) {
76
			declaringClass = this.getClass();
77
		}
78

    
79
		IoProblemEvent event = IoProblemEvent.NewInstance(declaringClass, message, dataLocation,
80
				lineNumber, severity, methodName);
81

    
82
		//for performance improvement one may read:
83
		//http://stackoverflow.com/questions/421280/in-java-how-do-i-find-the-caller-of-a-method-using-stacktrace-or-reflection
84
//		Object o = new SecurityManager().getSecurityContext();
85

    
86
		fire(event);
87
	}
88

    
89
	protected void fire(IIoEvent event){
90
		Set<IIoObserver> observers = state.getConfig().getObservers();
91
		for (IIoObserver observer: observers){
92
			observer.handleEvent(event);
93
		}
94
		if (observers.size() == 0){
95
			logger.warn(event.getMessage() +  " (no observer for message!).");
96
		}
97
	}
98

    
99

    
100

    
101
	/**
102
	 * Returns the value for the given term in the item.
103
	 */
104
	protected String getValue(StreamItem item, TermUri term) {
105
		return item.get(term.getUriString());
106
	}
107

    
108
	/**
109
	 * Checks if the given term has a value in item that is not blank (null, empty or whitespace only).
110
	 * @param term
111
	 * @param item
112
	 * @return true if value is not blank
113
	 */
114
	protected boolean exists(TermUri term, StreamItem item) {
115
		return ! StringUtils.isBlank(getValue(item, term));
116
	}
117

    
118
    /*
119
     * To be implemented by subclasses if needed.
120
     */
121
	@Override
122
    public ItemFilter<StreamItem> getItemFilter(){
123
	    return null;
124
	}
125

    
126
	@Override
127
    public Map<String, Set<String>> getPartitionForeignKeys(IReader<StreamItem> instream) {
128
		Map<String, Set<String>> result = new HashMap<>();
129

    
130
		while (instream.hasNext()){
131
			StreamItem next = instream.read();
132
			makeForeignKeysForItem(next, result);
133
		}
134
		return result;
135
	}
136

    
137

    
138
	/**
139
	 * Fills the the foreign key map with foreign keys required for this item.
140
	 * @param next
141
	 * @param foreignKeyMap
142
	 */
143
	protected abstract void makeForeignKeysForItem(StreamItem next, Map<String, Set<String>> foreignKeyMap);
144

    
145

    
146
	/**
147
	 * False if string is null, empty or whitespace only. True otherwise.
148
	 * @param string String to test.
149
	 */
150
	protected boolean hasValue(String string) {
151
		return StringUtils.isNotBlank(string);
152
	}
153

    
154

    
155
	/**
156
	 * Returns the key set for a given key or creates a new one.
157
	 * @param key
158
	 * @param fkMap
159
	 * @return
160
	 */
161
	protected Set<String> getKeySet(String key, Map<String, Set<String>> fkMap) {
162
		Set<String> keySet = fkMap.get(key);
163
		if (keySet == null){
164
			keySet = new HashSet<>();
165
			fkMap.put(key, keySet);
166
		}
167
		return keySet;
168
	}
169

    
170

    
171
	protected <T extends TaxonBase<?>> T getTaxonBase(String id, StreamItem item, Class<T> clazz, STATE state) {
172
		if (clazz == null){
173
			clazz = (Class)TaxonBase.class;
174
		}
175
		List<T> taxonList = state.get(TermUri.DWC_TAXON.toString(), id, clazz);
176
		if (taxonList.size() > 1){
177
			String message = "Ambigous taxon mapping for id %s. There is more than 1 matching taxon.";
178
			message = String.format(message, id);
179
			fireWarningEvent(message, item, 8);
180
			logger.warn(message);  //TODO remove when events are handled correctly
181
			return null;
182
		}else if (taxonList.isEmpty()){
183
			return null;
184
		}else{
185
			return taxonList.get(0);
186
		}
187
	}
188

    
189

    
190
	protected TaxonDescription getTaxonDescription(Taxon taxon, boolean isImageGallery) {
191
		TaxonDescription result = null;
192
		Set<TaxonDescription> descs = taxon.getDescriptions();
193
		for (TaxonDescription desc : descs){
194
			if (desc.isImageGallery() == isImageGallery){
195
				result = desc;
196
				break;
197
			}
198
		}
199
		if (result == null){
200
			result = TaxonDescription.NewInstance(taxon);
201
			result.setImageGallery(isImageGallery);
202
		}
203
		return result;
204
	}
205

    
206

    
207
    protected Language getDcLanguage(StreamItem item, List<MappedCdmBase<? extends CdmBase>> resultList ) {
208
        String namespace = TermUri.DC_LANGUAGE.toString();
209
        String languageStr = item.get(TermUri.DC_LANGUAGE);
210
        if (isBlank(languageStr)){
211
            return null;
212
        }
213

    
214
        List<Language> list = state.get(namespace, languageStr, Language.class);
215
        if (list.isEmpty()){
216
            //try to find in cdm
217
            Language lang = Language.getLanguageByIsoCode(languageStr);
218
            if (lang == null){
219
                 lang = Language.getLanguageByLabel(languageStr);
220
            }
221
            if (lang == null){
222
                lang = state.getCurrentIO().getLanguage(state, null, languageStr, languageStr, languageStr, null);
223
            }
224
            state.putMapping(namespace, languageStr, lang);
225
            list.add(lang);
226
//            MappedCdmBase<? extends CdmBase> languageMcb = new MappedCdmBase<>(TermUri.DC_LANGUAGE, languageStr, lang);
227
//            resultList.add(languageMcb);
228
        }
229
        if (list.size() > 1){
230
            String message = "There is more than 1 cdm entity matching given language '%s'. I take an arbitrary one.";
231
            fireWarningEvent(String.format(message, languageStr), item, 4);
232
        }
233
        Language result = list.iterator().next();
234
        return result;
235
    }
236

    
237
	protected boolean isNotBlank(String str){
238
		return StringUtils.isNotBlank(str);
239
	}
240

    
241
	protected boolean isBlank(String str){
242
		return StringUtils.isBlank(str);
243
	}
244

    
245
}
(16-16/21)