View Javadoc
1   /*
2    * Copyright 2012-2017 CodeLibs Project and the Others.
3    *
4    * Licensed under the Apache License, Version 2.0 (the "License");
5    * you may not use this file except in compliance with the License.
6    * You may obtain a copy of the License at
7    *
8    *     http://www.apache.org/licenses/LICENSE-2.0
9    *
10   * Unless required by applicable law or agreed to in writing, software
11   * distributed under the License is distributed on an "AS IS" BASIS,
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND,
13   * either express or implied. See the License for the specific language
14   * governing permissions and limitations under the License.
15   */
16  package org.codelibs.fess.app.web.base;
17  
18  import java.util.function.Consumer;
19  
20  import javax.annotation.Resource;
21  
22  import org.codelibs.core.beans.util.BeanUtil;
23  import org.codelibs.core.beans.util.CopyOptions;
24  import org.codelibs.fess.app.web.base.login.FessLoginAssist;
25  import org.codelibs.fess.helper.ActivityHelper;
26  import org.codelibs.fess.helper.SystemHelper;
27  import org.codelibs.fess.helper.ViewHelper;
28  import org.codelibs.fess.mylasta.action.FessHtmlPath;
29  import org.codelibs.fess.mylasta.action.FessMessages;
30  import org.codelibs.fess.mylasta.action.FessUserBean;
31  import org.codelibs.fess.mylasta.direction.FessConfig;
32  import org.dbflute.hook.AccessContext;
33  import org.dbflute.optional.OptionalThing;
34  import org.lastaflute.core.message.MessageManager;
35  import org.lastaflute.core.time.TimeManager;
36  import org.lastaflute.db.dbflute.accesscontext.AccessContextArranger;
37  import org.lastaflute.web.TypicalAction;
38  import org.lastaflute.web.response.ActionResponse;
39  import org.lastaflute.web.ruts.process.ActionRuntime;
40  import org.lastaflute.web.servlet.request.RequestManager;
41  import org.lastaflute.web.servlet.request.ResponseManager;
42  import org.lastaflute.web.servlet.session.SessionManager;
43  import org.lastaflute.web.validation.ActionValidator;
44  import org.lastaflute.web.validation.LaValidatable;
45  import org.lastaflute.web.validation.VaMessenger;
46  
47  /**
48   * @author jflute
49   */
50  public abstract class FessBaseAction extends TypicalAction // has several interfaces for direct use
51          implements LaValidatable<FessMessages>, FessHtmlPath {
52  
53      // ===================================================================================
54      //                                                                          Definition
55      //                                                                          ==========
56      /** The application type for FESs, e.g. used by access context. */
57      protected static final String APP_TYPE = "FES"; // #change_it_first
58  
59      /** The user type for Admin, e.g. used by access context. */
60      protected static final String USER_TYPE = "A";
61  
62      // ===================================================================================
63      //                                                                           Attribute
64      //                                                                           =========
65      @Resource
66      protected FessLoginAssist fessLoginAssist;
67  
68      @Resource
69      protected SessionManager sessionManager;
70  
71      @Resource
72      protected FessConfig fessConfig;
73  
74      @Resource
75      protected ActivityHelper activityHelper;
76  
77      @Resource
78      protected ResponseManager responseManager;
79  
80      @Resource
81      protected TimeManager timeManager;
82  
83      @Resource
84      protected SystemHelper systemHelper;
85  
86      @Resource
87      protected ViewHelper viewHelper;
88  
89      @Resource
90      private MessageManager messageManager;
91  
92      @Resource
93      private RequestManager requestManager;
94  
95      // ===================================================================================
96      //                                                                               Hook
97      //                                                                              ======
98      // to suppress unexpected override by sub-class
99      // you should remove the 'final' if you need to override this
100     @Override
101     public ActionResponse godHandPrologue(final ActionRuntime runtime) {
102         return viewHelper.getActionHook().godHandPrologue(runtime, r -> super.godHandPrologue(r));
103     }
104 
105     @Override
106     public final ActionResponse godHandMonologue(final ActionRuntime runtime) {
107         return viewHelper.getActionHook().godHandMonologue(runtime, r -> super.godHandMonologue(r));
108     }
109 
110     @Override
111     public final void godHandEpilogue(final ActionRuntime runtime) {
112         viewHelper.getActionHook().godHandEpilogue(runtime, r -> super.godHandEpilogue(r));
113     }
114 
115     // #app_customize you can customize the action hook
116     @Override
117     public ActionResponse hookBefore(final ActionRuntime runtime) { // application may override
118         return viewHelper.getActionHook().hookBefore(runtime, r -> super.hookBefore(r));
119     }
120 
121     @Override
122     public void hookFinally(final ActionRuntime runtime) {
123         viewHelper.getActionHook().hookFinally(runtime, r -> super.hookFinally(r));
124     }
125 
126     // ===================================================================================
127     //                                                                      Access Context
128     //                                                                      ==============
129     @Override
130     protected AccessContextArranger newAccessContextArranger() { // for framework
131         // fess does not use DBFlute, and this is unneeded so dummy
132         return resource -> {
133             final AccessContext context = new AccessContext();
134             context.setAccessLocalDateTimeProvider(() -> timeManager.currentDateTime());
135             context.setAccessUserProvider(() -> "unused");
136             return context;
137         };
138     }
139 
140     // ===================================================================================
141     //                                                                           User Info
142     //                                                                           =========
143     @Override
144     protected OptionalThing<FessUserBean> getUserBean() { // to return as concrete class
145         return fessLoginAssist.getSavedUserBean();
146     }
147 
148     @Override
149     protected String myAppType() { // for framework
150         return APP_TYPE;
151     }
152 
153     @Override
154     protected OptionalThing<String> myUserType() { // for framework
155         return OptionalThing.of(USER_TYPE); // same reason as getUserBean()
156     }
157 
158     // ===================================================================================
159     //                                                                          Validation
160     //                                                                          ==========
161     @SuppressWarnings("unchecked")
162     @Override
163     public ActionValidator<FessMessages> createValidator() {
164         return systemHelper.createValidator(requestManager, () -> createMessages(), myValidationGroups());
165     }
166 
167     @Override
168     public FessMessages createMessages() { // application may call
169         return new FessMessages(); // overriding to change return type to concrete-class
170     }
171 
172     // ===================================================================================
173     //                                                                        Small Helper
174     //                                                                        ============
175 
176     protected void saveInfo(final VaMessenger<FessMessages> validationMessagesLambda) {
177         final FessMessages messages = createMessages();
178         validationMessagesLambda.message(messages);
179         sessionManager.info().saveMessages(messages);
180     }
181 
182     protected void saveError(final VaMessenger<FessMessages> validationMessagesLambda) {
183         final FessMessages messages = createMessages();
184         validationMessagesLambda.message(messages);
185         sessionManager.errors().saveMessages(messages);
186     }
187 
188     protected static void copyBeanToBean(final Object src, final Object dest, final Consumer<CopyOptions> option) {
189         BeanUtil.copyBeanToBean(src, dest, option);
190     }
191 
192     protected static <T> T copyBeanToNewBean(final Object src, final Class<T> destClass) {
193         return BeanUtil.copyBeanToNewBean(src, destClass);
194     }
195 
196     protected String buildThrowableMessage(final Throwable t) {
197         final StringBuilder buf = new StringBuilder(100);
198         Throwable current = t;
199         while (current != null) {
200             buf.append(current.getLocalizedMessage()).append(' ');
201             current = current.getCause();
202         }
203         return buf.toString();
204     }
205 }