View Javadoc

1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.myfaces.extensions.validator.core.startup;
20  
21  import org.apache.myfaces.extensions.validator.internal.Priority;
22  import org.apache.myfaces.extensions.validator.internal.ToDo;
23  import org.apache.myfaces.extensions.validator.internal.UsageCategory;
24  import org.apache.myfaces.extensions.validator.internal.UsageInformation;
25  import org.apache.myfaces.extensions.validator.core.interceptor.ValidationInterceptor;
26  import org.apache.myfaces.extensions.validator.core.interceptor.HtmlCoreComponentsValidationExceptionInterceptor;
27  import org.apache.myfaces.extensions.validator.core.interceptor.ViolationSeverityValidationExceptionInterceptor;
28  import org.apache.myfaces.extensions.validator.core.interceptor.FacesMessagePropertyValidationInterceptor;
29  import org.apache.myfaces.extensions.validator.core.interceptor.ViolationExceptionInterceptor;
30  import org.apache.myfaces.extensions.validator.core.interceptor.ExtValViewRootInterceptor;
31  import org.apache.myfaces.extensions.validator.core.ExtValContext;
32  import org.apache.myfaces.extensions.validator.core.CustomInformation;
33  import org.apache.myfaces.extensions.validator.core.ExtValCoreConfiguration;
34  import org.apache.myfaces.extensions.validator.core.DefaultExtValCoreConfiguration;
35  import org.apache.myfaces.extensions.validator.core.PhaseIdRecordingPhaseListener;
36  import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
37          .BeanValidationStrategyToMetaDataTransformerNameMapper;
38  import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
39          .SimpleValidationStrategyToMetaDataTransformerNameMapper;
40  import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
41          .DefaultValidationStrategyToMetaDataTransformerNameMapper;
42  import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
43          .CustomConventionValidationStrategyToMetaDataTransformerNameMapper;
44  import org.apache.myfaces.extensions.validator.core.metadata.transformer.mapper
45          .CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper;
46  import org.apache.myfaces.extensions.validator.core.validation.strategy.mapper
47          .CustomConventionAnnotationToValidationStrategyNameMapper;
48  import org.apache.myfaces.extensions.validator.core.validation.strategy.mapper
49          .DefaultAnnotationToValidationStrategyNameMapper;
50  import org.apache.myfaces.extensions.validator.core.validation.strategy.mapper
51          .CustomConfiguredAnnotationToValidationStrategyNameMapper;
52  import org.apache.myfaces.extensions.validator.core.validation.strategy.mapper
53          .SimpleAnnotationToValidationStrategyNameMapper;
54  import org.apache.myfaces.extensions.validator.core.validation.strategy.mapper
55          .AnnotationToValidationStrategyBeanNameMapper;
56  import org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper
57          .CustomConfiguredValidationStrategyToMsgResolverNameMapper;
58  import org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper
59          .CustomConventionValidationStrategyToMsgResolverNameMapper;
60  import org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper
61          .DefaultValidationStrategyToMsgResolverNameMapper;
62  import org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper
63          .DefaultModuleValidationStrategyToMsgResolverNameMapper;
64  import org.apache.myfaces.extensions.validator.core.validation.message.resolver.mapper
65          .SimpleValidationStrategyToMsgResolverNameMapper;
66  import org.apache.myfaces.extensions.validator.core.validation.parameter.DefaultViolationSeverityInterpreter;
67  import org.apache.myfaces.extensions.validator.core.validation.parameter.ViolationSeverity;
68  import org.apache.myfaces.extensions.validator.core.validation.parameter.DisableClientSideValidation;
69  import org.apache.myfaces.extensions.validator.util.ClassUtils;
70  import org.apache.myfaces.extensions.validator.util.ExtValUtils;
71  import org.apache.myfaces.extensions.validator.util.JsfUtils;
72  import org.apache.myfaces.extensions.validator.ExtValInformation;
73  
74  /**
75   * @since 1.x.1
76   */
77  @UsageInformation(UsageCategory.INTERNAL)
78  public class ExtValStartupListener extends AbstractStartupListener
79  {
80      private static final long serialVersionUID = -2504826421086572012L;
81  
82      protected void initModuleConfig()
83      {
84          ExtValCoreConfiguration.use(new DefaultExtValCoreConfiguration(), false);
85      }
86  
87      protected void init()
88      {
89          if(ExtValInformation.VERSION != null && !ExtValInformation.VERSION.startsWith("null"))
90          {
91              logger.info("starting up MyFaces Extensions Validator v" + ExtValInformation.VERSION);
92          }
93          else
94          {
95              logger.info("starting up MyFaces Extensions Validator");
96          }
97  
98          ExtValContext.getContext().registerRendererInterceptor(new ValidationInterceptor());
99  
100         initNameMappers();
101         initValidationExceptionInterceptors();
102         initViolationSeverityInterpreter();
103         initPropertyValidationInterceptors();
104         initViewRootInterceptors();
105         initPhaseListeners();
106         initViolationSeverityKey();
107         initDisableClientSideValidationKey();
108         initRequiredInitialization();
109 
110         executeCustomStartupListener();
111     }
112 
113     private void initNameMappers()
114     {
115         if (ExtValCoreConfiguration.get().deactivateDefaultNameMappers())
116         {
117             return;
118         }
119 
120         //register metadata to validation strategy name mapper
121         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
122                 new CustomConfiguredAnnotationToValidationStrategyNameMapper());
123         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
124                 new CustomConventionAnnotationToValidationStrategyNameMapper());
125         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
126                 new DefaultAnnotationToValidationStrategyNameMapper());
127         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
128                 new SimpleAnnotationToValidationStrategyNameMapper());
129 
130         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
131                 new AnnotationToValidationStrategyBeanNameMapper(
132                         new CustomConfiguredAnnotationToValidationStrategyNameMapper()));
133         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
134                 new AnnotationToValidationStrategyBeanNameMapper(
135                         new CustomConventionAnnotationToValidationStrategyNameMapper()));
136         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
137                 new AnnotationToValidationStrategyBeanNameMapper(
138                         new DefaultAnnotationToValidationStrategyNameMapper()));
139         ExtValUtils.registerMetaDataToValidationStrategyNameMapper(
140                 new AnnotationToValidationStrategyBeanNameMapper(
141                         new SimpleAnnotationToValidationStrategyNameMapper()));
142 
143         //register validation strategy to message resolver name mapper
144         ExtValUtils.registerValidationStrategyToMessageResolverNameMapper(
145                 new CustomConfiguredValidationStrategyToMsgResolverNameMapper());
146         ExtValUtils.registerValidationStrategyToMessageResolverNameMapper(
147                 new CustomConventionValidationStrategyToMsgResolverNameMapper());
148         ExtValUtils.registerValidationStrategyToMessageResolverNameMapper(
149                 new DefaultValidationStrategyToMsgResolverNameMapper());
150         ExtValUtils.registerValidationStrategyToMessageResolverNameMapper(
151                 new DefaultModuleValidationStrategyToMsgResolverNameMapper());
152         ExtValUtils.registerValidationStrategyToMessageResolverNameMapper(
153                 new SimpleValidationStrategyToMsgResolverNameMapper());
154 
155         //register validation strategy to metadata transformer name mapper
156         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(
157                 new CustomConfiguredValidationStrategyToMetaDataTransformerNameMapper());
158         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(
159                 new CustomConventionValidationStrategyToMetaDataTransformerNameMapper());
160         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(
161                 new DefaultValidationStrategyToMetaDataTransformerNameMapper());
162         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(
163                 new SimpleValidationStrategyToMetaDataTransformerNameMapper());
164         ExtValUtils.registerValidationStrategyToMetaDataTransformerNameMapper(
165                 new BeanValidationStrategyToMetaDataTransformerNameMapper());
166     }
167 
168     private void executeCustomStartupListener()
169     {
170         String customStartupListenerName = ExtValContext.getContext().getInformationProviderBean()
171             .get(CustomInformation.STARTUP_LISTENER);
172         AbstractStartupListener customStartupListener =
173             (AbstractStartupListener)ClassUtils.tryToInstantiateClassForName(customStartupListenerName);
174 
175         if(customStartupListener != null)
176         {
177             logger.info("start init of " + customStartupListener.getClass().getName());
178 
179             customStartupListener.init();
180 
181             logger.info("init of " + customStartupListener.getClass().getName() + " finished");
182         }
183     }
184 
185     private void initValidationExceptionInterceptors()
186     {
187         ExtValContext.getContext().addValidationExceptionInterceptor(
188                 new HtmlCoreComponentsValidationExceptionInterceptor());
189         ExtValContext.getContext().addValidationExceptionInterceptor(
190                 new ViolationSeverityValidationExceptionInterceptor());
191 
192         ExtValContext.getContext().addValidationExceptionInterceptor(
193                 new ViolationExceptionInterceptor());
194     }
195 
196     private void initViolationSeverityInterpreter()
197     {
198         ExtValContext.getContext().setViolationSeverityInterpreter(new DefaultViolationSeverityInterpreter(), false);
199     }
200 
201     private void initPropertyValidationInterceptors()
202     {
203         ExtValContext.getContext().addPropertyValidationInterceptor(new FacesMessagePropertyValidationInterceptor());
204     }
205 
206     private void initViewRootInterceptors()
207     {
208         ExtValContext.getContext().addViewRootInterceptor(new ExtValViewRootInterceptor());
209     }
210 
211     private void initPhaseListeners()
212     {
213         JsfUtils.registerPhaseListener(new PhaseIdRecordingPhaseListener());
214     }
215 
216     @Deprecated
217     @ToDo(value=Priority.MEDIUM, description="DefaultValidationParameterFactory#tryToFindGlobalParameter still uses" +
218             "the global parameter")
219     private void initViolationSeverityKey()
220     {
221         ExtValContext.getContext().addGlobalProperty(ViolationSeverity.class.getName(),
222                 ExtValCoreConfiguration.get().violationSeverity(), false);
223     }
224 
225     @Deprecated
226     private void initDisableClientSideValidationKey()
227     {
228         ExtValContext.getContext().addGlobalProperty(DisableClientSideValidation.class.getName(),
229                 ExtValCoreConfiguration.get().disableClientSideValidationValidationParameter(), false);
230     }
231 
232     private void initRequiredInitialization()
233     {
234         boolean requiredInitialization = ExtValCoreConfiguration.get().activateRequiredInitialization();
235 
236         //noinspection deprecation
237         addRequiredInitializationAsGlobalProperty(requiredInitialization);
238 
239         initRequiredAttributeSupport();
240     }
241 
242     @Deprecated
243     private void addRequiredInitializationAsGlobalProperty(boolean requiredInitialization)
244     {
245         ExtValContext.getContext().addGlobalProperty("mode:init:required", requiredInitialization, false);
246     }
247 
248     /**
249      * if it's configured that required init should happen,
250      * it's required to deactivate the support for the required attribute
251      */
252     @Deprecated
253     private void initRequiredAttributeSupport()
254     {
255         ExtValContext.getContext().addGlobalProperty("mode:reset:required",
256                 ExtValCoreConfiguration.get().deactivateRequiredAttributeSupport(),
257                 false);
258     }
259 }