Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
  /*
   * 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.circular;
 
 
 
 import static de.danielbechler.util.Objects.isEqual;

Author(s):
Daniel Bechler
 
 {
It would be better to use java.util.Deque instead of the linked list, but that was first introduced in Java 6 and would break compatibility with Java 5.
 
 	@SuppressWarnings("TypeMayBeWeakened")
 	private final LinkedList<Entrystack = new LinkedList<Entry>();
 
 
 	public CircularReferenceDetector(final ReferenceMatchingMode referenceMatchingMode)
 	{
 		Assert.notNull(referenceMatchingMode"referenceMatchingMode");
 		this. = referenceMatchingMode;
 	}
 
 	public void push(final Object instancefinal NodePath nodePath)
 	{
 		if (instance == null)
 		{
 			return;
 		}
 		if (knows(instance))
 		{
 		}
 		final Entry entry = new Entry(nodePathinstance);
 		.addLast(entry);
 	}
 
 	public boolean knows(final Object needle)
 	{
 		for (final Entry entry : )
 		{
 			final Object instance = entry.getInstance();
 			if (isMatch(needleinstance))
 			{
 				return true;
 			}
 		}
 		return false;
 	}
 
 	private Entry entryForInstance(final Object instance)
 	{
 		for (final Entry entry : )
 		{
 			if (isMatch(instanceentry.getInstance()))
 			{
 				return entry;
 			}
 		}
 		return null;
 	}
 
 	protected boolean isMatch(final Object anObjectfinal Object anotherObject)
 	{
 		{
 			return anotherObject == anObject;
 		}
 		{
 			return (anotherObject == anObject) || isEqual(anObjectanotherObject);
 		}
 		else
 		{
 			throw new IllegalStateException("Missing reference matching mode");
 		}
 	}
	public void remove(final Object instance)
	{
		if (instance == null)
		{
			return;
		}
		if (isMatch(instance.getLast().getInstance()))
		{
		}
		else
		{
			throw new IllegalArgumentException("Detected inconsistency in enter/leave sequence. Must always be LIFO.");
		}
	}
	public int size()
	{
		return .size();
	}
	public static enum ReferenceMatchingMode
	{
Compares objects using the == operator.
		EQUALITY_OPERATOR,

		EQUALS_METHOD
	}
	private static class Entry
	{
		private final NodePath nodePath;
		private final Object instance;
		private Entry(final NodePath nodePathfinal Object instance)
		{
			this. = nodePath;
			this. = instance;
		}
		{
			return ;
		}
		{
			return ;
		}
		public String toString()
		{
			return .toString() + "{" + .toString() + "}";
		}
	}
	public static class CircularReferenceException extends RuntimeException
	{
		private static final long serialVersionUID = 1L;
		@SuppressWarnings("NonSerializableFieldInSerializableClass")
		private final NodePath nodePath;
		public CircularReferenceException(final NodePath nodePath)
		{
			this. = nodePath;
		}
		{
			return ;
		}
		{
			return this;
		}
	}
New to GrepCode? Check out our FAQ X