/*   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>
 * &lt;a&gt;&lt;![CDATA[cdata text]]&gt;&lt;/a&gt;               - is considered as: &lt;a&gt;&lt;![CDATA[cdata text]]&gt;&lt;/a&gt;
 * &lt;b&gt;&lt;![CDATA[cdata text]]&gt; regular text&lt;/b&gt;  - is considered as: &lt;b&gt;&lt;![CDATA[cdata text regular text]]&gt;&lt;/b&gt;
 * &lt;c&gt;text &lt;![CDATA[cdata text]]&gt;&lt;/c&gt;          - is considered as: &lt;c&gt;text cdata text&lt;/c&gt;
 * </pre>
 *
 * @see XmlOptions#setUseCDataBookmarks()
 * @see org.apache.xmlbeans.XmlObject.Factory#parse(String, XmlOptions)
 * @see org.apache.xmlbeans.XmlObject#save(java.io.OutputStream, XmlOptions)
 * @see XmlOptions#setSaveCDataEntityCountThreshold(int) 
 * @see XmlOptions#setSaveCDataLengthThreshold(int)
 * @author Cezar Andrei  (cezar dot andrei at gmail dot com)
 */
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 CDataBookmark CDATA_BOOKMARK = new CDataBookmark();
}