/*
* Hibernate Validator, declare and validate application constraints
*
* License: Apache License, Version 2.0
* See the license.txt file in the root directory or <http://www.apache.org/licenses/LICENSE-2.0>.
*/
package org.hibernate.validator.ap.util;
import java.text.MessageFormat;
import java.util.Map;
import javax.annotation.processing.Messager;
import javax.tools.Diagnostic.Kind;
/**
* Provides access to the processor options supported by the Hibernate Validator
* annotation processor.
*
* @author Gunnar Morling
*/
public class Configuration {
/**
* The name of the processor option for setting the diagnostic kind to be
* used when reporting errors during annotation processing.
*/
public static final String DIAGNOSTIC_KIND_PROCESSOR_OPTION = "diagnosticKind";
/**
* The name of the processor option for activating verbose message reporting.
*/
public static final String VERBOSE_PROCESSOR_OPTION = "verbose";
/**
* The name of the processor option for allowing constraints at methods
* other than getter methods.
*/
public static final String METHOD_CONSTRAINTS_SUPPORTED_PROCESSOR_OPTION = "methodConstraintsSupported";
/**
* The diagnostic kind to be used if no or an invalid kind is given as processor option.
*/
public static final Kind DEFAULT_DIAGNOSTIC_KIND = Kind.ERROR;
private final Kind diagnosticKind;
private final boolean verbose;
private final boolean methodConstraintsSupported;
public Configuration(Map<String, String> options, Messager messager) {
this.diagnosticKind = getDiagnosticKindOption( options, messager );
this.verbose = getVerboseOption( options, messager );
this.methodConstraintsSupported = getMethodConstraintsSupportedOption( options );
}
/**
* Returns the diagnosticKind to be used when reporting failing constraint checks.
*
* @return the diagnosticKind to be used when reporting failing constraint checks
*/
public Kind getDiagnosticKind() {
return diagnosticKind;
}
/**
* Whether logging information shall be put out in a verbose way or not.
*
* @return {@code true} if logging information shall be put out in a verbose, {@code false} otherwise
*/
public boolean isVerbose() {
return verbose;
}
/**
* Whether method constraints are allowed at any method (<code>true</code>) or only
* getter methods (<code>false</code>).
*
* @return {@code true} if method constraints are allowed on any method, {code false} if only on getter methods
*/
public boolean methodConstraintsSupported() {
return methodConstraintsSupported;
}
/**
* Retrieves the diagnostic kind to be used for error messages. If given in
* processor options, it will be taken from there, otherwise the default
* value {@link Kind#ERROR} will be returned.
*/
private Kind getDiagnosticKindOption(Map<String, String> options, Messager messager) {
String diagnosticKindFromOptions = options.get( DIAGNOSTIC_KIND_PROCESSOR_OPTION );
if ( diagnosticKindFromOptions != null ) {
try {
return Kind.valueOf( diagnosticKindFromOptions );
}
catch (IllegalArgumentException e) {
messager.printMessage(
Kind.WARNING, MessageFormat.format(
"The given value {0} is no valid diagnostic kind. {1} will be used.",
diagnosticKindFromOptions,
DEFAULT_DIAGNOSTIC_KIND
)
);
}
}
return DEFAULT_DIAGNOSTIC_KIND;
}
/**
* Retrieves the value for the "verbose" property from the options.
*/
private boolean getVerboseOption(Map<String, String> options, Messager messager) {
boolean theValue = Boolean.parseBoolean( options.get( VERBOSE_PROCESSOR_OPTION ) );
if ( theValue ) {
messager.printMessage(
Kind.NOTE, MessageFormat.format(
"Verbose reporting is activated. Some processing information will be displayed using diagnostic kind {0}.",
Kind.NOTE
)
);
}
return theValue;
}
/**
* Retrieves the value for the "methodConstraintsSupported" property from the options.
*/
private boolean getMethodConstraintsSupportedOption(Map<String, String> options) {
String methodConstraintsSupported = options.get( METHOD_CONSTRAINTS_SUPPORTED_PROCESSOR_OPTION );
//allow method constraints by default
if ( methodConstraintsSupported == null ) {
return true;
}
return Boolean.parseBoolean( methodConstraintsSupported );
}
}