Project

General

Profile

Download (3.92 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2018 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.persistence.hibernate;
10

    
11
import org.apache.commons.lang.ArrayUtils;
12
import org.apache.log4j.Logger;
13
import org.hibernate.event.spi.PostInsertEvent;
14
import org.hibernate.event.spi.PostInsertEventListener;
15
import org.hibernate.event.spi.PostUpdateEvent;
16
import org.hibernate.event.spi.PostUpdateEventListener;
17
import org.hibernate.persister.entity.EntityPersister;
18

    
19
import eu.etaxonomy.cdm.model.name.TaxonName;
20
import eu.etaxonomy.cdm.model.reference.Reference;
21
import eu.etaxonomy.cdm.persistence.dao.taxonGraph.ITaxonGraphDao;
22
import eu.etaxonomy.cdm.persistence.dao.taxonGraph.TaxonGraphException;
23

    
24
/**
25
 * @author a.kohlbecker
26
 * @since Sep 27, 2018
27
 *
28
 */
29
public class TaxonGraphHibernateListener implements PostInsertEventListener, PostUpdateEventListener {
30

    
31
    private static final long serialVersionUID = 5062518307839173935L;
32

    
33
    private static TaxonGraphHibernateListener instance;
34

    
35
    private ITaxonGraphDao taxonGraphDao;
36

    
37
    public void setTaxonGraphDao(ITaxonGraphDao taxonGraphDao){
38
        this.taxonGraphDao = taxonGraphDao;
39
    }
40

    
41
    private String[] NAMEPARTS_OR_RANK_PROPS = new String[]{"genusOrUninomial", "specificEpithet", "rank"};
42
    private String[] NOMREF_PROP = new String[]{"nomenclaturalReference"};
43

    
44

    
45
    private int checkStateChange(PostUpdateEvent event, String[] propertyNamesToCheck){
46

    
47
        String[] propertyNames = event.getPersister().getPropertyNames();
48
        Object[] oldState = event.getOldState();
49
        Object[] state = event.getState();
50

    
51
        int propsCheckedCnt = 0;
52
        for(int i = 0; i < propertyNames.length; i++){
53
            if(ArrayUtils.contains(propertyNamesToCheck, propertyNames[i])){
54
                propsCheckedCnt++;
55
                if(!oldState[i].equals(state[i])){
56
                    return i;
57
                }
58
                if(propsCheckedCnt == propertyNamesToCheck.length){
59
                    return -1;
60
                }
61
            }
62
        }
63
        // this execption should be raised during the unit tests already and thus will never occur in production
64
        throw new RuntimeException("TaxonName class misses at least one property of: " + ArrayUtils.toString(propertyNamesToCheck));
65
    }
66

    
67
    @Override
68
    public void onPostUpdate(PostUpdateEvent event) {
69
        if(taxonGraphDao == null){
70
            return;
71
        }
72
        try {
73
            if(event.getEntity() instanceof TaxonName){
74
                if(checkStateChange(event, NAMEPARTS_OR_RANK_PROPS) > -1){
75
                    taxonGraphDao.onNameOrRankChange((TaxonName) event.getEntity());
76
                }
77
                int changedNomRefIndex = checkStateChange(event, NOMREF_PROP);
78
                if(changedNomRefIndex > -1){
79
                    taxonGraphDao.onNomReferenceChange((TaxonName) event.getEntity(), (Reference)event.getOldState()[changedNomRefIndex]);
80
                }
81
            }
82
        } catch (TaxonGraphException e) {
83
            Logger.getLogger(this.getClass()).error(e);
84
        }
85

    
86
    }
87

    
88
    @Override
89
    public void onPostInsert(PostInsertEvent event) {
90
        if(taxonGraphDao == null){
91
            return;
92
        }
93
        try {
94
            if(event.getEntity() instanceof TaxonName){
95
                taxonGraphDao.onNewTaxonName((TaxonName) event.getEntity());
96
            }
97
        } catch (TaxonGraphException e) {
98
            Logger.getLogger(this.getClass()).error(e);
99
        }
100
    }
101

    
102
    @Override
103
    public boolean requiresPostCommitHanding(EntityPersister persister) {
104
        return true;
105
    }
106

    
107
    /**
108
     * @return
109
     */
110
    public static TaxonGraphHibernateListener instance() {
111
        if(instance == null){
112
            instance = new TaxonGraphHibernateListener();
113
        }
114
        return instance;
115
    }
116

    
117
}
(20-20/22)