/*   Copyright 2004 The Apache Software Foundation
 *
 *   Licensed 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.xmlbeans;

/**
 * Represents a CDATA bookmark.
 * <p>
 * When XmlOption UseCDataBookmarks is setted on parse methods,
 * the loader will set these CDataBookmarks in the store on the respective
 * TEXT fields that were represented as CDATA.
 * <p>
 * Users can modify the 'look' of TEXT fields, by annotating them with
 * this bookmark, or remove the bookmark.
 * <p>
 * Additionaly if setted on save methods, the output will look for these
 * bookmarks and will output the text as CDATA.
 * Note: The SaveCDataEntityCountThreshold and SaveCDataLengthThreshold
 * options and their default values still apply.
 * <p>
 * Note: Due to the store representation, a CDATA will not be recognized
 * if it is imediately after non CDATA text and all text following it will
 * be considered CDATA.<br>
 * Example:<br>
 * <pre>{@code
 * <a><![CDATA[cdata text]]></a>               - is considered as: <a><![CDATA[cdata text]]></a>
 * <b><![CDATA[cdata text]]> regular text</b>  - is considered as: <b><![CDATA[cdata text regular text]]></b>
 * <c>text <![CDATA[cdata text]]></c>          - is considered as: <c>text cdata text</c>
 * }</pre>
 *
 * @see XmlOptions#setUseCDataBookmarks()
 * @see org.apache.xmlbeans.impl.schema.XmlObjectFactory#parse(String, XmlOptions)
 * @see org.apache.xmlbeans.XmlObject#save(java.io.OutputStream, XmlOptions)
 * @see XmlOptions#setSaveCDataEntityCountThreshold(int)
 * @see XmlOptions#setSaveCDataLengthThreshold(int)
 */
public class CDataBookmark extends XmlCursor.XmlBookmark {
    /**
     * The actual bookmark object representing CData.<br>
     * Users must use this bookmark in addition to UseCDataBookmarks
     * option to make use of CDATA representation in XML text.
     */
    public static final CDataBookmark CDATA_BOOKMARK = new CDataBookmark();
}