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.beanval.metadata.transformer;
20  
21  import org.apache.myfaces.extensions.validator.internal.UsageInformation;
22  import org.apache.myfaces.extensions.validator.internal.UsageCategory;
23  import org.apache.myfaces.extensions.validator.core.metadata.transformer.MetaDataTransformer;
24  import org.apache.myfaces.extensions.validator.core.metadata.MetaDataEntry;
25  import org.apache.myfaces.extensions.validator.beanval.payload.ViolationSeverity;
26  import org.apache.myfaces.extensions.validator.beanval.payload.DisableClientSideValidation;
27  import org.apache.myfaces.extensions.validator.util.ExtValUtils;
28  
29  import javax.validation.metadata.ConstraintDescriptor;
30  import javax.validation.Payload;
31  import javax.faces.application.FacesMessage;
32  import java.util.Map;
33  import java.util.Collections;
34  import java.lang.annotation.Annotation;
35  
36  /**
37   * @author Gerhard Petracek
38   * @since x.x.3
39   */
40  @UsageInformation({UsageCategory.REUSE})
41  public abstract class AbstractBeanValidationMetaDataTransformer<T extends Annotation> implements MetaDataTransformer
42  {
43      @SuppressWarnings({"unchecked"})
44      public Map<String, Object> convertMetaData(MetaDataEntry metaDataEntry)
45      {
46          ConstraintDescriptor<? extends T> constraintDescriptor = metaDataEntry.getValue(ConstraintDescriptor.class);
47  
48          if(isClientSideValidationEnabled(constraintDescriptor) && isBlockingConstraint(constraintDescriptor))
49          {
50              return transformMetaData((ConstraintDescriptor<T>)constraintDescriptor);
51          }
52          return Collections.emptyMap();
53      }
54  
55      protected boolean isClientSideValidationEnabled(ConstraintDescriptor<? extends T> constraintDescriptor)
56      {
57          return !constraintDescriptor.getPayload().contains(
58                  ExtValUtils.getValidationParameterClassFor(DisableClientSideValidation.class));
59      }
60  
61      protected boolean isBlockingConstraint(ConstraintDescriptor<?> constraintDescriptor)
62      {
63          FacesMessage testMessage = new FacesMessage();
64          testMessage.setSeverity(ViolationSeverity.Error.VALUE);
65  
66          for (Class<? extends Payload> payload : constraintDescriptor.getPayload())
67          {
68              if (ExtValUtils.getValidationParameterClassFor(ViolationSeverity.Warn.class).isAssignableFrom(payload))
69              {
70                  testMessage.setSeverity(ViolationSeverity.Warn.VALUE);
71              }
72              else if(ExtValUtils.getValidationParameterClassFor(ViolationSeverity.Info.class).isAssignableFrom(payload))
73              {
74                  testMessage.setSeverity(ViolationSeverity.Info.VALUE);
75              }
76              else if(ExtValUtils.getValidationParameterClassFor(ViolationSeverity.Fatal.class).isAssignableFrom(payload))
77              {
78                  testMessage.setSeverity(ViolationSeverity.Fatal.VALUE);
79              }
80          }
81          return ExtValUtils.severityBlocksSubmitForComponentId(null, testMessage);
82      }
83      protected abstract Map<String, Object> transformMetaData(ConstraintDescriptor<T> constraintDescriptor);
84  }