Project

General

Profile

Download (8.65 KB) Statistics
| Branch: | Tag: | Revision:
1
/**
2
 * Copyright (C) 2009 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.dao.hibernate.validation;
10

    
11
import java.util.Arrays;
12
import java.util.HashSet;
13
import java.util.List;
14
import java.util.Set;
15

    
16
import javax.validation.ConstraintViolation;
17

    
18
import org.apache.log4j.Logger;
19
import org.hibernate.Query;
20
import org.springframework.beans.factory.annotation.Qualifier;
21
import org.springframework.stereotype.Repository;
22

    
23
import eu.etaxonomy.cdm.model.common.ICdmBase;
24
import eu.etaxonomy.cdm.model.validation.CRUDEventType;
25
import eu.etaxonomy.cdm.model.validation.EntityConstraintViolation;
26
import eu.etaxonomy.cdm.model.validation.EntityValidation;
27
import eu.etaxonomy.cdm.model.validation.Severity;
28
import eu.etaxonomy.cdm.persistence.dao.hibernate.common.CdmEntityDaoBase;
29
import eu.etaxonomy.cdm.persistence.dao.validation.IEntityValidationDao;
30

    
31
/**
32
 *
33
 * @author ayco_holleman
34
 * @date 15 jan. 2015
35
 *
36
 */
37
@Repository
38
@Qualifier("EntityValidationDaoHibernateImpl")
39
public class EntityValidationDaoHibernateImpl extends CdmEntityDaoBase<EntityValidation> implements
40
        IEntityValidationDao {
41

    
42
    private static final Logger logger = Logger.getLogger(EntityValidationDaoHibernateImpl.class);
43

    
44
    public EntityValidationDaoHibernateImpl() {
45
        super(EntityValidation.class);
46
    }
47

    
48
    @Override
49
    public <T extends ICdmBase> void saveEntityValidation(T validatedEntity, Set<ConstraintViolation<T>> errors,
50
            CRUDEventType crudEventType, Class<?>[] validationGroups) {
51
        EntityValidation entityValidation = getEntityValidation(validatedEntity.getClass().getName(),
52
                validatedEntity.getId());
53
        if (entityValidation == null) {
54
            entityValidation = EntityValidation.newInstance(validatedEntity, crudEventType);
55
            addNewErrors(entityValidation, validatedEntity, errors);
56
            getSession().save(entityValidation);
57
        } else {
58
            deleteOldErrors(entityValidation, validationGroups);
59
            addNewErrors(entityValidation, validatedEntity, errors);
60
            getSession().merge(entityValidation);
61
        }
62
    }
63

    
64
    @Override
65
    public void deleteEntityValidation(String validatedEntityClass, int validatedEntityId) {
66
        EntityValidation result = getEntityValidation(validatedEntityClass, validatedEntityId);
67
        if (result != null) {
68
            getSession().delete(result);
69
        }
70
    }
71

    
72
    @Override
73
    public EntityValidation getEntityValidation(String validatedEntityClass, int validatedEntityId) {
74
        Query query = getSession().createQuery(
75
                "FROM EntityValidation vr "
76
                        + "WHERE vr.validatedEntityClass = :cls AND vr.validatedEntityId = :id");
77
        query.setString("cls", validatedEntityClass);
78
        query.setInteger("id", validatedEntityId);
79
        @SuppressWarnings("unchecked")
80
        List<EntityValidation> result = query.list();
81
        if (result.size() == 0) {
82
            return null;
83
        } else {
84
            return result.iterator().next();
85
        }
86
    }
87

    
88
    @Override
89
    public List<EntityValidation> getEntityValidations() {
90
        Query query = getSession().createQuery(
91
                "FROM EntityValidation vr "
92
                        + "ORDER BY vr.validatedEntityClass, vr.validatedEntityId");
93
        @SuppressWarnings("unchecked")       
94
        List<EntityValidation> result = query.list();
95
        return result;
96
    }
97

    
98
    @Override
99
    public List<EntityValidation> getEntityValidations(String validatedEntityClass) {
100
        Query query = getSession()
101
                .createQuery(
102
                        "FROM EntityValidation vr "
103
                                + "WHERE vr.validatedEntityClass = :cls ORDER BY vr.validatedEntityClass, vr.validatedEntityId");
104
        query.setString("cls", validatedEntityClass);
105
        @SuppressWarnings("unchecked")
106
        List<EntityValidation> result = query.list();
107
        return result;
108
    }
109

    
110
    @Override
111
    public List<EntityValidation> getEntitiesViolatingConstraint(String validatorClass) {
112
        Query query = getSession().createQuery(
113
                "FROM EntityValidation vr JOIN FETCH vr.entityConstraintViolations cv "
114
                        + "WHERE cv.validator = :cls ORDER BY vr.validatedEntityClass, vr.validatedEntityId");
115
        query.setString("cls", validatorClass);
116
        @SuppressWarnings("unchecked")
117
        List<EntityValidation> result = query.list();
118
        return result;
119
    }
120

    
121
    @Override
122
    public List<EntityValidation> getEntityValidations(String validatedEntityClass, Severity severity) {
123
        Query query = getSession().createQuery(
124
                "FROM EntityValidation vr JOIN FETCH vr.entityConstraintViolations cv "
125
                        + "WHERE vr.validatedEntityClass = :cls " + "AND cv.severity = :severity "
126
                        + "ORDER BY vr.validatedEntityClass, vr.validatedEntityId");
127
        query.setString("cls", validatedEntityClass);
128
        query.setString("severity", severity.toString());
129
        @SuppressWarnings("unchecked")
130
        List<EntityValidation> result = query.list();
131
        return result;
132
    }
133

    
134
    @Override
135
    public List<EntityValidation> getEntityValidations(Severity severity) {
136
        Query query = getSession().createQuery(
137
                "FROM EntityValidation vr JOIN FETCH vr.entityConstraintViolations cv "
138
                        + "WHERE cv.severity = :severity " + "ORDER BY vr.validatedEntityClass, vr.validatedEntityId");
139
        query.setString("severity", severity.toString());
140
        @SuppressWarnings("unchecked")
141
        List<EntityValidation> result = query.list();
142
        return result;
143
    }
144

    
145
    private static void deleteOldErrors(EntityValidation fromResult, Class<?>[] validationGroups) {
146
        if (fromResult.getEntityConstraintViolations() == null || fromResult.getEntityConstraintViolations().size() == 0) {
147
            return;
148
        }
149
        Set<Class<?>> validationGroupSet = new HashSet<Class<?>>(Arrays.asList(validationGroups));
150
        Set<String> validationGroupNames = new HashSet<String>(validationGroupSet.size());
151
        for (Class<?> c : validationGroupSet) {
152
            validationGroupNames.add(c.getName());
153
        }
154
//        Iterator<EntityConstraintViolation> iterator = fromResult.getEntityConstraintViolations().iterator();
155
        Set<EntityConstraintViolation> constraintsToDelete = new HashSet<EntityConstraintViolation>();
156
        for (EntityConstraintViolation ecv : fromResult.getEntityConstraintViolations()){
157
            if (validationGroupNames.contains(ecv.getValidationGroup())) {
158
                constraintsToDelete.add(ecv);
159
            }
160
        }
161
        for (EntityConstraintViolation ecv : constraintsToDelete){
162
            fromResult.removeEntityConstraintViolation(ecv);
163
        }
164

    
165
    }
166

    
167
    private static <T extends ICdmBase> void addNewErrors(EntityValidation toResult, T validatedEntity,
168
            Set<ConstraintViolation<T>> errors) {
169
        for (ConstraintViolation<T> error : errors) {
170
            EntityConstraintViolation violation = EntityConstraintViolation.newInstance(validatedEntity, error);
171
            toResult.addEntityConstraintViolation(violation);
172
            violation.setEntityValidation(toResult);
173
        }
174
    }
175

    
176
    @SuppressWarnings("unused")
177
    private void deletedErrorRecords(int validationResultId, Class<?>[] validationGroups) {
178
        StringBuilder sql = new StringBuilder(127);
179
        sql.append("DELETE FROM EntityConstraintViolation ecv WHERE ecv.entityValidation.id = :id");
180
        if (validationGroups != null && validationGroups.length != 0) {
181
            sql.append(" AND (");
182
            for (int i = 0; i < validationGroups.length; ++i) {
183
                if (i != 0) {
184
                    sql.append(" OR ");
185
                }
186
                sql.append("validationgroup = :param" + i);
187
            }
188
            sql.append(")");
189
        }
190
        Query query = getSession().createQuery(sql.toString());
191
        query.setInteger("id", validationResultId);
192
        if (validationGroups != null && validationGroups.length != 0) {
193
            for (int i = 0; i < validationGroups.length; ++i) {
194
                query.setString("param" + i, validationGroups[i].getName());
195
            }
196
        }
197
        int n = query.executeUpdate();
198
        if (logger.isDebugEnabled()) {
199
            logger.debug("Deleted " + n + " error records");
200
        }
201
    }
202

    
203
}
(2-2/2)