Project

General

Profile

« Previous | Next » 

Revision 1c114e62

Added by Andreas Müller almost 13 years ago

Tests and first documentation for getHierarchieList

View differences:

cdmlib-model/src/main/java/eu/etaxonomy/cdm/model/location/NamedArea.java
335 335
	
336 336
	
337 337
	
338
	public NamedAreaNode getHiearchieList(List<NamedArea> areaList){
338
	/**
339
	 * This method returns a sorted tree structure which sorts areas by it's level and within the same level
340
	 * alphabetically (TODO to be tested).
341
	 * The structure returned is a tree with alternating nodes that represent an area and an areaLevel.
342
	 * This way also area the have children belonging to different levels can be handled.<BR>
343
	 * The root node is always an empty area node which holds the list of top level areaLevels.
344
	 * AreaLevels with no level defined are handled as if they have a separate level (level="null").
345
	 * 
346
	 * @param areaList
347
	 * @return
348
	 */
349
	public static NamedAreaNode getHiearchieList(List<NamedArea> areaList){
339 350
		NamedAreaNode result = new NamedAreaNode();
340 351
		for (NamedArea area : areaList){
341 352
			List<NamedArea> areaHierarchie  = area.getAllLevelList();
......
345 356
	}
346 357
	
347 358
	
348
	public class LevelNode {
359
	public static class LevelNode {
349 360
		NamedAreaLevel level;
350 361
		List<NamedAreaNode> areaList = new ArrayList<NamedAreaNode>();
351 362

  
......
367 378
		}
368 379

  
369 380
		public String toString() {
370
			return level.getTitleCache();
381
			return toString(false, 0);
382
		}
383
		public String toString(boolean recursive, int identation) {
384
			String result = level == null? "" :level.getTitleCache();
385
			if (recursive == false){
386
				return result;
387
			}else{
388
				int areaSize = this.areaList.size();
389
				if (areaSize > 0){
390
					result = "\n" + StringUtils.leftPad("", identation) + result  + "[";
391
				}
392
				boolean isFirst = true;
393
				for (NamedAreaNode level: this.areaList){
394
					if (isFirst){
395
						isFirst = false;
396
					}else{
397
						result += ",";
398
					}
399
					result += level.toString(recursive, identation+1);
400
				}
401
				if (areaSize > 0){
402
					result += "]";
403
					
404
				}
405
				return result;
406
			}
371 407
		}
372 408

  
373 409
	}
374 410

  
375
	public class NamedAreaNode {
411
	public static class NamedAreaNode {
376 412
		NamedArea area;
377 413
		List<LevelNode> levelList = new ArrayList<LevelNode>();
378 414
		
379 415
		public LevelNode getLevelNode(NamedAreaLevel level) {
380 416
			for (LevelNode node : levelList) {
381
				if (node.level.equals(level)) {
417
				if (node.level != null &&  node.level.equals(level)) {
382 418
					return node;
383 419
				}
384 420
			}
......
410 446
		}
411 447

  
412 448
		public String toString() {
413
			if (area == null) {
414
				return "";
449
			return toString(false, 0);
450
		}
451
		
452
		public String toString(boolean recursive, int identation) {
453
			String result = "";
454
			if (area != null) {
455
				result = area.getTitleCache();
456
			}
457
			if (recursive){
458
				int levelSize = this.levelList.size();
459
				if (levelSize > 0){
460
					result = "\n" + StringUtils.leftPad("", identation) + result  + "[";
461
				}
462
				boolean isFirst = true;
463
				for (LevelNode level: this.levelList){
464
					if (isFirst){
465
						isFirst = false;
466
					}else{
467
						result += ";";
468
					}
469
					result += level.toString(recursive, identation+1);
470
				}
471
				if (levelSize > 0){
472
					result += "]";
473
					
474
				}
475
				return result;
476
			}else{
477
				int levelSize = this.levelList.size();
478
				return result + "[" + levelSize + " sublevel(s)]";
415 479
			}
416
			return area.getTitleCache();
417 480
		}
418 481
	}
419 482

  
420
	private void mergeIntoResult(NamedAreaNode root,
421
			List<NamedArea> areaHierarchie) {
483
	private static void mergeIntoResult(NamedAreaNode root, List<NamedArea> areaHierarchie) {
422 484
		if (areaHierarchie.isEmpty()) {
423 485
			return;
424 486
		}
425 487
		NamedArea highestArea = areaHierarchie.get(0);
426 488
		NamedAreaLevel level = highestArea.getLevel();
427 489
		NamedAreaNode namedAreaNode;
428
		if (!root.contains(level)) {
490
		if (! root.contains(level)) {
429 491
			LevelNode node = root.add(level);
430 492
			namedAreaNode = node.add(highestArea);
493
			//NEW
494
//			root.area = highestArea;
431 495
		} else {
432 496
			LevelNode levelNode = root.getLevelNode(level);
433 497
			namedAreaNode = levelNode.getNamedAreaNode(highestArea);
......
435 499
				namedAreaNode = levelNode.add(highestArea);
436 500
			}
437 501
		}
438
		List<NamedArea> newList = areaHierarchie.subList(1, areaHierarchie
439
				.size());
502
		List<NamedArea> newList = areaHierarchie.subList(1, areaHierarchie.size());
440 503
		mergeIntoResult(namedAreaNode, newList);
441 504

  
442 505
	}
cdmlib-model/src/test/java/eu/etaxonomy/cdm/model/location/NamedAreaTest.java
9 9
*/
10 10
package eu.etaxonomy.cdm.model.location;
11 11

  
12
import java.util.ArrayList;
13
import java.util.List;
14

  
12 15
import org.apache.log4j.Logger;
13 16
import org.junit.Assert;
14 17
import org.junit.Before;
......
17 20

  
18 21
import eu.etaxonomy.cdm.model.common.DefaultTermInitializer;
19 22
import eu.etaxonomy.cdm.model.common.Language;
23
import eu.etaxonomy.cdm.model.location.NamedArea.LevelNode;
24
import eu.etaxonomy.cdm.model.location.NamedArea.NamedAreaNode;
20 25

  
21 26
/**
22 27
 * @author a.mueller
......
71 76
		
72 77
		//TODO include Vocabulay information
73 78
	}
79
	
80
	@Test
81
	public void getHiearchieListTest(){
82
		//Create example data
83
		List<NamedArea> list = new ArrayList<NamedArea>(); 
84
		NamedArea germanyL4 = TdwgArea.getAreaByTdwgAbbreviation("GER-OO");
85
		Assert.assertNotNull("Prerequisite: Germany should not be null", germanyL4);
86
		list.add(germanyL4);
87
		NamedArea franceL3 = TdwgArea.getAreaByTdwgAbbreviation("FRA");
88
		Assert.assertNotNull("Prerequisite: France should not be null", germanyL4);
89
		list.add(franceL3);
90
		NamedArea europe = TdwgArea.getAreaByTdwgAbbreviation("1");
91
		NamedArea middleEurope = TdwgArea.getAreaByTdwgAbbreviation("11");
92
//		System.out.println(middleEurope.getLabel());
93
		NamedArea southWestEurope = TdwgArea.getAreaByTdwgAbbreviation("12");
94
//		System.out.println(southWestEurope.getLabel());
95
		NamedArea germanyL3 = TdwgArea.getAreaByTdwgAbbreviation("GER");
96
		
97
		NamedArea newArea1 = NamedArea.NewInstance("New Area1 Description", "New Area1", "NA1");
98
		list.add(newArea1);
99
		NamedArea newArea2 = NamedArea.NewInstance("New Area2 Description", "New Area2", "NA2");
100
		NamedAreaLevel newLevel = NamedAreaLevel.NewInstance("New Level Description", "New level", "NL");
101
		newArea2.setLevel(newLevel);
102
		list.add(newArea2);
103
		
104
		NamedArea newGermanSubAreaAndLevel = NamedArea.NewInstance("New German Level 3 subarea", "New GER subarea", "GER-L5");
105
		NamedAreaLevel newGermanLevel5 = NamedAreaLevel.NewInstance("New German Level 5 Description", "GER Level 5", "GERL5");
106
		newGermanSubAreaAndLevel.setLevel(newGermanLevel5);
107
		germanyL3.addIncludes(newGermanSubAreaAndLevel);
108
//		germanyL3.getLevel().addIncludes(newGermanLevel5);
109
		list.add(newGermanSubAreaAndLevel);
110
		
111
		
112
		
113
		
114
		NamedAreaNode root = NamedArea.getHiearchieList(list);
115
		
116
		//level 0
117
		Assert.assertNull("Root should not have an area", root.area);
118
		//level1
119
		Assert.assertEquals("level1 list should include 3 levels", 3, root.levelList.size());
120
		LevelNode firstLevel1 = root.levelList.get(0);
121
		Assert.assertEquals(europe.getLevel(), firstLevel1.level);
122
		Assert.assertEquals("There should be 1 level1 area", 1, firstLevel1.areaList.size());
123
		NamedAreaNode level1AreaNode = firstLevel1.areaList.get(0);
124
		Assert.assertEquals("Level 1 area should be Europe", europe, level1AreaNode.area);
125
		LevelNode secondLevel1 = root.levelList.get(1);
126
		Assert.assertEquals(null, secondLevel1.level);
127
		
128
			//level 2
129
			Assert.assertEquals("level2 list should not be empty", 1, level1AreaNode.levelList.size());
130
			LevelNode firstLevel2 = level1AreaNode.levelList.get(0);
131
			Assert.assertEquals(middleEurope.getLevel(), firstLevel2.level);
132
			Assert.assertEquals("There should be 2 level2 area", 2, firstLevel2.areaList.size());
133
			NamedAreaNode middleEuropeAreaNode = firstLevel2.areaList.get(0);
134
			NamedAreaNode southWestAreaNode = firstLevel2.areaList.get(1);
135
			Assert.assertEquals("First level2 area should be MiddleEurope (11)", middleEurope, middleEuropeAreaNode.area);
136
			Assert.assertEquals("Second level2 area should be SouthWesternEurope (12)", southWestEurope, southWestAreaNode.area);
137
			//level 3
138
				//Middle Europe
139
				Assert.assertEquals("level3 list for Middle Europe should not be empty", 1, middleEuropeAreaNode.levelList.size());
140
				LevelNode middleEuropeLevel3 = middleEuropeAreaNode.levelList.get(0);
141
				Assert.assertEquals(germanyL3.getLevel(), middleEuropeLevel3.level);
142
				Assert.assertEquals("There should be 1 middle europe area", 1, middleEuropeLevel3.areaList.size());
143
				NamedAreaNode middleEuropeLevel3Area = middleEuropeLevel3.areaList.get(0);
144
				Assert.assertEquals("Middle Europe level 3 area should be GER", germanyL3, middleEuropeLevel3Area.area);
145
					//level 4
146
					Assert.assertEquals("sublevel list for GER should have 2 levels, TDWG level 4 and the new GER-L5", 2, middleEuropeLevel3Area.levelList.size());
147
					LevelNode germanyLevel3SubLevels = middleEuropeLevel3Area.levelList.get(0);
148
					Assert.assertEquals("Germany Level 3 sublevel should be level4", germanyL4.getLevel(), germanyLevel3SubLevels.level);
149
					Assert.assertEquals("There should be 1 GER subarea", 1, germanyLevel3SubLevels.areaList.size());
150
					NamedAreaNode germanyL3FirstSubArea = germanyLevel3SubLevels.areaList.get(0);
151
					Assert.assertEquals("Germany level 3 subarea should be GER-OO", germanyL4, germanyL3FirstSubArea.area);
152
					Assert.assertEquals("Germany level 4 area should not have sublevels", 0, germanyL3FirstSubArea.levelList.size());
153
					//level5
154
					LevelNode germanyLevel5Levels = middleEuropeLevel3Area.levelList.get(1);
155
					Assert.assertEquals("Second Germany Level 3 sublevel should be GERL5", newGermanLevel5, germanyLevel5Levels.level);
156
					Assert.assertEquals("There should be 1 GERL5 area", 1, germanyLevel5Levels.areaList.size());
157
					NamedAreaNode germanyL3SecondSubArea = germanyLevel5Levels.areaList.get(0);
158
					Assert.assertEquals("Second Germany level 3 subarea should be GER-L5", newGermanSubAreaAndLevel, germanyL3SecondSubArea.area);
159
					Assert.assertEquals("GER-L5 should not have sublevels", 0, germanyL3SecondSubArea.levelList.size());
160
					
161
				
162
				//SouthWest Europe
163
				Assert.assertEquals("level3 list for Southwestern Europe should not be empty", 1, southWestAreaNode.levelList.size());
164
				LevelNode southWestLevel3 = southWestAreaNode.levelList.get(0);
165
				Assert.assertEquals(franceL3.getLevel(), southWestLevel3.level);
166
				Assert.assertEquals("There should be 1 south west european area", 1, southWestLevel3.areaList.size());
167
				NamedAreaNode southWestLevel3Area = southWestLevel3.areaList.get(0);
168
				Assert.assertEquals("South Western Europe level 3 area should be FRA", franceL3, southWestLevel3Area.area);
169
				Assert.assertEquals("France level 3 should not have sublevels (in this hierarchie as France level 4 areas were not added to the area list)", 0, southWestLevel3Area.levelList.size());
170
				
171
			
172
		
173
		System.out.println(root.toString(true, 0));
174
		
175
		
176
	}
177
	
74 178

  
75 179
}

Also available in: Unified diff