You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lenya.apache.org by an...@apache.org on 2008/07/10 16:35:51 UTC

svn commit: r675594 - in /lenya/docu/modules/diff: ./ config/ config/cocoon-xconf/ java/src/org/apache/lenya/modules/diff/lcs/ java/test/org/apache/lenya/modules/diff/lcs/ usecases/

Author: andreas
Date: Thu Jul 10 07:35:49 2008
New Revision: 675594

URL: http://svn.apache.org/viewvc?rev=675594&view=rev
Log:
Adding diff functionality based on the longest common subsequence algorithm, adding diffAuthoringLive usecase.

Added:
    lenya/docu/modules/diff/config/cocoon-xconf/usecase-diffAuthoringLive.xconf
    lenya/docu/modules/diff/config/menu.xml
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/AttributeName.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffGenerator.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffHandler.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DomSerializer.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/EndTag.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentHandler.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentingHandler.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LcsDiff.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LongestCommonSubsequence.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/NamedObject.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/SaxHandler.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagEnd.java
    lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagStart.java
    lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/
    lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/LcsDiffTest.java
    lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test1.xml
    lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test2.xml
    lenya/docu/modules/diff/sitemap.xmap
Modified:
    lenya/docu/modules/diff/usecases/diff.jx

Added: lenya/docu/modules/diff/config/cocoon-xconf/usecase-diffAuthoringLive.xconf
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/config/cocoon-xconf/usecase-diffAuthoringLive.xconf?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/config/cocoon-xconf/usecase-diffAuthoringLive.xconf (added)
+++ lenya/docu/modules/diff/config/cocoon-xconf/usecase-diffAuthoringLive.xconf Thu Jul 10 07:35:49 2008
@@ -0,0 +1,30 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+
+<!-- $Id: usecases-workflow-deactivate.xconf 348547 2005-11-23 20:13:01Z chestnut $ -->
+<!--
+    This file defines the publication specific use-cases
+-->
+
+  <xconf xpath="/cocoon/usecases" unless="/cocoon/usecases/component-instance[@name = 'diff.diffAuthoringLive']">
+    <component-instance name="diff.diffAuthoringLive"
+      logger="org.apache.lenya.modules.diff"
+      class="org.apache.lenya.cms.usecase.DummyUsecase">
+      <view uri="modules/diff/usecases/diff.jx" menu="true" createContinuation="false"/>
+    </component-instance>
+  </xconf>

Added: lenya/docu/modules/diff/config/menu.xml
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/config/menu.xml?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/config/menu.xml (added)
+++ lenya/docu/modules/diff/config/menu.xml Thu Jul 10 07:35:49 2008
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+
+<menu xmlns:i18n="http://apache.org/cocoon/i18n/2.1"    
+  xmlns:uc="http://apache.org/cocoon/lenya/usecase/1.0"
+  xmlns="http://apache.org/cocoon/lenya/menubar/1.0">
+  <menus>
+    <menu i18n:attr="name" name="Workflow">
+      <block areas="authoring">
+        <item uc:usecase="diff.diffAuthoringLive"><i18n:text>Diff to live</i18n:text></item>
+      </block>
+    </menu>
+  </menus>
+</menu>

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/AttributeName.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/AttributeName.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/AttributeName.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/AttributeName.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,20 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Node;
+
+public class AttributeName extends NamedObject {
+    
+    public AttributeName(Attr attr) {
+        this(attr.getNamespaceURI(), attr.getLocalName());
+    }
+
+    public AttributeName(String namespaceUri, String localName) {
+        super(namespaceUri, localName);
+    }
+    
+    public String toString() {
+        return "{" + getNamespaceUri() + "}" + getLocalName() + "=";
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffGenerator.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffGenerator.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffGenerator.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffGenerator.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,45 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.apache.avalon.framework.service.ServiceException;
+import org.apache.avalon.framework.service.ServiceManager;
+import org.apache.avalon.framework.service.Serviceable;
+import org.apache.cocoon.ProcessingException;
+import org.apache.cocoon.generation.AbstractGenerator;
+import org.apache.lenya.cms.cocoon.source.SourceUtil;
+import org.w3c.dom.Document;
+import org.xml.sax.SAXException;
+
+public class DiffGenerator extends AbstractGenerator implements Serviceable {
+
+    private ServiceManager manager;
+
+    public void generate() throws IOException, SAXException, ProcessingException {
+
+        try {
+            String oldUri = this.parameters.getParameter("oldUri");
+            String newUri = this.parameters.getParameter("newUri");
+
+            Document oldXml = SourceUtil.readDOM(oldUri, this.manager);
+            Document newXml = SourceUtil.readDOM(newUri, this.manager);
+            
+            DomSerializer serializer = new DomSerializer();
+            List oldList = serializer.serialize(oldXml);
+            List newList = serializer.serialize(newXml);
+            
+            DiffHandler handler = new FragmentingHandler(new SaxHandler(this.contentHandler));
+            new LcsDiff().diff(oldList, newList, handler);
+            
+        } catch (Exception e) {
+            throw new ProcessingException(e);
+        }
+
+    }
+
+    public void service(ServiceManager manager) throws ServiceException {
+        this.manager = manager;
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffHandler.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffHandler.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffHandler.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DiffHandler.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,15 @@
+package org.apache.lenya.modules.diff.lcs;
+
+public interface DiffHandler {
+    
+    void equal(Object obj) throws Exception;
+    
+    void added(Object newObj) throws Exception;
+    
+    void removed(Object oldObj) throws Exception;
+    
+    void start() throws Exception;
+    
+    void end() throws Exception;
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DomSerializer.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DomSerializer.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DomSerializer.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/DomSerializer.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,84 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Iterator;
+import java.util.List;
+import java.util.SortedMap;
+import java.util.TreeMap;
+
+import org.w3c.dom.Attr;
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NamedNodeMap;
+import org.w3c.dom.Node;
+import org.w3c.dom.NodeList;
+import org.w3c.dom.Text;
+
+public class DomSerializer {
+    
+    public List serialize(Document dom) {
+        return serialize(dom.getDocumentElement());
+    }
+    
+    protected static final String XMLNS_NAMESPACE = "http://www.w3.org/2000/xmlns/";
+    
+    protected List serialize(Element element) {
+        List list = new ArrayList();
+        StartTagStart startTag = new StartTagStart(element);
+        list.add(startTag);
+        
+        SortedMap attrMap = new TreeMap();
+        NamedNodeMap attrs = element.getAttributes();
+        for (int i = 0; i < attrs.getLength(); i++) {
+            Attr attr = (Attr) attrs.item(i);
+            String ns = attr.getNamespaceURI();
+            if (ns == null || !ns.equals(XMLNS_NAMESPACE)) {
+                String key = getUniversalName(attr);
+                attrMap.put(key, attr);
+            }
+        }
+        for (Iterator i = attrMap.keySet().iterator(); i.hasNext(); ) {
+            String name = (String) i.next();
+            Attr attr = (Attr) attrMap.get(name);
+            list.add(new AttributeName(attr));
+            list.addAll(serialize(attr.getValue()));
+        }
+        
+        StartTagEnd startTagEnd = new StartTagEnd(element);
+        list.add(startTagEnd);
+        
+        NodeList children = element.getChildNodes();
+        for (int i = 0; i < children.getLength(); i++) {
+            Node node = children.item(i);
+            if (node instanceof Element) {
+                list.addAll(serialize((Element) node));
+            }
+            else if (node instanceof Text) {
+                list.addAll(serialize((Text) node));
+            }
+        }
+        
+        EndTag endTag = new EndTag(element);
+        list.add(endTag);
+        return list;
+    }
+    
+    protected List serialize(Text node) {
+        return serialize(node.getNodeValue().trim());
+    }
+
+    protected String getUniversalName(Node node) {
+        return "{" + node.getNamespaceURI() + "}" + node.getLocalName();
+    }
+    
+    protected List serialize(String text) {
+        List list = new ArrayList();
+        String[] words = text.split("\\s");
+        for (int i = 0; i < words.length; i++) {
+            list.add(words[i]);
+        }
+        return list;
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/EndTag.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/EndTag.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/EndTag.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/EndTag.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,19 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import org.w3c.dom.Element;
+
+public class EndTag extends NamedObject {
+
+    public EndTag(String namespaceUri, String localName) {
+        super(namespaceUri, localName);
+    }
+
+    public EndTag(Element element) {
+        this(element.getNamespaceURI(), element.getLocalName());
+    }
+
+    public String toString() {
+        return "</{" + getNamespaceUri() + "}" + getLocalName() + ">";
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentHandler.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentHandler.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentHandler.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentHandler.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,19 @@
+package org.apache.lenya.modules.diff.lcs;
+
+public interface FragmentHandler {
+    
+    void startAdding() throws Exception;
+    
+    void endAdding() throws Exception;
+    
+    void startRemoving() throws Exception;
+    
+    void endRemoving() throws Exception;
+    
+    void element(Object obj) throws Exception;
+
+    void start() throws Exception;
+
+    void end() throws Exception;
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentingHandler.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentingHandler.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentingHandler.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/FragmentingHandler.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,58 @@
+package org.apache.lenya.modules.diff.lcs;
+
+public class FragmentingHandler implements DiffHandler {
+    
+    private static final int ADDING = 2;
+    private static final int REMOVING = 1;
+    private static final int EQUAL = 0;
+    
+    private int state = EQUAL;
+    
+    private FragmentHandler handler;
+    
+    public FragmentingHandler(FragmentHandler handler) {
+        this.handler = handler;
+    }
+
+    public void added(Object newObj) throws Exception {
+        endRemoving();
+        state = ADDING;
+        handler.startAdding();
+        handler.element(newObj);
+    }
+
+    protected void endRemoving() throws Exception {
+        if (state == REMOVING) {
+            handler.endRemoving();
+        }
+    }
+
+    public void equal(Object obj) throws Exception {
+        endRemoving();
+        endAdding();
+        handler.element(obj);
+        state = EQUAL;
+    }
+
+    public void removed(Object oldObj) throws Exception {
+        endAdding();
+        state = REMOVING;
+        handler.startRemoving();
+        handler.element(oldObj);
+    }
+
+    protected void endAdding() throws Exception {
+        if (state == ADDING) {
+            handler.endAdding();
+        }
+    }
+
+    public void end() throws Exception {
+        handler.end();
+    }
+
+    public void start() throws Exception {
+        handler.start();
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LcsDiff.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LcsDiff.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LcsDiff.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LcsDiff.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,40 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import java.util.Iterator;
+import java.util.List;
+
+import org.apache.lenya.util.Queue;
+
+public class LcsDiff {
+    
+    public void diff(List oldList, List newList, DiffHandler handler) throws Exception {
+        List lcs = LongestCommonSubsequence.getLongestCommonSubsequence(oldList, newList);
+        Queue oldQueue = new Queue(oldList);
+        Queue newQueue = new Queue(newList);
+        Queue lcsQueue = new Queue(lcs);
+        
+        handler.start();
+        
+        while (!lcsQueue.isEmpty()) {
+            Object o = lcsQueue.out();
+            while (!oldQueue.front().equals(o)) {
+                handler.removed(oldQueue.out());
+            }
+            while (!newQueue.front().equals(o)) {
+                handler.added(newQueue.out());
+            }
+            oldQueue.out();
+            newQueue.out();
+            handler.equal(o);
+        }
+        while (!oldQueue.isEmpty()) {
+            handler.removed(oldQueue.out());
+        }
+        while (!newQueue.isEmpty()) {
+            handler.added(newQueue.out());
+        }
+        
+        handler.end();
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LongestCommonSubsequence.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LongestCommonSubsequence.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LongestCommonSubsequence.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/LongestCommonSubsequence.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,104 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF licenses this file to You 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 org.apache.lenya.modules.diff.lcs;
+
+import java.util.Arrays;
+import java.util.List;
+
+public class LongestCommonSubsequence {
+
+    // These are "constants" which indicate a direction in the backtracking array.
+    private static final int NEITHER = 0;
+    private static final int UP = 1;
+    private static final int LEFT = 2;
+    private static final int UP_AND_LEFT = 3;
+
+    public static List getLongestCommonSubsequence(List a, List b) {
+        int n = a.size();
+        int m = b.size();
+        int S[][] = new int[n + 1][m + 1];
+        int R[][] = new int[n + 1][m + 1];
+        int ii, jj;
+
+        // It is important to use <=, not <. The next two for-loops are initialization
+        for (ii = 0; ii <= n; ++ii) {
+            S[ii][0] = 0;
+            R[ii][0] = UP;
+        }
+        for (jj = 0; jj <= m; ++jj) {
+            S[0][jj] = 0;
+            R[0][jj] = LEFT;
+        }
+
+        // This is the main dynamic programming loop that computes the score and
+        // backtracking arrays.
+        for (ii = 1; ii <= n; ++ii) {
+            for (jj = 1; jj <= m; ++jj) {
+                
+                Object aObj = a.get(ii - 1);
+                Object bObj = b.get(jj - 1);
+
+                if (aObj.equals(bObj)) {
+                    S[ii][jj] = S[ii - 1][jj - 1] + 1;
+                    R[ii][jj] = UP_AND_LEFT;
+                }
+
+                else {
+                    S[ii][jj] = S[ii - 1][jj - 1] + 0;
+                    R[ii][jj] = NEITHER;
+                }
+
+                if (S[ii - 1][jj] >= S[ii][jj]) {
+                    S[ii][jj] = S[ii - 1][jj];
+                    R[ii][jj] = UP;
+                }
+
+                if (S[ii][jj - 1] >= S[ii][jj]) {
+                    S[ii][jj] = S[ii][jj - 1];
+                    R[ii][jj] = LEFT;
+                }
+            }
+        }
+
+        // The length of the longest substring is S[n][m]
+        ii = n;
+        jj = m;
+        int pos = S[ii][jj] - 1;
+        Object lcs[] = new Object[pos + 1];
+
+        // Trace the backtracking matrix.
+        while (ii > 0 || jj > 0) {
+            if (R[ii][jj] == UP_AND_LEFT) {
+                ii--;
+                jj--;
+                lcs[pos--] = a.get(ii);
+            }
+
+            else if (R[ii][jj] == UP) {
+                ii--;
+            }
+
+            else if (R[ii][jj] == LEFT) {
+                jj--;
+            }
+        }
+
+        return Arrays.asList(lcs);
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/NamedObject.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/NamedObject.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/NamedObject.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/NamedObject.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,39 @@
+package org.apache.lenya.modules.diff.lcs;
+
+public class NamedObject {
+
+    private String namespaceUri;
+    private String localName;
+
+    public NamedObject(String namespaceUri, String localName) {
+        this.localName = localName;
+        this.namespaceUri = namespaceUri;
+    }
+
+    public boolean equals(Object other) {
+        if (!getClass().isInstance(other)) {
+            return false;
+        }
+        NamedObject otherObj = (NamedObject) other;
+        
+        String thisNs = getNamespaceUri();
+        String otherNs = otherObj.getNamespaceUri();
+        
+        if (thisNs == null && otherNs != null || thisNs != null && otherNs == null) {
+            return false;
+        }
+        
+        return ((otherObj.namespaceUri == null && namespaceUri == null) || otherObj.namespaceUri
+                .equals(namespaceUri))
+                && otherObj.localName.equals(localName);
+    }
+
+    public String getNamespaceUri() {
+        return this.namespaceUri;
+    }
+
+    public String getLocalName() {
+        return this.localName;
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/SaxHandler.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/SaxHandler.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/SaxHandler.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/SaxHandler.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,116 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import org.xml.sax.ContentHandler;
+import org.xml.sax.helpers.AttributesImpl;
+
+public class SaxHandler implements FragmentHandler {
+    
+    protected static final String ENTITY_GT = ">";
+    protected static final String ENTITY_LT = "<";
+    protected static final String ATTR_CLASS = "class";
+    protected static final String ELEM_SPAN = "span";
+    protected static final String ELEM_DIV = "div";
+    public static final String ADDED = "added";
+    public static final String REMOVED = "removed";
+    
+    public static final String XHTML_NAMESPACE = "http://www.w3.org/1999/xhtml";
+    
+    private ContentHandler handler;
+    
+    public SaxHandler(ContentHandler handler) {
+        this.handler = handler;
+    }
+    
+    private boolean handlingAttr = false;
+    private boolean handlingText = false;
+
+    public void element(Object obj) throws Exception {
+        if (obj instanceof StartTagStart) {
+            startElement(ELEM_DIV);
+            StartTagStart startTag = (StartTagStart) obj;
+            characters("<" + startTag.getLocalName());
+            this.handlingText = false;
+        }
+        else if (obj instanceof StartTagEnd) {
+            closeAttribute();
+            characters(">");
+            this.handlingText = false;
+        }
+        else if (obj instanceof EndTag) {
+            EndTag endTag = (EndTag) obj;
+            characters("</" + endTag.getLocalName() + ">");
+            endElement(ELEM_DIV);
+            this.handlingText = false;
+        }
+        else if (obj instanceof AttributeName) {
+            closeAttribute();
+            AttributeName attr = (AttributeName) obj;
+            characters(" " + attr.getLocalName() + "=\"");
+            handlingAttr = true;
+            this.handlingText = false;
+        }
+        else if (obj instanceof String) {
+            if (this.handlingText) {
+                characters(" ");
+            }
+            characters((String) obj);
+            this.handlingText = true;
+        }
+    }
+    
+    protected void closeAttribute() throws Exception {
+        if (this.handlingAttr) {
+            characters("\"");
+            this.handlingAttr = false;
+        }
+    }
+    
+    protected void characters(String text) throws Exception {
+        char[] chars = text.toCharArray();
+        this.handler.characters(chars, 0, chars.length);
+    }
+
+    public void endAdding() throws Exception {
+        endElement(ELEM_SPAN);
+    }
+
+    public void endRemoving() throws Exception {
+        endElement(ELEM_SPAN);
+    }
+
+    public void startAdding() throws Exception {
+        startElement(ELEM_SPAN, ADDED);
+    }
+
+    protected void startElement(String localName, String className) throws Exception {
+        AttributesImpl attrs = new AttributesImpl();
+        attrs.addAttribute("", ATTR_CLASS, ATTR_CLASS, "string", className);
+        this.handler.startElement(XHTML_NAMESPACE, localName, localName, attrs);
+    }
+    
+    protected void startElement(String localName) throws Exception {
+        AttributesImpl attrs = new AttributesImpl();
+        this.handler.startElement(XHTML_NAMESPACE, localName, localName, attrs);
+    }
+    
+    protected void endElement(String localName) throws Exception {
+        this.handler.endElement(XHTML_NAMESPACE, localName, localName);
+    }
+
+    public void startRemoving() throws Exception {
+        startElement(ELEM_SPAN, REMOVED);
+    }
+    
+    public void start() throws Exception {
+        this.handler.startDocument();
+        this.handler.startPrefixMapping("", XHTML_NAMESPACE);
+        startElement(ELEM_DIV, "diff");
+    }
+    
+    public void end() throws Exception {
+        endElement(ELEM_DIV);
+        this.handler.endPrefixMapping("");
+        this.handler.endDocument();
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagEnd.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagEnd.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagEnd.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagEnd.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,19 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import org.w3c.dom.Element;
+
+public class StartTagEnd extends NamedObject {
+
+    public StartTagEnd(String namespaceUri, String localName) {
+        super(namespaceUri, localName);
+    }
+
+    public StartTagEnd(Element element) {
+        this(element.getNamespaceURI(), element.getLocalName());
+    }
+    
+    public String toString() {
+        return "{" + getNamespaceUri() + "}" + getLocalName() + ">";
+    }
+
+}

Added: lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagStart.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagStart.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagStart.java (added)
+++ lenya/docu/modules/diff/java/src/org/apache/lenya/modules/diff/lcs/StartTagStart.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,19 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import org.w3c.dom.Element;
+
+public class StartTagStart extends NamedObject {
+
+    public StartTagStart(String namespaceUri, String localName) {
+        super(namespaceUri, localName);
+    }
+
+    public StartTagStart(Element element) {
+        this(element.getNamespaceURI(), element.getLocalName());
+    }
+    
+    public String toString() {
+        return "<{" + getNamespaceUri() + "}" + getLocalName();
+    }
+
+}
\ No newline at end of file

Added: lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/LcsDiffTest.java
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/LcsDiffTest.java?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/LcsDiffTest.java (added)
+++ lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/LcsDiffTest.java Thu Jul 10 07:35:49 2008
@@ -0,0 +1,108 @@
+package org.apache.lenya.modules.diff.lcs;
+
+import java.net.URL;
+import java.util.ArrayList;
+import java.util.List;
+
+import junit.framework.TestCase;
+
+import org.apache.lenya.modules.diff.DifferenceTree;
+import org.apache.lenya.modules.diff.DifferenceTreeWriter;
+import org.apache.lenya.modules.diff.SimpleTreeDiff;
+import org.apache.lenya.modules.diff.Tree;
+import org.apache.lenya.modules.diff.TreeDiff;
+import org.apache.lenya.modules.diff.xml.DomTreeBuilder;
+import org.apache.lenya.modules.diff.xml.DomTreeBuilderFactory;
+import org.apache.lenya.modules.diff.xml.XmlNodeWriter;
+import org.apache.lenya.xml.DocumentHelper;
+import org.w3c.dom.Document;
+
+public class LcsDiffTest extends TestCase implements DiffHandler, FragmentHandler {
+
+    public void testLcsDiff() throws Exception {
+        
+        DomSerializer serializer = new DomSerializer();
+        List[] lists = new ArrayList[2];
+        for (int i = 0; i < lists.length; i++) {
+            URL url = getClass().getResource("test" + (i + 1) + ".xml");
+            Document dom = DocumentHelper.readDocument(url);
+            lists[i] = serializer.serialize(dom);
+        }
+        
+        System.out.println("List 1: " + lists[0]);
+        System.out.println("List 2: " + lists[1]);
+        
+        LcsDiff diff = new LcsDiff();
+        diff.diff(lists[0], lists[1], new FragmentingHandler(this));
+    }
+
+    public void added(Object newObj) throws Exception {
+        printPadded("", newObj);
+    }
+
+    public void end() throws Exception {
+        System.out.println("End");
+    }
+
+    public void equal(Object obj) throws Exception {
+        //printPadded(obj, obj);
+    }
+
+    public void removed(Object oldObj) throws Exception {
+        printPadded(oldObj, "");
+    }
+
+    public void start() throws Exception {
+        System.out.println("Start");
+    }
+    
+    private static final int columnWidth = 50;
+    
+    protected void printPadded(Object o1, Object o2) {
+        for (int i = 0; i < 2 * columnWidth; i++) {
+            System.out.print("-");
+        }
+        System.out.println();
+        printPadded(o1);
+        printPadded(o2);
+        System.out.println();
+    }
+    
+    protected void printPadded(Object obj) {
+        String string = obj.toString();
+        System.out.print(string);
+        for (int i = string.length(); i < columnWidth; i++) {
+            System.out.print(" ");
+        }
+    }
+
+    private boolean adding = false;
+    private boolean removing = false;
+    
+    public void element(Object obj) throws Exception {
+        if (adding || removing) {
+            System.out.println("  " + obj);
+        }
+    }
+
+    public void endAdding() throws Exception {
+        this.adding = false;
+        System.out.println("</add>");
+    }
+
+    public void endRemoving() throws Exception {
+        this.removing = false;
+        System.out.println("</remove>");
+    }
+
+    public void startAdding() throws Exception {
+        this.adding = true;
+        System.out.println("<add>");
+    }
+
+    public void startRemoving() throws Exception {
+        this.removing = true;
+        System.out.println("<remove>");
+    }
+
+}

Added: lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test1.xml
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test1.xml?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test1.xml (added)
+++ lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test1.xml Thu Jul 10 07:35:49 2008
@@ -0,0 +1,150 @@
+<?xml version="1.0" encoding="UTF-8"?><document>
+  <header>
+    <title>Who we are</title>
+  </header>
+  <body>
+    <section id="community">
+      <title>The Lenya Community</title>
+      <p>
+        
+        The Lenya Project operates as a meritocracy: the more you do, the more
+        responsibility you will obtain. This page lists all of the people who
+        have gone the extra mile and are Committers. If you would like to get
+        involved, the first step is to join the mailing lists.
+      </p>
+      <p>
+        Of course the committers are not the only people involved in the
+        community. Thanks to the many people for their contributions of patches,
+        assistance, ideas, and email discussion. Some are mentioned at the
+        changes pages. See how we
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7#contribution">acknowledge</a> contributions.
+      </p>
+      <p>
+        Please do not send emails directly to individual developers asking for
+        free support - see the Important Notices on the
+        <a href="lenya-document:dfb45860-e986-11dc-b04f-af2277a493d7">mailing lists</a> page.
+      </p>
+      
+    </section>
+    <section id="committers">
+      <title>List of committers</title>
+      <p>
+        List of all people who have ever been committers at Apache Lenya,
+        sorted alphabetically.
+      </p>
+      <ul>
+        <li>Doug Chestnut (chestnut at apache.org)</li>
+        
+        <li>Edith Chevrier (edith at apache.org)</li>
+        <li>Dale Christ (bigdog at apache.org)</li>
+        <li>Christian Egli (egli at apache.org)</li>
+        <li>Paul Ercolino (solprovider at apache.org)</li>
+        <li>
+          <strong>Jann Forrer (jann at apache.org)</strong>
+          
+        </li>
+        <li>Richard Frovarp (rfrovarp at apache.org)</li>
+        <li>
+          <strong>Antonio Gallardo (antonio at apache.org)</strong>
+        </li>
+        <li>Bob Harner (bobharner at apache.org)</li>
+        <li>
+          
+          <strong>Andreas Hartmann (andreas at apache.org)</strong>
+        </li>
+        <li>
+          <strong>J. Wolfgang Kaltz (jwkaltz at apache.org)</strong>
+        </li>
+        <li>Andreas Kuckartz (aku at apache.org)</li>
+        <li>
+          
+          <em>Rolf Kulemann (roku at apache.org)</em>
+        </li>
+        <li>
+          <strong>Jörn Nettingsmeier (nettings at apache.org)</strong>
+        </li>
+        <li>Jürgen Ragaller (ragaller at apache.org)</li>
+        <li>Renaud Richardet (renaud at apache.org)</li>
+        <li>Felix Röthenbacher (froethenbacher at apache.org)</li>
+        
+        <li>
+          <strong>
+            <em>Gregor J. Rothfuss (gregor at apache.org)</em>
+          </strong>
+        </li>
+        <li>Torsten Schlabach (tschlabach at apache.org)</li>
+        <li>
+          <strong>Thorsten Scherler (thorsten at apache.org)</strong>
+          
+        </li>
+        <li>Josias Thöny (josias at apache.org)</li>
+        <li>Michael Wechner (michi at apache.org)</li>
+      </ul>
+    </section>
+    <section id="notes">
+      <title>Notes</title>
+      
+      <p>
+        Strong type denotes "Project Management Committee
+        (<a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">PMC</a>) member". Emphasis type denotes
+        "emeritus PMC member". See the <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">ASF role
+          definitions</a> for detailed role information. The actual list of PMC
+        members is in the SVN "committers" repository at
+        /board/committee-info.txt
+      </p>
+      <p>
+        Some people were committers prior to Lenya becoming a top-level
+        project and so gaining a PMC. They were not around since then, so have
+        never been on the PMC. All new committers are
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">encouraged</a> to become PMC
+        members.
+      </p>
+      
+      <p>
+        Committers can be as active as they choose and there is no performance
+        pressure from the project. For those who are interested in the work that
+        each particular committer has done, see the
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">acknowledgements</a> section.
+      </p>
+      <p>
+        All <a href="http://cocoon.apache.org/community/members.html">Apache
+          Cocoon committers</a> and
+        <a href="http://forrest.apache.org/who.html">Apache
+          Forrest committers</a> also have rights to commit to Lenya.
+      </p>
+      
+    </section>
+    
+    <section>
+      <title>Other Contributors</title>
+      <ul>
+        <li>
+          Lon Boonen is the original creator of Xopus and helped a 
+          lot to integrate it into Lenya. Recently he 
+          rewrote the JavaScript of the Lenya menubar.
+        </li>
+        <li>Jose Chaso: Spanish translation</li>
+        
+        <li>Stephen England: Design of the Lenya logo, design of the Lenya UI</li>
+        <li>Jorge Gutierrez: Spanish translation</li>
+        <li>Martin Hitz</li>
+        <li>Margrit John</li>
+        <li>Olivier Lange: French translation</li>
+        <li>Jean Pierre LeJacq: Build system improvements</li>
+        
+        <li>Martin Lüthi: Mail class</li>
+        <li>
+          Christian Stocker is the original creator of the Bitflux Editor and helped
+          a lot to integrate it into Lenya.
+        </li>
+        <li>Urs Stöckli</li>
+        <li>Giampaolo Trapasso: Italian translation, entertainer on #lenya</li>
+        <li>Markus Vaterlaus</li>
+        
+        <li>Kars Veiling</li>
+        <li>Marc von Wattenwyl</li>
+        <li>Thomas Werschlein</li>
+      </ul>
+    </section>
+  </body>
+</document>

Added: lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test2.xml
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test2.xml?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test2.xml (added)
+++ lenya/docu/modules/diff/java/test/org/apache/lenya/modules/diff/lcs/test2.xml Thu Jul 10 07:35:49 2008
@@ -0,0 +1,152 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
+<document>
+  <header>
+    <title>Who we are</title>
+  </header>
+  <body>
+    <section id="community">
+      <title>The Lenya Community</title>
+      
+      <p>
+        The Lenya Project operates as a meritocracy: the more you do, the more
+        responsibility you will obtain. This page lists all of the people who
+        have gone the extra mile and are Committers. If you would like to get
+        involved, the first step is to join the mailing lists.
+      </p>
+      <p>
+        Of course the committers are not the only people involved in the
+        community. Thanks to the many people for their contributions of patches,
+        assistance, ideas, and email discussion. Some are mentioned at the
+        changes pages. See how we
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">acknowledge</a> contributions.
+      </p>
+      <p>
+        Please do not send emails directly to individual developers asking for
+        free support - see the Important Notices at the
+        <a href="lenya-document:dfb45860-e986-11dc-b04f-af2277a493d7">mailing lists</a> page.
+      </p>
+      
+    </section>
+    <section id="committers">
+      <title>List of committers</title>
+      <p>
+        List of all people who have ever been committers at Apache Lenya,
+        sorted alphabetically.
+      </p>
+      <ul>
+        <li>Doug Chestnut (chestnut at apache.org)</li>
+        
+        <li>Edith Chevrier (edith at apache.org)</li>
+        <li>Dale Christ (bigdog at apache.org)</li>
+        <li>Christian Egli (egli at apache.org)</li>
+        <li>Paul Ercolino (solprovider at apache.org)</li>
+        <li>
+          <strong>Jann Forrer (jann at apache.org)</strong>
+          
+        </li>
+        <li>Richard Frovarp (rfrovarp at apache.org)</li>
+        <li>
+          <strong>Antonio Gallardo (antonio at apache.org)</strong>
+        </li>
+        <li>Bob Harner (bobharner at apache.org)</li>
+        <li>
+          
+          <strong>Andreas Hartmann (andreas at apache.org)</strong>
+        </li>
+        <li>
+          <strong>J. Wolfgang Kaltz (jwkaltz at apache.org)</strong>
+        </li>
+        <li>Andreas Kuckartz (aku at apache.org)</li>
+        <li>
+          
+          <em>Rolf Kulemann (roku at apache.org)</em>
+        </li>
+        <li>
+          <strong>Jörn Nettingsmeier (nettings at apache.org)</strong>
+        </li>
+        <li>Jürgen Ragaller (ragaller at apache.org)</li>
+        <li>Renaud Richardet (renaud at apache.org)</li>
+        <li>Felix Röthenbacher (froethenbacher at apache.org)</li>
+        
+        <li>
+          <strong>
+            <em>Gregor J. Rothfuss (gregor at apache.org)</em>
+          </strong>
+        </li>
+        <li>Torsten Schlabach (tschlabach at apache.org)</li>
+        <li>
+          <strong>Thorsten Scherler (thorsten at apache.org)</strong>
+          
+        </li>
+        <li>Josias Thöny (josias at apache.org)</li>
+        <li>Michael Wechner (michi at apache.org)</li>
+      </ul>
+    </section>
+    <section id="notes">
+      <title>Notes</title>
+      
+      <p>
+        Strong type denotes "Project Management Committee
+        (<a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">PMC</a>) member". Emphasis type denotes
+        "emeritus PMC member". See the <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">ASF role
+          definitions</a> for detailed role information. The actual list of PMC
+        members is in the SVN "committers" repository at
+        /board/committee-info.txt
+      </p>
+      <p>
+        Some people were committers prior to Lenya becoming a top-level
+        project and so gaining a PMC. They were not around since then, so have
+        never been on the PMC. All new committers are
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">encouraged</a> to become PMC
+        members.
+      </p>
+      
+      <p>
+        Committers can be as active as they choose and there is no performance
+        pressure from the project. For those who are interested in the work that
+        each particular committer has done, see the
+        <a href="lenya-document:413a46e0-e986-11dc-b04f-af2277a493d7">acknowledgements</a> section.
+      </p>
+      <p>
+        All <a href="http://cocoon.apache.org/community/members.html">Apache
+          Cocoon committers</a> and
+        <a href="http://forrest.apache.org/who.html">Apache
+          Forrest committers</a> also have rights to commit to Lenya.
+      </p>
+      
+    </section>
+    
+    <section>
+      <title>Other Contributors</title>
+      <ul>
+        <li>
+          Lon Boonen is the original creator of Xopus and helped a 
+          lot to integrate it into Lenya. Recently he 
+          rewrote the JavaScript of the Lenya menubar.
+        </li>
+        <li>Jose Chaso: Spanish translation</li>
+        
+        <li>Stephen England: Design of the Lenya logo, design of the Lenya UI</li>
+        <li>Jorge Gutierrez: Spanish translation</li>
+        <li>Martin Hitz</li>
+        <li>Margrit John</li>
+        <li>Olivier Lange: French translation</li>
+        <li>Jean Pierre LeJacq: Build system improvements</li>
+        
+        <li>Martin Lüthi: Mail class</li>
+        <li>
+          Christian Stocker is the original creator of the Bitflux Editor and helped
+          a lot to integrate it into Lenya.
+        </li>
+        <li>Urs Stöckli</li>
+        <li>Giampaolo Trapasso: Italian translation, entertainer on #lenya</li>
+        <li>Markus Vaterlaus</li>
+        
+        <li>Kars Veiling</li>
+        <li>Marc von Wattenwyl</li>
+        <li>Thomas Werschlein</li>
+      </ul>
+    </section>
+  </body>
+</document>

Added: lenya/docu/modules/diff/sitemap.xmap
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/sitemap.xmap?rev=675594&view=auto
==============================================================================
--- lenya/docu/modules/diff/sitemap.xmap (added)
+++ lenya/docu/modules/diff/sitemap.xmap Thu Jul 10 07:35:49 2008
@@ -0,0 +1,40 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one or more
+  contributor license agreements.  See the NOTICE file distributed with
+  this work for additional information regarding copyright ownership.
+  The ASF licenses this file to You 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.
+-->
+
+<map:sitemap xmlns:map="http://apache.org/cocoon/sitemap/1.0">
+  
+  <map:components>
+    <map:generators default="file">
+      <map:generator name="diff" logger="org.apache.lenya.modules.diff"
+        src="org.apache.lenya.modules.diff.lcs.DiffGenerator"/>
+    </map:generators>
+  </map:components>
+  
+  <map:pipelines>
+    <map:pipeline>
+      <map:match pattern="areas/*-*">
+        <map:generate type="diff">
+          <map:parameter name="oldUri" value="lenya-document:,area={1}"/>
+          <map:parameter name="newUri" value="lenya-document:,area={2}"/>
+        </map:generate>
+        <map:serialize type="xml"/>
+      </map:match>
+    </map:pipeline>
+  </map:pipelines>
+  
+</map:sitemap>

Modified: lenya/docu/modules/diff/usecases/diff.jx
URL: http://svn.apache.org/viewvc/lenya/docu/modules/diff/usecases/diff.jx?rev=675594&r1=675593&r2=675594&view=diff
==============================================================================
--- lenya/docu/modules/diff/usecases/diff.jx (original)
+++ lenya/docu/modules/diff/usecases/diff.jx Thu Jul 10 07:35:49 2008
@@ -20,67 +20,68 @@
 
 <page:page xmlns:jx="http://apache.org/cocoon/templates/jx/1.0" 
   xmlns:page="http://apache.org/cocoon/lenya/cms-page/1.0" 
-  xmlns="http://www.w3.org/1999/xhtml" 
+  xmlns="http://www.w3.org/1999/xhtml"
+  xmlns:i="http://apache.org/cocoon/include/1.0"
   xmlns:i18n="http://apache.org/cocoon/i18n/2.1" >
+  <!--
+    <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/head.jx"/>
+  -->
   
-  <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/head.jx"/>
+  <page:head>
+    <style type="text/css">
+      .diff { font-size: 10pt; margin-top: 2em; color: #999999; }
+      .diff div div { margin-left: 2em; }
+      .added { color: #000000; }
+      .removed { text-decoration: line-through; color: #FF0000; }
+    </style>
+  </page:head>
   
   <page:body>
     
-    <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/sitetree.jx"/>
-    <jx:import uri="fallback://lenya/modules/usecase/templates/tabs.jx"/>
+    <!--
+      <jx:import uri="fallback://lenya/modules/sitemanagement/usecases/tab/sitetree.jx"/>
+      <jx:import uri="fallback://lenya/modules/usecase/templates/tabs.jx"/>
+    -->
     
-    <jx:set var="rev1" value="${usecase.getParameter('rev1')}"/>
-    <jx:set var="rev2" value="${usecase.getParameter('rev2')}"/>
+    <jx:set var="oldUri" value="${usecase.getParameter('oldUri')}"/>
+    <jx:set var="newUri" value="${usecase.getParameter('newUri')}"/>
     
-    <div id="contentblock1" class="lenya-tab-sitetree">
-      <h1>
-        <i18n:translate>
-          <i18n:text>difference-between</i18n:text>
-          <i18n:param>${rev1}</i18n:param>
-          <i18n:param>${rev2}</i18n:param>
-        </i18n:translate>
-      </h1>
-      
-      <jx:set var="differences" value="${usecase.getParameter('differences')}"/>
-      <jx:choose>
-        <jx:when test="${differences.size() == 0}">
-          <p>
-            <i18n:text>no-differences</i18n:text>
-          </p>
-        </jx:when>
-        <jx:otherwise>
-          <table class="lenya-table-list">
+    <h1>
+      <i18n:translate>Differences</i18n:translate>
+    </h1>
+    
+    <i:include src="cocoon://modules/diff/areas/live-authoring"/>
+    
+    <!--
+    <jx:set var="differences" value="${usecase.getParameter('differences')}"/>
+    <jx:choose>
+      <jx:when test="${differences.size() == 0}">
+        <p>
+          <i18n:text>no-differences</i18n:text>
+        </p>
+      </jx:when>
+      <jx:otherwise>
+        <table class="lenya-table-list">
+          <tr>
+            <th>Authoring</th>
+            <th>Live</th>
+          </tr>
+          <jx:forEach var="difference" items="${differences}">
+            <jx:if test="${!difference.getLeft().equals(difference.getRight())}">
             <tr>
-              <th><i18n:text>Revision</i18n:text> ${rev1}</th>
-              <th><i18n:text>Revision</i18n:text> ${rev2}</th>
-              <!--
-              <th><i18n:text>Location</i18n:text></th>
-              <th><i18n:text>Type</i18n:text></th>
-              <th><i18n:text>Revision</i18n:text>&#160;${rev1}</th>
-              <th><i18n:text>Revision</i18n:text>&#160;${rev2}</th>
-              -->
+              <td>
+                ${difference.getRight()}
+              </td>
+              <td>
+                ${difference.getLeft()}
+              </td>
             </tr>
-            <jx:forEach var="difference" items="${differences}">
-              <tr>
-                <td style="padding-left: ${difference.getDepth()}em;">
-                  ${difference.getLeft()}
-                </td>
-                <td style="padding-left: ${difference.getDepth()}em;">
-                  ${difference.getRight()}
-                </td>
-                <!--
-                <td>${difference.getControlNodeDetail().getXpathLocation()}</td>
-                <td>${difference.getDescription()}</td>
-                <td>${difference.getControlNodeDetail().getValue()}</td>
-                <td>${difference.getTestNodeDetail().getValue()}</td>
-                -->
-              </tr>
-            </jx:forEach>
-          </table>
-        </jx:otherwise>
-      </jx:choose>
-      
-    </div>
+            </jx:if>
+          </jx:forEach>
+        </table>
+      </jx:otherwise>
+    </jx:choose>
+    -->
+    
   </page:body>
 </page:page>
\ No newline at end of file



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@lenya.apache.org
For additional commands, e-mail: commits-help@lenya.apache.org