/* * 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.example; import de.danielbechler.diff.ObjectDifferBuilder; import de.danielbechler.diff.node.DiffNode; import de.danielbechler.diff.node.NodeHierarchyVisitor; import de.danielbechler.diff.selector.CollectionItemElementSelector; import java.util.LinkedList; import java.util.List; import static java.util.Arrays.asList; /** * @author Daniel Bechler */ class CanonicalAccessorExample { private CanonicalAccessorExample() { } @SuppressWarnings("unchecked") public static void main(final String[] args) { final AddressBook workingAddressBook = new AddressBook(); final Contact workingContact = new Contact("Walter White", "Heisenberg"); workingAddressBook.setContacts(asList(workingContact)); final AddressBook baseAddressBook = new AddressBook(); final Contact baseContact = new Contact("Walter White"); baseAddressBook.setContacts(asList(baseContact)); final DiffNode rootNode = ObjectDifferBuilder.buildDefault() .compare(workingAddressBook, baseAddressBook); final DiffNode contactsNode = rootNode.getChild("contacts"); final DiffNode contactNode = contactsNode.getChild(new CollectionItemElementSelector(baseContact)); final DiffNode nicknameNode = contactNode.getChild("nickname"); rootNode.visit(new NodeHierarchyVisitor()); /* Output: / ===> DefaultNode(state=CHANGED, type=de.danielbechler.diff.example.CanonicalAccessorExample.AddressBook, 1 child, accessed via root element) /contacts ===> CollectionNode(state=CHANGED, type=java.util.List, 1 child, accessed via property 'contacts') /contacts[Contact{name='Walter White'}] ===> DefaultNode(state=CHANGED, type=de.danielbechler.diff.example.CanonicalAccessorExample.Contact, 1 child, accessed via collection item [Contact{name='Walter White'}]) /contacts[Contact{name='Walter White'}]/nickname ===> DefaultNode(state=ADDED, type=java.lang.String, no children, accessed via property 'nickname') */ final AddressBook addressBook = (AddressBook) rootNode.get(workingAddressBook); final List<Contact> contacts = (List<Contact>) contactsNode.get(addressBook); final Contact contact = (Contact) contactNode.get(contacts); assert rootNode.get(workingAddressBook) == rootNode.canonicalGet(workingAddressBook); assert contactsNode.get(addressBook) == contactsNode.canonicalGet(workingAddressBook); assert contactNode.get(contacts) == contactNode.canonicalGet(workingAddressBook); assert nicknameNode.get(contact) == nicknameNode.canonicalGet(workingAddressBook); } public static class AddressBook { private List<Contact> contacts = new LinkedList<Contact>(); public List<Contact> getContacts() { return contacts; } public void setContacts(final List<Contact> contacts) { this.contacts = contacts; } } public static class Contact { private final String name; private String nickname; public Contact(final String name) { this.name = name; } public Contact(final String name, final String nickname) { this.name = name; this.nickname = nickname; } public String getName() { return name; } public String getNickname() { return nickname; } public void setNickname(final String nickname) { this.nickname = nickname; } @Override public boolean equals(final Object o) { if (this == o) { return true; } if (!(o instanceof Contact)) { return false; } final Contact contact = (Contact) o; if (name != null ? !name.equals(contact.name) : contact.name != null) { return false; } return true; } @Override public int hashCode() { return name != null ? name.hashCode() : 0; } @Override public String toString() { final StringBuilder sb = new StringBuilder(); sb.append("Contact"); sb.append("{name='").append(name).append('\''); sb.append('}'); return sb.toString(); } } }