/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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.apache.sling.validation.spi.support; import java.io.Serializable; import java.text.MessageFormat; import java.util.Arrays; import java.util.ResourceBundle; import javax.annotation.Nonnull; import org.apache.sling.validation.ValidationFailure; import org.apache.sling.validation.spi.ValidatorContext; import org.osgi.annotation.versioning.ProviderType; /** * Wraps a message key (being looked up in a {@link ResourceBundle}), messageArguments (being used with {@link MessageFormat#format(String, Object...)} * and the location where the validation failure occurred. */ @ProviderType public final class DefaultValidationFailure implements ValidationFailure, Serializable { /** * */ private static final long serialVersionUID = -1748031688917555982L; private final @Nonnull String location; private final @Nonnull String messageKey; private final Object[] messageArguments; private final transient @Nonnull ResourceBundle defaultResourceBundle; private final int severity; /** * Constructor of a validation failure. * @param validationContext the context from which to extract location, severity and default resource bundle * @param messageKey the key to look up in the resource bundle * @param messageArguments the arguments to be used with the looked up value from the resource bundle (given in {@link #getMessage(ResourceBundle)} */ public DefaultValidationFailure(@Nonnull ValidatorContext validationContext, @Nonnull String messageKey, Object... messageArguments) { this.location = validationContext.getLocation(); this.severity = validationContext.getSeverity(); this.defaultResourceBundle = validationContext.getDefaultResourceBundle(); this.messageKey = messageKey; this.messageArguments = messageArguments; } /** * Constructor of a validation failure. * @param location the location where the validation error occurred * @param severity the severity of this failure (may be {@code null} which leads to using the validator's default severity) * @param defaultResourceBundle the default resourceBundle which is used to resolve the {@code messageKey} in {@link #getMessage(ResourceBundle)} * if {@code null} is provided as parameter. * @param messageKey the key to look up in the resource bundle * @param messageArguments the arguments to be used with the looked up value from the resource bundle (given in {@link #getMessage(ResourceBundle)} */ public DefaultValidationFailure(@Nonnull String location, int severity, @Nonnull ResourceBundle defaultResourceBundle, @Nonnull String messageKey, Object... messageArguments) { this.location = location; this.severity = severity; this.messageKey = messageKey; this.messageArguments = messageArguments; this.defaultResourceBundle = defaultResourceBundle; } @Override public @Nonnull String getMessage(ResourceBundle resourceBundle) { if (resourceBundle == null) { resourceBundle = defaultResourceBundle; } if (resourceBundle == null) { // this should only happen if this class was deserialized because there the default resource bundle is missing return "No defaultResourceBundle found to resolve, messageKey = " + messageKey + ", messageArguments: " + Arrays.toString(messageArguments); } return MessageFormat.format(resourceBundle.getString(messageKey), messageArguments); } @Override public @Nonnull String getLocation() { return location; } @Override public int getSeverity() { return severity; } @Override public String toString() { return "DefaultValidationFailure [location=" + location + ", messageKey=" + messageKey + ", messageArguments=" + Arrays.toString(messageArguments) + ", severity=" + severity + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((location == null) ? 0 : location.hashCode()); result = prime * result + Arrays.hashCode(messageArguments); result = prime * result + ((messageKey == null) ? 0 : messageKey.hashCode()); result = prime * result + severity; return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; DefaultValidationFailure other = (DefaultValidationFailure) obj; if (!location.equals(other.location)) return false; if (!Arrays.equals(messageArguments, other.messageArguments)) return false; if (!messageKey.equals(other.messageKey)) return false; if (severity != other.severity) return false; return true; } }