Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * JBoss, Home of Professional Open Source
   * Copyright 2010, Red Hat, Inc. and/or its affiliates, and individual contributors
   * by the @authors tag. See the copyright.txt in the distribution for a
   * full listing of individual contributors.
   *
   * Licensed under the Apache License, Version 2.0 (the "License");
   * you may not use this file except in compliance with the License.
   * You may obtain a copy of the License at
  * http://www.apache.org/licenses/LICENSE-2.0
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
 package org.hibernate.validator.messageinterpolation;
 
 import java.util.Map;
 
Resource bundle backed message interpolator.

Author(s):
Emmanuel Bernard
Hardy Ferentschik
Gunnar Morling
Kevin Pollet <kevin.pollet@serli.com> (C) 2011 SERLI
 
The name of the default message bundle.
 
 	public static final String DEFAULT_VALIDATION_MESSAGES = "org.hibernate.validator.ValidationMessages";

The name of the user-provided message bundle as defined in the specification.
 
 	public static final String USER_VALIDATION_MESSAGES = "ValidationMessages";

Regular expression used to do message interpolation.
 
 	private static final Pattern MESSAGE_PARAMETER_PATTERN = Pattern.compile"(\\{[^\\}]+?\\})" );

The default locale in the current JVM.
 
 	private final Locale defaultLocale;

Loads user-specified resource bundles.
 
Loads built-in resource bundles.
 
Step 1-3 of message interpolation can be cached. We do this in this map.
 
Flag indicating whether this interpolator should chance some of the interpolation steps.
 
 	private final boolean cacheMessages;
 
 		this( (ResourceBundleLocatornull );
 	}

 
 		thisnew AdapteruserResourceBundleLocator ) );
 	}
 
 	public ResourceBundleMessageInterpolator(ResourceBundleLocator userResourceBundleLocator) {
 		thisuserResourceBundleLocatortrue );
 	}

	public ResourceBundleMessageInterpolator(org.hibernate.validator.resourceloading.ResourceBundleLocator userResourceBundleLocatorboolean cacheMessages) {
		thisnew AdapteruserResourceBundleLocator ), cacheMessages );
	}
	public ResourceBundleMessageInterpolator(ResourceBundleLocator userResourceBundleLocatorboolean cacheMessages) {
		if ( userResourceBundleLocator == null ) {
		}
		else {
			this. = userResourceBundleLocator;
		}
		this. = cacheMessages;
	}
	public String interpolate(String messageContext context) {
		// probably no need for caching, but it could be done by parameters since the map
		// is immutable and uniquely built per Validation definition, the comparison has to be based on == and not equals though
	}
	public String interpolate(String messageContext contextLocale locale) {
		return interpolateMessagemessagecontext.getConstraintDescriptor().getAttributes(), locale );
	}

Runs the message interpolation according to algorithm specified in JSR 303.
Note:
Look-ups in user bundles is recursive whereas look-ups in default bundle are not!

Parameters:
message the message to interpolate
annotationParameters the parameters of the annotation for which to interpolate this message
locale the Locale to use for the resource bundle.
Returns:
the interpolated message.
	private String interpolateMessage(String messageMap<StringObjectannotationParametersLocale locale) {
		LocalisedMessage localisedMessage = new LocalisedMessagemessagelocale );
		String resolvedMessage = null;
		if (  ) {
			resolvedMessage = .getlocalisedMessage );
		}
		// if the message is not already in the cache we have to run step 1-3 of the message resolution 
		if ( resolvedMessage == null ) {
					.getResourceBundlelocale );
					.getResourceBundlelocale );
			String userBundleResolvedMessage;
			resolvedMessage = message;
			boolean evaluatedDefaultBundleOnce = false;
			do {
				// search the user bundle recursive (step1)
				userBundleResolvedMessage = replaceVariables(
						resolvedMessageuserResourceBundlelocaletrue
				);
				// exit condition - we have at least tried to validate against the default bundle and there was no
				// further replacements
				if ( evaluatedDefaultBundleOnce
						&& !hasReplacementTakenPlaceuserBundleResolvedMessageresolvedMessage ) ) {
					break;
				}
				// search the default bundle non recursive (step2)
				resolvedMessage = replaceVariablesuserBundleResolvedMessagedefaultResourceBundlelocalefalse );
				evaluatedDefaultBundleOnce = true;
while ( true );
		}
		// cache resolved message
		if (  ) {
			String cachedResolvedMessage = .putIfAbsentlocalisedMessageresolvedMessage );
			if ( cachedResolvedMessage != null ) {
				resolvedMessage = cachedResolvedMessage;
			}
		}
		// resolve annotation attributes (step 4)
		resolvedMessage = replaceAnnotationAttributesresolvedMessageannotationParameters );
		// last but not least we have to take care of escaped literals
		resolvedMessage = resolvedMessage.replace"\\{""{" );
		resolvedMessage = resolvedMessage.replace"\\}""}" );
		resolvedMessage = resolvedMessage.replace"\\\\""\\" );
		return resolvedMessage;
	}
	private boolean hasReplacementTakenPlace(String origMessageString newMessage) {
		return !origMessage.equalsnewMessage );
	}
	private String replaceVariables(String messageResourceBundle bundleLocale localeboolean recurse) {
		Matcher matcher = .matchermessage );
		StringBuffer sb = new StringBuffer();
		String resolvedParameterValue;
		while ( matcher.find() ) {
			String parameter = matcher.group( 1 );
			resolvedParameterValue = resolveParameter(
					parameterbundlelocalerecurse
			);
			matcher.appendReplacementsb, Matcher.quoteReplacementresolvedParameterValue ) );
		}
		matcher.appendTailsb );
		return sb.toString();
	}
	private String replaceAnnotationAttributes(String messageMap<StringObjectannotationParameters) {
		Matcher matcher = .matchermessage );
		StringBuffer sb = new StringBuffer();
		while ( matcher.find() ) {
			String resolvedParameterValue;
			String parameter = matcher.group( 1 );
			Object variable = annotationParameters.getremoveCurlyBraceparameter ) );
			if ( variable != null ) {
				if ( variable.getClass().isArray() ) {
					resolvedParameterValue = Arrays.toString( (Object[]) variable );
				}
				else {
					resolvedParameterValue = variable.toString();
				}
			}
			else {
				resolvedParameterValue = parameter;
			}
			resolvedParameterValue = Matcher.quoteReplacementresolvedParameterValue );
			matcher.appendReplacementsbresolvedParameterValue );
		}
		matcher.appendTailsb );
		return sb.toString();
	}
	private String resolveParameter(String parameterNameResourceBundle bundleLocale localeboolean recurse) {
		String parameterValue;
		try {
			if ( bundle != null ) {
				parameterValue = bundle.getStringremoveCurlyBraceparameterName ) );
				if ( recurse ) {
					parameterValue = replaceVariablesparameterValuebundlelocalerecurse );
				}
			}
			else {
				parameterValue = parameterName;
			}
		}
		catch ( MissingResourceException e ) {
			// return parameter itself
			parameterValue = parameterName;
		}
		return parameterValue;
	}
	private String removeCurlyBrace(String parameter) {
		return parameter.substring( 1, parameter.length() - 1 );
	}
	private static class LocalisedMessage {
		private final String message;
		private final Locale locale;
		LocalisedMessage(String messageLocale locale) {
			this. = message;
			this. = locale;
		}
		public boolean equals(Object o) {
			if ( this == o ) {
				return true;
			}
			if ( o == null || getClass() != o.getClass() ) {
				return false;
			}
			if (  != null ? !.equalsthat.locale ) : that.locale != null ) {
				return false;
			}
			if (  != null ? !.equalsthat.message ) : that.message != null ) {
				return false;
			}
			return true;
		}
		public int hashCode() {
			int result =  != null ? .hashCode() : 0;
			result = 31 * result + (  != null ? .hashCode() : 0 );
			return result;
		}
	}
	@SuppressWarnings("deprecation")
	private static class Adapter implements org.hibernate.validator.spi.resourceloading.ResourceBundleLocator {
			this. = adaptee;
		}
			return .getResourceBundlelocale );
		}
	}
New to GrepCode? Check out our FAQ X