View Javadoc

1   /**
2    * Copyright (c) 2011, University of Konstanz, Distributed Systems Group
3    * All rights reserved.
4    * 
5    * Redistribution and use in source and binary forms, with or without
6    * modification, are permitted provided that the following conditions are met:
7    * * Redistributions of source code must retain the above copyright
8    * notice, this list of conditions and the following disclaimer.
9    * * Redistributions in binary form must reproduce the above copyright
10   * notice, this list of conditions and the following disclaimer in the
11   * documentation and/or other materials provided with the distribution.
12   * * Neither the name of the University of Konstanz nor the
13   * names of its contributors may be used to endorse or promote products
14   * derived from this software without specific prior written permission.
15   * 
16   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19   * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
20   * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26   */
27  
28  package org.treetank.service.xml.diff;
29  
30  import org.treetank.api.INodeReadTrx;
31  import org.treetank.exception.TTException;
32  import org.treetank.exception.TTIOException;
33  import org.treetank.node.ElementNode;
34  import org.treetank.node.IConstants;
35  import org.treetank.service.xml.diff.DiffFactory.Builder;
36  
37  /**
38   * Full diff including attributes and namespaces. Note that this class is thread
39   * safe.
40   * 
41   * @author Johannes Lichtenberger, University of Konstanz
42   * 
43   */
44  final class FullDiff extends AbsDiff {
45  
46      /**
47       * Constructor.
48       * 
49       * @param paramBuilder
50       *            {@link Builder} reference
51       * @throws TTException
52       *             if anything goes wrong while setting up Treetank transactions
53       */
54      FullDiff(final Builder paramBuilder) throws TTException {
55          super(paramBuilder);
56      }
57  
58      /** {@inheritDoc} 
59       * @throws TTIOException */
60      @Override
61      boolean checkNodes(final INodeReadTrx paramFirstRtx, final INodeReadTrx paramSecondRtx) throws TTIOException {
62          assert paramFirstRtx != null;
63          assert paramSecondRtx != null;
64  
65          boolean found = false;
66  
67          if (paramFirstRtx.getNode().getDataKey() == paramSecondRtx.getNode().getDataKey()
68              && paramFirstRtx.getNode().equals(paramSecondRtx.getNode())) {
69              final long nodeKey = paramFirstRtx.getNode().getDataKey();
70  
71              if (paramFirstRtx.getNode().getKind() == IConstants.ELEMENT) {
72                  if (((ElementNode)paramFirstRtx.getNode()).getNamespaceCount() == 0
73                      && ((ElementNode)paramFirstRtx.getNode()).getAttributeCount() == 0
74                      && ((ElementNode)paramSecondRtx.getNode()).getAttributeCount() == 0
75                      && ((ElementNode)paramSecondRtx.getNode()).getNamespaceCount() == 0) {
76                      found = true;
77                  } else {
78                      if (((ElementNode)paramFirstRtx.getNode()).getNamespaceCount() == 0) {
79                          found = true;
80                      } else {
81                          for (int i = 0; i < ((ElementNode)paramFirstRtx.getNode()).getNamespaceCount(); i++) {
82                              paramFirstRtx.moveToNamespace(i);
83                              for (int j = 0; j < ((ElementNode)paramSecondRtx.getNode()).getNamespaceCount(); j++) {
84                                  paramSecondRtx.moveToNamespace(i);
85  
86                                  if (paramFirstRtx.getNode().equals(paramSecondRtx.getNode())) {
87                                      found = true;
88                                      break;
89                                  }
90                              }
91                              paramFirstRtx.moveTo(nodeKey);
92                              paramSecondRtx.moveTo(nodeKey);
93                          }
94                      }
95  
96                      if (found) {
97                          for (int i = 0; i < ((ElementNode)paramFirstRtx.getNode()).getAttributeCount(); i++) {
98                              paramFirstRtx.moveToAttribute(i);
99                              for (int j = 0; j < ((ElementNode)paramSecondRtx.getNode()).getAttributeCount(); j++) {
100                                 paramSecondRtx.moveToAttribute(i);
101 
102                                 if (paramFirstRtx.getNode().equals(paramSecondRtx.getNode())) {
103                                     found = true;
104                                     break;
105                                 }
106                             }
107                             paramFirstRtx.moveTo(nodeKey);
108                             paramSecondRtx.moveTo(nodeKey);
109                         }
110                     }
111                 }
112             } else {
113                 found = true;
114             }
115         }
116 
117         return found;
118     }
119 }