Project

General

Profile

Download (7.7 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
* Copyright (C) 2015 EDIT
4
* European Distributed Institute of Taxonomy
5
* http://www.e-taxonomy.eu
6
*
7
* The contents of this file are subject to the Mozilla Public License Version 1.1
8
* See LICENSE.TXT at the top of this package for the full license terms.
9
*/
10
package eu.etaxonomy.cdm.persistence.hibernate;
11

    
12
import org.hibernate.event.spi.PreInsertEvent;
13
import org.hibernate.event.spi.PreInsertEventListener;
14
import org.hibernate.event.spi.PreUpdateEvent;
15
import org.hibernate.event.spi.PreUpdateEventListener;
16
import org.joda.time.DateTime;
17
import org.springframework.security.core.Authentication;
18
import org.springframework.security.core.context.SecurityContextHolder;
19

    
20
import eu.etaxonomy.cdm.model.agent.Team;
21
import eu.etaxonomy.cdm.model.agent.TeamOrPersonBase;
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.common.ICdmBase;
24
import eu.etaxonomy.cdm.model.common.ITreeNode;
25
import eu.etaxonomy.cdm.model.common.IdentifiableEntity;
26
import eu.etaxonomy.cdm.model.common.User;
27
import eu.etaxonomy.cdm.model.common.VersionableEntity;
28
import eu.etaxonomy.cdm.model.description.FeatureNode;
29
import eu.etaxonomy.cdm.model.description.PolytomousKeyNode;
30
import eu.etaxonomy.cdm.model.molecular.Amplification;
31
import eu.etaxonomy.cdm.model.name.NonViralName;
32
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
33
import eu.etaxonomy.cdm.model.reference.Reference;
34
import eu.etaxonomy.cdm.model.taxon.TaxonNode;
35

    
36
/**
37
 * @author cmathew
38
 * @date 7 Jul 2015
39
 *
40
 */
41
public class CdmPreDataChangeListener implements PreInsertEventListener, PreUpdateEventListener {
42
    private static final long serialVersionUID = -7581071903134036209L;
43

    
44
    static String sep = ITreeNode.separator;
45
    static String pref = ITreeNode.treePrefix;
46

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

    
66
    @Override
67
    public boolean onPreInsert(PreInsertEvent event) {
68
        try {
69
            Object entity = event.getEntity();
70
            Class<?> entityClazz = entity.getClass();
71
            if(ICdmBase.class.isAssignableFrom(entityClazz)) {
72
                ICdmBase cdmBase = (ICdmBase)entity;
73

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

    
90
    }
91

    
92
    //from former SaveOrUpdateOrMergeEntityListener
93
    public static void insertUpdateMerge(Object entity){
94
        if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){
95
            cacheDeterminationNames(entity);
96
            generateCaches(entity);
97
            removeNullFromCollections(entity);
98
        }
99
    }
100

    
101
    /**
102
     * @param entity
103
     */
104
    private static void removeNullFromCollections(Object entity) {
105
        if (entity != null){
106
            Class<?> entityClazz = entity.getClass();
107

    
108
            if (TaxonNode.class.isAssignableFrom(entityClazz)){
109
                TaxonNode node = (TaxonNode)entity;
110
                node.removeNullValueFromChildren();
111
            }else if(PolytomousKeyNode.class.isAssignableFrom(entityClazz)){
112
                PolytomousKeyNode node = (PolytomousKeyNode)entity;
113
                node.removeNullValueFromChildren();
114
            }else if(FeatureNode.class.isAssignableFrom(entityClazz)){
115
                FeatureNode node = (FeatureNode)entity;
116
                node.removeNullValueFromChildren();
117
            }
118

    
119
        }
120

    
121
    }
122

    
123
    private static void cacheDeterminationNames(Object entity) {
124
        if (entity instanceof DeterminationEvent) {
125
            DeterminationEvent detEv = (DeterminationEvent)entity;
126
            if (detEv.getTaxon() != null && detEv.getTaxonName() == null && detEv.getTaxon().getName() != null){
127
                detEv.setTaxonName(detEv.getTaxon().getName());
128
            }
129
        }
130
    }
131

    
132

    
133
    public static void generateCaches(Object entity){
134
        if (entity != null){
135
            Class<?> entityClazz = entity.getClass();
136

    
137
            if (IdentifiableEntity.class.isAssignableFrom(entityClazz)){
138
                IdentifiableEntity<?> identifiableEntity = (IdentifiableEntity)entity;
139
                //non-viral-name caches
140
                if(NonViralName.class.isAssignableFrom(entityClazz)) {
141
                    NonViralName<?> nonViralName = (NonViralName<?>)entity;
142
                    nonViralName.getAuthorshipCache();
143
                    nonViralName.getNameCache();
144
                    nonViralName.getTitleCache();
145
                    nonViralName.getFullTitleCache();
146
                    //team-or-person caches
147
                }else if(TeamOrPersonBase.class.isAssignableFrom(entityClazz)){
148
                    TeamOrPersonBase<?> teamOrPerson = (TeamOrPersonBase<?>)entity;
149
                    String nomTitle = teamOrPerson.getNomenclaturalTitle();
150
                    if (teamOrPerson instanceof Team){
151
                        Team team =CdmBase.deproxy(teamOrPerson, Team.class);
152
                        team.setNomenclaturalTitle(nomTitle, team.isProtectedNomenclaturalTitleCache()); //nomTitle is not necessarily cached when it is created
153
                    }else{
154
                        teamOrPerson.setNomenclaturalTitle(nomTitle);
155
                    }
156
                    String titleCache = teamOrPerson.getTitleCache();
157
                    if (! teamOrPerson.isProtectedTitleCache()){
158
                        teamOrPerson.setTitleCache(titleCache, false);
159
                    }
160

    
161
                    //reference caches
162
                }else if(Reference.class.isAssignableFrom(entityClazz)){
163
                    Reference ref = (Reference)entity;
164
                    ref.getAbbrevTitleCache();
165
                    ref.getTitleCache();
166
                }else { //any other
167
                    //title cache
168
                    identifiableEntity.getTitleCache();
169
                }
170
                //titleCache should never be empty, even if protected #5763, #5849
171
                if (identifiableEntity.isProtectedTitleCache() && identifiableEntity.hasEmptyTitleCache()){
172
                    identifiableEntity.setTitleCache(null, false);
173
                    identifiableEntity.getTitleCache();
174
                }
175
                if (identifiableEntity.hasEmptyTitleCache()){
176
                    identifiableEntity.setTitleCache(identifiableEntity.toString(), false);
177
                }
178

    
179

    
180
            }else if(Amplification.class.isAssignableFrom(entityClazz)) {
181
                Amplification amplification = (Amplification)entity;
182
                amplification.updateCache();
183
            }
184
        }
185
    }
186

    
187
}
(9-9/20)