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
package eu.etaxonomy.cdm.api.service;
10

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

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

    
27
import eu.etaxonomy.cdm.api.service.dto.GroupedTaxonDTO;
28
import eu.etaxonomy.cdm.compare.taxon.TaxonNodeByNameComparator;
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.persistence.dao.reference.IReferenceDao;
38
import eu.etaxonomy.cdm.persistence.dao.taxon.IClassificationDao;
39
import eu.etaxonomy.cdm.test.integration.CdmTransactionalIntegrationTest;
40

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

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

    
49
    @SpringBeanByType
50
    private IClassificationService service;
51

    
52
    @SpringBeanByType
53
    private ITaxonService taxonService;
54

    
55
    @SpringBeanByType
56
    private ITaxonNodeService taxonNodeService;
57

    
58
    @SpringBeanByType
59
    private IClassificationService classificationService;
60

    
61
    @SpringBeanByType
62
    private IClassificationDao classificationDao;
63

    
64
    @SpringBeanByType
65
    private IReferenceDao referenceDao;
66

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

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

    
77
    private Comparator<? super TaxonNode> taxonNodeComparator;
78

    
79
    private boolean includeUnpublished;
80

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

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

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

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

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

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

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

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

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

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

    
143
        // classification, see  createTestDataSet()
144

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

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

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

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

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

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

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

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

    
191
        // classification, see  createTestDataSet()
192

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

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

    
207

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    
349
        classificationDao.save(classification);
350

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

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

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