summaryrefslogtreecommitdiff
path: root/xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java
diff options
context:
space:
mode:
Diffstat (limited to 'xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java')
-rw-r--r--xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java386
1 files changed, 0 insertions, 386 deletions
diff --git a/xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java b/xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java
deleted file mode 100644
index 3799539e5c6d..000000000000
--- a/xmerge/java/org/openoffice/xmerge/merger/diff/NodeIterator.java
+++ /dev/null
@@ -1,386 +0,0 @@
-/************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * Copyright 2000, 2010 Oracle and/or its affiliates.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org. If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-package org.openoffice.xmerge.merger.diff;
-
-import org.w3c.dom.Node;
-import org.w3c.dom.NodeList;
-import org.w3c.dom.NamedNodeMap;
-import org.w3c.dom.Element;
-
-import org.openoffice.xmerge.ConverterCapabilities;
-import org.openoffice.xmerge.merger.Iterator;
-import org.openoffice.xmerge.converter.xml.OfficeConstants;
-import org.openoffice.xmerge.util.Debug;
-import org.openoffice.xmerge.util.Resources;
-
-import java.util.Vector;
-import java.util.List;
-
-
-/**
- * <p>This is an implementation of the <code>Iterator</code> interface.
- * It will traverse the tree and find <code>Node</code> sequences.</p>
- *
- * <p>Note: Once the XML Tree is parsed, then the <code>Iterator</code> will
- * be a snap shot of that tree. That means even the tree is modified later,
- * than the cached paragraph <code>Node</code> list will not be updated
- * accordingly. For this reason and for performance reasons this
- * <code>Iterator</code> does not support any operation methods such as
- * insert, remove or replace. The main purpose of this
- * <code>Iterator</code> is to be used with difference, not with merge.</p>
- *
- * @author smak
- */
-public abstract class NodeIterator implements Iterator {
-
- private List nodeList = null;
- private int currentPosition = 0;
- private Node root;
- private ConverterCapabilities cc_ = null;
-
-
- /**
- * Standard constructor.
- *
- * @param cc The <code>ConverterCapabilities</code>.
- * @param node The initial root <code>Node</code>.
- */
- public NodeIterator(ConverterCapabilities cc, Node node) {
- cc_ = cc;
- nodeList = new Vector();
- root = node;
- markTree(node);
- }
-
-
- public Object next() {
- if (currentPosition < nodeList.size() - 1) {
- currentPosition++;
- return currentElement();
- } else {
- return null;
- }
- }
-
-
- public Object previous() {
- if (currentPosition > 0) {
- currentPosition--;
- return currentElement();
- } else {
- return null;
- }
- }
-
-
- public Object start() {
- currentPosition = 0;
- return currentElement();
- }
-
-
- public Object end() {
- int size = nodeList.size();
-
- if (size > 0) {
- currentPosition = size - 1;
- return currentElement();
- } else {
- return null;
- }
- }
-
-
- public Object currentElement() {
-
- if (currentPosition < 0 || currentPosition >= nodeList.size()) {
- return null;
- }
-
- return nodeList.get(currentPosition);
- }
-
-
- public int elementCount() {
- return nodeList.size();
- }
-
-
- public boolean equivalent(Object obj1, Object obj2) {
- boolean equal = false;
- String errMsg = null;
- if (!(obj1 instanceof Node && obj2 instanceof Node)) {
- errMsg = Resources.getInstance().getString("NOT_NODE_ERROR");
- Debug.log(Debug.ERROR, errMsg);
- } else {
- Node node1 = (Node)obj1;
- Node node2 = (Node)obj2;
-
- equal = compareNode(node1, node2);
- }
- return equal;
- }
-
-
- public void refresh() {
- nodeList = new Vector();
- markTree(root);
- currentPosition = 0;
- }
-
-
- /**
- * Used to compare two <code>Node</code> objects (type/name/value)
- * and all their children <code>Node</code> objects.
- *
- * @param node1 The first <code>Node</code> to compare.
- * @param node2 The second <code>Node</code> to compare.
- *
- * @return true if <code>Node</code> is equal, false otherwise.
- */
- protected boolean compareNode(Node node1, Node node2) {
- boolean equal = false;
-
- nodeCheck: {
-
- if (node1 == null || node2 == null) {
- break nodeCheck;
- }
-
- // nodevalue is short
- if (node1.getNodeType() != node2.getNodeType()) {
- break nodeCheck;
- }
-
- // nodeName will not be null
- if (!node1.getNodeName().equals(node2.getNodeName())) {
- break nodeCheck;
- }
-
- // nodeValue can be null for a lot of type of cells
- if (node1.getNodeValue() == null && node2.getNodeValue() == null) {
- // empty
- } else if (node1.getNodeValue() == null ||
- node2.getNodeValue() == null) {
- break nodeCheck;
- } else if (!node1.getNodeValue().equals(node2.getNodeValue())) {
- break nodeCheck;
- }
-
- // try to compare attributes
- if (!attributesEqual(node1, node2)) {
- break nodeCheck;
- }
-
- // don't need to compare if both node do not have children
- if (!node1.hasChildNodes() && !node2.hasChildNodes()) {
- equal = true;
- break nodeCheck;
- // don't need to compare if one node has children but not the other
- } else if (!node1.hasChildNodes() || !node2.hasChildNodes()) {
- equal = false;
- break nodeCheck;
- // need to compare if both node has children
- } else if (!childrenEqual(node1, node2)) {
- break nodeCheck;
- }
-
- equal = true;
- }
-
- return equal;
- }
-
-
- /**
- * Compare the children of two <code>Node</code> objects. This
- * method can be intentionally overridden by any class that
- * extend from <code>NodeIterator</code> so that it can have
- * its own children comparison if necessary.
- *
- * @param node1 The first <code>Node</code> to compare.
- * @param node2 The second <code>Node</code> to compare.
- *
- * @return true if children are equal, false otherwise.
- */
- protected boolean childrenEqual(Node node1, Node node2) {
-
- boolean equal = false;
-
- childrenCheck: {
- NodeList node1Children = node1.getChildNodes();
- NodeList node2Children = node2.getChildNodes();
-
- if (node1Children == null || node2Children == null) {
- break childrenCheck;
- }
-
- if (node1Children.getLength() != node2Children.getLength()) {
- break childrenCheck;
- }
-
- // compare all the childrens
- equal = true;
-
- for (int i = 0; i < node1Children.getLength(); i++) {
- if (!compareNode(node1Children.item(i),
- node2Children.item(i))) {
- equal = false;
- break childrenCheck;
- }
- }
- }
-
- return equal;
- }
-
-
- /**
- * Compare attributes of two <code>Node</code> objects. This
- * method can be intentionally overridden by any class that
- * extends from <code>NodeIterator</code> so that it can have
- * its own attribute comparison.
- *
- * @param node1 The first <code>Node</code> to compare.
- * @param node2 The second <code>Node</code> to compare.
- *
- * @return true if attributes are equal, false otherwise.
- */
- protected boolean attributesEqual(Node node1, Node node2) {
-
- boolean equal = false;
- String nodeName = node1.getNodeName();
- NamedNodeMap attrNode[] = new NamedNodeMap[2];
- attrNode[0] = node1.getAttributes();
- attrNode[1] = node2.getAttributes();
-
- // attribute node will be null if node is not an element node
- // and attribute nodes are equal if both are not element node
- if (attrNode[0] == null || attrNode[1] == null) {
- if (attrNode[0] == null && attrNode[1] == null) {
- equal = true;
- }
- return equal;
- }
-
- // compare the attributes from node1 vs node2 and node2 vs node1
- // though it's a little inefficient for the duplication of comparison
- // as the number of attributes is not so many, it should not be
- // a big problem.
- int len [] = new int[2];
- int src, dst;
-
- attrCheck: {
- for (int i = 0; i < 2; i++) {
-
- if (i == 0) {
- src = 0;
- dst = 1;
- } else {
- src = 1;
- dst = 0;
- }
-
- len[src] = attrNode[src].getLength();
-
- for (int j = 0; j < len[src]; j++) {
- Node srcAttr = attrNode[src].item(j);
- String srcAttrName = srcAttr.getNodeName();
-
- // copy the supported attrs
- if (cc_ == null ||
- cc_.canConvertAttribute(nodeName, srcAttrName)) {
-
- // check whether the attribute exist in dst node
- Node dstAttr = attrNode[dst].getNamedItem(srcAttrName);
-
- if (dstAttr == null) {
- Debug.log(Debug.INFO,
- "[NodeIterator] Attr not exist in dst - "
- + srcAttrName);
- break attrCheck;
- }
-
- // then compare the attribute values
- if (!srcAttr.getNodeValue().equals(
- dstAttr.getNodeValue())) {
- Debug.log(Debug.INFO,
- "[NodeIterator] Attr diff src: " +
- srcAttr.getNodeValue() + " dst: "+
- dstAttr.getNodeValue());
- break attrCheck;
- }
- } // end if cc_ loop
- } // end for j loop
- } // end for i loop
-
- // the whole checking is done smoothly and all attributes are equal
- equal = true;
- }
-
- return equal;
- }
-
-
- /**
- * Check whether a <code>Node</code> is supported. This method
- * can be intentionally overridden by any class that extends from
- * <code>NodeIterator</code> so that it can specify which
- * <code>Node</code> to support.
- *
- * @param node <code>Node</code> to check.
- *
- * @return true if <code>Node</code> is supported, false otherwise.
- */
- protected abstract boolean nodeSupported(Node node);
-
- // doing a depth first search for the tree and mark all supported nodes
- private void markTree(Node node) {
-
- // if this is a supported node, then we add it to our cache table
- if (nodeSupported(node)) {
- nodeList.add(node);
- } else {
- // or we go through all children nodes recursively
- // (can be optimized in future)
- String nodeName = node.getNodeName();
- if ( cc_ == null || cc_.canConvertTag(nodeName)) {
- NodeList nodeList = node.getChildNodes();
- int nodeListLength = nodeList.getLength();
- for (int i = 0; i < nodeListLength; i++) {
- markTree(nodeList.item(i));
- }
- }
- else {
- Debug.log(Debug.INFO, " [NodeIterator::markTree] Skipping node "
- + nodeName);
- }
- }
- }
-}
-