Return-Path: X-Original-To: apmail-jackrabbit-commits-archive@www.apache.org Delivered-To: apmail-jackrabbit-commits-archive@www.apache.org Received: from mail.apache.org (hermes.apache.org [140.211.11.3]) by minotaur.apache.org (Postfix) with SMTP id 68CEA38E9 for ; Wed, 4 May 2011 15:42:56 +0000 (UTC) Received: (qmail 77538 invoked by uid 500); 4 May 2011 15:42:56 -0000 Delivered-To: apmail-jackrabbit-commits-archive@jackrabbit.apache.org Received: (qmail 77494 invoked by uid 500); 4 May 2011 15:42:55 -0000 Mailing-List: contact commits-help@jackrabbit.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: dev@jackrabbit.apache.org Delivered-To: mailing list commits@jackrabbit.apache.org Received: (qmail 77487 invoked by uid 99); 4 May 2011 15:42:55 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 May 2011 15:42:55 +0000 X-ASF-Spam-Status: No, hits=-2000.0 required=5.0 tests=ALL_TRUSTED X-Spam-Check-By: apache.org Received: from [140.211.11.4] (HELO eris.apache.org) (140.211.11.4) by apache.org (qpsmtpd/0.29) with ESMTP; Wed, 04 May 2011 15:42:54 +0000 Received: by eris.apache.org (Postfix, from userid 65534) id 2D16D238896F; Wed, 4 May 2011 15:42:34 +0000 (UTC) Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: svn commit: r1099493 - in /jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store: DiffBuilder.java RevisionDiffBuilder.java Date: Wed, 04 May 2011 15:42:34 -0000 To: commits@jackrabbit.apache.org From: stefan@apache.org X-Mailer: svnmailer-1.0.8 Message-Id: <20110504154234.2D16D238896F@eris.apache.org> Author: stefan Date: Wed May 4 15:42:33 2011 New Revision: 1099493 URL: http://svn.apache.org/viewvc?rev=1099493&view=rev Log: MicroKernel prototype (WIP) Added: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionDiffBuilder.java - copied, changed from r1098632, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DiffBuilder.java Removed: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DiffBuilder.java Copied: jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionDiffBuilder.java (from r1098632, jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DiffBuilder.java) URL: http://svn.apache.org/viewvc/jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionDiffBuilder.java?p2=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionDiffBuilder.java&p1=jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DiffBuilder.java&r1=1098632&r2=1099493&rev=1099493&view=diff ============================================================================== --- jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/DiffBuilder.java (original) +++ jackrabbit/sandbox/microkernel/src/main/java/org/apache/jackrabbit/mk/store/RevisionDiffBuilder.java Wed May 4 15:42:33 2011 @@ -16,6 +16,8 @@ */ package org.apache.jackrabbit.mk.store; +import org.apache.jackrabbit.mk.Repository; + import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -23,78 +25,96 @@ import java.util.Set; /** * */ -public class DiffBuilder { +public class RevisionDiffBuilder { - final Node before; - final Node after; - final DiffHandler handler; - - public DiffBuilder(Node before, Node after, DiffHandler handler) { - this.before = before; - this.after = after; + final String revisionId1; + final String revisionId2; + final Repository rep; + final RevisionDiffHandler handler; + + public RevisionDiffBuilder(String revisionId1, String revisionId2, Repository rep, RevisionDiffHandler handler) { + this.revisionId1 = revisionId1; + this.revisionId2 = revisionId2; + this.rep = rep; this.handler = handler; } - public void build() { + public void build() throws Exception { + // start at root node + String path = "/"; + Node node1 = rep.getNode(revisionId1, path); + Node node2 = rep.getNode(revisionId2, path); + + diff(path, node1, node2); + } + + void diff(String path, Node node1, Node node2) throws Exception { // compare properties - Map oldProps = before.getProperties(); - Map newProps = after.getProperties(); + Map oldProps = node1.getProperties(); + Map newProps = node2.getProperties(); if (!oldProps.equals(newProps)) { Set set = new HashSet(); set.addAll(oldProps.keySet()); set.removeAll(newProps.keySet()); for (String name : set) { - handler.propDeleted(name); + handler.propDeleted(path, name); } set.clear(); set.addAll(newProps.keySet()); set.removeAll(oldProps.keySet()); for (String name : set) { - handler.propAdded(name, newProps.get(name)); + handler.propAdded(path, name, newProps.get(name)); } for (Map.Entry entry : oldProps.entrySet()) { String val = newProps.get(entry.getKey()); if (val != null && !entry.getValue().equals(val)) { - handler.propChanged(entry.getKey(), entry.getValue(), val); + handler.propChanged(path, entry.getKey(), entry.getValue(), val); } } } + // todo determine copy/move and child-node reorder operations + // compare child node entries - Map oldEntries = before.getChildNodeEntries(); - Map newEntries = after.getChildNodeEntries(); + Map oldEntries = node1.getChildNodeEntries(); + Map newEntries = node2.getChildNodeEntries(); if (!oldEntries.equals(newEntries)) { Set set = new HashSet(); set.addAll(oldEntries.keySet()); set.removeAll(newEntries.keySet()); for (String name : set) { - handler.nodeDeleted(name); + handler.childNodeDeleted(path, name, oldEntries.get(name)); } set.clear(); set.addAll(newEntries.keySet()); set.removeAll(oldEntries.keySet()); for (String name : set) { - handler.nodeAdded(name, newEntries.get(name)); + handler.childNodeAdded(path, name, newEntries.get(name)); } for (Map.Entry entry : oldEntries.entrySet()) { String id = newEntries.get(entry.getKey()); if (id != null && !entry.getValue().equals(id)) { - handler.nodeChanged(entry.getKey(), entry.getValue(), id); + node1 = rep.getStore().getNode(entry.getValue()); + node2 = rep.getStore().getNode(id); + if (!path.equals("/")) { + path += "/"; + } + path += entry.getKey(); + // do recurse + diff(path, node1, node2); } } } - } - public static interface DiffHandler { + public static interface RevisionDiffHandler { + + void propAdded(String nodePath, String propName, String value); + void propChanged(String nodePath, String propName, String oldValue, String newValue); + void propDeleted(String nodePath, String propName); - void propAdded(String name, String value); - void propChanged(String name, String oldValue, String newValue); - void propDeleted(String name); - - void nodeAdded(String name, String id); - void nodeChanged(String name, String oldId, String newId); - void nodeDeleted(String name); + void childNodeAdded(String nodePath, String childName, String id); + void childNodeDeleted(String nodePath, String childName, String id); } }