de.danielbechler.diff.introspection.IntrospectionConfigurer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of java-object-diff Show documentation
Show all versions of java-object-diff Show documentation
Framework to detect and handle differences between Java objects
/*
* Copyright 2014 Daniel Bechler
*
* 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 de.danielbechler.diff.introspection;
import de.danielbechler.diff.ObjectDifferBuilder;
import de.danielbechler.diff.instantiation.InstanceFactory;
import de.danielbechler.diff.path.NodePath;
/**
* Allows to replace the default bean introspector with a custom implementation. The default introspector internally
* uses the `java.beans.Introspector` which has some limitations. The most important one being that it only operates on
* getters and setters. In case field introspection is needed a custom introspector must be used. An introspector can
* be
* set as global default or on a per-property basis. It is also possible to turn off introspection for specific
* properties in which case they will simply be compared via `equals` method.
*
* @author Daniel Bechler
*/
public interface IntrospectionConfigurer
{
/**
* When assigning new values via {@link de.danielbechler.diff.node.DiffNode} (e.g. during merging) it will
* implicitly create missing instances of its parent objects along the path to the root object. By default those
* instances will be created via public non-arg constructor. If that fails a {@link
* de.danielbechler.diff.instantiation.TypeInstantiationException} will be thrown.
*
* To add support for types that need to be instantiated differently you can overide the default behavior via
* custom {@link de.danielbechler.diff.instantiation.InstanceFactory}. When doing so, don't worry about types
* actually that are suitable for the default behavior, as it will automatically kick in, whenever the custom
* factroy returns {@code null}.
*
* @param instanceFactory A custom instance factory
* @throws java.lang.IllegalArgumentException when the instanceFactory is null
*/
IntrospectionConfigurer setInstanceFactory(InstanceFactory instanceFactory);
IntrospectionConfigurer setDefaultIntrospector(Introspector introspector);
IntrospectionConfigurer handlePropertyAccessExceptionsUsing(PropertyAccessExceptionHandler exceptionHandler);
Of ofType(Class> type);
Of ofNode(NodePath path);
ObjectDifferBuilder and();
public static interface Of
{
IntrospectionConfigurer toUse(Introspector introspector);
IntrospectionConfigurer toBeEnabled();
IntrospectionConfigurer toBeDisabled();
}
}