Project

General

Profile

« Previous | Next » 

Revision ef1b5da2

Added by Andreas Müller almost 8 years ago

Adapt table and column names to hibernate 5 naming strategy #5369

... and some other changes to table/attribute names

View differences:

cdmlib-io/src/test/java/eu/etaxonomy/cdm/test/integration/TestCdmDbComparator.java
1
/**
2
* Copyright (C) 2008 EDIT
3
* European Distributed Institute of Taxonomy 
4
* http://www.e-taxonomy.eu
5
*/
6

  
7
package eu.etaxonomy.cdm.test.integration;
8

  
9
import java.sql.ResultSet;
10
import java.sql.SQLException;
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.List;
14
import java.util.Map;
15

  
16
import org.apache.log4j.Logger;
17
import org.springframework.transaction.TransactionStatus;
18

  
19
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
20
import eu.etaxonomy.cdm.common.AccountStore;
21
import eu.etaxonomy.cdm.database.CdmDataSource;
22
import eu.etaxonomy.cdm.database.DbSchemaValidation;
23
import eu.etaxonomy.cdm.database.ICdmDataSource;
24
import eu.etaxonomy.cdm.io.common.Source;
25
import eu.etaxonomy.cdm.model.agent.AgentBase;
26
import eu.etaxonomy.cdm.model.common.CdmBase;
27
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
28
import eu.etaxonomy.cdm.model.common.LanguageString;
29
import eu.etaxonomy.cdm.model.common.Representation;
30
import eu.etaxonomy.cdm.model.common.TermVocabulary;
31
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
32
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
33
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
34
import eu.etaxonomy.cdm.model.reference.Reference;
35

  
36
/**
37
 * @author a.babadshanjan
38
 * @created 15.09.2008
39
 */
40
public class TestCdmDbComparator {
41
	
42
	private static final String sourceDbOne = "cdm_test_jaxb";
43
	private static final String sourceDbTwo = "cdm_test_jaxb2";
44
	
45
	private static final ICdmDataSource sourceOne = TestCdmDbComparator.CDM_DB(sourceDbOne);
46
	private static final ICdmDataSource sourceTwo = TestCdmDbComparator.CDM_DB(sourceDbTwo);
47
	
48
	private static final String server = "192.168.2.10";
49
	private static final String username = "edit";
50

  
51
	public static ICdmDataSource CDM_DB(String dbname) {
52
		
53
	String password = AccountStore.readOrStorePassword(dbname, server, username, null);
54
	ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
55
	return datasource;
56
	}
57
	
58
    private final int MAX_ROWS = 60000;
59
    private final int MAX_TABLES = 150;
60

  
61
    private static final Logger logger = Logger.getLogger(TestCdmDbComparator.class);
62
	
63
	private static final String[] table_list = {
64
//			"Address",
65
			"Agent",
66
//			"Agent_Agent",
67
//			"Agent_Annotation",
68
//			"Agent_DefinedTermBase", 
69
//			"Agent_Extension", 
70
//			"Agent_InstitutionalMembership", 
71
//			"Agent_Marker", 
72
//			"Agent_Media", 
73
//			"Agent_OriginalSource", 
74
//			"Agent_Rights", 
75
			"Annotation", 
76
//			"CDM_VIEW", 
77
//			"CDM_VIEW_CDM_VIEW", 
78
//			"Collection", 
79
//			"Collection_Annotation", 
80
//			"Collection_Extension", 
81
//			"Collection_Marker", 
82
//			"Collection_Media", 
83
//			"Collection_OriginalSource", 
84
//			"Collection_Rights", 
85
//			"Contact", 
86
			"DefinedTermBase", 
87
//			"DefinedTermBase_DefinedTermBase",
88
//			"DefinedTermBase_Media", 
89
//			"DefinedTermBase_Representation", 
90
//			"DefinedTermBase_TermVocabulary", 
91
//			"DerivationEvent", 
92
//			"DerivationEvent_Annotation", 
93
//			"DerivationEvent_Marker", 
94
			"DescriptionBase", 
95
//			"DescriptionBase_Annotation", 
96
//			"DescriptionBase_DefinedTermBase",
97
//			"DescriptionBase_DescriptionElementBase",
98
//			"DescriptionBase_Extension", 
99
//			"DescriptionBase_Marker", 
100
//			"DescriptionBase_OriginalSource", 
101
//			"DescriptionBase_Rights", 
102
			"DescriptionElementBase", 
103
//			"DescriptionElementBase_Annotation",
104
//			"DescriptionElementBase_DefinedTermBase",
105
//			"DescriptionElementBase_LanguageString",
106
//			"DescriptionElementBase_Marker", 
107
//			"DescriptionElementBase_Media", 
108
//			"DescriptionElementBase_StatisticalMeasurementValue",
109
//			"DeterminationEvent", 
110
//			"DeterminationEvent_Annotation", 
111
//			"DeterminationEvent_Marker", 
112
//			"Extension", 
113
			"FeatureNode", 
114
			"FeatureTree", 
115
//			"FeatureTree_Representation", 
116
//			"GatheringEvent", 
117
//			"GatheringEvent_Annotation", 
118
//			"GatheringEvent_Marker", 
119
			"HomotypicalGroup", 
120
//			"HomotypicalGroup_Annotation", 
121
//			"HomotypicalGroup_Marker", 
122
//			"HybridRelationship", 
123
//			"HybridRelationship_Annotation", 
124
//			"HybridRelationship_Marker", 
125
//			"InstitutionalMembership", 
126
			"LanguageString", 
127
//			"Locus", 
128
			"Marker", 
129
			"Media", 
130
			"MediaRepresentation", 
131
			"MediaRepresentationPart", 
132
//			"Media_Annotation", 
133
//			"Media_Marker", 
134
//			"Media_Rights", 
135
//			"Media_Sequence", 
136
//			"Media_TaxonBase", 
137
			"NameRelationship", 
138
//			"NameRelationship_Annotation", 
139
//			"NameRelationship_Marker", 
140
			"NomenclaturalStatus", 
141
//			"NomenclaturalStatus_Annotation", 
142
//			"NomenclaturalStatus_Marker", 
143
			"OriginalSource", 
144
//			"OriginalSource_Annotation", 
145
//			"OriginalSource_Marker", 
146
//			"Person_Keyword", 
147
			"Reference", 
148
//			"ReferenceBase_Annotation", 
149
//			"ReferenceBase_Extension", 
150
//			"ReferenceBase_Marker", 
151
//			"ReferenceBase_Media", 
152
//			"ReferenceBase_OriginalSource", 
153
//			"ReferenceBase_Rights", 
154
//			"RelationshipTermBase_inverseRepresentation",
155
			"Representation",
156
//			"Rights",
157
//			"Sequence",
158
//			"Sequence_Annotation", 
159
//			"Sequence_Extension", 
160
//			"Sequence_Marker", 
161
//			"Sequence_Media", 
162
//			"Sequence_OriginalSource", 
163
//			"Sequence_ReferenceBase", 
164
//			"Sequence_Rights", 
165
			"SpecimenOrObservationBase", 
166
//			"SpecimenOrObservationBase_Annotation",
167
//			"SpecimenOrObservationBase_DerivationEvent",
168
//			"SpecimenOrObservationBase_Extension",
169
//			"SpecimenOrObservationBase_Marker",
170
//			"SpecimenOrObservationBase_Media",
171
//			"SpecimenOrObservationBase_OriginalSource",
172
//			"SpecimenOrObservationBase_Rights",
173
//			"StateData",
174
//			"StateData_DefinedTermBase", 
175
//			"StatisticalMeasurementValue", 
176
//			"StatisticalMeasurementValue_DefinedTermBase",
177
			"SynonymRelationship", 
178
//			"SynonymRelationship_Annotation", 
179
//			"SynonymRelationship_Marker", 
180
			"TaxonBase", 
181
//			"TaxonBase_Annotation", 
182
//			"TaxonBase_Extension", 
183
//			"TaxonBase_Marker", 
184
//			"TaxonBase_OriginalSource", 
185
//			"TaxonBase_Rights", 
186
			"TaxonNameBase", 
187
//			"TaxonNameBase_Annotation", 
188
//			"TaxonNameBase_Extension", 
189
//			"TaxonNameBase_HybridRelationship",
190
//			"TaxonNameBase_Marker", 
191
//			"TaxonNameBase_NomenclaturalStatus",
192
//			"TaxonNameBase_OriginalSource", 
193
//			"TaxonNameBase_Rights", 
194
//			"TaxonNameBase_TypeDesignationBase",
195
			"TaxonRelationship", 
196
//			"TaxonRelationship_Annotation", 
197
//			"TaxonRelationship_Marker", 
198
			"TermVocabulary", 
199
//			"TermVocabulary_Representation", 
200
			"TypeDesignationBase", 
201
//			"TypeDesignationBase_Annotation", 
202
//			"TypeDesignationBase_Marker", 
203
	};
204

  
205
//	@Autowired
206
//	@Qualifier("cdmDao")
207
//	private ICdmEntityDao cdmDao;
208
	
209
//	@Autowired
210
//	protected void setDao(ICdmEntityDao dao) {
211
//		logger.debug("setting DAO");
212
//		this.cdmDao = dao;
213
//	}
214
	
215
//	@Autowired
216
//	private SessionFactory factory;
217
//	
218
//	protected Session getSession(){
219
//	Session session = factory.getCurrentSession();
220
//	return session;
221
//}
222

  
223
//    public ResultSet getResultSet (String query){
224
//    	ResultSet rs;
225
//    	try {
226
//            this.getConnection(); //establish connection
227
//        	if (query == null){
228
//        		return null;
229
//        	}
230
//            mStmt = mConn.createStatement();
231
//            rs = mStmt.executeQuery(query);
232
//            return rs;
233
//        }catch(SQLException e){
234
//            logger.error("Problems when creating Resultset for query \n  " + query + " \n" + "Exception: " + e);
235
//            return null;
236
//        }
237
//    }
238
    
239
	private Map<String, List<String>> doLoadDataFromDb(String dbname, Source source) {
240
    	
241
		Map<String, List<String>> dbTables = new HashMap<String, List<String>>();
242
		
243
		logger.info("Loading data from DB " + dbname);
244

  
245
		CdmApplicationController appCtr = null;
246

  
247

  
248
		String password = AccountStore.readOrStorePassword(dbname, server, username, null);
249
		
250
		DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;
251
		ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
252
		appCtr = CdmApplicationController.NewInstance(datasource, dbSchemaValidation, true);
253

  
254
    	
255
    	TransactionStatus txStatus = appCtr.startTransaction(true);
256

  
257
    	// get data from DB
258

  
259
    	try {
260

  
261
    		dbTables = retrieveAllTables(appCtr);
262
    		
263
    	} catch (Exception e) {
264
    		logger.error("error setting data");
265
    		e.printStackTrace();
266
    	}
267
    	appCtr.commitTransaction(txStatus);
268
    	appCtr.close();
269
    	
270
    	return dbTables;
271
    	
272
    }
273
	
274
	private Map<String, List<CdmBase>> doLoadDataFromDb_(String dbname) {
275
    	
276
		Map<String, List<CdmBase>> dbTables = new HashMap<String, List<CdmBase>>();
277
		
278
		logger.info("Loading data from DB " + dbname);
279

  
280
		CdmApplicationController appCtr = null;
281

  
282

  
283
		String password = AccountStore.readOrStorePassword(dbname, server, username, null);
284
		
285
		DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;
286
		ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
287
		appCtr = CdmApplicationController.NewInstance(datasource, dbSchemaValidation, true);
288

  
289
    	
290
    	TransactionStatus txStatus = appCtr.startTransaction(true);
291

  
292
    	// get data from DB
293

  
294
    	try {
295

  
296
    		dbTables = retrieveAllTables_(appCtr);
297
    		
298
    	} catch (Exception e) {
299
    		logger.error("error setting data");
300
    		e.printStackTrace();
301
    	}
302
    	appCtr.commitTransaction(txStatus);
303
    	appCtr.close();
304
    	
305
    	return dbTables;
306
    	
307
    }
308
	
309
	private Map<String, List<String>> doLoadDataFromDb__(String dbname, Source source) {
310
    	
311
		Map<String, List<String>> dbTables = new HashMap<String, List<String>>();
312
		
313
		logger.info("Loading data from DB " + dbname);
314

  
315
    	try {
316

  
317
    		dbTables = retrieveAllTables__(source);
318
    		
319
    	} catch (Exception e) {
320
    		logger.error("error setting data");
321
    		e.printStackTrace();
322
    	}
323
    	return dbTables;
324
    	
325
    }
326
	
327
    private Map<String, List<CdmBase>> retrieveAllTables_(CdmApplicationController appCtr) {
328
    	
329
		Map<String, List<CdmBase>> tables_ = new HashMap<String, List<CdmBase>>(table_list.length);
330
		
331
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
332
			
333
		//List<Agent> agents = appCtr.getAgentService().getAllAgents(MAX_ROWS, 0);
334
		
335
		try {
336
			//get data from database
337
			for (int i = 0; i < table_list.length; i++) {
338

  
339
	    		logger.debug("Retrieving table '" + table_list[i] + "'");
340
	    		System.out.println("Retrieving table '" + table_list[i] + "'");
341
	    		
342
				List<CdmBase> rows = new ArrayList<CdmBase>(MAX_ROWS);
343

  
344
				rows = appCtr.getMainService().rows(table_list[i], MAX_ROWS, 0);	
345
				
346
    			tables_.put(table_list[i], rows);
347

  
348
			}
349
				
350
		} catch (Exception e) {
351
    		logger.error("error retrieving data");
352
    		e.printStackTrace();
353
		}
354
//		return tables;
355
		return tables_;
356
    }
357

  
358
    private Map<String, List<String>> retrieveAllTables___(Source source) {
359
    	
360
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
361
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
362
			
363
		try {
364
			//get data from database
365
			for (int i = 0; i < table_list.length; i++) {
366
				
367
				List<String> rows = new ArrayList<String>(MAX_ROWS);
368

  
369
//					Session session = factory.getCurrentSession();
370
					
371
//					if ( sessionObject != null ) {
372
//						session.update(sessionObject);
373
//					}
374
//					Query query = session.createQuery("select term from DefinedTermBase term join fetch term.representations representation where representation.label = :label");
375
//					query.setParameter("label", queryString);
376
					
377
//					Query query = session.createQuery("select from " + table_list[i]);
378
//				    rows = query.list();
379
				
380
				//FIXME: NullPointerException (cdmDao is null)
381
				    //rows = cdmDao.list(MAX_ROWS, 0);
382
					tables.put(table_list[i], rows);
383

  
384
				}
385
				
386
		} catch (Exception e) {
387
    		logger.error("error retrieving data");
388
    		e.printStackTrace();
389
		}
390
		return tables;
391
    }
392

  
393
    private Map<String, List<String>> retrieveAllTables__(Source source) {
394
    	
395
//		IImportConfigurator config = new BerlinModelImportConfigurator;
396
//		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
397
//		Source source = bmiConfig.getSource();
398
//		ResultSet rs = berlinModelSource.getResultSet();
399

  
400
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
401
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
402
			
403
		try {
404
			//get data from database
405
			for (int i = 0; i < table_list.length; i++) {
406
				String strQuery = 
407
					" SELECT * FROM " + table_list[i];
408
				logger.debug("SQL Statement: " +  strQuery);
409
				//ResultSet rs = berlinModelSource.getResultSet();
410
				//ResultSet rs = source.getResultSet(strQuery) ;
411
				ResultSet rs = source.getResultSet(strQuery) ;
412
				List<String> rows = new ArrayList<String>(MAX_ROWS);
413

  
414
				while (rs.next()) {
415
					rows.add(rs.toString());
416
				}
417
				tables.put(table_list[i], rows);
418
			}
419
		} catch (SQLException e) {
420
			logger.error("SQLException:" +  e);
421
		}
422
		return tables;
423
    }
424
    
425
    private Map<String, List<String>> retrieveAllTables(CdmApplicationController appCtr) {
426
		
427
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
428
		
429
		List<String> agentTableContent = new ArrayList<String>(MAX_ROWS);
430
		List<? extends AgentBase> agents = appCtr.getAgentService().list(null,MAX_ROWS, 0,null,null);
431
		for (AgentBase agent: agents ) {
432
			//TODO: Want the entire row as string not just toString() of the object.
433
			agentTableContent.add(agent.toString());
434
		}
435
		tables.put("agents", agentTableContent);
436

  
437
		//List<Annotation> annotations = appCtr.getTermService().getAllAnnotations(MAX_ROWS, 0);
438
		
439
		List<String> definedTermBaseTableContent = new ArrayList<String>(MAX_ROWS);
440
		List<DefinedTermBase> definedTermBases = appCtr.getTermService().list(null,MAX_ROWS, 0,null,null);
441
		for (DefinedTermBase definedTermBase: definedTermBases ) {
442
			definedTermBaseTableContent.add(definedTermBase.toString());
443
		}
444
		tables.put("definedTermBases", definedTermBaseTableContent);
445

  
446
		//List<DescriptionBase> descriptionBases = appCtr.getDescriptionService().getAllDescriptionBases(MAX_ROWS, 0);
447
		//List<DescriptionElementBase> descriptionElementBases = appCtr.getDescriptionService().getAllDescriptionElementBases(MAX_ROWS, 0);
448
		//List<HomotypicalGroup> homotypicalGroups = appCtr.getNameService().getAllHomotypicalGroups(MAX_ROWS, 0);
449
		List<LanguageString> languageStrings = appCtr.getTermService().getAllLanguageStrings(MAX_ROWS, 0);
450
		//List<Marker> markers = appCtr.getTermService().getAllMarkers(MAX_ROWS, 0);
451
		//List<NameRelationship> nameRelationships = appCtr.getNameService().getAllNameRelationships(MAX_ROWS, 0);
452
		List<NomenclaturalStatus> nomenclaturalStatus = appCtr.getNameService().getAllNomenclaturalStatus(MAX_ROWS, 0);
453
		//List<OriginalSource> originalSources = appCtr.getNameService().getAllOriginalSources(MAX_ROWS, 0);
454
		List<Reference> references = appCtr.getReferenceService().list(null,MAX_ROWS, 0,null,null);
455
		List<Representation> representations = appCtr.getTermService().getAllRepresentations(MAX_ROWS, 0);
456
		List<SpecimenOrObservationBase> specimenOrObservationBases = appCtr.getOccurrenceService().list(null,MAX_ROWS, 0,null,null);
457
		//List<SynonymRelationship> synonymRelationships = appCtr.getTaxonService().getAllSynonymRelationships(MAX_ROWS, 0);
458
//		List<TaxonBase> taxonBases = appCtr.getTaxonService().getAllTaxa(MAX_ROWS, 0);
459
//		List<TaxonNameBase> taxonNameBases = appCtr.getNameService().getAllNames(MAX_ROWS, 0);
460
		//List<TaxonRelationship> taxonRelationships = appCtr.getTaxonService().getAllTaxonRelationships(MAX_ROWS, 0);
461
		List<TermVocabulary> termVocabularies = appCtr.getVocabularyService().list(null,MAX_ROWS, 0,null,null);
462
		List<TypeDesignationBase> typeDesignationBases = appCtr.getNameService().getAllTypeDesignations(MAX_ROWS, 0);
463
		
464
		return tables;
465
	}
466
	
467
     private void compareTables(String tableName, List<CdmBase> tablesDbOne, List<CdmBase> tablesDbTwo) {
468
    	
469
		int tableOneSize = tablesDbOne.size();
470
		int tableTwoSize = tablesDbTwo.size();
471
		int tableMinSize = 0;
472
		int tableMaxSize = 0;
473
	
474
		if (tableOneSize != tableTwoSize) {
475
			logger.warn("Table '" + tableName + "', Rows differ: " + tablesDbOne.size() + ", " + tablesDbTwo.size());
476
            tableMinSize = Math.min(tableOneSize, tableTwoSize);
477
            tableMaxSize = Math.max(tableOneSize, tableTwoSize);
478
		} else {
479
			logger.info("Table '" + tableName + "': " + tablesDbOne.size());
480
		}
481
		
482
		int different = 0;
483
		
484
		try {
485
		for (int i = 0; i < tableMinSize; i++) {
486

  
487
			CdmBase obj1 = tablesDbOne.get(i);
488
			CdmBase obj2 = tablesDbTwo.get(i);
489

  
490
			// This compares only whether both tables contain the same objects.
491
			// It doesn't check whether all field values are the same.
492
			logger.debug("Row # " + i + ":");
493
			if (obj1.equals(obj2) != true) {
494
				different++;
495
				logger.debug("Table 1 = " + obj1); 
496
				logger.debug("Table 2 = " + obj2); 
497
			} else {
498
				logger.debug("Entry = " + obj1); 
499
			}
500
		}
501
		if (different > 0) {
502
			logger.info("# Rows identical: " + (tableMaxSize - different)); 
503
			logger.warn("# Rows different: " + different); 
504
		} 
505
		} catch (org.hibernate.LazyInitializationException e){
506
			logger.error("LazyInitializationException");
507
		}
508
	}
509

  
510
    	private void doCompareDatabases(Map<String, List<CdmBase>> tablesDbOne, Map<String, List<CdmBase>> tablesDbTwo) {
511
//        public void doCompareDatabases(Map<String, List<String>> tablesDbOne, Map<String, List<String>> tablesDbTwo) {
512
		
513
		logger.debug("# Tables in DB 1: " + tablesDbOne.size());
514
		logger.debug("# Tables in DB 2: " + tablesDbTwo.size());
515
		
516
		for (String tableName: tablesDbOne.keySet()) {
517

  
518
			logger.info("Comparing table '" + tableName + "'");
519
			
520
//			List<String> dbOneTableRows = new ArrayList<String>();
521
//			List<String> dbTwoTableRows = new ArrayList<String>();
522
			List<CdmBase> dbOneTableRows = new ArrayList<CdmBase>();
523
			List<CdmBase> dbTwoTableRows = new ArrayList<CdmBase>();
524
			
525
			dbOneTableRows = tablesDbOne.get(tableName);
526
			dbTwoTableRows = tablesDbTwo.get(tableName);
527
			
528
//			Collections.sort(dbOneTableRows);
529
//			Collections.sort(dbTwoTableRows);
530

  
531
			int different = 0;
532
			int tableSize = dbOneTableRows.size();
533
			
534
			for (int i = 0; i < tableSize; i++) {
535

  
536
//				String str1 = dbOneTableRows.get(i);
537
//				String str2 = dbTwoTableRows.get(i);
538
				CdmBase str1 = dbOneTableRows.get(i);
539
				CdmBase str2 = dbTwoTableRows.get(i);
540

  
541
				if (str1.equals(str2) != true) {
542

  
543
					different++;
544
					logger.debug("Rows differ:");
545
					logger.debug("Table 1 Row = " + str1); 
546
					logger.debug("Table 2 Row = " + str2); 
547

  
548
				}
549
				i++;
550
			}
551
			if (different > 0) {
552
				logger.info("Compared table '" + tableName + "':");
553
				logger.info("# Rows total: " + tableSize);
554
				logger.info("# Rows identical: " + (tableSize - different)); 
555
				logger.warn("# Rows different: " + different); 
556
			}
557
		}
558
		logger.info("End database comparison"); 
559
	}
560

  
561
//	private void test_(){
562
//		
563
//		Map<String, List<CdmBase>> tablesDbOne = doLoadDataFromDb_(sourceDbOne);
564
//		Map<String, List<CdmBase>> tablesDbTwo = doLoadDataFromDb_(sourceDbTwo);
565
//	    doCompareDatabases(tablesDbOne, tablesDbTwo);
566
//
567
//	}
568
	
569
	private void test(){
570
		
571
		CdmApplicationController appCtrOne = null;
572
		CdmApplicationController appCtrTwo = null;
573
		logger.info("Comparing '" + sourceDbOne + "' and '" + sourceDbTwo + "'");
574

  
575
		try {
576
			appCtrOne = CdmApplicationController.NewInstance(sourceOne, DbSchemaValidation.VALIDATE, true);
577
			appCtrTwo = CdmApplicationController.NewInstance(sourceTwo, DbSchemaValidation.VALIDATE, true);
578

  
579
		} catch (Exception e) {
580
			logger.error("Error creating application controller");
581
			e.printStackTrace();
582
			System.exit(1);
583
		}
584
		
585
		try {
586
			//get data from database
587
	    	TransactionStatus txStatOne = appCtrOne.startTransaction(true);
588
	    	TransactionStatus txStatTwo = appCtrTwo.startTransaction(true);
589
			for (int i = 0; i < table_list.length; i++) {
590

  
591
				List<CdmBase> rowsDbOne = new ArrayList<CdmBase>(MAX_ROWS);
592
				List<CdmBase> rowsDbTwo = new ArrayList<CdmBase>(MAX_ROWS);
593
				rowsDbOne = appCtrOne.getMainService().rows(table_list[i], MAX_ROWS, 0);
594
				rowsDbTwo = appCtrTwo.getMainService().rows(table_list[i], MAX_ROWS, 0);	
595
				compareTables(table_list[i], rowsDbOne, rowsDbTwo);
596
			}
597
	    	appCtrTwo.commitTransaction(txStatTwo);
598
	    	appCtrOne.commitTransaction(txStatOne);
599
	    	//java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active
600
	    	appCtrOne.close();
601
	    	appCtrTwo.close();
602
			logger.info("End database comparison"); 
603
				
604
		} catch (Exception e) {
605
    		logger.error("Error retrieving or comparing data");
606
    		e.printStackTrace();
607
		}
608
	}
609
	
610
	/**
611
	 * @param args
612
	 */
613
	public static void  main(String[] args) {
614
		TestCdmDbComparator diff = new TestCdmDbComparator();
615
    	diff.test();
616
	}
617
}
1
/**
2
* Copyright (C) 2008 EDIT
3
* European Distributed Institute of Taxonomy
4
* http://www.e-taxonomy.eu
5
*/
6

  
7
package eu.etaxonomy.cdm.test.integration;
8

  
9
import java.sql.ResultSet;
10
import java.sql.SQLException;
11
import java.util.ArrayList;
12
import java.util.HashMap;
13
import java.util.List;
14
import java.util.Map;
15

  
16
import org.apache.log4j.Logger;
17
import org.springframework.transaction.TransactionStatus;
18

  
19
import eu.etaxonomy.cdm.api.application.CdmApplicationController;
20
import eu.etaxonomy.cdm.common.AccountStore;
21
import eu.etaxonomy.cdm.database.CdmDataSource;
22
import eu.etaxonomy.cdm.database.DbSchemaValidation;
23
import eu.etaxonomy.cdm.database.ICdmDataSource;
24
import eu.etaxonomy.cdm.io.common.Source;
25
import eu.etaxonomy.cdm.model.agent.AgentBase;
26
import eu.etaxonomy.cdm.model.common.CdmBase;
27
import eu.etaxonomy.cdm.model.common.DefinedTermBase;
28
import eu.etaxonomy.cdm.model.common.LanguageString;
29
import eu.etaxonomy.cdm.model.common.Representation;
30
import eu.etaxonomy.cdm.model.common.TermVocabulary;
31
import eu.etaxonomy.cdm.model.name.NomenclaturalStatus;
32
import eu.etaxonomy.cdm.model.name.TypeDesignationBase;
33
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
34
import eu.etaxonomy.cdm.model.reference.Reference;
35

  
36
/**
37
 * @author a.babadshanjan
38
 * @created 15.09.2008
39
 */
40
public class TestCdmDbComparator {
41

  
42
	private static final String sourceDbOne = "cdm_test_jaxb";
43
	private static final String sourceDbTwo = "cdm_test_jaxb2";
44

  
45
	private static final ICdmDataSource sourceOne = TestCdmDbComparator.CDM_DB(sourceDbOne);
46
	private static final ICdmDataSource sourceTwo = TestCdmDbComparator.CDM_DB(sourceDbTwo);
47

  
48
	private static final String server = "192.168.2.10";
49
	private static final String username = "edit";
50

  
51
	public static ICdmDataSource CDM_DB(String dbname) {
52

  
53
	String password = AccountStore.readOrStorePassword(dbname, server, username, null);
54
	ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
55
	return datasource;
56
	}
57

  
58
    private final int MAX_ROWS = 60000;
59
    private final int MAX_TABLES = 150;
60

  
61
    private static final Logger logger = Logger.getLogger(TestCdmDbComparator.class);
62

  
63
	private static final String[] table_list = {
64
//			"Address",
65
			"Agent",
66
//			"Agent_Agent",
67
//			"Agent_Annotation",
68
//			"Agent_DefinedTermBase",
69
//			"Agent_Extension",
70
//			"Agent_InstitutionalMembership",
71
//			"Agent_Marker",
72
//			"Agent_Media",
73
//			"Agent_OriginalSource",
74
//			"Agent_Rights",
75
			"Annotation",
76
//			"CDM_VIEW",
77
//			"CDM_VIEW_CDM_VIEW",
78
//			"Collection",
79
//			"Collection_Annotation",
80
//			"Collection_Extension",
81
//			"Collection_Marker",
82
//			"Collection_Media",
83
//			"Collection_OriginalSource",
84
//			"Collection_Rights",
85
//			"Contact",
86
			"DefinedTermBase",
87
//			"DefinedTermBase_DefinedTermBase",
88
//			"DefinedTermBase_Media",
89
//			"DefinedTermBase_Representation",
90
//			"DefinedTermBase_TermVocabulary",
91
//			"DerivationEvent",
92
//			"DerivationEvent_Annotation",
93
//			"DerivationEvent_Marker",
94
			"DescriptionBase",
95
//			"DescriptionBase_Annotation",
96
//			"DescriptionBase_DefinedTermBase",
97
//			"DescriptionBase_DescriptionElementBase",
98
//			"DescriptionBase_Extension",
99
//			"DescriptionBase_Marker",
100
//			"DescriptionBase_OriginalSource",
101
//			"DescriptionBase_Rights",
102
			"DescriptionElementBase",
103
//			"DescriptionElementBase_Annotation",
104
//			"DescriptionElementBase_DefinedTermBase",
105
//			"DescriptionElementBase_LanguageString",
106
//			"DescriptionElementBase_Marker",
107
//			"DescriptionElementBase_Media",
108
//			"DescriptionElementBase_StatisticalMeasurementValue",
109
//			"DeterminationEvent",
110
//			"DeterminationEvent_Annotation",
111
//			"DeterminationEvent_Marker",
112
//			"Extension",
113
			"FeatureNode",
114
			"FeatureTree",
115
//			"FeatureTree_Representation",
116
//			"GatheringEvent",
117
//			"GatheringEvent_Annotation",
118
//			"GatheringEvent_Marker",
119
			"HomotypicalGroup",
120
//			"HomotypicalGroup_Annotation",
121
//			"HomotypicalGroup_Marker",
122
//			"HybridRelationship",
123
//			"HybridRelationship_Annotation",
124
//			"HybridRelationship_Marker",
125
//			"InstitutionalMembership",
126
			"LanguageString",
127
//			"Locus",
128
			"Marker",
129
			"Media",
130
			"MediaRepresentation",
131
			"MediaRepresentationPart",
132
//			"Media_Annotation",
133
//			"Media_Marker",
134
//			"Media_Rights",
135
//			"Media_Sequence",
136
//			"MediaKey_CoveredTaxon",
137
			"NameRelationship",
138
//			"NameRelationship_Annotation",
139
//			"NameRelationship_Marker",
140
			"NomenclaturalStatus",
141
//			"NomenclaturalStatus_Annotation",
142
//			"NomenclaturalStatus_Marker",
143
			"OriginalSource",
144
//			"OriginalSource_Annotation",
145
//			"OriginalSource_Marker",
146
//			"Person_Keyword",
147
			"Reference",
148
//			"ReferenceBase_Annotation",
149
//			"ReferenceBase_Extension",
150
//			"ReferenceBase_Marker",
151
//			"ReferenceBase_Media",
152
//			"ReferenceBase_OriginalSource",
153
//			"ReferenceBase_Rights",
154
//			"RelationshipTermBase_inverseRepresentation",
155
			"Representation",
156
//			"Rights",
157
//			"Sequence",
158
//			"Sequence_Annotation",
159
//			"Sequence_Extension",
160
//			"Sequence_Marker",
161
//			"Sequence_Media",
162
//			"Sequence_OriginalSource",
163
//			"Sequence_ReferenceBase",
164
//			"Sequence_Rights",
165
			"SpecimenOrObservationBase",
166
//			"SpecimenOrObservationBase_Annotation",
167
//			"SpecimenOrObservationBase_DerivationEvent",
168
//			"SpecimenOrObservationBase_Extension",
169
//			"SpecimenOrObservationBase_Marker",
170
//			"SpecimenOrObservationBase_Media",
171
//			"SpecimenOrObservationBase_OriginalSource",
172
//			"SpecimenOrObservationBase_Rights",
173
//			"StateData",
174
//			"StateData_DefinedTermBase",
175
//			"StatisticalMeasurementValue",
176
//			"StatisticalMeasurementValue_DefinedTermBase",
177
			"SynonymRelationship",
178
//			"SynonymRelationship_Annotation",
179
//			"SynonymRelationship_Marker",
180
			"TaxonBase",
181
//			"TaxonBase_Annotation",
182
//			"TaxonBase_Extension",
183
//			"TaxonBase_Marker",
184
//			"TaxonBase_OriginalSource",
185
//			"TaxonBase_Rights",
186
			"TaxonNameBase",
187
//			"TaxonNameBase_Annotation",
188
//			"TaxonNameBase_Extension",
189
//			"TaxonNameBase_HybridRelationship",
190
//			"TaxonNameBase_Marker",
191
//			"TaxonNameBase_NomenclaturalStatus",
192
//			"TaxonNameBase_OriginalSource",
193
//			"TaxonNameBase_Rights",
194
//			"TaxonNameBase_TypeDesignationBase",
195
			"TaxonRelationship",
196
//			"TaxonRelationship_Annotation",
197
//			"TaxonRelationship_Marker",
198
			"TermVocabulary",
199
//			"TermVocabulary_Representation",
200
			"TypeDesignationBase",
201
//			"TypeDesignationBase_Annotation",
202
//			"TypeDesignationBase_Marker",
203
	};
204

  
205
//	@Autowired
206
//	@Qualifier("cdmDao")
207
//	private ICdmEntityDao cdmDao;
208

  
209
//	@Autowired
210
//	protected void setDao(ICdmEntityDao dao) {
211
//		logger.debug("setting DAO");
212
//		this.cdmDao = dao;
213
//	}
214

  
215
//	@Autowired
216
//	private SessionFactory factory;
217
//
218
//	protected Session getSession(){
219
//	Session session = factory.getCurrentSession();
220
//	return session;
221
//}
222

  
223
//    public ResultSet getResultSet (String query){
224
//    	ResultSet rs;
225
//    	try {
226
//            this.getConnection(); //establish connection
227
//        	if (query == null){
228
//        		return null;
229
//        	}
230
//            mStmt = mConn.createStatement();
231
//            rs = mStmt.executeQuery(query);
232
//            return rs;
233
//        }catch(SQLException e){
234
//            logger.error("Problems when creating Resultset for query \n  " + query + " \n" + "Exception: " + e);
235
//            return null;
236
//        }
237
//    }
238

  
239
	private Map<String, List<String>> doLoadDataFromDb(String dbname, Source source) {
240

  
241
		Map<String, List<String>> dbTables = new HashMap<String, List<String>>();
242

  
243
		logger.info("Loading data from DB " + dbname);
244

  
245
		CdmApplicationController appCtr = null;
246

  
247

  
248
		String password = AccountStore.readOrStorePassword(dbname, server, username, null);
249

  
250
		DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;
251
		ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
252
		appCtr = CdmApplicationController.NewInstance(datasource, dbSchemaValidation, true);
253

  
254

  
255
    	TransactionStatus txStatus = appCtr.startTransaction(true);
256

  
257
    	// get data from DB
258

  
259
    	try {
260

  
261
    		dbTables = retrieveAllTables(appCtr);
262

  
263
    	} catch (Exception e) {
264
    		logger.error("error setting data");
265
    		e.printStackTrace();
266
    	}
267
    	appCtr.commitTransaction(txStatus);
268
    	appCtr.close();
269

  
270
    	return dbTables;
271

  
272
    }
273

  
274
	private Map<String, List<CdmBase>> doLoadDataFromDb_(String dbname) {
275

  
276
		Map<String, List<CdmBase>> dbTables = new HashMap<String, List<CdmBase>>();
277

  
278
		logger.info("Loading data from DB " + dbname);
279

  
280
		CdmApplicationController appCtr = null;
281

  
282

  
283
		String password = AccountStore.readOrStorePassword(dbname, server, username, null);
284

  
285
		DbSchemaValidation dbSchemaValidation = DbSchemaValidation.VALIDATE;
286
		ICdmDataSource datasource = CdmDataSource.NewMySqlInstance(server, dbname, username, password);
287
		appCtr = CdmApplicationController.NewInstance(datasource, dbSchemaValidation, true);
288

  
289

  
290
    	TransactionStatus txStatus = appCtr.startTransaction(true);
291

  
292
    	// get data from DB
293

  
294
    	try {
295

  
296
    		dbTables = retrieveAllTables_(appCtr);
297

  
298
    	} catch (Exception e) {
299
    		logger.error("error setting data");
300
    		e.printStackTrace();
301
    	}
302
    	appCtr.commitTransaction(txStatus);
303
    	appCtr.close();
304

  
305
    	return dbTables;
306

  
307
    }
308

  
309
	private Map<String, List<String>> doLoadDataFromDb__(String dbname, Source source) {
310

  
311
		Map<String, List<String>> dbTables = new HashMap<String, List<String>>();
312

  
313
		logger.info("Loading data from DB " + dbname);
314

  
315
    	try {
316

  
317
    		dbTables = retrieveAllTables__(source);
318

  
319
    	} catch (Exception e) {
320
    		logger.error("error setting data");
321
    		e.printStackTrace();
322
    	}
323
    	return dbTables;
324

  
325
    }
326

  
327
    private Map<String, List<CdmBase>> retrieveAllTables_(CdmApplicationController appCtr) {
328

  
329
		Map<String, List<CdmBase>> tables_ = new HashMap<String, List<CdmBase>>(table_list.length);
330

  
331
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
332

  
333
		//List<Agent> agents = appCtr.getAgentService().getAllAgents(MAX_ROWS, 0);
334

  
335
		try {
336
			//get data from database
337
			for (int i = 0; i < table_list.length; i++) {
338

  
339
	    		logger.debug("Retrieving table '" + table_list[i] + "'");
340
	    		System.out.println("Retrieving table '" + table_list[i] + "'");
341

  
342
				List<CdmBase> rows = new ArrayList<CdmBase>(MAX_ROWS);
343

  
344
				rows = appCtr.getMainService().rows(table_list[i], MAX_ROWS, 0);
345

  
346
    			tables_.put(table_list[i], rows);
347

  
348
			}
349

  
350
		} catch (Exception e) {
351
    		logger.error("error retrieving data");
352
    		e.printStackTrace();
353
		}
354
//		return tables;
355
		return tables_;
356
    }
357

  
358
    private Map<String, List<String>> retrieveAllTables___(Source source) {
359

  
360
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
361
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
362

  
363
		try {
364
			//get data from database
365
			for (int i = 0; i < table_list.length; i++) {
366

  
367
				List<String> rows = new ArrayList<String>(MAX_ROWS);
368

  
369
//					Session session = factory.getCurrentSession();
370

  
371
//					if ( sessionObject != null ) {
372
//						session.update(sessionObject);
373
//					}
374
//					Query query = session.createQuery("select term from DefinedTermBase term join fetch term.representations representation where representation.label = :label");
375
//					query.setParameter("label", queryString);
376

  
377
//					Query query = session.createQuery("select from " + table_list[i]);
378
//				    rows = query.list();
379

  
380
				//FIXME: NullPointerException (cdmDao is null)
381
				    //rows = cdmDao.list(MAX_ROWS, 0);
382
					tables.put(table_list[i], rows);
383

  
384
				}
385

  
386
		} catch (Exception e) {
387
    		logger.error("error retrieving data");
388
    		e.printStackTrace();
389
		}
390
		return tables;
391
    }
392

  
393
    private Map<String, List<String>> retrieveAllTables__(Source source) {
394

  
395
//		IImportConfigurator config = new BerlinModelImportConfigurator;
396
//		BerlinModelImportConfigurator bmiConfig = (BerlinModelImportConfigurator)config;
397
//		Source source = bmiConfig.getSource();
398
//		ResultSet rs = berlinModelSource.getResultSet();
399

  
400
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
401
		List<String> tableRows = new ArrayList<String>(MAX_ROWS);
402

  
403
		try {
404
			//get data from database
405
			for (int i = 0; i < table_list.length; i++) {
406
				String strQuery =
407
					" SELECT * FROM " + table_list[i];
408
				logger.debug("SQL Statement: " +  strQuery);
409
				//ResultSet rs = berlinModelSource.getResultSet();
410
				//ResultSet rs = source.getResultSet(strQuery) ;
411
				ResultSet rs = source.getResultSet(strQuery) ;
412
				List<String> rows = new ArrayList<String>(MAX_ROWS);
413

  
414
				while (rs.next()) {
415
					rows.add(rs.toString());
416
				}
417
				tables.put(table_list[i], rows);
418
			}
419
		} catch (SQLException e) {
420
			logger.error("SQLException:" +  e);
421
		}
422
		return tables;
423
    }
424

  
425
    private Map<String, List<String>> retrieveAllTables(CdmApplicationController appCtr) {
426

  
427
		Map<String, List<String>> tables = new HashMap<String, List<String>>(table_list.length);
428

  
429
		List<String> agentTableContent = new ArrayList<String>(MAX_ROWS);
430
		List<? extends AgentBase> agents = appCtr.getAgentService().list(null,MAX_ROWS, 0,null,null);
431
		for (AgentBase agent: agents ) {
432
			//TODO: Want the entire row as string not just toString() of the object.
433
			agentTableContent.add(agent.toString());
434
		}
435
		tables.put("agents", agentTableContent);
436

  
437
		//List<Annotation> annotations = appCtr.getTermService().getAllAnnotations(MAX_ROWS, 0);
438

  
439
		List<String> definedTermBaseTableContent = new ArrayList<String>(MAX_ROWS);
440
		List<DefinedTermBase> definedTermBases = appCtr.getTermService().list(null,MAX_ROWS, 0,null,null);
441
		for (DefinedTermBase definedTermBase: definedTermBases ) {
442
			definedTermBaseTableContent.add(definedTermBase.toString());
443
		}
444
		tables.put("definedTermBases", definedTermBaseTableContent);
445

  
446
		//List<DescriptionBase> descriptionBases = appCtr.getDescriptionService().getAllDescriptionBases(MAX_ROWS, 0);
447
		//List<DescriptionElementBase> descriptionElementBases = appCtr.getDescriptionService().getAllDescriptionElementBases(MAX_ROWS, 0);
448
		//List<HomotypicalGroup> homotypicalGroups = appCtr.getNameService().getAllHomotypicalGroups(MAX_ROWS, 0);
449
		List<LanguageString> languageStrings = appCtr.getTermService().getAllLanguageStrings(MAX_ROWS, 0);
450
		//List<Marker> markers = appCtr.getTermService().getAllMarkers(MAX_ROWS, 0);
451
		//List<NameRelationship> nameRelationships = appCtr.getNameService().getAllNameRelationships(MAX_ROWS, 0);
452
		List<NomenclaturalStatus> nomenclaturalStatus = appCtr.getNameService().getAllNomenclaturalStatus(MAX_ROWS, 0);
453
		//List<OriginalSource> originalSources = appCtr.getNameService().getAllOriginalSources(MAX_ROWS, 0);
454
		List<Reference> references = appCtr.getReferenceService().list(null,MAX_ROWS, 0,null,null);
455
		List<Representation> representations = appCtr.getTermService().getAllRepresentations(MAX_ROWS, 0);
456
		List<SpecimenOrObservationBase> specimenOrObservationBases = appCtr.getOccurrenceService().list(null,MAX_ROWS, 0,null,null);
457
		//List<SynonymRelationship> synonymRelationships = appCtr.getTaxonService().getAllSynonymRelationships(MAX_ROWS, 0);
458
//		List<TaxonBase> taxonBases = appCtr.getTaxonService().getAllTaxa(MAX_ROWS, 0);
459
//		List<TaxonNameBase> taxonNameBases = appCtr.getNameService().getAllNames(MAX_ROWS, 0);
460
		//List<TaxonRelationship> taxonRelationships = appCtr.getTaxonService().getAllTaxonRelationships(MAX_ROWS, 0);
461
		List<TermVocabulary> termVocabularies = appCtr.getVocabularyService().list(null,MAX_ROWS, 0,null,null);
462
		List<TypeDesignationBase> typeDesignationBases = appCtr.getNameService().getAllTypeDesignations(MAX_ROWS, 0);
463

  
464
		return tables;
465
	}
466

  
467
     private void compareTables(String tableName, List<CdmBase> tablesDbOne, List<CdmBase> tablesDbTwo) {
468

  
469
		int tableOneSize = tablesDbOne.size();
470
		int tableTwoSize = tablesDbTwo.size();
471
		int tableMinSize = 0;
472
		int tableMaxSize = 0;
473

  
474
		if (tableOneSize != tableTwoSize) {
475
			logger.warn("Table '" + tableName + "', Rows differ: " + tablesDbOne.size() + ", " + tablesDbTwo.size());
476
            tableMinSize = Math.min(tableOneSize, tableTwoSize);
477
            tableMaxSize = Math.max(tableOneSize, tableTwoSize);
478
		} else {
479
			logger.info("Table '" + tableName + "': " + tablesDbOne.size());
480
		}
481

  
482
		int different = 0;
483

  
484
		try {
485
		for (int i = 0; i < tableMinSize; i++) {
486

  
487
			CdmBase obj1 = tablesDbOne.get(i);
488
			CdmBase obj2 = tablesDbTwo.get(i);
489

  
490
			// This compares only whether both tables contain the same objects.
491
			// It doesn't check whether all field values are the same.
492
			logger.debug("Row # " + i + ":");
493
			if (obj1.equals(obj2) != true) {
494
				different++;
495
				logger.debug("Table 1 = " + obj1);
496
				logger.debug("Table 2 = " + obj2);
497
			} else {
498
				logger.debug("Entry = " + obj1);
499
			}
500
		}
501
		if (different > 0) {
502
			logger.info("# Rows identical: " + (tableMaxSize - different));
503
			logger.warn("# Rows different: " + different);
504
		}
505
		} catch (org.hibernate.LazyInitializationException e){
506
			logger.error("LazyInitializationException");
507
		}
508
	}
509

  
510
    	private void doCompareDatabases(Map<String, List<CdmBase>> tablesDbOne, Map<String, List<CdmBase>> tablesDbTwo) {
511
//        public void doCompareDatabases(Map<String, List<String>> tablesDbOne, Map<String, List<String>> tablesDbTwo) {
512

  
513
		logger.debug("# Tables in DB 1: " + tablesDbOne.size());
514
		logger.debug("# Tables in DB 2: " + tablesDbTwo.size());
515

  
516
		for (String tableName: tablesDbOne.keySet()) {
517

  
518
			logger.info("Comparing table '" + tableName + "'");
519

  
520
//			List<String> dbOneTableRows = new ArrayList<String>();
521
//			List<String> dbTwoTableRows = new ArrayList<String>();
522
			List<CdmBase> dbOneTableRows = new ArrayList<CdmBase>();
523
			List<CdmBase> dbTwoTableRows = new ArrayList<CdmBase>();
524

  
525
			dbOneTableRows = tablesDbOne.get(tableName);
526
			dbTwoTableRows = tablesDbTwo.get(tableName);
527

  
528
//			Collections.sort(dbOneTableRows);
529
//			Collections.sort(dbTwoTableRows);
530

  
531
			int different = 0;
532
			int tableSize = dbOneTableRows.size();
533

  
534
			for (int i = 0; i < tableSize; i++) {
535

  
536
//				String str1 = dbOneTableRows.get(i);
537
//				String str2 = dbTwoTableRows.get(i);
538
				CdmBase str1 = dbOneTableRows.get(i);
539
				CdmBase str2 = dbTwoTableRows.get(i);
540

  
541
				if (str1.equals(str2) != true) {
542

  
543
					different++;
544
					logger.debug("Rows differ:");
545
					logger.debug("Table 1 Row = " + str1);
546
					logger.debug("Table 2 Row = " + str2);
547

  
548
				}
549
				i++;
550
			}
551
			if (different > 0) {
552
				logger.info("Compared table '" + tableName + "':");
553
				logger.info("# Rows total: " + tableSize);
554
				logger.info("# Rows identical: " + (tableSize - different));
555
				logger.warn("# Rows different: " + different);
556
			}
557
		}
558
		logger.info("End database comparison");
559
	}
560

  
561
//	private void test_(){
562
//
563
//		Map<String, List<CdmBase>> tablesDbOne = doLoadDataFromDb_(sourceDbOne);
564
//		Map<String, List<CdmBase>> tablesDbTwo = doLoadDataFromDb_(sourceDbTwo);
565
//	    doCompareDatabases(tablesDbOne, tablesDbTwo);
566
//
567
//	}
568

  
569
	private void test(){
570

  
571
		CdmApplicationController appCtrOne = null;
572
		CdmApplicationController appCtrTwo = null;
573
		logger.info("Comparing '" + sourceDbOne + "' and '" + sourceDbTwo + "'");
574

  
575
		try {
576
			appCtrOne = CdmApplicationController.NewInstance(sourceOne, DbSchemaValidation.VALIDATE, true);
577
			appCtrTwo = CdmApplicationController.NewInstance(sourceTwo, DbSchemaValidation.VALIDATE, true);
578

  
579
		} catch (Exception e) {
580
			logger.error("Error creating application controller");
581
			e.printStackTrace();
582
			System.exit(1);
583
		}
584

  
585
		try {
586
			//get data from database
587
	    	TransactionStatus txStatOne = appCtrOne.startTransaction(true);
588
	    	TransactionStatus txStatTwo = appCtrTwo.startTransaction(true);
589
			for (int i = 0; i < table_list.length; i++) {
590

  
591
				List<CdmBase> rowsDbOne = new ArrayList<CdmBase>(MAX_ROWS);
592
				List<CdmBase> rowsDbTwo = new ArrayList<CdmBase>(MAX_ROWS);
593
				rowsDbOne = appCtrOne.getMainService().rows(table_list[i], MAX_ROWS, 0);
594
				rowsDbTwo = appCtrTwo.getMainService().rows(table_list[i], MAX_ROWS, 0);
595
				compareTables(table_list[i], rowsDbOne, rowsDbTwo);
596
			}
597
	    	appCtrTwo.commitTransaction(txStatTwo);
598
	    	appCtrOne.commitTransaction(txStatOne);
599
	    	//java.lang.IllegalStateException: Cannot deactivate transaction synchronization - not active
600
	    	appCtrOne.close();
601
	    	appCtrTwo.close();
602
			logger.info("End database comparison");
603

  
604
		} catch (Exception e) {
605
    		logger.error("Error retrieving or comparing data");
606
    		e.printStackTrace();
607
		}
608
	}
609

  
610
	/**
611
	 * @param args
612
	 */
613
	public static void  main(String[] args) {
614
		TestCdmDbComparator diff = new TestCdmDbComparator();
615
    	diff.test();
616
	}
617
}
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/io/ClearDBDataSet.xml
206 206
  <HYBRIDRELATIONSHIP_AUD/>
207 207
  <HYBRIDRELATIONSHIP_MARKER/>
208 208
  <HYBRIDRELATIONSHIP_MARKER_AUD/>
209
  <INDIVIDUALASSOCIATION_LANGUAGESTRING/>
210
  <INDIVIDUALASSOCIATION_LANGUAGESTRING_AUD/>
209
  <INDIVIDUALSASSOCIATION_LANGUAGESTRING/>
210
  <INDIVIDUALSASSOCIATION_LANGUAGESTRING_AUD/>
211 211
  <INSTITUTIONALMEMBERSHIP/>
212 212
  <INSTITUTIONALMEMBERSHIP_AUD/>
213 213
  <KEYSTATEMENT/>
......
229 229
  <MEDIAKEY_NAMEDAREA_AUD/>
230 230
  <MEDIAKEY_SCOPE/>
231 231
  <MEDIAKEY_SCOPE_AUD/>
232
  <MEDIAKEY_TAXON/>
233
  <MEDIAKEY_TAXON_AUD/>
232
  <MEDIAKEY_TAXONSCOPE/>
233
  <MEDIAKEY_TAXONSCOPE_AUD/>
234 234
  <MEDIAREPRESENTATION/>
235 235
  <MEDIAREPRESENTATIONPART/>
236 236
  <MEDIAREPRESENTATIONPART_AUD/>
......
257 257
  <MEDIA_REPRESENTATION_AUD/>
258 258
  <MEDIA_RIGHTSINFO/>
259 259
  <MEDIA_RIGHTSINFO_AUD/>
260
  <MEDIA_TAXONBASE/>
261
  <MEDIA_TAXONBASE_AUD/>
260
  <MEDIAKEY_COVEREDTAXON/>
261
  <MEDIAKEY_COVEREDTAXON_AUD/>
262 262
  <MULTIACCESSKEY_NAMEDAREA/>
263 263
  <MULTIACCESSKEY_NAMEDAREA_AUD/>
264 264
  <MULTIACCESSKEY_SCOPE/>
265 265
  <MULTIACCESSKEY_SCOPE_AUD/>
266
  <MULTIACCESSKEY_TAXON/>
267
  <MULTIACCESSKEY_TAXON_AUD/>
266
  <MULTIACCESSKEY_TAXONSCOPE/>
267
  <MULTIACCESSKEY_TAXONSCOPE_AUD/>
268 268
  <NAMERELATIONSHIP/>
269 269
  <NAMERELATIONSHIP_ANNOTATION/>
270 270
  <NAMERELATIONSHIP_ANNOTATION_AUD/>
......
456 456
  <WORKINGSET_MARKER_AUD/>
457 457
  <WORKINGSET_REPRESENTATION/>
458 458
  <WORKINGSET_REPRESENTATION_AUD/>
459
  <WORKINGSET_TAXONBASE/>
460
  <WORKINGSET_TAXONBASE_AUD/>
459
  <MULTIACCESSKEY_COVEREDTAXON/>
460
  <MULTIACCESSKEY_COVEREDTAXON_AUD/>
461 461
</dataset>
cdmlib-io/src/test/resources/eu/etaxonomy/cdm/io/ClearDB_with_Terms_DataSet.xml
1
<?xml version='1.0' encoding='UTF-8'?>
2
<dataset xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../service/dataset.xsd">
3
<ADDRESS />
4
<ADDRESS_AUD />
5
<AGENTBASE />
6
<AGENTBASE_ADDRESS />
7
<AGENTBASE_ADDRESS_AUD />
8
<AGENTBASE_AGENTBASE />
9
<AGENTBASE_AGENTBASE_AUD />
10
<AGENTBASE_ANNOTATION />
11
<AGENTBASE_ANNOTATION_AUD />
12
<AGENTBASE_AUD />
13
<AGENTBASE_CONTACT_EMAILADDRESSES />
14
<AGENTBASE_CONTACT_EMAILADDRESSES_AUD />
15
<AGENTBASE_CONTACT_FAXNUMBERS />
16
<AGENTBASE_CONTACT_FAXNUMBERS_AUD />
17
<AGENTBASE_CONTACT_PHONENUMBERS />
18
<AGENTBASE_CONTACT_PHONENUMBERS_AUD />
19
<AGENTBASE_CONTACT_URLS />
20
<AGENTBASE_CONTACT_URLS_AUD />
21
<AGENTBASE_CREDIT />
22
<AGENTBASE_CREDIT_AUD />
23
<AGENTBASE_DEFINEDTERMBASE />
24
<AGENTBASE_DEFINEDTERMBASE_AUD />
25
<AGENTBASE_EXTENSION />
26
<AGENTBASE_EXTENSION_AUD />
27
<AGENTBASE_MARKER />
28
<AGENTBASE_MARKER_AUD />
29
<AGENTBASE_MEDIA />
30
<AGENTBASE_MEDIA_AUD />
31
<AGENTBASE_ORIGINALSOURCEBASE />
32
<AGENTBASE_ORIGINALSOURCEBASE_AUD />
33
<AGENTBASE_RIGHTSINFO />
34
<AGENTBASE_RIGHTSINFO_AUD />
35
<ANNOTATION />
36
<ANNOTATION_ANNOTATION />
37
<ANNOTATION_ANNOTATION_AUD />
38
<ANNOTATION_AUD />
39
<ANNOTATION_MARKER />
40
<ANNOTATION_MARKER_AUD />
41
<AUDITEVENT />
42
<CDMMETADATA />
43
<CDM_VIEW />
44
<CDM_VIEW_CDM_VIEW />
45
<CLASSIFICATION />
46
<CLASSIFICATION_ANNOTATION />
47
<CLASSIFICATION_ANNOTATION_AUD />
48
<CLASSIFICATION_AUD />
49
<CLASSIFICATION_CREDIT />
50
<CLASSIFICATION_CREDIT_AUD />
51
<CLASSIFICATION_EXTENSION />
52
<CLASSIFICATION_EXTENSION_AUD />
53
<CLASSIFICATION_MARKER />
54
<CLASSIFICATION_MARKER_AUD />
55
<CLASSIFICATION_ORIGINALSOURCEBASE />
56
<CLASSIFICATION_ORIGINALSOURCEBASE_AUD />
57
<CLASSIFICATION_RIGHTSINFO />
58
<CLASSIFICATION_RIGHTSINFO_AUD />
59
<!--<CLASSIFICATION_TAXONNODE />
60
  <CLASSIFICATION_TAXONNODE_AUD />-->
61
<COLLECTION />
62
<COLLECTION_ANNOTATION />
63
<COLLECTION_ANNOTATION_AUD />
64
<COLLECTION_AUD />
65
<COLLECTION_CREDIT />
66
<COLLECTION_CREDIT_AUD />
67
<COLLECTION_EXTENSION />
68
<COLLECTION_EXTENSION_AUD />
69
<COLLECTION_MARKER />
70
<COLLECTION_MARKER_AUD />
71
<COLLECTION_MEDIA />
72
<COLLECTION_MEDIA_AUD />
73
<COLLECTION_ORIGINALSOURCEBASE />
74
<COLLECTION_ORIGINALSOURCEBASE_AUD />
75
<COLLECTION_RIGHTSINFO />
76
<COLLECTION_RIGHTSINFO_AUD />
77
<CREDIT />
78
<CREDIT_ANNOTATION />
79
<CREDIT_ANNOTATION_AUD />
80
<CREDIT_AUD />
81
<CREDIT_MARKER />
82
<CREDIT_MARKER_AUD />
83
<DBMAINTAIN_SCRIPTS />
84
<DEFINEDTERMBASE />
85
<DEFINEDTERMBASE_ANNOTATION />
86
<DEFINEDTERMBASE_ANNOTATION_AUD />
87
<DEFINEDTERMBASE_AUD />
88
<DEFINEDTERMBASE_CONTINENT />
89
<DEFINEDTERMBASE_CONTINENT_AUD />
90
<DEFINEDTERMBASE_CREDIT />
91
<DEFINEDTERMBASE_CREDIT_AUD />
92
<DEFINEDTERMBASE_EXTENSION />
93
<DEFINEDTERMBASE_EXTENSION_AUD />
94
<DEFINEDTERMBASE_MARKER />
95
<DEFINEDTERMBASE_MARKER_AUD />
96
<DEFINEDTERMBASE_MEASUREMENTUNIT />
97
<DEFINEDTERMBASE_MEASUREMENTUNIT_AUD />
98
<DEFINEDTERMBASE_MEDIA />
99
<DEFINEDTERMBASE_MEDIA_AUD />
100
<DEFINEDTERMBASE_ORIGINALSOURCEBASE />
101
<DEFINEDTERMBASE_ORIGINALSOURCEBASE_AUD />
102
<DEFINEDTERMBASE_RECOMMENDEDMODIFIERENUMERATION />
103
<DEFINEDTERMBASE_RECOMMENDEDMODIFIERENUMERATION_AUD />
104
<DEFINEDTERMBASE_REPRESENTATION />
105
<DEFINEDTERMBASE_REPRESENTATION_AUD />
106
<DEFINEDTERMBASE_RIGHTSINFO />
107
<DEFINEDTERMBASE_RIGHTSINFO_AUD />
108
<DEFINEDTERMBASE_STATISTICALMEASURE />
109
<DEFINEDTERMBASE_STATISTICALMEASURE_AUD />
110
<DEFINEDTERMBASE_SUPPORTEDCATEGORICALENUMERATION />
111
<DEFINEDTERMBASE_SUPPORTEDCATEGORICALENUMERATION_AUD />
112
<DEFINEDTERMBASE_COUNTRY />
113
<DEFINEDTERMBASE_COUNTRY_AUD />
114
<DERIVATIONEVENT />
115
<DERIVATIONEVENT_ANNOTATION />
116
<DERIVATIONEVENT_ANNOTATION_AUD />
117
<DERIVATIONEVENT_AUD />
118
<DERIVATIONEVENT_MARKER />
119
<DERIVATIONEVENT_MARKER_AUD />
120
<DESCRIPTIONBASE />
121
<DESCRIPTIONBASE_ANNOTATION />
122
<DESCRIPTIONBASE_ANNOTATION_AUD />
123
<DESCRIPTIONBASE_AUD />
124
<DESCRIPTIONBASE_CREDIT />
125
<DESCRIPTIONBASE_CREDIT_AUD />
126
<DESCRIPTIONBASE_EXTENSION />
127
<DESCRIPTIONBASE_EXTENSION_AUD />
128
<DESCRIPTIONBASE_FEATURE />
129
<DESCRIPTIONBASE_FEATURE_AUD />
130
<DESCRIPTIONBASE_GEOSCOPE />
131
<DESCRIPTIONBASE_GEOSCOPE_AUD />
132
<DESCRIPTIONBASE_MARKER />
133
<DESCRIPTIONBASE_MARKER_AUD />
134
<DESCRIPTIONBASE_ORIGINALSOURCEBASE />
135
<DESCRIPTIONBASE_ORIGINALSOURCEBASE_AUD />
136
<DESCRIPTIONBASE_REFERENCE />
137
<DESCRIPTIONBASE_REFERENCE_AUD />
138
<DESCRIPTIONBASE_RIGHTSINFO />
139
<DESCRIPTIONBASE_RIGHTSINFO_AUD />
140
<DESCRIPTIONBASE_SCOPE />
141
<DESCRIPTIONBASE_SCOPE_AUD />
142
<DESCRIPTIONELEMENTBASE />
143
<DESCRIPTIONELEMENTBASE_ANNOTATION />
144
<DESCRIPTIONELEMENTBASE_ANNOTATION_AUD />
145
<DESCRIPTIONELEMENTBASE_AUD />
146
<DESCRIPTIONELEMENTBASE_LANGUAGESTRING />
147
<DESCRIPTIONELEMENTBASE_LANGUAGESTRING_AUD />
148
<DESCRIPTIONELEMENTBASE_MARKER />
149
<DESCRIPTIONELEMENTBASE_MARKER_AUD />
150
<DESCRIPTIONELEMENTBASE_MEDIA />
151
<DESCRIPTIONELEMENTBASE_MEDIA_AUD />
152
<DESCRIPTIONELEMENTBASE_MODIFIER />
153
<DESCRIPTIONELEMENTBASE_MODIFIER_AUD />
154
<DESCRIPTIONELEMENTBASE_MODIFYINGTEXT />
155
<DESCRIPTIONELEMENTBASE_MODIFYINGTEXT_AUD />
156
<DESCRIPTIONELEMENTBASE_ORIGINALSOURCEBASE />
157
<DESCRIPTIONELEMENTBASE_ORIGINALSOURCEBASE_AUD />
158
<DETERMINATIONEVENT />
159
<DETERMINATIONEVENT_ANNOTATION />
160
<DETERMINATIONEVENT_ANNOTATION_AUD />
161
<DETERMINATIONEVENT_AUD />
162
<DETERMINATIONEVENT_MARKER />
163
<DETERMINATIONEVENT_MARKER_AUD />
164
<DETERMINATIONEVENT_REFERENCE />
165
<DETERMINATIONEVENT_REFERENCE_AUD />
166
<EXTENSION />
167
<EXTENSION_AUD />
168
<FEATURENODE />
169
<FEATURENODE_AUD />
170
<FEATURENODE_DEFINEDTERMBASE_INAPPLICABLEIF />
171
<FEATURENODE_DEFINEDTERMBASE_INAPPLICABLEIF_AUD />
172
<FEATURENODE_DEFINEDTERMBASE_ONLYAPPLICABLE />
173
<FEATURENODE_DEFINEDTERMBASE_ONLYAPPLICABLE_AUD />
174
<FEATURETREE />
175
<FEATURETREE_ANNOTATION />
176
<FEATURETREE_ANNOTATION_AUD />
177
<FEATURETREE_AUD />
178
<FEATURETREE_CREDIT />
179
<FEATURETREE_CREDIT_AUD />
180
<FEATURETREE_EXTENSION />
181
<FEATURETREE_EXTENSION_AUD />
182
<FEATURETREE_MARKER />
183
<FEATURETREE_MARKER_AUD />
184
<FEATURETREE_ORIGINALSOURCEBASE />
185
<FEATURETREE_ORIGINALSOURCEBASE_AUD />
186
<FEATURETREE_REPRESENTATION />
187
<FEATURETREE_REPRESENTATION_AUD />
188
<FEATURETREE_RIGHTSINFO />
189
<FEATURETREE_RIGHTSINFO_AUD />
190
<GATHERINGEVENT />
191
<GATHERINGEVENT_ANNOTATION />
192
<GATHERINGEVENT_ANNOTATION_AUD />
193
<GATHERINGEVENT_AUD />
194
<GATHERINGEVENT_DEFINEDTERMBASE />
195
<GATHERINGEVENT_DEFINEDTERMBASE_AUD />
... This diff was truncated because it exceeds the maximum size that can be displayed.

Also available in: Unified diff