Project

General

Profile

« Previous | Next » 

Revision e8719569

Added by Cherian Mathew over 8 years ago

#5066 Remove unnecessary merge listener

View differences:

cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/CdmListenerIntegrator.java
49 49
		// this example will register a persist event listener
50 50
		eventRegistry.prependListeners(EventType.SAVE, new CacheStrategyGenerator(), new SaveEntityListener());
51 51
		eventRegistry.prependListeners(EventType.UPDATE, new CacheStrategyGenerator(), new UpdateEntityListener());
52

  
53
		eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener());
54
		eventRegistry.prependListeners(EventType.MERGE, new CacheStrategyGenerator(), new SaveOrUpdateorMergeEntityListener());
55

  
56
//		eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener());
57
		//TODO Cherian move to SaveOrUpdateorMergeEntityListener
52
		eventRegistry.prependListeners(EventType.SAVE_UPDATE, new CacheStrategyGenerator(), new SaveOrUpdateEntityListener());
58 53
		eventRegistry.appendListeners(EventType.MERGE, new PostMergeEntityListener());
59

  
60 54
		eventRegistry.appendListeners(EventType.DELETE, new CdmDeleteListener());
61 55
		eventRegistry.appendListeners(EventType.POST_LOAD, new CdmPostDataChangeObservableListener());
62 56
//with validation
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveOrUpdateEntityListener.java
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

  
14
import org.hibernate.HibernateException;
15
import org.hibernate.Session;
16
import org.hibernate.event.spi.SaveOrUpdateEvent;
17
import org.hibernate.event.spi.SaveOrUpdateEventListener;
18

  
19
import eu.etaxonomy.cdm.model.common.CdmBase;
20
import eu.etaxonomy.cdm.model.common.ITreeNode;
21

  
22

  
23
@SuppressWarnings("serial")
24
public class SaveOrUpdateEntityListener implements SaveOrUpdateEventListener{
25

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

  
33

  
34
    private void saveOrUpdate(Object entity, Session session) {
35

  
36
        //moved to CdmPreDataChangeListener
37
        if(entity != null && CdmBase.class.isAssignableFrom(entity.getClass())){
38
            if (entity instanceof ITreeNode) {
39
                ITreeNode<?> node = (ITreeNode<?>)entity;
40
                reindex(node);
41

  
42
            }
43
        }
44
    }
45

  
46
    static String sep = ITreeNode.separator;
47
    static String pref = ITreeNode.treePrefix;
48

  
49
    /**
50
     * @param event
51
     * @param node
52
     */
53
    private <T extends ITreeNode> void reindex(T node) {
54
        String oldChildIndex = node.treeIndex();
55
        ITreeNode<?> parent = node.getParent();
56
        String parentIndex = (parent == null) ? (sep + pref + node.treeId() + sep)  : parent.treeIndex();  //TODO
57
        if (node.getId() > 0){   //TODO
58
            String newChildIndex = parentIndex + node.getId() + sep;
59
            if (oldChildIndex == null || ! oldChildIndex.equals(newChildIndex)){
60
                node.setTreeIndex(newChildIndex);
61

  
62
                //TODO this is a greedy implementation, better use update by replace string
63
                //either using and improving the below code or by using native SQL
64
                //The current approach may run out of memory for large descendant sets.
65
                List<T> childNodes = node.getChildNodes();
66
                for (T child : childNodes){
67
                    if (child != null && ! child.equals(node)){  //node should not be it's own child, however just in case
68
                        reindex(child);
69
                    }
70
                }
71

  
72
                //			String className = event.getEntityName();
73
                //					String updateQuery = " UPDATE %s tn " +
74
                //							" SET tn.treeIndex = Replace(tn.treeIndex, '%s', '%s') " +
75
                //							" WHERE tn.id <> "+ node.getId()+" ";
76
                //					updateQuery = String.format(updateQuery, className, oldChildIndex, parentIndex);  //dummy
77
                //					System.out.println(updateQuery);
78
                //					EventSource session = event.getSession();
79
                //					Query query = session.createQuery(updateQuery);
80
                //					query.executeUpdate();
81
            }
82
        }
83
    }
84

  
85

  
86

  
87
}
cdmlib-persistence/src/main/java/eu/etaxonomy/cdm/persistence/hibernate/SaveOrUpdateorMergeEntityListener.java
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
}

Also available in: Unified diff