Package org.eclipse.wst.xml.core.internal.document

Source Code of org.eclipse.wst.xml.core.internal.document.CharacterDataImpl

/*******************************************************************************
* Copyright (c) 2001, 2011 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
*     David Carver (STAR) - bug 296999 - Inefficient use of new String()
*******************************************************************************/
package org.eclipse.wst.xml.core.internal.document;



import org.eclipse.wst.sse.core.internal.provisional.text.IStructuredDocumentRegion;
import org.w3c.dom.CharacterData;
import org.w3c.dom.DOMException;
import org.w3c.dom.Node;


/**
* CharacterDataImpl class
*/
public abstract class CharacterDataImpl extends NodeImpl implements CharacterData {

  private char[] data = null;

  /**
   * CharacterDataImpl constructor
   */
  protected CharacterDataImpl() {
    super();
  }

  /**
   * CharacterDataImpl constructor
   *
   * @param that
   *            CharacterDataImpl
   */
  protected CharacterDataImpl(CharacterDataImpl that) {
    super(that);

    if (that != null) {
      this.data = that.getData().toCharArray();
    }
  }

  /**
   * appendData method
   *
   * @param arg
   *            java.lang.String
   */
  public void appendData(String arg) throws DOMException {
    if (arg == null)
      return;

    String data = getData();
    if (data == null)
      data = arg;
    else
      data += arg;
    setData(data);
  }

  /**
   * deleteData method
   *
   * @param offset
   *            int
   * @param count
   *            int
   */
  public void deleteData(int offset, int count) throws DOMException {
    if (count == 0)
      return;
    if (!isDataEditable()) {
      throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
    }

    if (count < 0 || offset < 0) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }

    String data = getData();
    if (data == null) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }
    int length = data.length();
    if (offset > length) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }
    if (offset == 0) {
      if (count > length) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      if (count == length)
        data = NodeImpl.EMPTY_STRING;
      else
        data = data.substring(count);
    } else {
      int end = offset + count;
      if (end > length) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      if (end == length)
        data = data.substring(0, offset);
      else
        data = data.substring(0, offset) + data.substring(end);
    }
    setData(data);
  }

  /**
   */
  protected final char[] getCharacterData() {
    return this.data;
  }

  /**
   * getData method
   *
   * @return java.lang.String
   */
  public String getData() throws DOMException {
    char[] cdata = getCharacterData();
    if (cdata != null)
      return new String(cdata);
    return null;
  }

  /**
   * getLength method
   *
   * @return int
   */
  public int getLength() {
    String data = getData();
    if (data == null)
      return 0;
    return data.length();
  }

  /**
   * getNodeValue method
   *
   * @return java.lang.String
   */
  public String getNodeValue() {
    return getData();
  }

  /**
   * insertData method
   *
   * @param offset
   *            int
   * @param arg
   *            java.lang.String
   */
  public void insertData(int offset, String arg) throws DOMException {
    if (arg == null)
      return;

    if (!isDataEditable()) {
      throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
    }

    if (offset < 0) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }

    String data = getData();
    if (data == null) {
      if (offset > 0) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      data = arg;
    } else if (offset == 0) {
      data = arg + data;
    } else {
      int length = data.length();
      if (offset > length) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      if (offset == length)
        data += arg;
      else
        data = data.substring(0, offset) + arg + data.substring(offset);
    }
    setData(data);
  }

  /**
   * isJSPContent method
   *
   * @return boolean
   */
  public boolean isJSPContent() {
    Node parent = getParentNode();
    if (parent == null || parent.getNodeType() != Node.ELEMENT_NODE)
      return false;
    ElementImpl element = (ElementImpl) parent;
    return element.isJSPContainer();
  }

  /**
   * replaceData method
   *
   * @param offset
   *            int
   * @param count
   *            int
   * @param arg
   *            java.lang.String
   */
  public void replaceData(int offset, int count, String arg) throws DOMException {
    if (!isDataEditable()) {
      throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
    }

    if (arg == null) {
      deleteData(offset, count);
      return;
    }
    if (count == 0) {
      insertData(offset, arg);
      return;
    }
    if (offset < 0 || count < 0) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }

    String data = getData();
    if (data == null) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    } else if (offset == 0) {
      int length = data.length();
      if (count > length) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      if (count == length)
        data = arg;
      else
        data = arg + data.substring(count);
    } else {
      int length = data.length();
      int end = offset + count;
      if (end > length) {
        throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
      }
      if (end == length)
        data = data.substring(0, offset) + arg;
      else
        data = data.substring(0, offset) + arg + data.substring(end);
    }
    setData(data);
  }

  /**
   */
  void resetStructuredDocumentRegions() {
    this.data = getData().toCharArray();
    setStructuredDocumentRegion(null);
  }

  /**
   * setData method
   *
   * @param data
   *            java.lang.String
   */
  public void setData(String data) throws DOMException {
    if (!isDataEditable()) {
      throw new DOMException(DOMException.NO_MODIFICATION_ALLOWED_ERR, DOMMessages.NO_MODIFICATION_ALLOWED_ERR);
    }

    this.data = (data != null ? data.toCharArray() : null);

    notifyValueChanged();
  }

  /**
   * setNodeValue method
   *
   * @param nodeValue
   *            java.lang.String
   */
  public void setNodeValue(String nodeValue) throws DOMException {
    setData(nodeValue);
  }

  /**
   */
  void setStructuredDocumentRegion(IStructuredDocumentRegion flatNode) {
    super.setStructuredDocumentRegion(flatNode);
    if (flatNode != null)
      this.data = null;
  }

  /**
   * substringData method
   *
   * @return java.lang.String
   * @param offset
   *            int
   * @param count
   *            int
   */
  public String substringData(int offset, int count) throws DOMException {
    if (count == 0)
      return NodeImpl.EMPTY_STRING;
    if (offset < 0 || count < 0) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }

    String data = getData();
    if (data == null) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }
    int length = data.length();
    if (offset == 0 && count == length)
      return data;
    if (offset > length) {
      throw new DOMException(DOMException.INDEX_SIZE_ERR, DOMMessages.INDEX_SIZE_ERR);
    }
    int end = offset + count;
    if (end > length) {
      // no DOMException specified to be thrown
      end = length;
    }
    return data.substring(offset, end);
  }

  /**
   * toString method
   *
   * @return java.lang.String
   */
  public String toString() {
    StringBuffer buffer = new StringBuffer();
    buffer.append(getNodeName());
    buffer.append('(');
    buffer.append(getData());
    buffer.append(')');
    IStructuredDocumentRegion flatNode = getStructuredDocumentRegion();
    if (flatNode != null) {
      buffer.append('@');
      buffer.append(flatNode.toString());
    }
    return buffer.toString();
  }
}
TOP

Related Classes of org.eclipse.wst.xml.core.internal.document.CharacterDataImpl

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.