View Javadoc
1   /*
2    * Licensed under the GPL License. You may not use this file except in compliance with the License.
3    * You may obtain a copy of the License at
4    *
5    *   https://www.gnu.org/licenses/old-licenses/gpl-2.0.html
6    *
7    * THIS PACKAGE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING,
8    * WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR
9    * PURPOSE.
10   */
11  package psiprobe;
12  
13  import java.util.ArrayList;
14  import java.util.HashMap;
15  import java.util.List;
16  import java.util.Locale;
17  import java.util.Map;
18  import java.util.Properties;
19  
20  import org.slf4j.Logger;
21  import org.slf4j.LoggerFactory;
22  import org.springframework.beans.factory.FactoryBean;
23  import org.springframework.beans.factory.annotation.Autowired;
24  import org.springframework.beans.factory.config.PropertiesFactoryBean;
25  import org.springframework.context.MessageSource;
26  import org.springframework.context.annotation.Bean;
27  import org.springframework.context.annotation.ComponentScan;
28  import org.springframework.context.annotation.Configuration;
29  import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
30  import org.springframework.context.support.ReloadableResourceBundleMessageSource;
31  import org.springframework.core.io.ClassPathResource;
32  import org.springframework.web.multipart.support.StandardServletMultipartResolver;
33  import org.springframework.web.servlet.HandlerMapping;
34  import org.springframework.web.servlet.LocaleResolver;
35  import org.springframework.web.servlet.ViewResolver;
36  import org.springframework.web.servlet.config.annotation.EnableWebMvc;
37  import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
38  import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
39  import org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping;
40  import org.springframework.web.servlet.i18n.CookieLocaleResolver;
41  import org.springframework.web.servlet.i18n.LocaleChangeInterceptor;
42  import org.springframework.web.servlet.view.InternalResourceViewResolver;
43  import org.springframework.web.servlet.view.JstlView;
44  import org.springframework.web.util.pattern.PathPatternParser;
45  
46  import psiprobe.beans.ClusterWrapperBean;
47  import psiprobe.beans.ContainerListenerBean;
48  import psiprobe.beans.ContainerWrapperBean;
49  import psiprobe.beans.JBossResourceResolverBean;
50  import psiprobe.beans.JvmMemoryInfoAccessorBean;
51  import psiprobe.beans.LogResolverBean;
52  import psiprobe.beans.ResourceResolver;
53  import psiprobe.beans.ResourceResolverBean;
54  import psiprobe.beans.RuntimeInfoAccessorBean;
55  import psiprobe.tools.Mailer;
56  
57  /**
58   * The Class ProbeConfig.
59   */
60  @EnableWebMvc
61  @Configuration
62  @ComponentScan(basePackages = {"psiprobe"})
63  public class ProbeConfig implements WebMvcConfigurer {
64  
65    /** The Constant logger. */
66    private static final Logger logger = LoggerFactory.getLogger(ProbeConfig.class);
67  
68    /**
69     * Gets the container listener bean.
70     *
71     * @return the container listener bean
72     */
73    @Bean(name = "containerListener")
74    public ContainerListenerBean getContainerListenerBean() {
75      logger.debug("Instantiated containerListener");
76      return new ContainerListenerBean();
77    }
78  
79    /**
80     * Gets the container wrapper bean.
81     *
82     * @return the container wrapper bean
83     */
84    @Bean(name = "containerWrapper")
85    public ContainerWrapperBean getContainerWrapperBean() {
86      logger.debug("Instantiated containerWrapper");
87      return new ContainerWrapperBean();
88    }
89  
90    /**
91     * Gets the cluster wrapper bean.
92     *
93     * @return the cluster wrapper bean
94     */
95    @Bean(name = "clusterWrapper")
96    public ClusterWrapperBean getClusterWrapperBean() {
97      logger.debug("Instantiated clusterWrapper");
98      return new ClusterWrapperBean();
99    }
100 
101   /**
102    * Gets the mailer.
103    *
104    * @return the mailer
105    */
106   @Bean(name = "mailer")
107   public Mailer getMailer() {
108     logger.debug("Instantiated mailer");
109     return new Mailer();
110   }
111 
112   /**
113    * Gets the default res.
114    *
115    * @return the default res
116    */
117   @Bean(name = "datasourceMappers")
118   public List<String> getDefaultRes() {
119     logger.debug("Instantiated datasourceMappers");
120     List<String> list = new ArrayList<>();
121     list.add("psiprobe.beans.accessors.C3P0DatasourceAccessor");
122     list.add("psiprobe.beans.accessors.Dbcp2DatasourceAccessor");
123     list.add("psiprobe.beans.accessors.FlexyPoolDatasourceAccessor");
124     list.add("psiprobe.beans.accessors.HikariCpDatasourceAccessor");
125     list.add("psiprobe.beans.accessors.OracleDatasourceAccessor");
126     list.add("psiprobe.beans.accessors.OracleUcpDatasourceAccessor");
127     list.add("psiprobe.beans.accessors.OpenEjbBasicDatasourceAccessor");
128     list.add("psiprobe.beans.accessors.OpenEjbManagedDatasourceAccessor");
129     list.add("psiprobe.beans.accessors.Tomcat10DbcpDatasourceAccessor");
130     list.add("psiprobe.beans.accessors.Tomcat11DbcpDatasourceAccessor");
131     list.add("psiprobe.beans.accessors.TomcatJdbcPoolDatasourceAccessor");
132     list.add("psiprobe.beans.accessors.TomEeJdbcPoolDatasourceAccessor");
133     list.add("psiprobe.beans.accessors.ViburCpDatasourceAccessor");
134     return list;
135   }
136 
137   /**
138    * Gets the resource resolver bean.
139    *
140    * @return the resource resolver bean
141    */
142   @Bean(name = "default")
143   public ResourceResolverBean getResourceResolverBean() {
144     logger.debug("Instantiated default resourceResolverBean");
145     return new ResourceResolverBean();
146   }
147 
148   /**
149    * Gets the jboss resource resolver bean.
150    *
151    * @return the jboss resource resolver bean
152    */
153   @Bean(name = "jboss")
154   public JBossResourceResolverBean getJBossResourceResolverBean() {
155     logger.debug("Instantiated jbossResourceResolverBean");
156     return new JBossResourceResolverBean();
157   }
158 
159   /**
160    * Gets the resource resolvers.
161    *
162    * @param jbossResourceResolverBean the jboss resource resolver bean
163    * @param resourceResolverBean the resource resolver bean
164    *
165    * @return the resource resolvers
166    */
167   @Bean(name = "resourceResolvers")
168   public Map<String, ResourceResolver> getResourceResolvers(
169       @Autowired JBossResourceResolverBean jbossResourceResolverBean,
170       @Autowired ResourceResolverBean resourceResolverBean) {
171     logger.debug("Instantiated resourceResolvers");
172     Map<String, ResourceResolver> map = new HashMap<>();
173     map.put("jboss", jbossResourceResolverBean);
174     map.put("default", resourceResolverBean);
175     return map;
176   }
177 
178   /**
179    * Gets the adapter classes.
180    *
181    * @return the adapter classes
182    */
183   @Bean(name = "adapterClasses")
184   public List<String> getAdapterClasses() {
185     logger.debug("Instantiated adapterClasses");
186     List<String> list = new ArrayList<>();
187     try {
188       Properties properties = adapters().getObject();
189       if (properties == null) {
190         return List.of();
191       }
192       for (Object adapter : properties.values()) {
193         list.add((String) adapter);
194       }
195     } catch (Exception e) {
196       logger.error("", e);
197     }
198     return list;
199   }
200 
201   /**
202    * Gets the stdout files. Any file added to this list will be displayed.
203    *
204    * @return the stdout files
205    */
206   @Bean(name = "stdoutFiles")
207   public List<String> getStdoutFiles() {
208     logger.debug("Instantiated stdoutFiles");
209     List<String> list = new ArrayList<>();
210     try {
211       Properties properties = stdout().getObject();
212       if (properties == null) {
213         return List.of();
214       }
215       for (Object stdout : properties.values()) {
216         list.add((String) stdout);
217       }
218     } catch (Exception e) {
219       logger.error("", e);
220     }
221     return list;
222   }
223 
224   /**
225    * Standard Out Properties.
226    *
227    * @return the properties factory bean for standard out
228    */
229   @Bean(name = "stdout")
230   public FactoryBean<Properties> stdout() {
231     logger.debug("Instantiated stdout");
232     PropertiesFactoryBean bean = new PropertiesFactoryBean();
233     bean.setLocation(new ClassPathResource("stdout.properties"));
234     return bean;
235   }
236 
237   /**
238    * Adapters Properties.
239    *
240    * @return the properties factory bean for adaptors
241    */
242   @Bean(name = "adapters")
243   public FactoryBean<Properties> adapters() {
244     logger.debug("Instantiated adapters");
245     PropertiesFactoryBean bean = new PropertiesFactoryBean();
246     bean.setLocation(new ClassPathResource("adapters.properties"));
247     return bean;
248   }
249 
250   /**
251    * Gets the log resolver bean.
252    *
253    * @return the log resolver bean
254    */
255   @Bean(name = "logResolver")
256   public LogResolverBean getLogResolverBean() {
257     logger.debug("Instantiated logResolver");
258     return new LogResolverBean();
259   }
260 
261   /**
262    * Gets the jvm memory info accessor bean.
263    *
264    * @return the jvm memory info accessor bean
265    */
266   @Bean(name = "jvmMemoryInfoAccessor")
267   public JvmMemoryInfoAccessorBean getJvmMemoryInfoAccessorBean() {
268     logger.debug("Instantiated jvmMemoryInfoAccessorBean");
269     return new JvmMemoryInfoAccessorBean();
270   }
271 
272   /**
273    * Gets the runtime info accessor bean.
274    *
275    * @return the runtime info accessor bean
276    */
277   @Bean(name = "runtimeInfoAccessor")
278   public RuntimeInfoAccessorBean getRuntimeInfoAccessorBean() {
279     logger.debug("Instantiated runtimeInfoAccessorBean");
280     return new RuntimeInfoAccessorBean();
281   }
282 
283   /**
284    * Gets the internal resource view resolver.
285    *
286    * @return the internal resource view resolver
287    */
288   @Bean(name = "jspViewResolver")
289   public ViewResolver getViewResolver() {
290     logger.debug("Instantiated internalResourceViewResolver");
291     InternalResourceViewResolver resolver = new InternalResourceViewResolver();
292     resolver.setViewClass(JstlView.class);
293     resolver.setPrefix("/WEB-INF/jsp/");
294     resolver.setSuffix(".jsp");
295     return resolver;
296   }
297 
298   /**
299    * Gets the reloadable resource bundle message source.
300    *
301    * @return the reloadable resource bundle message source
302    */
303   @Bean(name = "messageSource")
304   public MessageSource getMessageSource() {
305     logger.debug("Instantiated reloadableResourceBundleMessageSource");
306     ReloadableResourceBundleMessageSource source = new ReloadableResourceBundleMessageSource();
307     source.setBasename("/WEB-INF/messages");
308     source.setCacheSeconds(1);
309     source.setFallbackToSystemLocale(false);
310     return source;
311   }
312 
313   /**
314    * Gets the cookie locale resolver.
315    *
316    * @return the cookie locale resolver
317    */
318   @Bean(name = "localeResolver")
319   public LocaleResolver getLocaleResolver() {
320     logger.debug("Instantiated cookieLocaleResolver");
321     CookieLocaleResolver resolver = new CookieLocaleResolver();
322     resolver.setDefaultLocale(Locale.ENGLISH);
323     resolver.setCookieSecure(true);
324     resolver.setCookieHttpOnly(true);
325     return resolver;
326   }
327 
328   /**
329    * Gets the bean name url handler mapping.
330    *
331    * @param interceptor the interceptor
332    *
333    * @return the bean name url handler mapping
334    */
335   @Bean(name = "handlerMapping")
336   public HandlerMapping getHandlerMapping(@Autowired LocaleChangeInterceptor interceptor) {
337     logger.debug("Instantiated beanNameUrlHandlerMapping");
338     BeanNameUrlHandlerMapping mapping = new BeanNameUrlHandlerMapping();
339     mapping.setPatternParser(PathPatternParser.defaultInstance);
340     mapping.setInterceptors(interceptor);
341     return mapping;
342   }
343 
344   @Override
345   public void addInterceptors(InterceptorRegistry registry) {
346     logger.debug("Registering localeChangeInterceptor");
347     registry.addInterceptor(getLocaleChangeInterceptor());
348   }
349 
350   /**
351    * Gets the locale change interceptor.
352    *
353    * @return the locale change interceptor
354    */
355   @Bean(name = "localeChangeInterceptor")
356   public LocaleChangeInterceptor getLocaleChangeInterceptor() {
357     logger.debug("Instantiated localeChangeInterceptor");
358     LocaleChangeInterceptor interceptor = new LocaleChangeInterceptor();
359     interceptor.setParamName("lang");
360     return interceptor;
361   }
362 
363   /**
364    * Gets the property sources placeholder configurer.
365    *
366    * @return the property sources placeholder configurer
367    */
368   @Bean(name = "propertySourcesPlaceholderConfigurer")
369   public static PropertySourcesPlaceholderConfigurer getPropertySourcesPlaceholderConfigurer() {
370     logger.debug("Instantiated propertySourcesPlaceholderConfigurer");
371     PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
372     configurer.setLocation(new ClassPathResource("stats.properties"));
373     configurer.setNullValue("NULL");
374 
375     Properties properties = new Properties();
376     properties.put("psiprobe.tools.mail.to", "NULL");
377     properties.put("psiprobe.tools.mail.subjectPrefix", "[PSI Probe]");
378     configurer.setProperties(properties);
379     return configurer;
380   }
381 
382   /**
383    * Version.
384    *
385    * @return the properties factory bean
386    */
387   @Bean(name = "version")
388   public PropertiesFactoryBean version() {
389     logger.debug("Instantiated version");
390     PropertiesFactoryBean bean = new PropertiesFactoryBean();
391     bean.setLocation(new ClassPathResource("version.properties"));
392     return bean;
393   }
394 
395   /**
396    * Multipart resolver.
397    *
398    * @return the standard servlet multipart resolver
399    */
400   @Bean(name = "multipartResolver")
401   public StandardServletMultipartResolver multipartResolver() {
402     return new StandardServletMultipartResolver();
403   }
404 
405 }