Project

General

Profile

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

    
11
import java.util.ArrayList;
12
import java.util.Collection;
13
import java.util.HashMap;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Map.Entry;
17
import java.util.UUID;
18

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

    
24
import eu.etaxonomy.cdm.api.service.AnnotatableServiceBase;
25
import eu.etaxonomy.cdm.api.service.DeleteResult;
26
import eu.etaxonomy.cdm.api.service.IOccurrenceService;
27
import eu.etaxonomy.cdm.api.service.PreferenceServiceImpl;
28
import eu.etaxonomy.cdm.api.service.UpdateResult;
29
import eu.etaxonomy.cdm.api.service.UpdateResult.Status;
30
import eu.etaxonomy.cdm.hibernate.HibernateProxyHelper;
31
import eu.etaxonomy.cdm.model.common.CdmBase;
32
import eu.etaxonomy.cdm.model.molecular.DnaSample;
33
import eu.etaxonomy.cdm.model.molecular.Sequence;
34
import eu.etaxonomy.cdm.model.molecular.SingleRead;
35
import eu.etaxonomy.cdm.model.molecular.SingleReadAlignment;
36
import eu.etaxonomy.cdm.persistence.dao.molecular.ISequenceDao;
37
import eu.etaxonomy.cdm.persistence.dao.molecular.ISingleReadDao;
38

    
39
/**
40
 * @author pplitzner
41
 * @date 11.03.2014
42
 *
43
 */
44
@Service
45
@Transactional(readOnly = true)
46
public class SequenceServiceImpl extends AnnotatableServiceBase<Sequence, ISequenceDao> implements ISequenceService{
47
    @SuppressWarnings("unused")
48
	private static final Logger logger = Logger.getLogger(PreferenceServiceImpl.class);
49

    
50
    @Autowired
51
    IOccurrenceService occurrenceService;
52

    
53
    @Autowired
54
    ISingleReadDao singleReadDao;
55

    
56
    @Override
57
    @Autowired
58
    protected void setDao(ISequenceDao dao) {
59
        this.dao = dao;
60
    }
61

    
62
    @Override
63
    public UpdateResult moveSingleRead(Sequence from, Sequence to, SingleRead singleRead) {
64
        UpdateResult result = new UpdateResult();
65
        from.removeSingleRead(singleRead);
66
        saveOrUpdate(from);
67
        to.addSingleRead(singleRead);
68
        saveOrUpdate(to);
69
        result.setStatus(Status.OK);
70
        result.addUpdatedObject(from);
71
        result.addUpdatedObject(to);
72
        return result;
73
    }
74

    
75
    @Override
76
    @Transactional(readOnly = false)
77
    public UpdateResult moveSingleRead(UUID fromUuid, UUID toUuid, UUID singleReadUuid) {
78
        SingleRead singleRead = null;
79
        Sequence from = CdmBase.deproxy(dao.load(fromUuid), Sequence.class);
80
        Sequence to = CdmBase.deproxy(dao.load(toUuid), Sequence.class);
81
        for(SingleRead sr : from.getSingleReads()) {
82
            if(sr.getUuid().equals(singleReadUuid)) {
83
                singleRead = sr;
84
                break;
85
            }
86
        }
87
        return moveSingleRead(from, to , singleRead);
88
    }
89

    
90
    @Override
91
    public Map<SingleRead, Collection<Sequence>> getSingleReadSequencesMap() {
92
        Map<SingleRead, Collection<Sequence>> singleReadToSequences = new HashMap<SingleRead, Collection<Sequence>>();
93
        for(Sequence sequence:list(Sequence.class, null, null, null, null)){
94
            for(SingleRead singleRead:sequence.getSingleReads()){
95
                Collection<Sequence> sequences = singleReadToSequences.get(singleRead);
96
                if(sequences==null){
97
                    sequences = new ArrayList<Sequence>();
98
                }
99
                sequences.add(sequence);
100
                singleReadToSequences.put(singleRead, sequences);
101
            }
102
        }
103
        return singleReadToSequences;
104
    }
105

    
106
    @Override
107
    public DeleteResult delete(Sequence sequence) {
108
        DeleteResult deleteResult = new DeleteResult();
109
        //remove from dnaSample
110
        DnaSample dnaSample = sequence.getDnaSample();
111
        if(dnaSample!=null){
112
            dnaSample.removeSequence(sequence);
113
            deleteResult.addUpdatedObject(dnaSample);
114
        }
115
        //remove singleReads
116
        for (SingleReadAlignment singleReadAlignment : sequence.getSingleReadAlignments()) {
117
            deleteSingleRead(singleReadAlignment.getSingleRead(), sequence);
118
        }
119
        dao.delete(sequence);
120
        deleteResult.addDeletedObject(sequence);
121
        return deleteResult;
122
    }
123

    
124
    @Override
125
    public DeleteResult deleteSingleRead(SingleRead singleRead, Sequence sequence){
126
        DeleteResult deleteResult = new DeleteResult();
127
        singleRead = HibernateProxyHelper.deproxy(singleRead, SingleRead.class);
128
        //delete from amplification result
129
        if(singleRead.getAmplificationResult()!=null){
130
            deleteResult.addUpdatedObject(singleRead.getAmplificationResult());
131
            singleRead.getAmplificationResult().removeSingleRead(singleRead);
132
        }
133
        //delete from sequence
134
        sequence.removeSingleRead(singleRead);
135
        deleteResult.addUpdatedObject(sequence);
136

    
137
        //check if used in other sequences
138
        List<SingleRead> toDelete = new ArrayList<SingleRead>();
139
        Map<SingleRead, Collection<Sequence>> singleReadSequencesMap = getSingleReadSequencesMap();
140
        if(singleReadSequencesMap.containsKey(singleRead)){
141
            for (Entry<SingleRead, Collection<Sequence>> entry : singleReadSequencesMap.entrySet()) {
142
                if(entry.getValue().isEmpty()){
143
                    toDelete.add(singleRead);
144
                }
145
            }
146
            for (SingleRead singleReadToDelete : toDelete) {
147
                singleReadDao.delete(singleReadToDelete);
148
                deleteResult.addDeletedObject(singleReadToDelete);
149
            }
150
        }
151
        else{
152
            singleReadDao.delete(singleRead);
153
            deleteResult.addDeletedObject(singleRead);
154
        }
155
        deleteResult.setStatus(Status.OK);
156
        return deleteResult;
157
    }
158

    
159
    @Override
160
    @Transactional(readOnly = false)
161
    public DeleteResult deleteSingleRead(UUID singleReadUuid, UUID sequenceUuid){
162
        SingleRead singleRead = null;
163
        Sequence sequence = CdmBase.deproxy(load(sequenceUuid), Sequence.class);
164
        for(SingleRead sr : sequence.getSingleReads()) {
165
            if(sr.getUuid().equals(singleReadUuid)) {
166
                singleRead = sr;
167
                break;
168
            }
169
        }
170
        return deleteSingleRead(singleRead, sequence);
171
    }
172

    
173
}
(6-6/6)