Project

General

Profile

Download (4.43 KB) Statistics
| Branch: | Tag: | Revision:
1 0e7a9b4f Andreas Kohlbecker
/**
2
* Copyright (C) 2017 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.vaadin.mvp;
10
11 fe785c1e Andreas Kohlbecker
import org.hibernate.FlushMode;
12 9d5ae601 Andreas Kohlbecker
import org.springframework.beans.factory.annotation.Autowired;
13
import org.springframework.context.ApplicationEventPublisher;
14 0e7a9b4f Andreas Kohlbecker
import org.springframework.context.event.EventListener;
15 7328ae26 Andreas Kohlbecker
import org.springframework.transaction.TransactionDefinition;
16 0e7a9b4f Andreas Kohlbecker
17 96783004 Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.event.AbstractEditorAction;
18 fe785c1e Andreas Kohlbecker
import eu.etaxonomy.cdm.vaadin.session.ViewScopeConversationHolder;
19 538800b4 Andreas Kohlbecker
import eu.etaxonomy.vaadin.mvp.event.EditorDeleteEvent;
20 c46954e3 Andreas Kohlbecker
import eu.etaxonomy.vaadin.mvp.event.EditorPreSaveEvent;
21
import eu.etaxonomy.vaadin.mvp.event.EditorSaveEvent;
22 96783004 Andreas Kohlbecker
import eu.etaxonomy.vaadin.mvp.event.EditorViewEvent;
23 c46954e3 Andreas Kohlbecker
24 0e7a9b4f Andreas Kohlbecker
/**
25 fe785c1e Andreas Kohlbecker
 *
26 0e7a9b4f Andreas Kohlbecker
 * @author a.kohlbecker
27
 * @since Apr 5, 2017
28
 *
29
 */
30 c46954e3 Andreas Kohlbecker
public abstract class AbstractEditorPresenter<DTO extends Object, V extends ApplicationView<?>> extends AbstractPresenter<V> {
31 0e7a9b4f Andreas Kohlbecker
32 5ba148ae Andreas Kohlbecker
33
    private static final long serialVersionUID = -6677074110764145236L;
34
35 fe785c1e Andreas Kohlbecker
    FlushMode previousPreSaveEvenFlushMode = null;
36
37 9d5ae601 Andreas Kohlbecker
    @Autowired
38
    protected ApplicationEventPublisher eventBus;
39
40 fe785c1e Andreas Kohlbecker
    /**
41 55ecdf3a Andreas Kohlbecker
     * Load the bean to be edited in the editor freshly from the persistent storage.
42 fe785c1e Andreas Kohlbecker
     * Ore create an new empty instance in case the supplied <code>identifier</code> is <code>null</code>.
43
     *
44
     * @param identifier
45
     * @return
46
     */
47
    protected abstract DTO loadBeanById(Object identifier);
48
49 2a3d1ef0 Andreas Kohlbecker
    /**
50
     * This method is called directly before setting the bean as item data source to
51
     * the field group of the editor.
52
     * <p>
53
     * Override this method to pre-process the bean if needed. This can be the case if
54
     * you are using a persistence layer with short running session like Hibernate.
55
     *
56
     * @param bean
57
     * @return
58
     */
59
    protected DTO prepareAsFieldGroupDataSource(DTO bean){
60 fe785c1e Andreas Kohlbecker
61 2a3d1ef0 Andreas Kohlbecker
        return bean;
62
    }
63
64 7328ae26 Andreas Kohlbecker
    @Override
65
    protected TransactionDefinition getTransactionDefinition(){
66
        super.getTransactionDefinition();
67
        if(definition.isReadOnly()){
68
            definition.setReadOnly(false);
69
        }
70
        return definition;
71
    }
72
73 fe785c1e Andreas Kohlbecker
    /**
74
     * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
75
     *
76
     * @param preSaveEvent
77
     */
78 5ba148ae Andreas Kohlbecker
    @EventListener
79 538800b4 Andreas Kohlbecker
    public void onEditorPreSaveEvent(EditorPreSaveEvent<DTO> preSaveEvent){
80 96783004 Andreas Kohlbecker
        if(!isFromOwnView(preSaveEvent)){
81 437f2e6f Andreas Kohlbecker
            return;
82
        }
83 fe785c1e Andreas Kohlbecker
        ensureBoundConversation();
84
        previousPreSaveEvenFlushMode = getConversationHolder().getSession().getFlushMode();
85
        getConversationHolder().getSession().setFlushMode(FlushMode.AUTO);
86
87 5ba148ae Andreas Kohlbecker
    }
88
89
    /**
90 fe785c1e Andreas Kohlbecker
     * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
91 5ba148ae Andreas Kohlbecker
     *
92
     * @param saveEvent
93
     */
94 0e7a9b4f Andreas Kohlbecker
    @EventListener
95 538800b4 Andreas Kohlbecker
    public void onEditorSaveEvent(EditorSaveEvent<DTO> saveEvent){
96 96783004 Andreas Kohlbecker
        if(!isFromOwnView(saveEvent)){
97 437f2e6f Andreas Kohlbecker
            return;
98
        }
99 538800b4 Andreas Kohlbecker
        DTO bean = saveEvent.getBean();
100 0e7a9b4f Andreas Kohlbecker
        saveBean(bean);
101 fe785c1e Andreas Kohlbecker
        getConversationHolder().getSession().setFlushMode(previousPreSaveEvenFlushMode);
102
        previousPreSaveEvenFlushMode = null;
103 0e7a9b4f Andreas Kohlbecker
    }
104
105 538800b4 Andreas Kohlbecker
    /**
106 fe785c1e Andreas Kohlbecker
    * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
107 538800b4 Andreas Kohlbecker
    *
108
    * @param saveEvent
109
    */
110
   @EventListener
111
   public void onEditorDeleteEvent(EditorDeleteEvent<DTO> deleteEvent){
112
       if(!isFromOwnView(deleteEvent)){
113
           return;
114
       }
115 fe785c1e Andreas Kohlbecker
       if(!conversationBound){
116
           bindConversation();
117
       }
118
       FlushMode previousFlushMode = getSession().getFlushMode();
119
       getConversationHolder().getSession().setFlushMode(FlushMode.AUTO);
120 538800b4 Andreas Kohlbecker
       deleteBean(deleteEvent.getBean());
121 fe785c1e Andreas Kohlbecker
       getConversationHolder().getSession().setFlushMode(previousFlushMode);
122 538800b4 Andreas Kohlbecker
   }
123
124 96783004 Andreas Kohlbecker
    /**
125
     * @param saveEvent
126
     * @return
127
     */
128
    protected boolean isFromOwnView(EditorViewEvent saveEvent) {
129
        return saveEvent.getView().equals(getView());
130
    }
131
132 c46954e3 Andreas Kohlbecker
    protected Class<V> getViewType() {
133
        return (Class<V>) super.getView().getClass();
134
    }
135
136 96783004 Andreas Kohlbecker
    protected boolean isFromOwnView(AbstractEditorAction action){
137
        return action.getSourceView() != null && getView().equals(action.getSourceView());
138
    }
139
140 0e7a9b4f Andreas Kohlbecker
    protected abstract void saveBean(DTO bean);
141
142 538800b4 Andreas Kohlbecker
    /**
143
     * @param bean
144
     */
145
    protected abstract void deleteBean(DTO bean);
146
147 0e7a9b4f Andreas Kohlbecker
}