Project

General

Profile

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

    
11
package eu.etaxonomy.cdm.io.berlinModel.in.validation;
12

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

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

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

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

    
32
	@Override
33
	public boolean validate(BerlinModelImportState state) {
34
		boolean result = true;
35
		result &= checkInActivatedStatus(state);
36
		result &= checkSynonymRelationsWithAcceptedTaxa(state);
37
		result &= checkConceptRelationsWithSynonymTaxa(state);
38
		result &= checkRelPTaxonWithNotes(state);
39
		result &= checkTaxaWithNoRelations(state);
40
		return result;
41
	}
42
	
43
	
44
	private boolean checkInActivatedStatus(BerlinModelImportState state){
45
		try {
46
			boolean result = true;
47
			BerlinModelImportConfigurator config = state.getConfig();
48
			Source source = state.getConfig().getSource();
49
			String strSQL = 
50
				" SELECT RelPTaxon.RelPTaxonId, RelPTaxon.RelQualifierFk, FromName.FullNameCache AS FromName, RelPTaxon.PTNameFk1 AS FromNameID, "  +
51
		    			" Status.Status AS FromStatus, ToName.FullNameCache AS ToName, RelPTaxon.PTNameFk2 AS ToNameId, ToStatus.Status AS ToStatus, FromTaxon.DoubtfulFlag AS doubtfulFrom, ToTaxon.DoubtfulFlag AS doubtfulTo" + 
52
    			" FROM PTaxon AS FromTaxon " + 
53
    				" INNER JOIN RelPTaxon ON FromTaxon.PTNameFk = RelPTaxon.PTNameFk1 AND FromTaxon.PTRefFk = RelPTaxon.PTRefFk1 " + 
54
    				" INNER JOIN PTaxon AS ToTaxon ON RelPTaxon.PTNameFk2 = ToTaxon.PTNameFk AND RelPTaxon.PTRefFk2 = ToTaxon.PTRefFk " + 
55
    				" INNER JOIN Name AS ToName ON ToTaxon.PTNameFk = ToName.NameId " + 
56
    				" INNER JOIN Name AS FromName ON FromTaxon.PTNameFk = FromName.NameId " + 
57
    				" INNER JOIN Status ON FromTaxon.StatusFk = Status.StatusId AND FromTaxon.StatusFk = Status.StatusId " + 
58
    				" INNER JOIN Status AS ToStatus ON ToTaxon.StatusFk = ToStatus.StatusId AND ToTaxon.StatusFk = ToStatus.StatusId " +
59
				" WHERE (RelPTaxon.RelQualifierFk = - 99) ";
60
			
61
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
62
				strSQL += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
63
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ; 
64
			}
65
			
66
//			System.out.println(strSQL);
67
			ResultSet rs = source.getResultSet(strSQL);
68
			boolean firstRow = true;
69
			int i = 0;
70
			while (rs.next()){
71
				i++;
72
				if (firstRow){
73
					System.out.println("========================================================");
74
					System.out.println("There are TaxonRelationships with status 'inactivated'(-99)!");
75
					System.out.println("========================================================");
76
				}
77
				
78
				int relPTaxonId = rs.getInt("RelPTaxonId");
79
				String fromName = rs.getString("FromName");
80
				int fromNameID = rs.getInt("FromNameID");
81
				String fromStatus = rs.getString("FromStatus");
82
				
83
				String toName = rs.getString("ToName");
84
				int toNameId = rs.getInt("ToNameId");
85
				String toStatus = rs.getString("ToStatus");
86
				String doubtfulFrom = String.valueOf(rs.getObject("doubtfulFrom"));
87
				String doubtfulTo = String.valueOf(rs.getObject("doubtfulTo"));
88
				
89
				
90
				System.out.println("RelPTaxonId:" + relPTaxonId + 
91
						"\n  FromName: " + fromName + "\n  FromNameID: " + fromNameID + "\n  FromStatus: " + fromStatus + "\n  FromDoubtful: " + doubtfulFrom + 
92
						"\n  ToName: " + toName + "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo );
93
				result = firstRow = false;
94
			}
95
			if (i > 0){
96
				System.out.println(" ");
97
			}
98
			
99
			return result;
100
		} catch (SQLException e) {
101
			e.printStackTrace();
102
			return false;
103
		}
104
	}
105
	
106
	/**
107
	 * @param state
108
	 * @return
109
	 */
110
	private boolean checkRelPTaxonWithNotes(BerlinModelImportState state) {
111
		boolean success = true;
112
		try {
113
			BerlinModelImportConfigurator config = state.getConfig();
114
			Source source = config.getSource();
115
			String strQuery = 
116
				"SELECT count(*) AS n FROM RelPTaxon " + 
117
				" WHERE (Notes IS NOT NULL) AND (RTRIM(LTRIM(Notes)) <> '') ";
118
			
119
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
120
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
121
                        " ( %s ) ) " , config.getRelTaxaIdQuery()) ; 
122
			}
123
			
124
			ResultSet rs = source.getResultSet(strQuery);
125
			rs.next();
126
			int n;
127
			n = rs.getInt("n");
128
			if (n > 0){
129
				System.out.println("========================================================");
130
				System.out.println("There are " + n + " RelPTaxa with a note. Notes for RelPTaxa are not imported!");
131
				System.out.println("========================================================");
132
				success = false;
133
				
134
			}
135
		} catch (SQLException e) {
136
			e.printStackTrace();
137
		}
138
		return success;
139
	}
140
	
141
	/**
142
	 * @param state
143
	 * @return
144
	 */
145
	private boolean checkSynonymRelationsWithAcceptedTaxa(BerlinModelImportState state) {
146
		boolean success = true;
147
		try {
148
			BerlinModelImportConfigurator config = state.getConfig();
149
			
150
			Source source = config.getSource();
151
			String strQuery = 
152
				"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
153
				" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
154
					" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
155
					" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
156
					" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
157
				" WHERE (PTaxon.StatusFk = 1) AND (RelPTaxon.RelQualifierFk IN (2, 4, 5, 6, 7)) ";
158
			
159
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
160
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
161
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ; 
162
			}
163
			
164
			ResultSet rs = source.getResultSet(strQuery);
165
			boolean firstRow = true;
166
			while (rs.next()){
167
				if (firstRow){
168
					System.out.println("========================================================");
169
					System.out.println("There are accepted taxa having synonym role in a synonym relationship!");
170
					System.out.println("========================================================");
171
				}
172

    
173
				int relPTaxonId = rs.getInt("RelPTaxonId");
174
				String relType = rs.getString("RelPTQualifier");
175
				int fromIdentifier = rs.getInt("RIdentifier");
176
				String fromName = rs.getString("fromName");
177
				int fromRefFk = rs.getInt("PTRefFk");
178
				int fromNameId = rs.getInt("fromNameId");
179
				String toName = rs.getString("acceptedName");
180
				
181
				System.out.println("RelPTaxonId:" + relPTaxonId + 
182
						"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType  
183
						+ "\n acceptedName: " + toName //+ "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo )
184
						);
185
				success = (firstRow = false);
186
			}
187
		} catch (SQLException e) {
188
			e.printStackTrace();
189
		}
190
		return success;
191
	}
192
	
193
	
194
	/**
195
	 * @param state
196
	 * @return
197
	 */
198
	private boolean checkConceptRelationsWithSynonymTaxa(BerlinModelImportState state) {
199
		boolean success = true;
200
		try {
201
			BerlinModelImportConfigurator config = state.getConfig();
202
			
203
			Source source = config.getSource();
204
			String strQuery = 
205
				"SELECT RelPTaxon.RelPTaxonId, RelPTQualifier, PTaxon.RIdentifier,PTaxon.StatusFk as fromStatus, Name.FullNameCache fromName, PTaxon.PTRefFk, Name.NameId as fromNameId, AcceptedName.FullNameCache acceptedName" +
206
				" FROM RelPTaxon INNER JOIN PTaxon ON RelPTaxon.PTNameFk1 = PTaxon.PTNameFk AND RelPTaxon.PTRefFk1 = PTaxon.PTRefFk " +
207
					" INNER JOIN RelPTQualifier ON RelPTaxon.RelQualifierFk = RelPTQualifier.RelPTQualifierId " +
208
					" LEFT OUTER JOIN Name ON PTaxon.PTNameFk = Name.NameId " +
209
					" LEFT OUTER JOIN Name AS AcceptedName ON RelPTaxon.PTNameFk2 = AcceptedName.NameId " +
210
				" WHERE (PTaxon.StatusFk IN (2,3,4)) AND (RelPTaxon.RelQualifierFk NOT IN (2, 4, 5, 6, 7, 101, 102, 103, 104, -99)) ";
211
			
212
			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
213
				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
214
                        " ( %s ) )" , config.getRelTaxaIdQuery()) ; 
215
			}
216
			
217
			ResultSet rs = source.getResultSet(strQuery);
218
			boolean firstRow = true;
219
			while (rs.next()){
220
				if (firstRow){
221
					System.out.println("========================================================");
222
					System.out.println("There are synonyms being part of an accepted taxon relationship!");
223
					System.out.println("--------------------------------------------------------");
224
					System.out.println(strQuery);
225
					System.out.println("========================================================");
226
				}
227

    
228
				int relPTaxonId = rs.getInt("RelPTaxonId");
229
				String relType = rs.getString("RelPTQualifier");
230
				int fromIdentifier = rs.getInt("RIdentifier");
231
				String fromName = rs.getString("fromName");
232
				int fromRefFk = rs.getInt("PTRefFk");
233
				int fromNameId = rs.getInt("fromNameId");
234
				String toName = rs.getString("acceptedName");
235
				
236
				System.out.println("RelPTaxonId:" + relPTaxonId + 
237
						"\n TaxonRIdentifier: " + fromIdentifier + "\n name: " + fromName + "\n nameId: " + fromNameId + "\n RefFk: " + fromRefFk + "\n RelType: " + relType  
238
						+ "\n toName: " + toName //+ "\n  ToNameId: " + toNameId + "\n  ToStatus: " + toStatus + "\n  ToDoubtful: " + doubtfulTo )
239
						);
240
				success = (firstRow = false);
241
			}
242
		} catch (SQLException e) {
243
			e.printStackTrace();
244
		}
245
		return success;
246
	}
247
	
248
	/**
249
	 * @param state
250
	 * @return
251
	 */
252
	private boolean checkTaxaWithNoRelations(BerlinModelImportState state) {
253
		boolean success = true;
254
		try {
255
			BerlinModelImportConfigurator config = state.getConfig();
256
			
257
			Source source = config.getSource();
258
			String strQuery = 
259
				" SELECT pt.PTRefFk AS secRefFk, dbo.Reference.RefCache AS secRef, dbo.Name.FullNameCache, Name.NameId, Status.Status " +
260
				" FROM PTaxon AS pt LEFT OUTER JOIN " +
261
                      	" Status ON pt.StatusFk = Status.StatusId LEFT OUTER JOIN " + 
262
				        " Reference ON pt.PTRefFk = dbo.Reference.RefId LEFT OUTER JOIN " + 
263
				        " Name ON pt.PTNameFk = dbo.Name.NameId LEFT OUTER JOIN " +
264
				        " RelPTaxon ON pt.PTNameFk = dbo.RelPTaxon.PTNameFk2 AND pt.PTRefFk = dbo.RelPTaxon.PTRefFk2 LEFT OUTER JOIN " +
265
				        " RelPTaxon AS RelPTaxon_1 ON pt.PTNameFk = RelPTaxon_1.PTNameFk1 AND pt.PTRefFk = RelPTaxon_1.PTRefFk1 " + 
266
				" WHERE (RelPTaxon_1.RelQualifierFk IS NULL) AND (dbo.RelPTaxon.RelQualifierFk IS NULL) AND pt.statusFK <> 6 " + 
267
				" ORDER BY Reference.RefCache, pt.PTRefFk, Name.FullNameCache, statusFK";
268

    
269
			//project filter
270
//			if (StringUtils.isNotBlank(config.getRelTaxaIdQuery())){
271
//				strQuery += String.format(" AND (RelPTaxon.RelPTaxonId IN " +
272
//                        " ( %s ) )" , config.getRelTaxaIdQuery()) ; 
273
//			}
274
			
275
			ResultSet rs = source.getResultSet(strQuery);
276
			boolean firstRow = true;
277
			while (rs.next()){
278
				if (firstRow){
279
					System.out.println("=====================================================================");
280
					System.out.println("There are taxa without any taxon relationship and not being orphaned!");
281
					System.out.println("=====================================================================");
282
				}
283

    
284
				int secRefFk = rs.getInt("secRefFk");
285
				String secRef = rs.getString("secRef");
286
				String nameCache = rs.getString("FullNameCache");
287
				int nameId = rs.getInt("NameId");
288
				String status = rs.getString("Status");
289
				
290
				System.out.println("SecRef:" + secRefFk + 
291
						"\n secRef: " + secRef + "\n name: " + nameCache + "\n nameId: " + nameId 
292
						+ "\n status: " + status 
293
					);
294
				success = (firstRow = false);
295
			}
296
		} catch (SQLException e) {
297
			e.printStackTrace();
298
		}
299
		return success;
300
	}
301
	
302

    
303

    
304
}
(15-15/19)