Project

General

Profile

Download (6.19 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2017 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.service;
10

    
11
import java.util.ArrayList;
12
import java.util.Arrays;
13
import java.util.List;
14
import java.util.Optional;
15
import java.util.UUID;
16
import java.util.stream.Collectors;
17

    
18
import org.springframework.beans.factory.annotation.Autowired;
19
import org.springframework.beans.factory.annotation.Qualifier;
20
import org.springframework.stereotype.Service;
21
import org.springframework.transaction.annotation.Transactional;
22

    
23
import com.vaadin.data.util.BeanItemContainer;
24

    
25
import eu.etaxonomy.cdm.api.application.CdmRepository;
26
import eu.etaxonomy.cdm.api.service.pager.Pager;
27
import eu.etaxonomy.cdm.model.common.CdmBase;
28
import eu.etaxonomy.cdm.model.name.TypeDesignationStatusBase;
29
import eu.etaxonomy.cdm.model.term.DefinedTermBase;
30
import eu.etaxonomy.cdm.model.term.IEnumTerm;
31
import eu.etaxonomy.cdm.model.term.TermBase;
32
import eu.etaxonomy.cdm.model.term.TermType;
33
import eu.etaxonomy.cdm.model.term.TermVocabulary;
34
import eu.etaxonomy.cdm.persistence.query.OrderHint;
35

    
36
/**
37
 * <b>Read only</b> service which can provide {@link BeanItemContainer BeanItemContainers} as source for select form
38
 * element options.
39
 *
40
 * @author a.kohlbecker
41
 * @since Apr 6, 2017
42
 *
43
 */
44
@Service
45
public class CdmBeanItemContainerFactory {
46

    
47
    @Autowired
48
    @Qualifier("cdmRepository")
49
    private CdmRepository repo;
50

    
51
    private final static List<String> INIT_STRATEGY = Arrays.asList(new String[]{"$", "representations"});
52

    
53
    private static List<OrderHint> orderHints = new ArrayList<>();
54

    
55
    static {
56
        orderHints.add(OrderHint.BY_ORDER_INDEX);
57
        orderHints.add(OrderHint.ORDER_BY_TITLE_CACHE);
58
    }
59

    
60
    @Transactional(readOnly=true)
61
    public BeanItemContainer<DefinedTermBase> buildTermItemContainer(TermType termType) {
62

    
63
        clearSession();
64
        // TODO use TermCacher?
65
        List<DefinedTermBase> terms = repo.getTermService().listByTermType(termType, null, null, orderHints, INIT_STRATEGY);
66
        BeanItemContainer<DefinedTermBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
67
        termItemContainer.addAll(terms);
68
        return termItemContainer;
69
    }
70

    
71
    @Transactional(readOnly=true)
72
    public BeanItemContainer<DefinedTermBase> buildVocabularyTermsItemContainer(UUID vocabularyUuid) {
73

    
74
        clearSession();
75
        TermVocabulary vocab = repo.getVocabularyService().find(vocabularyUuid);
76
        Pager<DefinedTermBase> terms = repo.getVocabularyService().getTerms(vocab, null, null, orderHints, INIT_STRATEGY);
77
        BeanItemContainer<DefinedTermBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
78
        termItemContainer.addAll(terms.getRecords());
79
        return termItemContainer;
80
    }
81

    
82
    @Transactional(readOnly=true)
83
    public <DTO extends Object> BeanItemContainer<DTO> buildVocabularyTermsItemContainer(UUID vocabularyUuid, BeanToDTOConverter<TermBase, DTO> converter) {
84

    
85
        clearSession();
86
        TermVocabulary vocab = repo.getVocabularyService().find(vocabularyUuid);
87
        Pager<DefinedTermBase> terms = repo.getVocabularyService().getTerms(vocab, null, null, orderHints, INIT_STRATEGY);
88
        BeanItemContainer<DTO> termItemContainer = new BeanItemContainer<>(converter.getDTOType());
89
        termItemContainer.addAll(terms.getRecords().stream().map(b -> converter.toDTO(b)).collect(Collectors.toList()));
90
        return termItemContainer;
91
    }
92

    
93

    
94
    public BeanItemContainer<DefinedTermBase> buildTermItemContainer(UUID ... termUuid) {
95
        return buildTermItemContainer(Arrays.asList(termUuid));
96
    }
97

    
98
    @Transactional(readOnly=true)
99
    public BeanItemContainer<DefinedTermBase> buildTermItemContainer(List<UUID> termsUuids) {
100
        clearSession();
101
        List<DefinedTermBase> terms = repo.getTermService().load(termsUuids, INIT_STRATEGY);
102
        BeanItemContainer<DefinedTermBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
103
        termItemContainer.addAll(terms);
104
        return termItemContainer;
105
    }
106

    
107
    public BeanItemContainer<TypeDesignationStatusBase> buildTypeDesignationStatusBaseItemContainer(List<UUID> termsUuids,
108
            Optional<Boolean> withHasDesignationSource) {
109
        clearSession();
110
        List<DefinedTermBase> terms = repo.getTermService().load(termsUuids, INIT_STRATEGY);
111
        BeanItemContainer<TypeDesignationStatusBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
112
        termItemContainer.addAll(terms.stream()
113
                .filter(t -> t instanceof TypeDesignationStatusBase)
114
                .map(t -> (TypeDesignationStatusBase)t)
115
                .filter(tsb ->
116
                    !withHasDesignationSource.isPresent()
117
                    || withHasDesignationSource.get().equals(false)
118
                    || tsb.hasDesignationSource() == true
119
                )
120
                .collect(Collectors.toList())
121
        );
122
        return termItemContainer;
123
    }
124

    
125
    @Transactional(readOnly=true)
126
    public <T extends CdmBase> BeanItemContainer<T> buildBeanItemContainer(Class<T> type, List<OrderHint> orderHints) {
127

    
128
        if(orderHints == null){
129
            orderHints = OrderHint.defaultOrderHintsFor(type);
130
        }
131
        clearSession();
132
        List<T> terms = repo.getCommonService().list(type, (Integer)null, (Integer)null,
133
                orderHints,
134
                Arrays.asList(new String[]{"$"}));
135
        BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(type);
136
        termItemContainer.addAll(terms);
137
        return termItemContainer;
138
    }
139

    
140
    public <T extends CdmBase> BeanItemContainer<T> buildBeanItemContainer(Class<T> type) {
141
        return buildBeanItemContainer(type, null);
142
    }
143

    
144
    public <T extends IEnumTerm<T>> BeanItemContainer<T> buildEnumTermItemContainer(Class<T> termType, T ... enumTerms) {
145
        BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(termType);
146
        List<T> termList = Arrays.asList(enumTerms);
147
        termItemContainer.addAll(termList);
148
        return termItemContainer;
149
    }
150

    
151
    public void clearSession() {
152
        repo.clearSession();
153
    }
154

    
155
}
(2-2/14)