Project

General

Profile

Download (7.23 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.TaxonNameBase;
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
 * @date 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

    
97

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

    
107

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

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

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

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

    
164

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

    
172
}
(9-9/20)