/******************************************************************************* * Copyright (c) 2001, 2005 IBM Corporation and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * IBM Corporation - initial API and implementation * Jens Lukowski/Innoopract - initial renaming/restructuring * *******************************************************************************/ package org.eclipse.wst.xml.core.internal.document; import java.io.IOException; import java.io.Writer; import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion; import org.eclipse.wst.xml.core.internal.provisional.document.IDOMModel; import org.w3c.dom.Node; /** * This class is only for debug purpose. */ public class StructuredDocumentRegionChecker { String EOL = System.getProperty("line.separator"); //$NON-NLS-1$ private int offset = 0; Writer testWriter = null; /** */ public StructuredDocumentRegionChecker() { super(); } public StructuredDocumentRegionChecker(Writer writer) { super(); testWriter = writer; } /** */ private void checkChildNodes(Node node) { for (Node child = node.getFirstChild(); child != null; child = child.getNextSibling()) { checkNode(child); } } /** */ public void checkModel(IDOMModel model) { checkChildNodes(model.getDocument()); } /** */ private void checkNode(Node node) { checkStructuredDocumentRegion(((NodeImpl) node).getStructuredDocumentRegion()); if (node.getNodeType() == Node.ELEMENT_NODE) { checkChildNodes(node); checkStructuredDocumentRegion(((ElementImpl) node).getEndStructuredDocumentRegion()); } } /** */ private void checkStructuredDocumentRegion(IStructuredDocumentRegion flatNode) { if (flatNode == null) return; if (flatNode instanceof StructuredDocumentRegionContainer) { StructuredDocumentRegionContainer container = (StructuredDocumentRegionContainer) flatNode; int n = container.getStructuredDocumentRegionCount(); for (int i = 0; i < n; i++) { IStructuredDocumentRegion c = container.getStructuredDocumentRegion(i); if (c == null) { reportError("null"); //$NON-NLS-1$ continue; } checkStructuredDocumentRegion(c); } return; } int start = flatNode.getStart(); if (start < this.offset) reportError("overwrap"); //$NON-NLS-1$ if (start > this.offset) reportError("gap"); //$NON-NLS-1$ int end = flatNode.getEnd(); this.offset = end; if (flatNode instanceof StructuredDocumentRegionProxy) { StructuredDocumentRegionProxy proxy = (StructuredDocumentRegionProxy) flatNode; IStructuredDocumentRegion p = proxy.getStructuredDocumentRegion(); if (p == null) { reportError("null"); //$NON-NLS-1$ return; } int s = p.getStart(); int e = p.getEnd(); if (s > start || e < end) reportError("out"); //$NON-NLS-1$ if (s == start && e == end) reportWarning("vain"); //$NON-NLS-1$ } } /** */ private void reportError(String message) { String msg = "StructuredDocumentRegionChecker : error : " + message; //$NON-NLS-1$ if (testWriter != null) { try { testWriter.write(msg + EOL); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println(msg); } throw new StructuredDocumentRegionManagementException(); } /** */ private void reportWarning(String message) { String msg = "StructuredDocumentRegionChecker : warning : " + message; //$NON-NLS-1$ if (testWriter != null) { try { testWriter.write(msg + EOL); } catch (IOException e) { e.printStackTrace(); } } else { System.out.println(msg); } } }