Project

General

Profile

Download (6.56 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.molecular.Amplification;
29
import eu.etaxonomy.cdm.model.name.NonViralName;
30
import eu.etaxonomy.cdm.model.occurrence.DeterminationEvent;
31
import eu.etaxonomy.cdm.model.reference.Reference;
32

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

    
41
    static String sep = ITreeNode.separator;
42
    static String pref = ITreeNode.treePrefix;
43

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

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

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

    
87
    }
88

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

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

    
106

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

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

    
135
                    //reference caches
136
                }else if(Reference.class.isAssignableFrom(entityClazz)){
137
                    Reference ref = (Reference)entity;
138
                    ref.getAbbrevTitleCache();
139
                    ref.getTitleCache();
140
                }else { //any other
141
                    //title cache
142
                    identifiableEntity.getTitleCache();
143
                }
144
                //titleCache should never be empty, even if protected
145
                if (identifiableEntity.isProtectedTitleCache() && identifiableEntity.hasEmptyTitleCache()){
146
                    identifiableEntity.setTitleCache(null, false);
147
                    identifiableEntity.getTitleCache();
148
                }
149

    
150
            }else if(Amplification.class.isAssignableFrom(entityClazz)) {
151
                Amplification amplification = (Amplification)entity;
152
                amplification.updateCache();
153
            }
154
        }
155
    }
156

    
157
}
(9-9/20)