Project

General

Profile

« Previous | Next » 

Revision 2f02081c

Added by Andreas Kohlbecker over 6 years ago

ref #7046 completely removing open session per view implementation and adding init strategies for Name and Typedesignation editor

View differences:

src/main/java/eu/etaxonomy/vaadin/mvp/AbstractEditorPresenter.java
12 12
import org.springframework.beans.factory.annotation.Autowired;
13 13
import org.springframework.context.ApplicationEventPublisher;
14 14
import org.springframework.context.event.EventListener;
15
import org.springframework.transaction.TransactionDefinition;
15

  
16
import com.vaadin.server.ServletPortletHelper;
17
import com.vaadin.server.VaadinRequest;
18
import com.vaadin.server.VaadinService;
19
import com.vaadin.server.VaadinSession;
20
import com.vaadin.ui.UI;
16 21

  
17 22
import eu.etaxonomy.cdm.vaadin.event.AbstractEditorAction;
18
import eu.etaxonomy.cdm.vaadin.session.ViewScopeConversationHolder;
23
import eu.etaxonomy.cdm.vaadin.server.CdmSpringVaadinServletService;
24
import eu.etaxonomy.cdm.vaadin.server.RequestEndListener;
25
import eu.etaxonomy.cdm.vaadin.server.RequestStartListener;
19 26
import eu.etaxonomy.vaadin.mvp.event.EditorDeleteEvent;
20 27
import eu.etaxonomy.vaadin.mvp.event.EditorPreSaveEvent;
21 28
import eu.etaxonomy.vaadin.mvp.event.EditorSaveEvent;
......
27 34
 * @since Apr 5, 2017
28 35
 *
29 36
 */
30
public abstract class AbstractEditorPresenter<DTO extends Object, V extends ApplicationView<?>> extends AbstractPresenter<V> {
37
public abstract class AbstractEditorPresenter<DTO extends Object, V extends ApplicationView<?>> extends AbstractPresenter<V>
38
implements RequestEndListener, RequestStartListener {
31 39

  
32 40

  
33 41
    private static final long serialVersionUID = -6677074110764145236L;
......
61 69
        return bean;
62 70
    }
63 71

  
64
    @Override
65
    protected TransactionDefinition getTransactionDefinition(){
66
        super.getTransactionDefinition();
67
        if(definition.isReadOnly()){
68
            definition.setReadOnly(false);
69
        }
70
        return definition;
71
    }
72
//    @Override
73
//    protected TransactionDefinition getTransactionDefinition(){
74
//        super.getTransactionDefinition();
75
//        if(definition.isReadOnly()){
76
//            definition.setReadOnly(false);
77
//        }
78
//        return definition;
79
//    }
72 80

  
73 81
    /**
74 82
     * Regarding changing the Flush mode see see also {@link ViewScopeConversationHolder}
......
80 88
        if(!isFromOwnView(preSaveEvent)){
81 89
            return;
82 90
        }
83
        ensureBoundConversation();
84
        previousPreSaveEvenFlushMode = getConversationHolder().getSession().getFlushMode();
85
        getConversationHolder().getSession().setFlushMode(FlushMode.AUTO);
91
        getSession().setFlushMode(FlushMode.AUTO);
86 92

  
87 93
    }
88 94

  
......
98 104
        }
99 105
        DTO bean = saveEvent.getBean();
100 106
        saveBean(bean);
101
        getConversationHolder().getSession().setFlushMode(previousPreSaveEvenFlushMode);
107
        getSession().setFlushMode(previousPreSaveEvenFlushMode);
102 108
        previousPreSaveEvenFlushMode = null;
103 109
    }
104 110

  
......
112 118
       if(!isFromOwnView(deleteEvent)){
113 119
           return;
114 120
       }
115
       if(!conversationBound){
116
           bindConversation();
117
       }
118 121
       FlushMode previousFlushMode = getSession().getFlushMode();
119
       getConversationHolder().getSession().setFlushMode(FlushMode.AUTO);
122
       getSession().setFlushMode(FlushMode.AUTO);
120 123
       deleteBean(deleteEvent.getBean());
121
       getConversationHolder().getSession().setFlushMode(previousFlushMode);
124
       getSession().setFlushMode(previousFlushMode);
122 125
   }
123 126

  
124 127
    /**
......
137 140
        return action.getSourceView() != null && getView().equals(action.getSourceView());
138 141
    }
139 142

  
143
    @Override
144
    protected void init(V view) {
145
        super.init(view);
146
        registerListeners();
147
    }
148

  
149
    @Override
150
    public void onViewExit() {
151
        super.onViewExit();
152
        unregisterListeners();
153
    }
154

  
155

  
156
    // -------------------------------------------------------------------------
157

  
158
    protected void registerListeners() {
159
     // register as request start and end listener
160
        VaadinService service = UI.getCurrent().getSession().getService();
161
        if(service instanceof CdmSpringVaadinServletService){
162
            logger.trace(String.format("~~~~~ %s register as request listener", _toString()));
163
            ((CdmSpringVaadinServletService)service).addRequestEndListener(this);
164
            if(logger.isTraceEnabled()){
165
                ((CdmSpringVaadinServletService)service).addRequestStartListener(this);
166
            }
167
        } else {
168
            throw new RuntimeException("Using the CdmSpringVaadinServletService is required for proper per view conversation handling");
169
        }
170
    }
171

  
172
    /**
173
    *
174
    */
175
   protected void unregisterListeners() {
176
       VaadinService service = UI.getCurrent().getSession().getService();
177
       if(service instanceof CdmSpringVaadinServletService){
178
           logger.trace(String.format("~~~~~ %s un-register as request listener", _toString()));
179
           ((CdmSpringVaadinServletService)service).removeRequestEndListener(this);
180
           if(logger.isTraceEnabled()){
181
               ((CdmSpringVaadinServletService)service).removeRequestStartListener(this);
182
           }
183
       } else {
184
           throw new RuntimeException("Using the CdmSpringVaadinServletService is required for proper per view conversation handling");
185
       }
186
   }
187

  
188
    /**
189
     * <b>ONLY USED FOR LOGGING</b> when Level==TRACE
190
     * {@inheritDoc}
191
     */
192
    @Override
193
    public void onRequestStart(VaadinRequest request){
194

  
195
        if(requestNeedsSession(request) ){
196

  
197
            if(getView() instanceof AbstractPopupEditor){
198
                Object bean = ((AbstractPopupEditor)getView()).getBean();
199
                getSession().merge(bean);
200
            }
201

  
202
        } else {
203
            // ignore hartbeat, fileupload, push etc
204
            logger.trace("ignoring request:" + request.getPathInfo());
205
        }
206
    }
207

  
208
    /**
209
     * Returns <code>true</code> for:
210
     * <ul>
211
     *   <li>..</li>
212
     * <ul>
213
     *
214
     * Return <code>false</code> for:
215
     *
216
     * <ul>
217
     *   <li>UILD request in a existing view, like clicking on a button</li>
218
     * <ul>
219
     *
220
     * @return
221
    protected boolean isActiveView(){
222
        return UI.getCurrent() != null && getView() != null && getView() == navigationManager.getCurrentView();
223
    }
224
     */
225

  
226
    @Override
227
    public void onRequestEnd(VaadinRequest request, VaadinSession session){
228

  
229
        if(requestNeedsSession(request) ){
230
            logger.trace("onRequestEnd() " + request.getPathInfo() + " " + _toString());
231

  
232
        } else {
233
            // ignore hartbeat, fileupload, push etc
234
            logger.trace("ignoring request:" + request.getPathInfo());
235
        }
236

  
237
    }
238

  
239
    /**
240
     * @param request
241
     * @return
242
     */
243
    protected boolean requestNeedsSession(VaadinRequest request) {
244
        return !(
245
                ServletPortletHelper.isAppRequest(request) // includes published file request
246
             || ServletPortletHelper.isFileUploadRequest(request)
247
             || ServletPortletHelper.isHeartbeatRequest(request)
248
             || ServletPortletHelper.isPushRequest(request)
249
             );
250
    }
251

  
140 252
    protected abstract void saveBean(DTO bean);
141 253

  
142 254
    /**

Also available in: Unified diff