Project

General

Profile

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

    
10
package eu.etaxonomy.cdm.api.service;
11

    
12
import java.io.FileNotFoundException;
13
import java.util.ArrayList;
14
import java.util.Arrays;
15
import java.util.Collections;
16
import java.util.Comparator;
17
import java.util.List;
18
import java.util.UUID;
19

    
20
import org.apache.commons.lang.StringUtils;
21
import org.apache.log4j.Logger;
22
import org.junit.Assert;
23
import org.junit.Before;
24
import org.junit.Test;
25
import org.unitils.dbunit.annotation.DataSet;
26
import org.unitils.spring.annotation.SpringBeanByType;
27

    
28
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO;
29
import eu.etaxonomy.cdm.model.name.IBotanicalName;
30
import eu.etaxonomy.cdm.model.name.Rank;
31
import eu.etaxonomy.cdm.model.name.TaxonNameFactory;
32
import eu.etaxonomy.cdm.model.reference.Reference;
33
import eu.etaxonomy.cdm.model.reference.ReferenceFactory;
34
import eu.etaxonomy.cdm.model.taxon.Classification;
35
import eu.etaxonomy.cdm.model.taxon.Taxon;
36
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
37
import eu.etaxonomy.cdm.model.taxon.TaxonNodeByNameComparator;
38
import eu.etaxonomy.cdm.persistence.dao.reference.IReferenceDao;
39
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
40
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
41

    
42
/**
43
 * @author n.hoffmann
44
 * @since Sep 22, 2009
45
 */
46
public class ClassificationServiceImplTest extends CdmTransactionalIntegrationTest{
47

    
48
    private static final Logger logger = Logger.getLogger(ClassificationServiceImplTest.class);
49

    
50
    @SpringBeanByType
51
    private IClassificationService service;
52

    
53
    @SpringBeanByType
54
    private ITaxonService taxonService;
55

    
56
    @SpringBeanByType
57
    private ITaxonNodeService taxonNodeService;
58

    
59
    @SpringBeanByType
60
    private IClassificationService classificationService;
61

    
62
    @SpringBeanByType
63
    private IClassificationDao classificationDao;
64

    
65
    @SpringBeanByType
66
    private IReferenceDao referenceDao;
67

    
68
    private static final List<String> NODE_INIT_STRATEGY = Arrays.asList(new String[]{
69
            "childNodes",
70
            "childNodes.taxon",
71
            "childNodes.taxon.name",
72
            "taxon.sec",
73
            "taxon.name.*"
74
            });
75

    
76
    public static final UUID CLASSIFICATION_UUID = UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878");
77

    
78
    private Comparator<? super TaxonNode> taxonNodeComparator;
79

    
80
    private boolean includeUnpublished;
81

    
82
    @Before
83
    public void setUp() {
84
        includeUnpublished = true;
85
    }
86

    
87
    @Test
88
    public final void testLoadTaxonNodeByTaxon() {
89
		logger.warn("testLoadTaxonNodeByTaxon not yet implemented");
90
    }
91

    
92
    @Test
93
    public final void testLoadTaxonNode() {
94
		logger.warn("testLoadTaxonNode not yet implemented");
95
    }
96

    
97
    @Test
98
    @DataSet
99
    public final void testTaxonNodeByNameComparator() {
100
        taxonNodeComparator = new TaxonNodeByNameComparator();
101

    
102
        List<TaxonNode> nodes = service.getAllNodes();
103
        Collections.sort(nodes, taxonNodeComparator);
104

    
105
//        logger.setLevel(Level.DEBUG);
106
        if(logger.isDebugEnabled()){
107
            logger.debug("-------------");
108
	        for (TaxonNode node: nodes){
109
	        	if (node!= null && node.getTaxon() != null && node.getTaxon().getName()!= null){
110
	                logger.debug(node.getTaxon().getName().getTitleCache() + " [" + node.getTaxon().getName().getRank() + "]");
111
	        	}
112
	        }
113
        }
114

    
115
        Assert.assertEquals("Acacia N.Jacobsen, Bastm. & Yuji Sasaki", nodes.get(1).getTaxon().getName().getTitleCache());
116
        Assert.assertEquals("Acacia subgen. Aculeiferum Pedley", nodes.get(2).getTaxon().getName().getTitleCache());
117
        Assert.assertEquals("Acacia sect. Botrycephalae Yuji Sasaki", nodes.get(3).getTaxon().getName().getTitleCache());
118
        Assert.assertEquals("Acacia subgen. Phyllodineae N.Jacobsen, Bastm. & Yuji Sasaki", nodes.get(4).getTaxon().getName().getTitleCache());
119
        Assert.assertEquals("Acacia acicularis Willd.", nodes.get(5).getTaxon().getName().getTitleCache());
120
        Assert.assertEquals("×Acacia acicularis Willd. subsp. acicularis", nodes.get(6).getTaxon().getName().getTitleCache());
121
        Assert.assertEquals("Acacia cuspidifolia Maslin", nodes.get(7).getTaxon().getName().getTitleCache());
122
        Assert.assertEquals("Acacia mearnsii Benth", nodes.get(8).getTaxon().getName().getTitleCache());
123

    
124
        /*
125
        ((TaxonNodeByNameComparator)taxonNodeComparator).setSortInfraGenericFirst(false);
126
        Collections.sort(taxonNodes, taxonNodeComparator);
127

    
128
        Assert.assertEquals("Acacia cuspidifolia Maslin", taxonNodes.get(0).getTaxon().getName().getTitleCache());
129
        System.err.println();
130
        for (TaxonNode node: taxonNodes){
131
            System.err.println(node.getTaxon().getName().getTitleCache() );
132
            /*for (TaxonNode child : node.getChildNodes()){
133
                System.err.println(child.getTaxon().getName().getTitleCache());
134
            }
135
        }*/
136
//		fail("Not yet implemented");
137
    }
138

    
139
    @Test
140
    @DataSet
141
    public final void testListRankSpecificRootNodes(){
142
        Classification classification = service.find(UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878"));
143

    
144
        // classification, see  createTestDataSet()
145

    
146
        // ClassificationRoot
147
        // |- Acacia N.Jacobsen, Bastm. & Yuji Sasaki                          [Genus]
148
        // |  |-- Acacia subg. Aculeiferum Pedley                              [Subgenus]
149
        // |  |-- Acacia subg. Phyllodineae N.Jacobsen, Bastm. & Yuji Sasaki   [Subgenus]
150
        // |  |  |-- Acacia sect. Botrycephalae Yuji Sasaki                    [Section (Botany)]
151
        // |  |------- Acacia cuspidifolia Maslin                              [Species]
152
        // |  |------- Acacia mearnsii Benth                                   [Species]
153
        // |---------- Acacia acicularis Willd.                                [Species]
154
        //             |-- ×Acacia acicularis Willd. subsp. acicularis         [Subspecies]
155
        //
156
        // for more historic Acacia taxonomy see http://lexikon.freenet.de/Akazien
157

    
158
        List<TaxonNode> taxonNodes = service.listRankSpecificRootNodes(null, null, null, includeUnpublished, null, null, NODE_INIT_STRATEGY);
159
        Assert.assertEquals(2, taxonNodes.size());
160

    
161
        taxonNodes = service.listRankSpecificRootNodes(classification, null, null, includeUnpublished, null, null, NODE_INIT_STRATEGY);
162
        Assert.assertEquals(2, taxonNodes.size());
163

    
164
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, null, null, NODE_INIT_STRATEGY);
165
        Assert.assertEquals(4, taxonNodes.size());
166

    
167
        // also test if the pager works
168
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 10, 0, NODE_INIT_STRATEGY);
169
        Assert.assertEquals(4, taxonNodes.size());
170
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 0, NODE_INIT_STRATEGY);
171
        Assert.assertEquals(2, taxonNodes.size());
172
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 1, NODE_INIT_STRATEGY);
173
        Assert.assertEquals(2, taxonNodes.size());
174
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 2, NODE_INIT_STRATEGY);
175
        Assert.assertEquals(0, taxonNodes.size());
176

    
177
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, null, null, NODE_INIT_STRATEGY);
178
        Assert.assertEquals(3, taxonNodes.size());
179

    
180
        // also test if the pager works
181
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, 10, 0, NODE_INIT_STRATEGY);
182
        Assert.assertEquals(3, taxonNodes.size());
183
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, 2, 1, NODE_INIT_STRATEGY);
184
        Assert.assertEquals(1, taxonNodes.size());
185
    }
186

    
187
    @Test
188
    @DataSet
189
    public final void testListRankSpecificRootNodes_withSubtree(){
190
        Classification classification = service.find(UUID.fromString("6c2bc8d9-ee62-4222-be89-4a8e31770878"));
191

    
192
        // classification, see  createTestDataSet()
193

    
194
        // ClassificationRoot
195
        // |- Acacia N.Jacobsen, Bastm. & Yuji Sasaki                          [Genus]
196
        // |  |-- Acacia subg. Aculeiferum Pedley                              [Subgenus]
197
        // |  |-- Acacia subg. Phyllodineae N.Jacobsen, Bastm. & Yuji Sasaki   [Subgenus]
198
        // |  |  |-- Acacia sect. Botrycephalae Yuji Sasaki                    [Section (Botany)]
199
        // |  |------- Acacia cuspidifolia Maslin                              [Species]
200
        // |  |------- Acacia mearnsii Benth                                   [Species]
201
        // |---------- Acacia acicularis Willd.                                [Species]
202
        //             |-- ×Acacia acicularis Willd. subsp. acicularis         [Subspecies]
203
        //
204
        // for more historic Acacia taxonomy see http://lexikon.freenet.de/Akazien
205

    
206
        TaxonNode subtree = taxonNodeService.find(UUID.fromString("bcdf945f-1f02-423e-883d-fe89e0af93e4"));
207

    
208

    
209
        List<TaxonNode> taxonNodes = service.listRankSpecificRootNodes(null, subtree, null, includeUnpublished, null, null, NODE_INIT_STRATEGY);
210
        Assert.assertEquals(2, taxonNodes.size());
211

    
212
        taxonNodes = service.listRankSpecificRootNodes(classification, null, null, includeUnpublished, null, null, NODE_INIT_STRATEGY);
213
        Assert.assertEquals(2, taxonNodes.size());
214

    
215
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, null, null, NODE_INIT_STRATEGY);
216
        Assert.assertEquals(4, taxonNodes.size());
217

    
218
        // also test if the pager works
219
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 10, 0, NODE_INIT_STRATEGY);
220
        Assert.assertEquals(4, taxonNodes.size());
221
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 0, NODE_INIT_STRATEGY);
222
        Assert.assertEquals(2, taxonNodes.size());
223
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 1, NODE_INIT_STRATEGY);
224
        Assert.assertEquals(2, taxonNodes.size());
225
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SECTION_BOTANY(), includeUnpublished, 2, 2, NODE_INIT_STRATEGY);
226
        Assert.assertEquals(0, taxonNodes.size());
227

    
228
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, null, null, NODE_INIT_STRATEGY);
229
        Assert.assertEquals(3, taxonNodes.size());
230

    
231
        // also test if the pager works
232
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, 10, 0, NODE_INIT_STRATEGY);
233
        Assert.assertEquals(3, taxonNodes.size());
234
        taxonNodes = service.listRankSpecificRootNodes(classification, null, Rank.SPECIES(), includeUnpublished, 2, 1, NODE_INIT_STRATEGY);
235
        Assert.assertEquals(1, taxonNodes.size());
236
    }
237

    
238
    @Test
239
    public final void testSetDaoIClassificationDao() {
240
        Assert.assertNotNull(service);
241
    }
242

    
243
    @Test
244
    @DataSet
245
    public final void testGroupTaxaByHigherTaxon(){
246

    
247
        Rank minRank = Rank.GENUS();
248
        Rank maxRank = Rank.KINGDOM();
249
        List<UUID> taxonUuids = new ArrayList<>();
250
        taxonUuids.add(acacia_acicularis_uuid);
251
        taxonUuids.add(acacia_cuspidifolia_uuid);
252
        taxonUuids.add(acacia_sect_botrycephalae_uuid);
253

    
254
        List<GroupedTaxonDTO> result = this.service.groupTaxaByHigherTaxon(taxonUuids, CLASSIFICATION_UUID, minRank, maxRank);
255
        System.out.println(result);
256
        Assert.assertEquals(3, result.size());
257
        //acacia_acicularis_uuid  //is a root taxon with no parents
258
        Assert.assertEquals(acacia_acicularis_uuid, result.get(0).getTaxonUuid());
259
        Assert.assertNull(result.get(0).getGroupTaxonUuid());
260
        Assert.assertTrue(StringUtils.isBlank(result.get(0).getGroupTaxonName()));
261
        //acacia_cuspidifolia_uuid
262
        Assert.assertEquals(acacia_cuspidifolia_uuid, result.get(1).getTaxonUuid());
263
        Assert.assertNotNull(result.get(1).getGroupTaxonUuid());
264
        Assert.assertFalse(StringUtils.isBlank(result.get(1).getGroupTaxonName()));
265
        //acacia_sect_botrycephalae_uuid
266
        Assert.assertEquals(acacia_sect_botrycephalae_uuid, result.get(2).getTaxonUuid());
267
        Assert.assertNotNull(result.get(2).getGroupTaxonUuid());
268
        Assert.assertFalse(StringUtils.isBlank(result.get(2).getGroupTaxonName()));
269
    }
270

    
271
    private UUID acacia_acicularis_uuid  = UUID.fromString("90ad2d8f-19a9-4a10-bab3-7d1de5ce1968");
272
    private UUID acacia_cuspidifolia_uuid = UUID.fromString("94123e4d-da49-4ed0-9d59-f52a9f7a3618");
273
    private UUID acacia_sect_botrycephalae_uuid = UUID.fromString("2c73a166-35d1-483d-b8e8-209214cb6193");
274

    
275
    @Override
276
//    @Test
277
    public void createTestDataSet() throws FileNotFoundException {
278

    
279
        // ClassificationRoot
280
        // |- Acacia N.Jacobsen, Bastm. & Yuji Sasaki                          [Genus]
281
        // |  |-- Acacia subg. Aculeiferum Pedley                              [Subgenus]
282
        // |  |-- Acacia subg. Phyllodineae N.Jacobsen, Bastm. & Yuji Sasaki   [Subgenus]
283
        // |  |  |-- Acacia sect. Botrycephalae Yuji Sasaki                    [Section (Botany)]
284
        // |  |------- Acacia cuspidifolia Maslin                              [Species]
285
        // |  |------- Acacia mearnsii Benth                                   [Species]
286
        // |---------- Acacia acicularis Willd.                                [Species]
287
        //             |-- ×Acacia acicularis Willd. subsp. acicularis         [Subspecies]
288
        //
289
        // for more historic Acacia taxonomy see http://lexikon.freenet.de/Akazien
290

    
291
        // 1. create the entities   and save them
292
        Classification classification = Classification.NewInstance("Acacia Classification");
293
        classification.setUuid(CLASSIFICATION_UUID);
294
        classificationDao.save(classification);
295

    
296
        Reference sec = ReferenceFactory.newBook();
297
        sec.setTitleCache("Sp. Pl.", true);
298
        referenceDao.save(sec);
299

    
300
        IBotanicalName acacia_n = TaxonNameFactory.NewBotanicalInstance(Rank.GENUS(), "Acacia", null, null, null, null, sec, null, null);
301
        acacia_n.setAuthorshipCache("N.Jacobsen, Bastm. & Yuji Sasaki", true);
302
        Taxon acacia_t = Taxon.NewInstance(acacia_n, sec);
303
        acacia_t.setUuid(UUID.fromString("2fc779ee-7a9d-4586-92ba-1cd774ac77f0"));
304

    
305
        IBotanicalName acacia_subg_aculeiferum_n = TaxonNameFactory.NewBotanicalInstance(Rank.SUBGENUS(), "Acacia", "Aculeiferum", null, null, null, sec, null, null);
306
        acacia_subg_aculeiferum_n.setAuthorshipCache("Pedley", true);
307
        Taxon acacia_subg_aculeiferum_t = Taxon.NewInstance(acacia_subg_aculeiferum_n, sec);
308
        acacia_subg_aculeiferum_t.setUuid(UUID.fromString("169fea08-6b7a-4315-b111-a774c7fafe30"));
309

    
310
        IBotanicalName acacia_subg_phyllodineae_n = TaxonNameFactory.NewBotanicalInstance(Rank.SUBGENUS(), "Acacia", "Phyllodineae", null, null, null, sec, null, null);
311
        acacia_subg_phyllodineae_n.setAuthorshipCache("N.Jacobsen, Bastm. & Yuji Sasaki", true);
312
        Taxon acacia_subg_phyllodineae_t = Taxon.NewInstance(acacia_subg_phyllodineae_n, sec);
313
        acacia_subg_phyllodineae_t.setUuid(UUID.fromString("a9da5d43-517e-4ca5-a490-b6a5cd637e9e"));
314

    
315
        IBotanicalName acacia_setc_botrycephalae_n = TaxonNameFactory.NewBotanicalInstance(Rank.SECTION_BOTANY(), "Acacia", "Botrycephalae", null, null, null, sec, null, null);
316
        acacia_setc_botrycephalae_n.setAuthorshipCache("Yuji Sasaki", true);
317
        Taxon acacia_sect_botrycephalae_t = Taxon.NewInstance(acacia_setc_botrycephalae_n, sec);
318
        acacia_sect_botrycephalae_t.setUuid(acacia_sect_botrycephalae_uuid);
319

    
320
        IBotanicalName acacia_cuspidifolia_n = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES(), "Acacia", null,"cuspidifolia", null, null, sec, null, null);
321
        acacia_cuspidifolia_n.setAuthorshipCache("Maslin", true);
322
        Taxon acacia_cuspidifolia_t = Taxon.NewInstance(acacia_cuspidifolia_n, sec);
323
        acacia_cuspidifolia_t.setUuid(acacia_cuspidifolia_uuid);
324

    
325
        IBotanicalName acacia_mearnsii_n = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES(), "Acacia", null,"mearnsii", null, null, sec, null, null);
326
        acacia_mearnsii_n.setAuthorshipCache("Benth", true);
327
        Taxon acacia_mearnsii_t = Taxon.NewInstance(acacia_mearnsii_n, sec);
328
        acacia_mearnsii_t.setUuid(UUID.fromString("2e55dc01-71f5-4d42-9bb0-a2448e46dd18"));
329

    
330
        IBotanicalName acacia_acicularis_n = TaxonNameFactory.NewBotanicalInstance(Rank.SPECIES(), "Acacia", null,"acicularis", null, null, sec, null, null);
331
        acacia_acicularis_n.setAuthorshipCache("Willd.", true);
332
        Taxon acacia_acicularis_t = Taxon.NewInstance(acacia_acicularis_n, sec);
333
        acacia_acicularis_t.setUuid(acacia_acicularis_uuid);
334

    
335
        IBotanicalName xacacia_acicularis_n = TaxonNameFactory.NewBotanicalInstance(Rank.SUBSPECIES(), "Acacia", null,"acicularis", "acicularis", null, sec, null, null);
336
        xacacia_acicularis_n.setAuthorshipCache("Willd.", true);
337
        xacacia_acicularis_n.setMonomHybrid(true);
338
        System.out.println(xacacia_acicularis_n.getTitleCache());
339
        Taxon xacacia_acicularis_t = Taxon.NewInstance(xacacia_acicularis_n, sec);
340
        xacacia_acicularis_t.setUuid(UUID.fromString("04d125a6-6adf-4900-97ff-82729618086a"));
341

    
342
        TaxonNode acacia_tn = classification.addChildTaxon(acacia_t, sec, null);
343
        TaxonNode acacia_subg_phyllodineae_tn = acacia_tn.addChildTaxon(acacia_subg_phyllodineae_t, sec, null);
344
        acacia_subg_phyllodineae_tn.addChildTaxon(acacia_sect_botrycephalae_t, sec, null);
345
        acacia_tn.addChildTaxon(acacia_subg_aculeiferum_t, sec, null);
346
        acacia_tn.addChildTaxon(acacia_mearnsii_t, sec, null).addChildTaxon(xacacia_acicularis_t, sec, null);
347
        acacia_tn.addChildTaxon(acacia_cuspidifolia_t, sec, null);
348
        classification.addChildTaxon(acacia_acicularis_t, sec, null);
349

    
350
        classificationDao.save(classification);
351

    
352
        // 2. end the transaction so that all data is actually written to the db
353
        setComplete();
354
        endTransaction();
355

    
356
        // use the fileNameAppendix if you are creating a data set file which need to be named differently
357
        // from the standard name. For example if a single test method needs different data then the other
358
        // methods the test class you may want to set the fileNameAppendix when creating the data for this method.
359
        String fileNameAppendix = null;
360

    
361
        // 3.
362
        writeDbUnitDataSetFile(new String[] {
363
            "TAXONBASE", "TAXONNAME",
364
            "REFERENCE",
365
            "CLASSIFICATION", "TAXONNODE",
366
            "LANGUAGESTRING", "HOMOTYPICALGROUP",
367
            "HIBERNATE_SEQUENCES" // IMPORTANT!!!
368
            },
369
            fileNameAppendix, true );
370
    }
371
}
(4-4/40)