/*
* 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.isis.core.commons.ensure;
import org.hamcrest.Matcher;
import org.hamcrest.StringDescription;
/**
* Uses the {@link Matcher Hamcrest API} as a means of verifying arguments and
* so on.
*/
public final class Ensure {
private Ensure() {
}
/**
* To ensure that the provided assertion is true
*
* @throws IllegalArgumentException
*/
public static void ensure(final String expectation, final boolean expression) {
if (!expression) {
throw new IllegalArgumentException("illegal argument, expected: " + expectation);
}
}
/**
* To ensure that the provided argument is correct.
*
* @see #ensureThatArg(Object, Matcher, String)
* @see #ensureThatState(Object, Matcher, String)
* @see #ensureThatContext(Object, Matcher)
*
* @throws IllegalArgumentException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatArg(final T object, final Matcher<T> matcher) {
if (!matcher.matches(object)) {
throw new IllegalArgumentException("illegal argument, expected: " + descriptionOf(matcher));
}
return object;
}
/**
* To ensure that the provided argument is correct.
*
* @see #ensureThatArg(Object, Matcher)
* @see #ensureThatState(Object, Matcher, String)
* @see #ensureThatContext(Object, Matcher)
*
* @throws IllegalArgumentException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatArg(final T arg, final Matcher<T> matcher, final String message) {
if (!matcher.matches(arg)) {
throw new IllegalArgumentException(message);
}
return arg;
}
/**
* To ensure that the current state of this object (instance fields) is
* correct.
*
* @see #ensureThatArg(Object, Matcher)
* @see #ensureThatContext(Object, Matcher)
* @see #ensureThatState(Object, Matcher, String)
*
* @throws IllegalStateException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatState(final T field, final Matcher<T> matcher) {
if (!matcher.matches(field)) {
throw new IllegalStateException("illegal argument, expected: " + descriptionOf(matcher));
}
return field;
}
/**
* To ensure that the current state of this object (instance fields) is
* correct.
*
* @see #ensureThatArg(Object, Matcher)
* @see #ensureThatContext(Object, Matcher)
* @see #ensureThatState(Object, Matcher)
*
* @throws IllegalStateException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatState(final T field, final Matcher<T> matcher, final String message) {
if (!matcher.matches(field)) {
throw new IllegalStateException(message);
}
return field;
}
/**
* To ensure that the current context (<tt>IsisContext</tt>) is correct.
*
* @see #ensureThatArg(Object, Matcher)
* @see #ensureThatState(Object, Matcher)
* @see #ensureThatContext(Object, Matcher, String)
*
* @throws IllegalThreadStateException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatContext(final T contextProperty, final Matcher<T> matcher) {
if (!matcher.matches(contextProperty)) {
throw new IllegalThreadStateException("illegal argument, expected: " + descriptionOf(matcher));
}
return contextProperty;
}
/**
* To ensure that the current context (<tt>IsisContext</tt>) is correct.
*
* @see #ensureThatArg(Object, Matcher)
* @see #ensureThatState(Object, Matcher)
* @see #ensureThatContext(Object, Matcher, String)
*
* @throws IllegalThreadStateException
* if matcher does not {@link Matcher#matches(Object) match}.
*/
public static <T> T ensureThatContext(final T contextProperty, final Matcher<T> matcher, final String message) {
if (!matcher.matches(contextProperty)) {
throw new IllegalThreadStateException(message);
}
return contextProperty;
}
private static <T> String descriptionOf(final Matcher<T> matcher) {
final StringDescription stringDescription = new StringDescription();
matcher.describeTo(stringDescription);
final String description = stringDescription.toString();
return description;
}
}