Project

General

Profile

Download (3.63 KB) Statistics
| Branch: | Tag: | Revision:
1
// $Id$
2
/**
3
 * Copyright (C) 2007 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 java.util.List;
13
import java.util.Map;
14

    
15
import org.hibernate.HibernateException;
16
import org.hibernate.Session;
17
import org.hibernate.event.spi.MergeEvent;
18
import org.hibernate.event.spi.MergeEventListener;
19
import org.hibernate.event.spi.SaveOrUpdateEvent;
20
import org.hibernate.event.spi.SaveOrUpdateEventListener;
21

    
22
import eu.etaxonomy.cdm.model.common.CdmBase;
23
import eu.etaxonomy.cdm.model.common.ITreeNode;
24

    
25

    
26
@SuppressWarnings("serial")
27
public class SaveOrUpdateorMergeEntityListener implements SaveOrUpdateEventListener, MergeEventListener {
28

    
29
    @Override
30
    public void onSaveOrUpdate(SaveOrUpdateEvent event) throws HibernateException {
31
        //System.err.println("SaveOrUpdateListener" + event.getEntity().getClass());
32
        Object entity = event.getObject();
33
        saveOrUpdateOrMerge(entity, event.getSession());
34
    }
35

    
36
    @Override
37
    public void onMerge(MergeEvent event) throws HibernateException {
38
        Object entity = event.getOriginal();
39
        saveOrUpdateOrMerge(entity,event.getSession());
40
    }
41

    
42
    @Override
43
    public void onMerge(MergeEvent event, Map copiedAlready) throws HibernateException {
44

    
45
    }
46

    
47
    private void saveOrUpdateOrMerge(Object entity, Session session) {
48

    
49
        //moved to CdmPreDataChangeListener
50
        if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){
51
            if (entity instanceof ITreeNode) {
52
                ITreeNode<?> node = (ITreeNode<?>)entity;
53
                reindex(node);
54

    
55
            }
56
        }
57
    }
58

    
59
    static String sep = ITreeNode.separator;
60
    static String pref = ITreeNode.treePrefix;
61

    
62
    /**
63
     * @param event
64
     * @param node
65
     */
66
    private <T extends ITreeNode> void reindex(T node) {
67
        String oldChildIndex = node.treeIndex();
68
        ITreeNode<?> parent = node.getParent();
69
        String parentIndex = (parent == null) ? (sep + pref + node.treeId() + sep)  : parent.treeIndex();  //TODO
70
        if (node.getId() > 0){   //TODO
71
            String newChildIndex = parentIndex + node.getId() + sep;
72
            if (oldChildIndex == null || ! oldChildIndex.equals(newChildIndex)){
73
                node.setTreeIndex(newChildIndex);
74

    
75
                //TODO this is a greedy implementation, better use update by replace string
76
                //either using and improving the below code or by using native SQL
77
                //The current approach may run out of memory for large descendant sets.
78
                List<T> childNodes = node.getChildNodes();
79
                for (T child : childNodes){
80
                    if (child != null && ! child.equals(node)){  //node should not be it's own child, however just in case
81
                        reindex(child);
82
                    }
83
                }
84

    
85
                //			String className = event.getEntityName();
86
                //					String updateQuery = " UPDATE %s tn " +
87
                //							" SET tn.treeIndex = Replace(tn.treeIndex, '%s', '%s') " +
88
                //							" WHERE tn.id <> "+ node.getId()+" ";
89
                //					updateQuery = String.format(updateQuery, className, oldChildIndex, parentIndex);  //dummy
90
                //					System.out.println(updateQuery);
91
                //					EventSource session = event.getSession();
92
                //					Query query = session.createQuery(updateQuery);
93
                //					query.executeUpdate();
94
            }
95
        }
96
    }
97

    
98

    
99

    
100
}
(16-16/20)