Project

General

Profile

Download (7.45 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 <T extends DefinedTermBase> BeanItemContainer<T> buildTermItemContainer(Class<T> type, TermType termType) {
73

    
74
        clearSession();
75
        // TODO use TermCacher?
76
        List<T> terms = repo.getTermService().listByTermType(termType, null, null, orderHints, INIT_STRATEGY);
77
        BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
78
        termItemContainer.addAll(terms);
79
        return termItemContainer;
80
    }
81

    
82

    
83
    @Transactional(readOnly=true)
84
    public BeanItemContainer<DefinedTermBase> buildVocabularyTermsItemContainer(UUID vocabularyUuid) {
85

    
86
        clearSession();
87
        TermVocabulary vocab = repo.getVocabularyService().find(vocabularyUuid);
88
        Pager<DefinedTermBase> terms = repo.getVocabularyService().getTerms(vocab, null, null, orderHints, INIT_STRATEGY);
89
        BeanItemContainer<DefinedTermBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
90
        termItemContainer.addAll(terms.getRecords());
91
        return termItemContainer;
92
    }
93

    
94
    @Transactional(readOnly=true)
95
    public <DTO extends Object> BeanItemContainer<DTO> buildVocabularyTermsItemContainer(UUID vocabularyUuid, BeanToDTOConverter<TermBase, DTO> converter) {
96

    
97
        clearSession();
98
        TermVocabulary vocab = repo.getVocabularyService().find(vocabularyUuid);
99
        Pager<DefinedTermBase> terms = repo.getVocabularyService().getTerms(vocab, null, null, orderHints, INIT_STRATEGY);
100
        BeanItemContainer<DTO> termItemContainer = new BeanItemContainer<>(converter.getDTOType());
101
        termItemContainer.addAll(terms.getRecords().stream().map(b -> converter.toDTO(b)).collect(Collectors.toList()));
102
        return termItemContainer;
103
    }
104

    
105

    
106
    public BeanItemContainer<DefinedTermBase> buildTermItemContainer(UUID ... termUuid) {
107
        return buildTermItemContainer(Arrays.asList(termUuid));
108
    }
109

    
110
    @Transactional(readOnly=true)
111
    public BeanItemContainer<DefinedTermBase> buildTermItemContainer(List<UUID> termsUuids) {
112
        clearSession();
113
        List<DefinedTermBase> terms = repo.getTermService().load(termsUuids, INIT_STRATEGY);
114
        BeanItemContainer<DefinedTermBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
115
        termItemContainer.addAll(terms);
116
        return termItemContainer;
117
    }
118

    
119
    public BeanItemContainer<TypeDesignationStatusBase> buildTypeDesignationStatusBaseItemContainer(List<UUID> termsUuids,
120
            Optional<Boolean> withHasDesignationSource) {
121
        clearSession();
122
        List<DefinedTermBase> terms = repo.getTermService().load(termsUuids, INIT_STRATEGY);
123
        BeanItemContainer<TypeDesignationStatusBase> termItemContainer = new BeanItemContainer<>(DefinedTermBase.class);
124
        termItemContainer.addAll(terms.stream()
125
                .filter(t -> t instanceof TypeDesignationStatusBase)
126
                .map(t -> (TypeDesignationStatusBase)t)
127
                .filter(tsb ->
128
                    !withHasDesignationSource.isPresent()
129
                    || withHasDesignationSource.get().equals(false)
130
                    || tsb.hasDesignationSource() == true
131
                )
132
                .collect(Collectors.toList())
133
        );
134
        return termItemContainer;
135
    }
136

    
137
    public BeanItemContainer<TypeDesignationStatusBase> buildTypeDesignationStatusBaseItemItemContainer(Class<TypeDesignationStatusBase> type,
138
            List<OrderHint> orderHints, Optional<Boolean> withHasDesignationSource) {
139

    
140
        BeanItemContainer<TypeDesignationStatusBase> container = buildBeanItemContainer(type, null);
141
        List<TypeDesignationStatusBase> filteredItems = container.getItemIds().stream().filter(tsb ->
142
                    !withHasDesignationSource.isPresent()
143
                    || withHasDesignationSource.get().equals(false)
144
                    || tsb.hasDesignationSource() == true
145
                )
146
                .collect(Collectors.toList());
147
        container.removeAllItems();
148
        container.addAll(filteredItems);
149
        return container;
150
    }
151

    
152

    
153
    @Transactional(readOnly=true)
154
    public <T extends CdmBase> BeanItemContainer<T> buildBeanItemContainer(Class<T> type, List<OrderHint> orderHints) {
155

    
156
        if(orderHints == null){
157
            orderHints = OrderHint.defaultOrderHintsFor(type);
158
        }
159
        clearSession();
160
        List<T> terms = repo.getCommonService().list(type, (Integer)null, (Integer)null,
161
                orderHints,
162
                Arrays.asList(new String[]{"$"}));
163
        BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(type);
164
        termItemContainer.addAll(terms);
165
        return termItemContainer;
166
    }
167

    
168
    public <T extends CdmBase> BeanItemContainer<T> buildBeanItemContainer(Class<T> type) {
169
        return buildBeanItemContainer(type, null);
170
    }
171

    
172
    public <T extends IEnumTerm<T>> BeanItemContainer<T> buildEnumTermItemContainer(Class<T> termType, T ... enumTerms) {
173
        BeanItemContainer<T> termItemContainer = new BeanItemContainer<>(termType);
174
        List<T> termList = Arrays.asList(enumTerms);
175
        termItemContainer.addAll(termList);
176
        return termItemContainer;
177
    }
178

    
179
    public void clearSession() {
180
        repo.clearSession();
181
    }
182

    
183
}
(2-2/13)