Project

General

Profile

Download (7.31 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
* Copyright (C) 2015 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.hibernate.event.spi.PreInsertEvent;
12
import org.hibernate.event.spi.PreInsertEventListener;
13
import org.hibernate.event.spi.PreUpdateEvent;
14
import org.hibernate.event.spi.PreUpdateEventListener;
15
import org.joda.time.DateTime;
16
import org.springframework.security.core.Authentication;
17
import org.springframework.security.core.context.SecurityContextHolder;
18

    
19
import eu.etaxonomy.cdm.model.agent.Team;
20
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
21
import eu.etaxonomy.cdm.model.common.CdmBase;
22
import eu.etaxonomy.cdm.model.common.ICdmBase;
23
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
24
import eu.etaxonomy.cdm.model.common.User;
25
import eu.etaxonomy.cdm.model.common.VersionableEntity;
26
import eu.etaxonomy.cdm.model.molecular.Amplification;
27
import eu.etaxonomy.cdm.model.name.TaxonName;
28
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
29
import eu.etaxonomy.cdm.model.occurrence.SpecimenOrObservationBase;
30
import eu.etaxonomy.cdm.model.reference.Reference;
31

    
32
/**
33
 * @author cmathew
34
 * @since 7 Jul 2015
35
 *
36
 */
37
public class CdmPreDataChangeListener
38
        implements PreInsertEventListener, PreUpdateEventListener {
39

    
40
    private static final long serialVersionUID = -7581071903134036209L;
41

    
42
    @Override
43
    public boolean onPreUpdate(PreUpdateEvent event) {
44
        try {
45
            Object entity = event.getEntity();
46
            if (VersionableEntity.class.isAssignableFrom(entity.getClass())) {
47
                VersionableEntity versionableEntity = (VersionableEntity)entity;
48
                versionableEntity.setUpdated(new DateTime());
49
                Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
50
                if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User) {
51
                    User user = (User)authentication.getPrincipal();
52
                    versionableEntity.setUpdatedBy(user);
53
                }
54
            }
55
            insertUpdateMerge(event.getEntity());
56
        } finally {
57
            return false;
58
        }
59
    }
60

    
61
    @Override
62
    public boolean onPreInsert(PreInsertEvent event) {
63
        try {
64
            Object entity = event.getEntity();
65
            Class<?> entityClazz = entity.getClass();
66
            if(ICdmBase.class.isAssignableFrom(entityClazz)) {
67
                ICdmBase cdmBase = (ICdmBase)entity;
68

    
69
                if (cdmBase.getCreated() == null){
70
                    cdmBase.setCreated(new DateTime());
71
                }
72
                if(cdmBase.getCreatedBy() == null) {
73
                    Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
74
                    if(authentication != null && authentication.getPrincipal() != null && authentication.getPrincipal() instanceof User) {
75
                        User user = (User)authentication.getPrincipal();
76
                        cdmBase.setCreatedBy(user);
77
                    }
78
                }
79
            }
80
            insertUpdateMerge(entity);
81
        } finally {
82
            return false;
83
        }
84

    
85
    }
86

    
87
    //from former SaveOrUpdateOrMergeEntityListener
88
    public static void insertUpdateMerge(Object entity){
89
        if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){
90
            cacheDeterminationNames(entity);
91
            generateCaches(entity);
92

    
93
        }
94
    }
95

    
96
    private static void cacheDeterminationNames(Object entity) {
97
        if (entity instanceof DeterminationEvent) {
98
            DeterminationEvent detEv = (DeterminationEvent)entity;
99
            if (detEv.getTaxon() != null && detEv.getTaxonName() == null && detEv.getTaxon().getName() != null){
100
                detEv.setTaxonName(detEv.getTaxon().getName());
101
            }
102
        }
103
    }
104

    
105

    
106
    public static void generateCaches(Object entity){
107
        if (entity != null){
108
            entity = CdmBase.deproxy(entity);
109
            Class<?> entityClazz = entity.getClass();
110

    
111
            if (IdentifiableEntity.class.isAssignableFrom(entityClazz)){
112
                IdentifiableEntity<?> identifiableEntity = (IdentifiableEntity<?>)entity;
113
                if(TaxonName.class.isAssignableFrom(entityClazz)) {
114
                    //non-viral-name caches  (was NonViralName)
115
                    TaxonName nonViralName = (TaxonName)entity;
116
                    nonViralName.getAuthorshipCache();
117
                    nonViralName.getNameCache();
118
                    nonViralName.getTitleCache();
119
                    nonViralName.getFullTitleCache();
120
                }else if(TeamOrPersonBase.class.isAssignableFrom(entityClazz)){
121
                    //team-or-person caches
122
                    TeamOrPersonBase<?> teamOrPerson = (TeamOrPersonBase<?>)entity;
123
                    String nomTitle = teamOrPerson.getNomenclaturalTitle();
124
                    if (teamOrPerson instanceof Team){
125
                        Team team = (Team)teamOrPerson;
126
                        //nomTitle is not necessarily cached when it is created
127
                        team.setNomenclaturalTitle(nomTitle, team.isProtectedNomenclaturalTitleCache());
128
                    }else{
129
                        teamOrPerson.setNomenclaturalTitle(nomTitle);
130
                    }
131
                    String titleCache = teamOrPerson.getTitleCache();
132
                    if (! teamOrPerson.isProtectedTitleCache()){
133
                        teamOrPerson.setTitleCache(titleCache, false);
134
                    }
135
                    //if this is changed in future, change also in ImportDeduplicationHelper
136

    
137
                }else if(Reference.class.isAssignableFrom(entityClazz)){
138
                    //reference caches
139
                    Reference ref = (Reference)entity;
140
                    ref.getAbbrevTitleCache();
141
                    ref.getTitleCache();
142
                }else if (SpecimenOrObservationBase.class.isAssignableFrom(entityClazz)){
143
                    //specimen
144
                    SpecimenOrObservationBase<?> specimen = (SpecimenOrObservationBase<?>)entity;
145
                    if (!specimen.isProtectedTitleCache()){
146
                        specimen.setTitleCache(specimen.generateTitle(), false);
147
                    }
148
                //any other
149
                }   else{
150
                   // identifiableEntity.setTitleCache(identifiableEntity.generateTitle(), identifiableEntity.isProtectedTitleCache());
151
                    identifiableEntity.getTitleCache();
152
                }
153

    
154
                //titleCache should never be empty, even if protected #5763, #5849
155
                if (identifiableEntity.isProtectedTitleCache() && identifiableEntity.hasEmptyTitleCache()){
156
                    identifiableEntity.setTitleCache(null, false);
157
                    identifiableEntity.getTitleCache();
158
                }
159
                if (identifiableEntity.hasEmptyTitleCache()){
160
                    identifiableEntity.setTitleCache(identifiableEntity.toString(), false);
161
                }
162

    
163

    
164
            }else if(Amplification.class.isAssignableFrom(entityClazz)) {
165
                Amplification amplification = (Amplification)entity;
166
                amplification.updateCache();
167
            }
168
        }
169
    }
170

    
171
}
(9-9/23)