1 package eu
.etaxonomy
.cdm
.api
.service
;
3 import java
.util
.ArrayList
;
6 import org
.apache
.log4j
.Logger
;
7 import org
.springframework
.beans
.factory
.annotation
.Autowired
;
8 import org
.springframework
.stereotype
.Service
;
9 import org
.springframework
.transaction
.annotation
.Transactional
;
11 import eu
.etaxonomy
.cdm
.api
.service
.statistics
.Statistics
;
12 import eu
.etaxonomy
.cdm
.api
.service
.statistics
.StatisticsConfigurator
;
13 import eu
.etaxonomy
.cdm
.api
.service
.statistics
.StatisticsTypeEnum
;
14 import eu
.etaxonomy
.cdm
.model
.common
.IdentifiableEntity
;
15 import eu
.etaxonomy
.cdm
.model
.description
.DescriptionBase
;
16 import eu
.etaxonomy
.cdm
.model
.name
.TaxonNameBase
;
17 import eu
.etaxonomy
.cdm
.model
.taxon
.Classification
;
18 import eu
.etaxonomy
.cdm
.model
.taxon
.Synonym
;
19 import eu
.etaxonomy
.cdm
.model
.taxon
.Taxon
;
20 import eu
.etaxonomy
.cdm
.model
.taxon
.TaxonBase
;
21 import eu
.etaxonomy
.cdm
.persistence
.dao
.description
.IDescriptionDao
;
22 import eu
.etaxonomy
.cdm
.persistence
.dao
.name
.ITaxonNameDao
;
23 import eu
.etaxonomy
.cdm
.persistence
.dao
.reference
.IReferenceDao
;
24 import eu
.etaxonomy
.cdm
.persistence
.dao
.statistics
.IStatisticsDao
;
25 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.IClassificationDao
;
26 import eu
.etaxonomy
.cdm
.persistence
.dao
.taxon
.ITaxonDao
;
30 * @author s.buers Service to provide statistic data of the database elements
35 public class StatisticsServiceImpl
implements IStatisticsService
{
37 private static final Logger logger
= Logger
38 .getLogger(StatisticsServiceImpl
.class);
42 // this does not make sense, we just count nothing if no type is given.
43 // the one who calls this service should check that there are types given!
44 // private static final StatisticsTypeEnum DEFAULT_TYPE=StatisticsTypeEnum.ALL_TAXA;
45 //TODO create a list with all types.
47 // this constant can also be used by the ones that use the service
49 private static final IdentifiableEntity
<?
> ALL_DB
= null;
53 public IdentifiableEntity
<?
> getFilterALL_DB(){
57 private ArrayList
<Statistics
> statisticsList
;
60 private ITaxonDao taxonDao
;
63 private ITaxonNameDao taxonNameDao
;
66 private IClassificationDao classificationDao
;
69 private IReferenceDao referenceDao
;
72 private IStatisticsDao statisticsDao
;
75 private IDescriptionDao descriptionDao
;
78 * counts all the elements referenced in the configurator from the part of
79 * the database referenced in the configurator
81 * @param configurators
82 * @return be aware that a Statistics.countMap might contain "null"
83 * {@link Number} values, if the count failed (, if the value is "0"
84 * the count succeeded in counting zero elements.)
88 public List
<Statistics
> getCountStatistics(
89 List
<StatisticsConfigurator
> configurators
) {
91 statisticsList
= new ArrayList
<Statistics
>();
93 for (StatisticsConfigurator statisticsConfigurator
: configurators
) {
94 // create a Statistics element for each configurator
95 countStatisticsPart(statisticsConfigurator
);
97 return this.statisticsList
;
101 private void countStatisticsPart(StatisticsConfigurator configurator
) {
102 // get last element of configurator.filter (the node that is the root
104 IdentifiableEntity filter
= configurator
.getFilter().get(
105 (configurator
.getFilter().size()) - 1);
106 if (filter
== getFilterALL_DB()) {
107 countAll(configurator
);
108 } else { // check for classtype classification
109 countPart(configurator
, filter
);
115 * @param configurator
117 private void countAll(StatisticsConfigurator configurator
) {
118 Statistics statistics
= new Statistics(configurator
);
120 for (StatisticsTypeEnum type
: configurator
.getType()) {
125 counter
= Long
.valueOf(taxonDao
.count(TaxonBase
.class));
128 counter
= Long
.valueOf(taxonDao
.count(Synonym
.class));
131 counter
= Long
.valueOf(taxonDao
.count(Taxon
.class));
135 .valueOf(referenceDao
136 .count(eu
.etaxonomy
.cdm
.model
.reference
.Reference
.class));
139 case NOMECLATURAL_REFERENCES
:
141 counter
= statisticsDao
.countNomenclaturalReferences();
145 counter
= Long
.valueOf(classificationDao
146 .count(Classification
.class));
151 counter
= Long
.valueOf(taxonNameDao
.count(TaxonNameBase
.class));
154 case DESCRIPTIVE_SOURCE_REFERENCES
:
156 counter
= statisticsDao
.countDescriptiveSourceReferences();
161 counter
= Long
.valueOf(descriptionDao
.count(DescriptionBase
.class));
166 statistics
.addCount(type
, counter
);
168 statisticsList
.add(statistics
);
172 private void countPart(StatisticsConfigurator configurator
,
173 IdentifiableEntity filter
) {
174 // TODO maybe remove redundant parameter filter
175 Statistics statistics
= new Statistics(configurator
);
179 if (filter
instanceof Classification
) {
181 for (StatisticsTypeEnum type
: configurator
.getType()) {
185 logger
.info("there should not be any classification "
186 + "nested in an other classification");
190 counter
= statisticsDao
.countTaxaInClassification(
191 Taxon
.class, (Classification
) filter
);
195 counter
= statisticsDao
.countTaxaInClassification(
196 TaxonBase
.class, (Classification
) filter
);
199 counter
= statisticsDao
.countTaxaInClassification(
200 Synonym
.class, (Classification
) filter
);
203 counter
= statisticsDao
204 .countTaxonNames((Classification
) filter
);
207 counter
= statisticsDao
.countReferencesInClassification((Classification
) filter
);
209 case DESCRIPTIVE_SOURCE_REFERENCES
:
210 counter
= statisticsDao
211 .countDescriptive(true, (Classification
) filter
);
214 counter
= statisticsDao
215 .countDescriptive(false, (Classification
) filter
);
217 case NOMECLATURAL_REFERENCES
:
218 counter
= statisticsDao
219 .countNomenclaturalReferences((Classification
) filter
);
224 statistics
.addCount(type
, counter
);
226 } else if(filter
instanceof Taxon
) {
227 //TODO get all taxa of the tree:
230 statisticsDao
.getTaxonTree(filter
);
233 // we just return null as count for the statistics
234 // element, if the filter is neither classification nor null.
237 statisticsList
.add(statistics
);