View Javadoc
1   /*
2    * Copyright 2012-2021 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.Map;
19  import java.util.function.Consumer;
20  
21  import javax.annotation.Resource;
22  
23  import org.apache.logging.log4j.LogManager;
24  import org.apache.logging.log4j.Logger;
25  import org.codelibs.core.beans.util.BeanUtil;
26  import org.codelibs.core.beans.util.CopyOptions;
27  import org.codelibs.fess.Constants;
28  import org.codelibs.fess.app.web.base.login.FessLoginAssist;
29  import org.codelibs.fess.helper.AccessTokenHelper;
30  import org.codelibs.fess.helper.ActivityHelper;
31  import org.codelibs.fess.helper.SystemHelper;
32  import org.codelibs.fess.helper.ViewHelper;
33  import org.codelibs.fess.mylasta.action.FessHtmlPath;
34  import org.codelibs.fess.mylasta.action.FessMessages;
35  import org.codelibs.fess.mylasta.action.FessUserBean;
36  import org.codelibs.fess.mylasta.direction.FessConfig;
37  import org.dbflute.hook.AccessContext;
38  import org.dbflute.optional.OptionalThing;
39  import org.lastaflute.core.message.MessageManager;
40  import org.lastaflute.core.time.TimeManager;
41  import org.lastaflute.db.dbflute.accesscontext.AccessContextArranger;
42  import org.lastaflute.web.TypicalAction;
43  import org.lastaflute.web.response.ActionResponse;
44  import org.lastaflute.web.ruts.process.ActionRuntime;
45  import org.lastaflute.web.servlet.request.RequestManager;
46  import org.lastaflute.web.servlet.request.ResponseManager;
47  import org.lastaflute.web.servlet.session.SessionManager;
48  import org.lastaflute.web.validation.ActionValidator;
49  import org.lastaflute.web.validation.LaValidatable;
50  import org.lastaflute.web.validation.VaMessenger;
51  
52  /**
53   * @author jflute
54   */
55  public abstract class FessBaseAction extends TypicalAction // has several interfaces for direct use
56          implements LaValidatable<FessMessages>, FessHtmlPath {
57  
58      // ===================================================================================
59      //                                                                          Definition
60      //                                                                          ==========
61      private static final Logger logger = LogManager.getLogger(FessBaseAction.class);
62  
63      /** The application type for FESs, e.g. used by access context. */
64      protected static final String APP_TYPE = "FES"; // #change_it_first
65  
66      /** The user type for Admin, e.g. used by access context. */
67      protected static final String USER_TYPE = "A";
68  
69      // ===================================================================================
70      //                                                                           Attribute
71      //                                                                           =========
72      @Resource
73      protected FessLoginAssist fessLoginAssist;
74  
75      @Resource
76      protected SessionManager sessionManager;
77  
78      @Resource
79      protected FessConfig fessConfig;
80  
81      @Resource
82      protected ActivityHelper activityHelper;
83  
84      @Resource
85      protected ResponseManager responseManager;
86  
87      @Resource
88      protected TimeManager timeManager;
89  
90      @Resource
91      protected SystemHelper systemHelper;
92  
93      @Resource
94      protected AccessTokenHelper accessTokenHelper;
95  
96      @Resource
97      protected ViewHelper viewHelper;
98  
99      @Resource
100     private MessageManager messageManager;
101 
102     @Resource
103     private RequestManager requestManager;
104 
105     // ===================================================================================
106     //                                                                               Hook
107     //                                                                              ======
108     // to suppress unexpected override by sub-class
109     // you should remove the 'final' if you need to override this
110     @Override
111     public ActionResponse godHandPrologue(final ActionRuntime runtime) {
112         fessLoginAssist.getSavedUserBean().ifPresent(u -> {
113             final boolean result = u.getFessUser().refresh();
114             if (logger.isDebugEnabled()) {
115                 logger.debug("refresh user info: {}", result);
116             }
117         });
118         return viewHelper.getActionHook().godHandPrologue(runtime, super::godHandPrologue);
119     }
120 
121     @Override
122     public final ActionResponse godHandMonologue(final ActionRuntime runtime) {
123         return viewHelper.getActionHook().godHandMonologue(runtime, super::godHandMonologue);
124     }
125 
126     @Override
127     public final void godHandEpilogue(final ActionRuntime runtime) {
128         viewHelper.getActionHook().godHandEpilogue(runtime, super::godHandEpilogue);
129     }
130 
131     // #app_customize you can customize the action hook
132     @Override
133     public ActionResponse hookBefore(final ActionRuntime runtime) { // application may override
134         return viewHelper.getActionHook().hookBefore(runtime, super::hookBefore);
135     }
136 
137     @Override
138     public void hookFinally(final ActionRuntime runtime) {
139         viewHelper.getActionHook().hookFinally(runtime, super::hookFinally);
140     }
141 
142     // ===================================================================================
143     //                                                                      Access Context
144     //                                                                      ==============
145     @Override
146     protected AccessContextArranger newAccessContextArranger() { // for framework
147         // fess does not use DBFlute, and this is unneeded so dummy
148         return resource -> {
149             final AccessContext context = new AccessContext();
150             context.setAccessLocalDateTimeProvider(() -> timeManager.currentDateTime());
151             context.setAccessUserProvider(() -> "unused");
152             return context;
153         };
154     }
155 
156     // ===================================================================================
157     //                                                                           User Info
158     //                                                                           =========
159     @Override
160     protected OptionalThing<FessUserBean> getUserBean() { // to return as concrete class
161         return fessLoginAssist.getSavedUserBean();
162     }
163 
164     @Override
165     protected String myAppType() { // for framework
166         return APP_TYPE;
167     }
168 
169     @Override
170     protected OptionalThing<String> myUserType() { // for framework
171         return OptionalThing.of(USER_TYPE); // same reason as getUserBean()
172     }
173 
174     // ===================================================================================
175     //                                                                          Validation
176     //                                                                          ==========
177     @SuppressWarnings("unchecked")
178     @Override
179     public ActionValidator<FessMessages> createValidator() {
180         return systemHelper.createValidator(requestManager, this::createMessages, myValidationGroups());
181     }
182 
183     @Override
184     public FessMessages createMessages() { // application may call
185         return new FessMessages(); // overriding to change return type to concrete-class
186     }
187 
188     // ===================================================================================
189     //                                                                        Small Helper
190     //                                                                        ============
191 
192     protected void saveInfo(final VaMessenger<FessMessages> validationMessagesLambda) {
193         final FessMessages messages = createMessages();
194         validationMessagesLambda.message(messages);
195         sessionManager.info().saveMessages(messages);
196     }
197 
198     protected void saveError(final VaMessenger<FessMessages> validationMessagesLambda) {
199         final FessMessages messages = createMessages();
200         validationMessagesLambda.message(messages);
201         sessionManager.errors().saveMessages(messages);
202     }
203 
204     protected static void copyBeanToBean(final Object src, final Object dest, final Consumer<CopyOptions> option) {
205         BeanUtil.copyBeanToBean(src, dest, option);
206     }
207 
208     protected static void copyMapToBean(final Map<String, ? extends Object> src, final Object dest, final Consumer<CopyOptions> option) {
209         BeanUtil.copyMapToBean(src, dest, option);
210     }
211 
212     protected static <T> T copyBeanToNewBean(final Object src, final Class<T> destClass) {
213         return BeanUtil.copyBeanToNewBean(src, destClass);
214     }
215 
216     protected String buildThrowableMessage(final Throwable t) {
217         final StringBuilder buf = new StringBuilder(100);
218         Throwable current = t;
219         while (current != null) {
220             buf.append(current.getLocalizedMessage()).append(' ');
221             current = current.getCause();
222         }
223         return buf.toString();
224     }
225 
226     public static boolean isCheckboxEnabled(final String value) {
227         if (value == null) {
228             return false;
229         }
230         return Constants.ON.equalsIgnoreCase(value) || Constants.TRUE.equalsIgnoreCase(value);
231     }
232 }