Package de.danielbechler.diff.node

Source Code of de.danielbechler.diff.node.PrintingVisitor

/*
* 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.node;

import de.danielbechler.diff.path.NodePath;
import de.danielbechler.util.Strings;

/**
* @author Daniel Bechler
*/
public class PrintingVisitor implements DiffNode.Visitor
{
  private final Object working;
  private final Object base;

  public PrintingVisitor(final Object working, final Object base)
  {
    this.base = base;
    this.working = working;
  }

  public void node(final DiffNode node, final Visit visit)
  {
    if (filter(node))
    {
      final String text = differenceToString(node, base, working);
      print(text);
    }
  }

  protected boolean filter(final DiffNode node)
  {
    return (node.isRootNode() && !node.hasChanges())
        || (node.hasChanges() && !node.hasChildren());
  }

  protected String differenceToString(final DiffNode node, final Object base, final Object modified)
  {
    final NodePath nodePath = node.getPath();
    final String stateMessage = translateState(node.getState(), node.canonicalGet(base), node.canonicalGet(modified));
    final String propertyMessage = String.format("Property at path '%s' %s", nodePath, stateMessage);
    final StringBuilder stringBuilder = new StringBuilder();
    stringBuilder.append(propertyMessage);
    if (node.isCircular())
    {
      stringBuilder.append(" (Circular reference detected: The property has already been processed at another position.)");
    }
    return stringBuilder.toString();
  }

  protected void print(final String text)
  {
    System.out.println(text);
  }

  private static String translateState(final DiffNode.State state, final Object base, final Object modified)
  {
    if (state == DiffNode.State.IGNORED)
    {
      return "has been ignored";
    }
    else if (state == DiffNode.State.CHANGED)
    {
      return String.format("has changed from [ %s ] to [ %s ]",
          Strings.toSingleLineString(base),
          Strings.toSingleLineString(modified));
    }
    else if (state == DiffNode.State.ADDED)
    {
      return String.format("has been added => [ %s ]", Strings.toSingleLineString(modified));
    }
    else if (state == DiffNode.State.REMOVED)
    {
      return String.format("with value [ %s ] has been removed", Strings.toSingleLineString(base));
    }
    else if (state == DiffNode.State.UNTOUCHED)
    {
      return "has not changed";
    }
    else if (state == DiffNode.State.CIRCULAR)
    {
      return "has already been processed at another position. (Circular reference!)";
    }
    return '(' + state.name() + ')';
  }
}
TOP

Related Classes of de.danielbechler.diff.node.PrintingVisitor

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.