Revision 2f02081c
Added by Andreas Kohlbecker over 6 years ago
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
ref #7046 completely removing open session per view implementation and adding init strategies for Name and Typedesignation editor