Project

General

Profile

Download (12.8 KB) Statistics
| Branch: | 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.berlinModel.in.validation;
11

    
12
import java.sql.ResultSet;
13
import java.sql.SQLException;
14

    
15
import org.apache.commons.lang.StringUtils;
16
import org.apache.log4j.Logger;
17

    
18
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportConfigurator;
19
import eu.etaxonomy.cdm.io.berlinModel.in.BerlinModelImportState;
20
import eu.etaxonomy.cdm.io.common.IOValidator;
21
import eu.etaxonomy.cdm.io.common.Source;
22

    
23
/**
24
 * @author a.mueller
25
 * @since 17.02.2010
26
 */
27
public class BerlinModelTaxonRelationImportValidator implements IOValidator<BerlinModelImportState> {
28
	@SuppressWarnings("unused")
29
	private static final Logger logger = Logger.getLogger(BerlinModelTaxonRelationImportValidator.class);
30

    
31
	@Override
32
	public boolean validate(BerlinModelImportState state) {
33
		boolean result = true;
34
		result &= checkInActivatedStatus(state);
35
		result &= checkSynonymRelationsWithAcceptedTaxa(state);
36
		result &= checkConceptRelationsWithSynonymTaxa(state);
37
		result &= checkRelPTaxonWithNotes(state);
38
		result &= checkTaxaWithNoRelations(state);
39
		return result;
40
	}
41

    
42

    
43
	private boolean checkInActivatedStatus(BerlinModelImportState state){
44
		try {
45
			boolean result = true;
46
			BerlinModelImportConfigurator config = state.getConfig();
47
			Source source = state.getConfig().getSource();
48
			String strSQL =
49
				" SELECT RelPTaxon.RelPTaxonId, RelPTaxon.RelQualifierFk, FromName.FullNameCache AS FromName, RelPTaxon.PTNameFk1 AS FromNameID, "  +
50
		    			" Status.Status AS FromStatus, ToName.FullNameCache AS ToName, RelPTaxon.PTNameFk2 AS ToNameId, ToStatus.Status AS ToStatus, FromTaxon.DoubtfulFlag AS doubtfulFrom, ToTaxon.DoubtfulFlag AS doubtfulTo" +
51
    			" FROM PTaxon AS FromTaxon " +
52
    				" INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " +
53
    				" INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " +
54
    				" INNER JOIN Name AS ToName ON ToTaxon.PTNameFk = ToName.NameId " +
55
    				" INNER JOIN Name AS FromName ON FromTaxon.PTNameFk = FromName.NameId " +
56
    				" INNER JOIN Status ON FromTaxon.StatusFk = Status.StatusId AND FromTaxon.StatusFk = Status.StatusId " +
57
    				" INNER JOIN Status AS ToStatus ON ToTaxon.StatusFk = ToStatus.StatusId AND ToTaxon.StatusFk = ToStatus.StatusId " +
58
				" WHERE (RelPTaxon.RelQualifierFk = - 99) ";
59

    
60
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
61
				strSQL += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
62
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ;
63
			}
64

    
65
//			System.out.println(strSQL);
66
			ResultSet rs = source.getResultSet(strSQL);
67
			boolean firstRow = true;
68
			int i = 0;
69
			while (rs.next()){
70
				i++;
71
				if (firstRow){
72
					System.out.println("========================================================");
73
					System.out.println("There are TaxonRelationships with status 'inactivated'(-99)!");
74
					System.out.println("========================================================");
75
				}
76

    
77
				int relPTaxonId = rs.getInt("RelPTaxonId");
78
				String fromName = rs.getString("FromName");
79
				int fromNameID = rs.getInt("FromNameID");
80
				String fromStatus = rs.getString("FromStatus");
81

    
82
				String toName = rs.getString("ToName");
83
				int toNameId = rs.getInt("ToNameId");
84
				String toStatus = rs.getString("ToStatus");
85
				String doubtfulFrom = String.valueOf(rs.getObject("doubtfulFrom"));
86
				String doubtfulTo = String.valueOf(rs.getObject("doubtfulTo"));
87

    
88

    
89
				System.out.println("RelPTaxonId:" + relPTaxonId +
90
						"\n  FromName: " + fromName + "\n  FromNameID: " + fromNameID + "\n  FromStatus: " + fromStatus + "\n  FromDoubtful: " + doubtfulFrom +
91
						"\n  ToName: " + toName + "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo );
92
				result = firstRow = false;
93
			}
94
			if (i > 0){
95
				System.out.println(" ");
96
			}
97

    
98
			return result;
99
		} catch (SQLException e) {
100
			e.printStackTrace();
101
			return false;
102
		}
103
	}
104

    
105
	/**
106
	 * @param state
107
	 * @return
108
	 */
109
	private boolean checkRelPTaxonWithNotes(BerlinModelImportState state) {
110
		boolean success = true;
111
		try {
112
			BerlinModelImportConfigurator config = state.getConfig();
113
			Source source = config.getSource();
114
			String strQuery =
115
				"SELECT count(*) AS n FROM RelPTaxon " +
116
				" WHERE (Notes IS NOT NULL) AND (RTRIM(LTRIM(Notes)) <> '') ";
117

    
118
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
119
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
120
                        " ( %s ) ) " , config.getRelTaxaIdQuery()) ;
121
			}
122

    
123
			ResultSet rs = source.getResultSet(strQuery);
124
			rs.next();
125
			int n;
126
			n = rs.getInt("n");
127
			if (n > 0){
128
				System.out.println("========================================================");
129
				System.out.println("There are " + n + " RelPTaxa with a note. Notes for RelPTaxa are not imported!");
130
				System.out.println("========================================================");
131
				success = false;
132

    
133
			}
134
		} catch (SQLException e) {
135
			e.printStackTrace();
136
		}
137
		return success;
138
	}
139

    
140
	/**
141
	 * @param state
142
	 * @return
143
	 */
144
	private boolean checkSynonymRelationsWithAcceptedTaxa(BerlinModelImportState state) {
145
		boolean success = true;
146
		try {
147
			BerlinModelImportConfigurator config = state.getConfig();
148

    
149
			Source source = config.getSource();
150
			String strQuery =
151
				"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
152
				" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
153
					" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
154
					" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
155
					" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
156
				" WHERE (PTaxon.StatusFk = 1) AND (RelPTaxon.RelQualifierFk IN (2, 4, 5, 6, 7)) ";
157

    
158
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
159
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
160
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ;
161
			}
162

    
163
			ResultSet rs = source.getResultSet(strQuery);
164
			boolean firstRow = true;
165
			while (rs.next()){
166
				if (firstRow){
167
					System.out.println("========================================================");
168
					System.out.println("There are accepted taxa having synonym role in a synonym relationship!");
169
					System.out.println("========================================================");
170
				}
171

    
172
				int relPTaxonId = rs.getInt("RelPTaxonId");
173
				String relType = rs.getString("RelPTQualifier");
174
				int fromIdentifier = rs.getInt("RIdentifier");
175
				String fromName = rs.getString("fromName");
176
				int fromRefFk = rs.getInt("PTRefFk");
177
				int fromNameId = rs.getInt("fromNameId");
178
				String toName = rs.getString("acceptedName");
179

    
180
				System.out.println("RelPTaxonId:" + relPTaxonId +
181
						"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType
182
						+ "\n acceptedName: " + toName //+ "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo )
183
						);
184
				success = (firstRow = false);
185
			}
186
		} catch (SQLException e) {
187
			e.printStackTrace();
188
		}
189
		return success;
190
	}
191

    
192

    
193
	/**
194
	 * @param state
195
	 * @return
196
	 */
197
	private boolean checkConceptRelationsWithSynonymTaxa(BerlinModelImportState state) {
198
		boolean success = true;
199
		try {
200
			BerlinModelImportConfigurator config = state.getConfig();
201

    
202
			Source source = config.getSource();
203
			String strQuery =
204
				"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier,PTaxon.StatusFk as fromStatus, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
205
				" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
206
					" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
207
					" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
208
					" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
209
				" WHERE (PTaxon.StatusFk IN (2,3,4)) AND (RelPTaxon.RelQualifierFk NOT IN (2, 4, 5, 6, 7, 101, 102, 103, 104, -99)) ";
210

    
211
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
212
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
213
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ;
214
			}
215

    
216
			ResultSet rs = source.getResultSet(strQuery);
217
			boolean firstRow = true;
218
			while (rs.next()){
219
				if (firstRow){
220
					System.out.println("========================================================");
221
					System.out.println("There are synonyms being part of an accepted taxon relationship!");
222
					System.out.println("--------------------------------------------------------");
223
					System.out.println(strQuery);
224
					System.out.println("========================================================");
225
				}
226

    
227
				int relPTaxonId = rs.getInt("RelPTaxonId");
228
				String relType = rs.getString("RelPTQualifier");
229
				int fromIdentifier = rs.getInt("RIdentifier");
230
				String fromName = rs.getString("fromName");
231
				int fromRefFk = rs.getInt("PTRefFk");
232
				int fromNameId = rs.getInt("fromNameId");
233
				String toName = rs.getString("acceptedName");
234

    
235
				System.out.println("RelPTaxonId:" + relPTaxonId +
236
						"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType
237
						+ "\n toName: " + toName //+ "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo )
238
						);
239
				success = (firstRow = false);
240
			}
241
		} catch (SQLException e) {
242
			e.printStackTrace();
243
		}
244
		return success;
245
	}
246

    
247
	/**
248
	 * @param state
249
	 * @return
250
	 */
251
	private boolean checkTaxaWithNoRelations(BerlinModelImportState state) {
252
		boolean success = true;
253
		try {
254
			BerlinModelImportConfigurator config = state.getConfig();
255

    
256
			Source source = config.getSource();
257
	        String strSelect = " SELECT pt.PTRefFk AS secRefFk, r.RefCache AS secRef, n.FullNameCache, n.NameId, st.Status ";
258
	        String strCount = " SELECT count(*) as n ";
259
	        String strQueryBase =
260
				" FROM PTaxon AS pt LEFT OUTER JOIN " +
261
                      	" Status st ON pt.StatusFk = st.StatusId LEFT OUTER JOIN " +
262
				        " Reference r ON pt.PTRefFk = r.RefId LEFT OUTER JOIN " +
263
				        " Name n ON pt.PTNameFk = n.NameId LEFT OUTER JOIN " +
264
				        " RelPTaxon rel1 ON pt.PTNameFk = rel1.PTNameFk2 AND pt.PTRefFk = rel1.PTRefFk2 LEFT OUTER JOIN " +
265
				        " RelPTaxon AS rel2 ON pt.PTNameFk = rel2.PTNameFk1 AND pt.PTRefFk = rel2.PTRefFk1 " +
266
				" WHERE (rel2.RelQualifierFk IS NULL) AND (rel1.RelQualifierFk IS NULL) AND pt.statusFK <> 6 ";
267
			String strOrderBy =	" ORDER BY r.RefCache, pt.PTRefFk, n.FullNameCache, pt.statusFK ";
268
			if (state.getConfig().isEuroMed()){
269
			    strQueryBase += " AND pt.RIdentifier IN (SELECT RIdentifier FROM v_cdm_exp_taxaAll) AND (pt.IsExcludedMarker = 0 OR  pt.IsExcludedMarker IS NULL) " ;
270
			}
271

    
272
			//project filter
273
//			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
274
//				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
275
//                        " ( %s ) )" , config.getRelTaxaIdQuery()) ;
276
//			}
277

    
278
			ResultSet rs = source.getResultSet(strCount + strQueryBase);
279
			rs.next();
280
			int n = rs.getInt("n");
281
            if (n > 0){
282
                System.out.println("=======================================================================");
283
                System.out.println("There are "+n+" taxa without any taxon relationship and not being orphaned!");
284
                System.out.println("=======================================================================");
285
            }
286

    
287
			rs = source.getResultSet(strSelect + strQueryBase + strOrderBy);
288
			while (rs.next()){
289

    
290
			    int secRefFk = rs.getInt("secRefFk");
291
				String secRef = rs.getString("secRef");
292
				String nameCache = rs.getString("FullNameCache");
293
				int nameId = rs.getInt("NameId");
294
				String status = rs.getString("Status");
295

    
296
				System.out.println("SecRef:" + secRefFk +
297
						"\n secRef: " + secRef + "\n name: " + nameCache + "\n nameId: " + nameId
298
						+ "\n status: " + status
299
					);
300
			}
301
			success = (n == 0);
302
		} catch (SQLException e) {
303
			e.printStackTrace();
304
			success = false;
305
		}
306
		return success;
307
	}
308

    
309

    
310

    
311
}
(15-15/19)