Project

General

Profile

« Previous | Next » 

Revision dac80b4a

Added by Katja Luther over 12 years ago

View differences:

cdmlib-services/src/test/java/eu/etaxonomy/cdm/api/service/SecurityTest.java
1 1
package eu.etaxonomy.cdm.api.service;
2 2

  
3 3
import static org.junit.Assert.assertEquals;
4
import static org.junit.Assert.assertFalse;
5
import static org.junit.Assert.assertTrue;
4 6

  
5 7

  
6 8
import java.util.Iterator;
......
18 20

  
19 21
import org.springframework.security.authentication.AuthenticationManager;
20 22
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
23
import org.springframework.security.authentication.dao.ReflectionSaltSource;
24
import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
21 25
import org.springframework.security.core.Authentication;
22 26
import org.springframework.security.core.context.SecurityContext;
23 27
import org.springframework.security.core.context.SecurityContextHolder;
......
44 48
import eu.etaxonomy.cdm.model.name.Rank;
45 49
import eu.etaxonomy.cdm.model.taxon.Taxon;
46 50
import eu.etaxonomy.cdm.model.taxon.TaxonBase;
51
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
52
import eu.etaxonomy.cdm.permission.CdmPermissionEvaluator;
47 53

  
48 54
import org.springframework.security.access.AccessDeniedException;
49 55

  
......
85 91
	 */
86 92
	@Test
87 93
	public final void testSaveTaxon() {
94
		/*
95
		Md5PasswordEncoder encoder =new Md5PasswordEncoder();
96
		ReflectionSaltSource saltSource = new ReflectionSaltSource();
97
		saltSource.setUserPropertyToUse("getUsername");
98
		User user = User.NewInstance("partEditor", "test4");
99
		System.err.println(encoder.encodePassword("test4", saltSource.getSalt(user)));
88 100
		
101
		*/
89 102
		authentication = authenticationManager.authenticate(token);
90 103
		SecurityContext context = SecurityContextHolder.getContext();
91 104
		context.setAuthentication(authentication);
......
94 107
		UUID uuid = taxonService.save(expectedTaxon);
95 108
		TaxonBase<?> actualTaxon = taxonService.find(uuid);
96 109
		assertEquals(expectedTaxon, actualTaxon);
110
		
111
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
112
		authentication = authenticationManager.authenticate(token);
113
		context = SecurityContextHolder.getContext();
114
		context.setAuthentication(authentication);
115
		expectedTaxon = Taxon.NewInstance(BotanicalName.NewInstance(Rank.GENUS()), null);
116
		taxonService.save(actualTaxon);
117
		
118
		
97 119
	}
98 120
	@Test
99 121
	public void testUpdateUser(){
......
109 131
		user.setEmailAddress("test@bgbm.org");
110 132
		
111 133
		userService.updateUser(user);
112
		//userService.update(user);
134
		userService.update(user);
113 135
		userService.saveOrUpdate(user);
114 136
	}
115 137
	
......
124 146
		assertEquals(expectedTaxon, actualTaxon);
125 147
		
126 148
		actualTaxon.setName(BotanicalName.NewInstance(Rank.SPECIES()));
127
		try{
128
			taxonService.saveOrUpdate(actualTaxon);
129
		}catch(Exception e){
130
			Assert.fail();
131
		}
149
		taxonService.saveOrUpdate(actualTaxon);
150
		
151
		token = new UsernamePasswordAuthenticationToken("taxonEditor", "test2");
152
		authentication = authenticationManager.authenticate(token);
153
		context = SecurityContextHolder.getContext();
154
		context.setAuthentication(authentication);
155
		actualTaxon = taxonService.find(uuid);
156
		actualTaxon.setName(BotanicalName.NewInstance(Rank.GENUS()));
157
		taxonService.saveOrUpdate(actualTaxon);
158
			
159
	}
160
	
161
	@Test
162
	public void testDeleteTaxon(){
163
		token = new UsernamePasswordAuthenticationToken("taxonomist", "test3");
164
		authentication = authenticationManager.authenticate(token);
165
		SecurityContext context = SecurityContextHolder.getContext();
166
		context.setAuthentication(authentication);
167
		Taxon actualTaxon = (Taxon)taxonService.find(UUID.fromString("7b8b5cb3-37ba-4dba-91ac-4c6ffd6ac331"));
168
		
169
		taxonService.delete(actualTaxon);
132 170
	}
133 171
	
134 172
	
......
160 198
		iterator = descriptions.iterator();
161 199
		
162 200
		description = iterator.next();
163
		
201
		assertEquals(1,description.getElements().iterator().next().getMedia().size());
164 202
		//taxonService.saveOrUpdate(taxon);
165 203
	}
204
	
205
	@Test
206
	public void testAllowOnlyAccessToPartOfTree(){
207
		authentication = authenticationManager.authenticate(new UsernamePasswordAuthenticationToken("partEditor", "test4"));
208
		SecurityContext context = SecurityContextHolder.getContext();
209
		context.setAuthentication(authentication);
210
		
211
		Taxon tribe = (Taxon)taxonService.find(UUID.fromString("928a0167-98cd-4555-bf72-52116d067625"));
212
		Iterator<TaxonNode> it = tribe.getTaxonNodes().iterator();
213
		TaxonNode node = it.next();
214
		
215
		CdmPermissionEvaluator permissionEvaluator = new CdmPermissionEvaluator();
216
		assertFalse(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
217
		node = node.getChildNodes().iterator().next();
218
		System.err.println(node.getUuid()); 
219
		assertTrue(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
220
		node = node.getChildNodes().iterator().next();
221
		assertTrue(permissionEvaluator.hasPermission(authentication, node, "UPDATE"));
222
		
223
		
224
	}
166 225
}
cdmlib-services/src/test/resources/eu/etaxonomy/cdm/api/service/SecurityTest.xml
1 1
<?xml version='1.0' encoding='UTF-8'?>
2 2
<dataset  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="dataset.xsd">
3
  <PERMISSIONGROUP ID="1" NAME="CopyEditors" UUID="8a423129-6d88-41cc-a1da-96bca45f5838"/>
4
  <PERMISSIONGROUP ID="2" NAME="Editors" UUID="db5f3578-e689-43da-b1f0-e72f81c1fd79"/>
3
  <PERMISSIONGROUP ID="1" NAME="SpecialEditors" UUID="8a423129-6d88-41cc-a1da-96bca45f5838"/>
4
  <PERMISSIONGROUP ID="2" NAME="Taxonomist" UUID="db5f3578-e689-43da-b1f0-e72f81c1fd79"/>
5
  <PERMISSIONGROUP ID="3" NAME="PartEditor" UUID="d1c31727-b5df-4640-83c6-ef8110dd4d5d"/>
5 6
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="1" GRANTEDAUTHORITIES_ID="2"/>
6
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="1" GRANTEDAUTHORITIES_ID="4"/>
7
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="1" GRANTEDAUTHORITIES_ID="3"/>
7 8
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="2" GRANTEDAUTHORITIES_ID="1"/>
9
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="2" GRANTEDAUTHORITIES_ID="2"/>
8 10
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="2" GRANTEDAUTHORITIES_ID="3"/>
11
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="2" GRANTEDAUTHORITIES_ID="4"/>
12
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="3" GRANTEDAUTHORITIES_ID="8"/>
13
  <PERMISSIONGROUP_GRANTEDAUTHORITYIMPL PERMISSIONGROUP_ID="3" GRANTEDAUTHORITIES_ID="9"/>
14
  
9 15
  <GRANTEDAUTHORITYIMPL ID="1" UUID="441a3c40-0c84-11de-8c30-0800200c9a66" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXON.READ"/>
10 16
  <GRANTEDAUTHORITYIMPL ID="2" UUID="14788361-1a7e-4eed-b22f-fd90a0b424ac" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXON.UPDATE"/>
11 17
  <GRANTEDAUTHORITYIMPL ID="3" UUID="fa56073c-0ffd-4384-b459-b2f07e35b689" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXON.CREATE"/>
12 18
  <GRANTEDAUTHORITYIMPL ID="4" UUID="e5354c0e-657b-4b4d-bb2f-791612199711" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXON.DELETE"/>
13 19
  <GRANTEDAUTHORITYIMPL ID="5" UUID="9eabd2c6-0590-4a1e-95f5-99cc58b63aa7" CREATED="2009-02-03 17:52:26.0" AUTHORITY="ALL.ADMIN"/>
14 20
  <GRANTEDAUTHORITYIMPL ID="7" UUID="2fc19d6c-a227-41d8-94e4-7c31accebc26" CREATED="2009-02-03 17:52:26.0" AUTHORITY="DESCRIPTION.UPDATE"/>
21
  <GRANTEDAUTHORITYIMPL ID="8" UUID="45b40e93-88b0-40eb-92a4-ffdd8f1d7bc3" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXONNODE.UPDATE{20c8f083-5870-4cbd-bf56-c5b2b98ab6a7}"/>
22
  <GRANTEDAUTHORITYIMPL ID="9" UUID="8696ef0f-e98c-4842-b9d2-456b82584c25" CREATED="2009-02-03 17:52:26.0" AUTHORITY="TAXONNODE.CREATE{20c8f083-5870-4cbd-bf56-c5b2b98ab6a7}"/>
15 23
  
16
  <USERACCOUNT USERNAME="ben" ID="1" UUID="e4acf200-63b6-11dd-ad8b-0800200c9a66" PASSWORD="e141bbb8bb7f4579aa3156fdbe0d1226" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
17
  <USERACCOUNT USERNAME="descriptionEditor" ID="2" UUID="49efface-4c2b-40d2-84bb-e3915c0e77b1" PASSWORD="d211b476c3f3795f801c959fb9671b0c" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
24
  <USERACCOUNT USERNAME="ben" ID="1" CREATED="2009-06-18 13:47:59.0" UUID="e4acf200-63b6-11dd-ad8b-0800200c9a66" PASSWORD="e141bbb8bb7f4579aa3156fdbe0d1226" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
25
  <USERACCOUNT USERNAME="descriptionEditor" ID="2" CREATED="2009-06-18 13:47:59.0" UUID="49efface-4c2b-40d2-84bb-e3915c0e77b1" PASSWORD="d211b476c3f3795f801c959fb9671b0c" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
26
  <USERACCOUNT USERNAME="taxonEditor" ID="3" CREATED="2009-06-18 13:47:59.0" UUID="56eac992-67ba-40be-896c-4e992ca2afc0" PASSWORD="c949cc3b8939be4643577db7e9830e5b" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
27
  <USERACCOUNT USERNAME="taxonomist" ID="4" CREATED="2009-06-18 13:47:59.0" UUID="0595de98-5e6e-4194-ab3b-3cb158716d4c" PASSWORD="c61d8d73a010bdac5a9d788d8d488c25" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
28
  <USERACCOUNT USERNAME="partEditor" ID="5" CREATED="2009-06-18 13:47:59.0" UUID="38a251bd-0ba4-426f-8fcb-5c09560749a7" PASSWORD="41af8a6dac9f86b1081aa5840df75a53" ENABLED="true" ACCOUNTNONEXPIRED="true" CREDENTIALSNONEXPIRED="true" ACCOUNTNONLOCKED="true"/>
18 29
  <USERACCOUNT_GRANTEDAUTHORITYIMPL USERACCOUNT_ID="1" GRANTEDAUTHORITIES_ID="5"/>
19 30
  <USERACCOUNT_GRANTEDAUTHORITYIMPL USERACCOUNT_ID="2" GRANTEDAUTHORITIES_ID="7"/>
20 31
  <USERACCOUNT_PERMISSIONGROUP GROUPS_ID="1" MEMBERS_ID="1"/>
21 32
  <USERACCOUNT_PERMISSIONGROUP GROUPS_ID="2" MEMBERS_ID="1"/>
33
  <USERACCOUNT_PERMISSIONGROUP GROUPS_ID="1" MEMBERS_ID="3"/>
34
  <USERACCOUNT_PERMISSIONGROUP GROUPS_ID="2" MEMBERS_ID="4"/>
35
  <USERACCOUNT_PERMISSIONGROUP GROUPS_ID="3" MEMBERS_ID="5"/>
22 36
  <LANGUAGESTRING ID="1" CREATED="2009-06-18 13:47:59.0" UUID="2b5846e5-b8d2-4ca9-ac51-099286ea4adc" TEXT="Name" LANGUAGE_ID="10"/>
23 37
  
24 38
  <REFERENCE DTYPE="Book" ID="1" CREATED="2008-12-10 09:56:07.0" UUID="596b1325-be50-4b0a-9aa2-3ecd610215f2" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Lorem ipsum" PROTECTEDTITLECACHE="true" NOMENCLATURALLYRELEVANT="false" PARSINGPROBLEM="0" PROBLEMENDS="-1" PROBLEMSTARTS="-1"/>
......
31 45
  <TAXONBASE DTYPE="Taxon" ID="37" SEC_ID="2" CREATED="2003-08-10 09:56:07.0" UUID="7b8b5cb3-37ba-4dba-91ac-4c6ffd6ac331" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Acherontia styx Westwood, 1847 sec. cate-sphingidae.org" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="1" NAME_ID="37" />
32 46
  <TAXONBASE DTYPE="Taxon" ID="36" SEC_ID="2" CREATED="2008-12-10 09:56:07.0" UUID="3b2b3e17-5c4a-4d1b-aa39-349f63100d6b" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Acherontia(Fabricius, 1798)" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="2" NAME_ID="36"/>
33 47
  <TAXONBASE DTYPE="Taxon" ID="38" SEC_ID="2" CREATED="2008-12-10 09:56:07.0" UUID="bc09aca6-06fd-4905-b1e7-cbf7cc65d783" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Acherontia lachesis (Fabricius, 1798)" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="38"/>
48
  <TAXONBASE DTYPE="Taxon" ID="41" SEC_ID="2" CREATED="2008-12-10 09:56:07.0" UUID="928a0167-98cd-4555-bf72-52116d067625" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Acherontiini" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="41"/>
34 49
  <TAXONBASE DTYPE="Synonym" ID="39" SEC_ID="2" CREATED="2008-12-10 09:56:07.0" UUID="3ef145f7-bd92-4a64-8afd-2b8203e00e02" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="Acheontitia ciprosus (Fabricius, 1797)" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="39"/>
35 50
  <TAXONBASE DTYPE="Synonym" ID="40" SEC_ID="2" CREATED="2008-12-10 09:56:07.0" UUID="0b196c1a-5a1c-4a4b-a818-26a8d21b5c17" UPDATED="2008-12-10 09:56:07.253" TITLECACHE="SynGenus" PROTECTEDTITLECACHE="true" TAXONSTATUSUNKNOWN="false"  UNPLACED="false" EXCLUDED="false" DOUBTFUL="false" USENAMECACHE="false" TAXONOMICCHILDRENCOUNT="0" NAME_ID="40"/>
36 51
  
......
46 61
  <HOMOTYPICALGROUP ID="35" CREATED="2008-12-10 09:56:07.0" UUID="baf4e929-4291-4635-aa35-1255069eefe6" UPDATED="2008-12-10 09:56:07.253"/>
47 62
  <HOMOTYPICALGROUP ID="36" CREATED="2008-12-10 09:56:07.0" UUID="b2b007a4-9c8c-43a1-8da4-20ed85464cf2" UPDATED="2008-12-10 09:56:07.253"/>
48 63
  
49
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="36" CREATED="2008-12-10 09:56:07.0" UUID="6d1d279a-d245-4b16-9049-44a2b028c303" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontia styx Westwood, 1847" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="Westwood, 1847" NAMECACHE="Acherontia styx" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="774" GENUSORUNINOMIAL="Acherontia" NOMENCLATURALREFERENCE_ID="1"/>
64
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="36" CREATED="2008-12-10 09:56:07.0" UUID="6d1d279a-d245-4b16-9049-44a2b028c303" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontia" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="Westwood, 1847" NAMECACHE="Acherontia styx" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" RANK_ID="774" GENUSORUNINOMIAL="Acherontia" NOMENCLATURALREFERENCE_ID="1"/>
50 65
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="38" CREATED="2008-12-10 09:56:07.0" UUID="7969821b-a2cf-4d01-95ec-6a5ed0ca3f69" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontia lachesis (Fabricius, 1798)" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(Fabricius, 1798)" NAMECACHE="Acherontia lachesis" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="35" RANK_ID="765" GENUSORUNINOMIAL="Acherontia" SPECIFICEPITHET="lachesis" NOMENCLATURALREFERENCE_ID="1"/>
51 66
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="37" CREATED="2008-12-10 09:56:07.0" UUID="61b1dcae-8aa6-478a-bcd6-080cf0eb6ad7" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontia styx Westwood, 1847" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="Westwood, 1847" NAMECACHE="Acherontia styx" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="36" RANK_ID="765" GENUSORUNINOMIAL="Acherontia" SPECIFICEPITHET="styx" NOMENCLATURALREFERENCE_ID="1"/>
52 67
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="39" CREATED="2008-12-10 09:56:07.0" UUID="9d98c15a-48c4-4b0f-8d2d-30eac2b6b638" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontia ciprosus (Fabricius, 1797)" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(Fabricius, 1797)" NAMECACHE="Acherontia ciprosus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="35" RANK_ID="765" GENUSORUNINOMIAL="Acherontia" SPECIFICEPITHET="ciprosus" NOMENCLATURALREFERENCE_ID="1"/>
53 68
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="40" CREATED="2008-12-10 09:56:07.0" UUID="57d756e1-9381-43f1-8705-d29e7046483a" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="SynGenus" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(Fabricius, 1797)" NAMECACHE="SynGenus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="35" RANK_ID="774" GENUSORUNINOMIAL="SynGenus" NOMENCLATURALREFERENCE_ID="1"/>
54
  <TAXONNAMEBASE DTYPE="BotanicalName" ID="41" CREATED="2008-12-10 09:56:07.0" UUID="507b60dd-113d-4ab7-9665-25d0374bd6d1" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="test" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(Fabricius, 1797)" NAMECACHE="Acherontia ciprosus" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false" HOMOTYPICALGROUP_ID="35" RANK_ID="765" GENUSORUNINOMIAL="Acherontia" SPECIFICEPITHET="ciprosus" NOMENCLATURALREFERENCE_ID="1"/>
69
  <TAXONNAMEBASE DTYPE="ZoologicalName" ID="41" CREATED="2008-12-10 09:56:07.0" UUID="507b60dd-113d-4ab7-9665-25d0374bd6d1" UPDATED="2008-12-10 09:56:07.238" TITLECACHE="Acherontiini" PROTECTEDTITLECACHE="true" PARSINGPROBLEM="0" FULLTITLECACHE="" PROBLEMENDS="-1" PROBLEMSTARTS="-1" PROTECTEDFULLTITLECACHE="true" AUTHORSHIPCACHE="(Laspeyres, 1809)" NAMECACHE="Acherontia atropos" PROTECTEDAUTHORSHIPCACHE="true" PROTECTEDNAMECACHE="true" ANAMORPHIC="false"  BINOMHYBRID="false" HYBRIDFORMULA="false" MONOMHYBRID="false" TRINOMHYBRID="false"  RANK_ID="791" GENUSORUNINOMIAL="" SPECIFICEPITHET="" NOMENCLATURALREFERENCE_ID="1"/>
55 70
  
56 71
  
57 72
  <TAXONNODE ID="1" CREATED="2009-06-18 13:47:59.0" UUID="0b5846e5-b8d2-4ca9-ac51-099286ea4adc" COUNTCHILDREN="0" TAXON_ID="38" PARENT_ID="3" CLASSIFICATION_ID="1"/>
58 73
  <TAXONNODE ID="2" CREATED="2009-06-18 13:47:59.0" UUID="770239f6-4fa8-496b-8738-fe8f7b2ad519" COUNTCHILDREN="0" TAXON_ID="37" PARENT_ID="3" CLASSIFICATION_ID="1"/>
59
  <TAXONNODE ID="3" CREATED="2009-06-18 13:47:59.0" UUID="20c8f083-5870-4cbd-bf56-c5b2b98ab6a7" COUNTCHILDREN="2" TAXON_ID="36" CLASSIFICATION_ID="1"/>
74
  <TAXONNODE ID="3" CREATED="2009-06-18 13:47:59.0" UUID="20c8f083-5870-4cbd-bf56-c5b2b98ab6a7" COUNTCHILDREN="2" TAXON_ID="36" PARENT_ID="4" CLASSIFICATION_ID="1"/>
75
  <TAXONNODE ID="4" CREATED="2009-06-18 13:47:59.0" UUID="cecfa77f-f26a-4476-9d87-a8d993cb55d9" COUNTCHILDREN="1" TAXON_ID="41" CLASSIFICATION_ID="1"/>
60 76
 
61 77
  <TAXONNODE_AUD ID="1" REV="1025" REVTYPE="0" CREATED="2009-06-18 13:47:59.0" UUID="4c8a01a1-6037-43ce-8421-15258d9f5c11" COUNTCHILDREN="0" TAXON_ID="38" CLASSIFICATION_ID="1"/>
62 78
  <TAXONNODE_AUD ID="2" REV="1025" REVTYPE="0" CREATED="2009-06-18 13:47:59.0" UUID="770239f6-4fa8-496b-8738-fe8f7b2ad519" COUNTCHILDREN="0" TAXON_ID="37" CLASSIFICATION_ID="1"/>

Also available in: Unified diff