Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * Copyright 2012 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;
 
 import org.slf4j.*;
 
 import static de.danielbechler.diff.CircularReferenceDetector.*;

Author(s):
Daniel Bechler
 
 @SuppressWarnings("MethodMayBeStatic")
 {
 	private static final Logger logger = LoggerFactory.getLogger(DifferDelegator.class);
 
 	private final DifferFactory differFactory;
 
 	public DifferDelegator(final DifferFactory differFactory,
 						   final CircularReferenceDetectorFactory circularReferenceDetectorFactory)
 	{
 		Assert.notNull(differFactory"differFactory");
 		Assert.notNull(circularReferenceDetectorFactory"circularReferenceDetectorFactory");
 		this. = differFactory;
 		this. = circularReferenceDetectorFactory;
 	}

Delegates the call to an appropriate Differ.

Returns:
A node representing the difference between the given Instances.
 
 	public Node delegate(final Node parentNodefinal Instances instances)
 	{
 		Assert.notNull(instances"instances");
 		final Class<?> type = instances.getType();
 		if (type == null)
 		{
 			return newDefaultNode(parentNodeinstancestype);
 		}
 		return delegateWithCircularReferenceTracking(parentNodeinstances);
 	}
 
 	private Node delegateWithCircularReferenceTracking(final Node parentNodefinal Instances instances)
 	{
 		Node node;
 		try
 		{
 			rememberInstances(parentNodeinstances);
 			try
 			{
 				node = compare(parentNodeinstances);
 			}
 			finally
 			{
 				forgetInstances(instances);
 			}
 		}
 		{
 			node = newCircularNode(parentNodeinstancese.getPropertyPath());
 		}
 		if (parentNode == null)
 		{
 		}
 		return node;
 	}
 
 	private Node findNodeMatchingPropertyPath(final Node nodefinal PropertyPath propertyPath)
 	{
 		if (node == null)
 		{
 			return null;
 		}
 		if (node.matches(propertyPath))
 		{
 			return node;
 		}
		return findNodeMatchingPropertyPath(node.getParentNode(), propertyPath);
	}
	private static Node newDefaultNode(final Node parentNodefinal Instances instancesfinal Class<?> type)
	{
		return new DefaultNode(parentNodeinstances.getSourceAccessor(), type);
	}
	private Node newCircularNode(final Node parentNode,
								 final Instances instances,
								 final PropertyPath circleStartPath)
	{
		final Node node = new DefaultNode(parentNodeinstances.getSourceAccessor(), instances.getType());
		node.setCircleStartPath(circleStartPath);
		node.setCircleStartNode(findNodeMatchingPropertyPath(parentNodecircleStartPath));
		return node;
	}
	private static void logCircularReference(final PropertyPath propertyPath)
	{
		.warn("Detected circular reference in node at path {}. " +
				"Going deeper would cause an infinite loop, so I'll stop looking at " +
				"this instance along the current path."propertyPath);
	}
	private Node compare(final Node parentNodefinal Instances instances)
	{
		final Differ<?> differ = .createDiffer(instances.getType(), this);
		if (differ != null)
		{
			return differ.compare(parentNodeinstances);
		}
		throw new IllegalStateException("Couldn't create Differ for type '" + instances.getType() +
				"'. This mustn't happen, as there should always be a fallback differ.");
	}
	protected final void resetInstanceMemory()
	{
	}
	protected void forgetInstances(final Instances instances)
	{
	}
	protected void rememberInstances(final Node parentNodefinal Instances instances)
	{
		final PropertyPath propertyPath = instances.getPropertyPath(parentNode);
		.push(instances.getBase(), propertyPath);
	}
New to GrepCode? Check out our FAQ X