Project

General

Profile

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

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

    
13
import java.util.ArrayList;
14
import java.util.Collection;
15
import java.util.HashSet;
16
import java.util.List;
17
import java.util.Map;
18
import java.util.Set;
19
import java.util.UUID;
20

    
21
import org.apache.log4j.Logger;
22
import org.springframework.beans.factory.annotation.Autowired;
23
import org.springframework.stereotype.Service;
24
import org.springframework.transaction.annotation.Transactional;
25

    
26
import eu.etaxonomy.cdm.api.service.pager.Pager;
27
import eu.etaxonomy.cdm.api.service.pager.impl.DefaultPagerImpl;
28
import eu.etaxonomy.cdm.api.utility.DescriptionUtility;
29
import eu.etaxonomy.cdm.common.monitor.IProgressMonitor;
30
import eu.etaxonomy.cdm.model.common.Annotation;
31
import eu.etaxonomy.cdm.model.common.Language;
32
import eu.etaxonomy.cdm.model.common.Marker;
33
import eu.etaxonomy.cdm.model.common.MarkerType;
34
import eu.etaxonomy.cdm.model.common.TermVocabulary;
35
import eu.etaxonomy.cdm.model.description.DescriptionBase;
36
import eu.etaxonomy.cdm.model.description.DescriptionElementBase;
37
import eu.etaxonomy.cdm.model.description.Distribution;
38
import eu.etaxonomy.cdm.model.description.Feature;
39
import eu.etaxonomy.cdm.model.description.FeatureTree;
40
import eu.etaxonomy.cdm.model.description.PresenceAbsenceTermBase;
41
import eu.etaxonomy.cdm.model.description.Scope;
42
import eu.etaxonomy.cdm.model.description.TaxonDescription;
43
import eu.etaxonomy.cdm.model.description.TaxonNameDescription;
44
import eu.etaxonomy.cdm.model.description.TextData;
45
import eu.etaxonomy.cdm.model.location.NamedArea;
46
import eu.etaxonomy.cdm.model.location.NamedAreaLevel;
47
import eu.etaxonomy.cdm.model.media.Media;
48
import eu.etaxonomy.cdm.model.name.Rank;
49
import eu.etaxonomy.cdm.model.name.TaxonNameBase;
50
import eu.etaxonomy.cdm.model.taxon.Taxon;
51
import eu.etaxonomy.cdm.persistence.dao.common.IDefinedTermDao;
52
import eu.etaxonomy.cdm.persistence.dao.common.ITermVocabularyDao;
53
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionDao;
54
import eu.etaxonomy.cdm.persistence.dao.description.IDescriptionElementDao;
55
import eu.etaxonomy.cdm.persistence.dao.description.IFeatureDao;
56
import eu.etaxonomy.cdm.persistence.dao.description.IFeatureNodeDao;
57
import eu.etaxonomy.cdm.persistence.dao.description.IFeatureTreeDao;
58
import eu.etaxonomy.cdm.persistence.dao.description.IStatisticalMeasurementValueDao;
59
import eu.etaxonomy.cdm.persistence.query.OrderHint;
60
import eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy;
61

    
62
/**
63
 * @author a.mueller
64
 * @created 24.06.2008
65
 * @version 1.0
66
 */
67
@Service
68
@Transactional(readOnly = true)
69
public class DescriptionServiceImpl extends IdentifiableServiceBase<DescriptionBase,IDescriptionDao> implements IDescriptionService {
70

    
71
    private static final Logger logger = Logger.getLogger(DescriptionServiceImpl.class);
72

    
73
    protected IDescriptionElementDao descriptionElementDao;
74
    protected IFeatureTreeDao featureTreeDao;
75
    protected IFeatureNodeDao featureNodeDao;
76
    protected IFeatureDao featureDao;
77
    protected ITermVocabularyDao vocabularyDao;
78
    protected IDefinedTermDao definedTermDao;
79
    protected IStatisticalMeasurementValueDao statisticalMeasurementValueDao;
80
    //TODO change to Interface
81
    private NaturalLanguageGenerator naturalLanguageGenerator;
82

    
83
    @Autowired
84
    protected void setFeatureTreeDao(IFeatureTreeDao featureTreeDao) {
85
        this.featureTreeDao = featureTreeDao;
86
    }
87

    
88
    @Autowired
89
    protected void setFeatureNodeDao(IFeatureNodeDao featureNodeDao) {
90
        this.featureNodeDao = featureNodeDao;
91
    }
92

    
93
    @Autowired
94
    protected void setFeatureDao(IFeatureDao featureDao) {
95
        this.featureDao = featureDao;
96
    }
97

    
98
    @Autowired
99
    protected void setVocabularyDao(ITermVocabularyDao vocabularyDao) {
100
        this.vocabularyDao = vocabularyDao;
101
    }
102

    
103
    @Autowired
104
    protected void setDefinedTermDao(IDefinedTermDao definedTermDao) {
105
        this.definedTermDao = definedTermDao;
106
    }
107

    
108
    @Autowired
109
    protected void statisticalMeasurementValueDao(IStatisticalMeasurementValueDao statisticalMeasurementValueDao) {
110
        this.statisticalMeasurementValueDao = statisticalMeasurementValueDao;
111
    }
112

    
113
    @Autowired
114
    protected void setDescriptionElementDao(IDescriptionElementDao descriptionElementDao) {
115
        this.descriptionElementDao = descriptionElementDao;
116
    }
117

    
118
    @Autowired
119
    protected void setNaturalLanguageGenerator(NaturalLanguageGenerator naturalLanguageGenerator) {
120
        this.naturalLanguageGenerator = naturalLanguageGenerator;
121
    }
122

    
123
    /**
124
     *
125
     */
126
    public DescriptionServiceImpl() {
127
        logger.debug("Load DescriptionService Bean");
128
    }
129

    
130

    
131

    
132
    /* (non-Javadoc)
133
     * @see eu.etaxonomy.cdm.api.service.IIdentifiableEntityService#updateTitleCache(java.lang.Integer, eu.etaxonomy.cdm.strategy.cache.common.IIdentifiableEntityCacheStrategy)
134
     */
135
    @Override
136
    @Transactional(readOnly = false)
137
    public void updateTitleCache(Class<? extends DescriptionBase> clazz, Integer stepSize, IIdentifiableEntityCacheStrategy<DescriptionBase> cacheStrategy, IProgressMonitor monitor) {
138
        if (clazz == null){
139
            clazz = DescriptionBase.class;
140
        }
141
        super.updateTitleCacheImpl(clazz, stepSize, cacheStrategy, monitor);
142
    }
143

    
144

    
145
    @Override
146
    public TermVocabulary<Feature> getDefaultFeatureVocabulary(){
147
        String uuidFeature = "b187d555-f06f-4d65-9e53-da7c93f8eaa8";
148
        UUID featureUuid = UUID.fromString(uuidFeature);
149
        return vocabularyDao.findByUuid(featureUuid);
150
    }
151

    
152
    @Override
153
    @Autowired
154
    protected void setDao(IDescriptionDao dao) {
155
        this.dao = dao;
156
    }
157

    
158
    @Override
159
    public int count(Class<? extends DescriptionBase> type, Boolean hasImages, Boolean hasText,Set<Feature> feature) {
160
        return dao.countDescriptions(type, hasImages, hasText, feature);
161
    }
162

    
163
    @Override
164
    public Pager<DescriptionElementBase> pageDescriptionElements(DescriptionBase description, Class<? extends DescriptionBase> descriptionType,
165
            Set<Feature> features, Class<? extends DescriptionElementBase> type, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
166

    
167
        List<DescriptionElementBase> results = listDescriptionElements(description, descriptionType, features, type, pageSize, pageNumber, propertyPaths);
168
        return new DefaultPagerImpl<DescriptionElementBase>(pageNumber, results.size(), pageSize, results);
169
    }
170

    
171
    /* (non-Javadoc)
172
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#getDescriptionElements(eu.etaxonomy.cdm.model.description.DescriptionBase, java.util.Set, java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List)
173
     */
174
    @Override
175
    @Deprecated
176
    public Pager<DescriptionElementBase> getDescriptionElements(DescriptionBase description,
177
            Set<Feature> features, Class<? extends DescriptionElementBase> type, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
178
        return pageDescriptionElements(description, null, features, type, pageSize, pageNumber, propertyPaths);
179
    }
180

    
181
    @Override
182
    public List<DescriptionElementBase> listDescriptionElements(DescriptionBase description, Class<? extends DescriptionBase> descriptionType,
183
            Set<Feature> features, Class<? extends DescriptionElementBase> type, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
184

    
185
        Integer numberOfResults = dao.countDescriptionElements(description, descriptionType, features, type);
186
        List<DescriptionElementBase> results = new ArrayList<DescriptionElementBase>();
187
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
188
            results = dao.getDescriptionElements(description, descriptionType, features, type, pageSize, pageNumber, propertyPaths);
189
        }
190
        return results;
191
    }
192

    
193
    /* (non-Javadoc)
194
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#listDescriptionElements(eu.etaxonomy.cdm.model.description.DescriptionBase, java.util.Set, java.lang.Class, java.lang.Integer, java.lang.Integer, java.util.List)
195
     */
196
    @Override
197
    @Deprecated
198
    public List<DescriptionElementBase> listDescriptionElements(DescriptionBase description,
199
            Set<Feature> features, Class<? extends DescriptionElementBase> type, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
200

    
201
        return listDescriptionElements(description, null, features, type, pageSize, pageNumber, propertyPaths);
202
    }
203

    
204
    @Override
205
    public Pager<Annotation> getDescriptionElementAnnotations(DescriptionElementBase annotatedObj, MarkerType status, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths){
206
        Integer numberOfResults = descriptionElementDao.countAnnotations(annotatedObj, status);
207

    
208
        List<Annotation> results = new ArrayList<Annotation>();
209
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
210
            results = descriptionElementDao.getAnnotations(annotatedObj, status, pageSize, pageNumber, orderHints, propertyPaths);
211
        }
212

    
213
        return new DefaultPagerImpl<Annotation>(pageNumber, numberOfResults, pageSize, results);
214
    }
215

    
216

    
217

    
218
    @Override
219
    public Pager<Media> getMedia(DescriptionElementBase descriptionElement,	Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
220
        Integer numberOfResults = descriptionElementDao.countMedia(descriptionElement);
221

    
222
        List<Media> results = new ArrayList<Media>();
223
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
224
            results = descriptionElementDao.getMedia(descriptionElement, pageSize, pageNumber, propertyPaths);
225
        }
226

    
227
        return new DefaultPagerImpl<Media>(pageNumber, numberOfResults, pageSize, results);
228
    }
229

    
230
    @Override
231
    public Pager<TaxonDescription> pageTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
232
        Set<MarkerType> markerTypes = null;
233
        return pageTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes, pageSize, pageNumber, propertyPaths);
234
    }
235

    
236
    @Override
237
    public List<TaxonDescription> listTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
238
        Set<MarkerType> markerTypes = null;
239
        return listTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes, pageSize, pageNumber, propertyPaths);
240
    }
241

    
242

    
243
    /* (non-Javadoc)
244
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#pageMarkedTaxonDescriptions(eu.etaxonomy.cdm.model.taxon.Taxon, java.util.Set, java.util.Set, java.util.Set, java.lang.Integer, java.lang.Integer, java.util.List)
245
     */
246
    @Override
247
    public Pager<TaxonDescription> pageTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
248
        Integer numberOfResults = dao.countTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes);
249

    
250
        List<TaxonDescription> results = new ArrayList<TaxonDescription>();
251
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
252
            results = dao.listTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes, pageSize, pageNumber, propertyPaths);
253
        }
254

    
255
        return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);
256
    }
257

    
258
    @Override
259
    public List<TaxonDescription> listTaxonDescriptions(Taxon taxon, Set<Scope> scopes, Set<NamedArea> geographicalScope, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
260
        List<TaxonDescription> results = dao.listTaxonDescriptions(taxon, scopes, geographicalScope, markerTypes, pageSize, pageNumber, propertyPaths);
261
        return results;
262
    }
263

    
264

    
265
    /* (non-Javadoc)
266
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#listTaxonDescriptionMedia(UUID, boolean, Set, Integer, Integer, List)
267
     */
268
    @Override
269
    public List<Media> listTaxonDescriptionMedia(UUID taxonUuid, boolean limitToGalleries, Set<MarkerType> markerTypes, Integer pageSize, Integer pageNumber, List<String> propertyPaths){
270
        return this.dao.listTaxonDescriptionMedia(taxonUuid, limitToGalleries, markerTypes, pageSize, pageNumber, propertyPaths);
271
    }
272

    
273
    /*
274
     * @see IDescriptionService#countTaxonDescriptionMedia(UUID, boolean, Set)
275
     */
276
    @Override
277
    public int countTaxonDescriptionMedia(UUID taxonUuid, boolean limitToGalleries, Set<MarkerType> markerTypes){
278
        return this.dao.countTaxonDescriptionMedia(taxonUuid, limitToGalleries, markerTypes);
279
    }
280

    
281

    
282

    
283

    
284
    @Override
285
    public DistributionTree getOrderedDistributions(
286
            Set<TaxonDescription> taxonDescriptions,
287
            Set<NamedAreaLevel> omitLevels,
288
            List<String> propertyPaths){
289

    
290
        DistributionTree tree = new DistributionTree();
291
        List<Distribution> distList = new ArrayList<Distribution>();
292

    
293
        for (TaxonDescription taxonDescription : taxonDescriptions) {
294
            taxonDescription = (TaxonDescription) dao.load(taxonDescription.getUuid(), propertyPaths);
295
            Set<DescriptionElementBase> elements = taxonDescription.getElements();
296
            for (DescriptionElementBase element : elements) {
297
                    if (element.isInstanceOf(Distribution.class)) {
298
                        Distribution distribution = (Distribution) element;
299
                        if(distribution.getArea() != null){
300
                            distList.add(distribution);
301
                        }
302
                    }
303
            }
304
        }
305

    
306
        // filter distributions
307
        Collection<Distribution> filteredDistributions = DescriptionUtility.filterDistributions(distList);
308
        distList.clear();
309
        distList.addAll(filteredDistributions);
310

    
311
        //order by areas
312
        tree.orderAsTree(distList, omitLevels);
313
        tree.sortChildren();
314
        return tree;
315
    }
316

    
317
    @Override
318
    public Pager<TaxonNameDescription> getTaxonNameDescriptions(TaxonNameBase name, Integer pageSize, Integer pageNumber, List<String> propertyPaths) {
319
        Integer numberOfResults = dao.countTaxonNameDescriptions(name);
320

    
321
        List<TaxonNameDescription> results = new ArrayList<TaxonNameDescription>();
322
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
323
            results = dao.getTaxonNameDescriptions(name, pageSize, pageNumber,propertyPaths);
324
        }
325

    
326
        return new DefaultPagerImpl<TaxonNameDescription>(pageNumber, numberOfResults, pageSize, results);
327
    }
328

    
329

    
330
    @Override
331
    public Pager<DescriptionBase> page(Class<? extends DescriptionBase> type, Boolean hasImages, Boolean hasText, Set<Feature> feature, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
332
        Integer numberOfResults = dao.countDescriptions(type, hasImages, hasText, feature);
333

    
334
        List<DescriptionBase> results = new ArrayList<DescriptionBase>();
335
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
336
            results = dao.listDescriptions(type, hasImages, hasText, feature, pageSize, pageNumber,orderHints,propertyPaths);
337
        }
338

    
339
        return new DefaultPagerImpl<DescriptionBase>(pageNumber, numberOfResults, pageSize, results);
340
    }
341

    
342
    /**
343
     * FIXME Candidate for harmonization
344
     * Rename: searchByDistribution
345
     */
346
    @Override
347
    public Pager<TaxonDescription> searchDescriptionByDistribution(Set<NamedArea> namedAreas, PresenceAbsenceTermBase presence,	Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
348
        Integer numberOfResults = dao.countDescriptionByDistribution(namedAreas, presence);
349

    
350
        List<TaxonDescription> results = new ArrayList<TaxonDescription>();
351
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
352
            results = dao.searchDescriptionByDistribution(namedAreas, presence, pageSize, pageNumber,orderHints,propertyPaths);
353
        }
354

    
355
        return new DefaultPagerImpl<TaxonDescription>(pageNumber, numberOfResults, pageSize, results);
356
    }
357

    
358
    /**
359
     * FIXME Candidate for harmonization
360
     * move: descriptionElementService.search
361
     */
362
    @Override
363
    public Pager<DescriptionElementBase> searchElements(Class<? extends DescriptionElementBase> clazz, String queryString, Integer pageSize, Integer pageNumber, List<OrderHint> orderHints, List<String> propertyPaths) {
364
        Integer numberOfResults = descriptionElementDao.count(clazz, queryString);
365

    
366
        List<DescriptionElementBase> results = new ArrayList<DescriptionElementBase>();
367
        if(numberOfResults > 0) { // no point checking again //TODO use AbstractPagerImpl.hasResultsInRange(numberOfResults, pageNumber, pageSize)
368
            results = descriptionElementDao.search(clazz, queryString, pageSize, pageNumber, orderHints, propertyPaths);
369
        }
370

    
371
        return new DefaultPagerImpl<DescriptionElementBase>(pageNumber, numberOfResults, pageSize, results);
372
    }
373

    
374
    /**
375
     * FIXME Candidate for harmonization
376
     * descriptionElementService.find
377
     */
378
    @Override
379
    public DescriptionElementBase getDescriptionElementByUuid(UUID uuid) {
380
        return descriptionElementDao.findByUuid(uuid);
381
    }
382

    
383
    /**
384
     * FIXME Candidate for harmonization
385
     * descriptionElementService.load
386
     */
387
    @Override
388
    public DescriptionElementBase loadDescriptionElement(UUID uuid,	List<String> propertyPaths) {
389
        return descriptionElementDao.load(uuid, propertyPaths);
390
    }
391

    
392
    /**
393
     * FIXME Candidate for harmonization
394
     * descriptionElementService.save
395
     */
396
    @Override
397
    @Transactional(readOnly = false)
398
    public UUID saveDescriptionElement(DescriptionElementBase descriptionElement) {
399
        return descriptionElementDao.save(descriptionElement);
400
    }
401

    
402
    /**
403
     * FIXME Candidate for harmonization
404
     * descriptionElementService.save
405
     */
406
    @Override
407
    @Transactional(readOnly = false)
408
    public Map<UUID, DescriptionElementBase> saveDescriptionElement(Collection<DescriptionElementBase> descriptionElements) {
409
        return descriptionElementDao.saveAll(descriptionElements);
410
    }
411

    
412
    /**
413
     * FIXME Candidate for harmonization
414
     * descriptionElementService.delete
415
     */
416
    @Override
417
    public UUID deleteDescriptionElement(DescriptionElementBase descriptionElement) {
418
        return descriptionElementDao.delete(descriptionElement);
419
    }
420

    
421
    @Override
422
    public TermVocabulary<Feature> getFeatureVocabulary(UUID uuid) {
423
        return vocabularyDao.findByUuid(uuid);
424
    }
425

    
426
    @Override
427
    @Deprecated
428
    public <T extends DescriptionElementBase> List<T> getDescriptionElementsForTaxon(
429
            Taxon taxon, Set<Feature> features,
430
            Class<T> type, Integer pageSize,
431
            Integer pageNumber, List<String> propertyPaths) {
432
        return listDescriptionElementsForTaxon(taxon, features, type, pageSize, pageNumber, propertyPaths);
433
    }
434

    
435
    @Override
436
    public <T extends DescriptionElementBase> List<T> listDescriptionElementsForTaxon(
437
            Taxon taxon, Set<Feature> features,
438
            Class<T> type, Integer pageSize,
439
            Integer pageNumber, List<String> propertyPaths) {
440
        return dao.getDescriptionElementForTaxon(taxon, features, type, pageSize, pageNumber, propertyPaths);
441
    }
442

    
443
    @Override
444
    public <T extends DescriptionElementBase> Pager<T> pageDescriptionElementsForTaxon(
445
            Taxon taxon, Set<Feature> features,
446
            Class<T> type, Integer pageSize,
447
            Integer pageNumber, List<String> propertyPaths) {
448
        Long count = dao.countDescriptionElementForTaxon(taxon, features, type);
449
        List<T> descriptionElements;
450
        if(count > (pageSize * pageNumber + 1)){ // no point checking again
451
            descriptionElements = listDescriptionElementsForTaxon(taxon, features, type, pageSize, pageNumber, propertyPaths);
452
        } else {
453
            descriptionElements = new ArrayList<T>(0);
454
        }
455
        return new DefaultPagerImpl<T>(pageNumber, count.intValue(), pageSize, descriptionElements);
456
    }
457

    
458

    
459
    /* (non-Javadoc)
460
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#generateNaturalLanguageDescription(eu.etaxonomy.cdm.model.description.FeatureTree, eu.etaxonomy.cdm.model.description.TaxonDescription, eu.etaxonomy.cdm.model.common.Language, java.util.List)
461
     */
462
    @Override
463
    public String generateNaturalLanguageDescription(FeatureTree featureTree,
464
            TaxonDescription description, List<Language> preferredLanguages, String separator) {
465

    
466
        Language lang = preferredLanguages.size() > 0 ? preferredLanguages.get(0) : Language.DEFAULT();
467

    
468
        description = (TaxonDescription)load(description.getUuid());
469
        featureTree = featureTreeDao.load(featureTree.getUuid());
470

    
471
        StringBuilder naturalLanguageDescription = new StringBuilder();
472

    
473
        MarkerType useMarkerType = (MarkerType) definedTermDao.load(UUID.fromString("2e6e42d9-e92a-41f4-899b-03c0ac64f039"));
474
        boolean isUseDescription = false;
475
        if(!description.getMarkers().isEmpty()) {
476
            for (Marker marker: description.getMarkers()) {
477
                MarkerType markerType = marker.getMarkerType();
478
                if (markerType.equals(useMarkerType)) {
479
                    isUseDescription = true;
480
                }
481

    
482
            }
483
        }
484

    
485
        if(description.hasStructuredData() && !isUseDescription){
486

    
487

    
488
            String lastCategory = null;
489
            String categorySeparator = ". ";
490

    
491
            List<TextData> textDataList;
492
            TextData naturalLanguageDescriptionText = null;
493

    
494
            boolean useMicroFormatQuantitativeDescriptionBuilder = false;
495

    
496
            if(useMicroFormatQuantitativeDescriptionBuilder){
497

    
498
                MicroFormatQuantitativeDescriptionBuilder micro = new MicroFormatQuantitativeDescriptionBuilder();
499
                naturalLanguageGenerator.setQuantitativeDescriptionBuilder(micro);
500
                naturalLanguageDescriptionText = naturalLanguageGenerator.generateSingleTextData(featureTree, (description), lang);
501

    
502
            } else {
503

    
504
                naturalLanguageDescriptionText = naturalLanguageGenerator.generateSingleTextData(
505
                        featureTree,
506
                        (description),
507
                        lang);
508
            }
509

    
510
            return naturalLanguageDescriptionText.getText(lang);
511

    
512
//
513
//			boolean doItBetter = false;
514
//
515
//			for (TextData textData : textDataList.toArray(new TextData[textDataList.size()])){
516
//				if(textData.getMultilanguageText().size() > 0){
517
//
518
//					if (!textData.getFeature().equals(Feature.UNKNOWN())) {
519
//						String featureLabel = textData.getFeature().getLabel(lang);
520
//
521
//						if(doItBetter){
522
//							/*
523
//							 *  WARNING
524
//							 *  The code lines below are desinged to handle
525
//							 *  a special case where as the feature label contains
526
//							 *  hierarchical information on the features. This code
527
//							 *  exist only as a base for discussion, and is not
528
//							 *  intendet to be used in production.
529
//							 */
530
//							featureLabel = StringUtils.remove(featureLabel, '>');
531
//
532
//							String[] labelTokens = StringUtils.split(featureLabel, '<');
533
//							if(labelTokens[0].equals(lastCategory) && labelTokens.length > 1){
534
//								if(naturalLanguageDescription.length() > 0){
535
//									naturalLanguageDescription.append(separator);
536
//								}
537
//								naturalLanguageDescription.append(labelTokens[1]);
538
//							} else {
539
//								if(naturalLanguageDescription.length() > 0){
540
//									naturalLanguageDescription.append(categorySeparator);
541
//								}
542
//								naturalLanguageDescription.append(StringUtils.join(labelTokens));
543
//							}
544
//							lastCategory = labelTokens[0];
545
//							// end of demo code
546
//						} else {
547
//							if(naturalLanguageDescription.length() > 0){
548
//								naturalLanguageDescription.append(separator);
549
//							}
550
//							naturalLanguageDescription.append(textData.getFeature().getLabel(lang));
551
//						}
552
//					} else {
553
//						if(naturalLanguageDescription.length() > 0){
554
//							naturalLanguageDescription.append(separator);
555
//						}
556
//					}
557
//					String text = textData.getMultilanguageText().values().iterator().next().getText();
558
//					naturalLanguageDescription.append(text);
559
//
560
//				}
561
//			}
562

    
563
        }
564
        else if (isUseDescription) {
565
            //AT: Left Blank in case we need to generate a Natural language text string.
566
        }
567
        return naturalLanguageDescription.toString();
568
    }
569

    
570
    /* (non-Javadoc)
571
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#hasStructuredData(eu.etaxonomy.cdm.model.description.DescriptionBase)
572
     */
573
    @Override
574
    public boolean hasStructuredData(DescriptionBase<?> description) {
575
        return load(description.getUuid()).hasStructuredData();
576
    }
577

    
578

    
579
    /* (non-Javadoc)
580
     * @see eu.etaxonomy.cdm.api.service.IDescriptionService#moveDescriptionElementsToDescription(java.util.Collection, eu.etaxonomy.cdm.model.description.DescriptionBase, boolean)
581
     */
582
    @Override
583
    public void moveDescriptionElementsToDescription(Collection<DescriptionElementBase> descriptionElements,
584
                                                    DescriptionBase targetDescription, boolean isCopy) {
585

    
586
        if (descriptionElements.isEmpty() ){
587
            return ;
588
        }
589

    
590
        if (! isCopy && descriptionElements == descriptionElements.iterator().next().getInDescription().getElements()){
591
            //if the descriptionElements collection is the elements set of a description, put it in a separate set before to avoid concurrent modification exceptions
592
            descriptionElements = new HashSet<DescriptionElementBase>(descriptionElements);
593
//			descriptionElementsTmp.addAll(descriptionElements);
594
//			descriptionElements = descriptionElementsTmp;
595
        }
596
        for (DescriptionElementBase element : descriptionElements){
597
            DescriptionBase description = element.getInDescription();
598
            try {
599
                DescriptionElementBase newElement = (DescriptionElementBase)element.clone();
600
                targetDescription.addElement(newElement);
601
            } catch (CloneNotSupportedException e) {
602
                new RuntimeException ("Clone not yet implemented for class " + element.getClass().getName(), e);
603
            }
604
            if (! isCopy){
605
                description.removeElement(element);
606
            }
607

    
608
        }
609
    }
610

    
611
    public void aggregateDistributions(List<NamedArea> superAreas, Rank lowerRank, Rank upperRank) {
612

    
613
//        transmissionEngineDistribution engine = new transmissionEngineDistribution(superAreas, lowerRank, upperRank);
614

    
615
    }
616

    
617
}
(16-16/81)