All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.amazon.ion.impl._Private_MarkupCallback Maven / Gradle / Ivy

The newest version!

/*
 * Copyright 2007-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License").
 * You may not use this file except in compliance with the License.
 * A copy of the License is located at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * or in the "license" file accompanying this file. This file 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 com.amazon.ion.impl;

import com.amazon.ion.IonType;
import com.amazon.ion.SymbolToken;

import com.amazon.ion.system.IonTextWriterBuilder;
import com.amazon.ion.util._Private_FastAppendable;
import java.io.IOException;

/**
 * NOT FOR APPLICATION USE!
 *
 *
 * Callback for giving users the ability to inject markup into their Ion
 * documents.
 * 

* Customers who want to inject markup into their Ion documents will need to * extend {@link _Private_MarkupCallback}, implement {@link _Private_CallbackBuilder} to build new * instances, and pass an instance of their {@link _Private_CallbackBuilder} into * {@link IonTextWriterBuilder#setCallbackBuilder(_Private_CallbackBuilder)} or * {@link IonTextWriterBuilder#withCallbackBuilder(_Private_CallbackBuilder)} *

*

* Note: It is only necessary for subclasses to implement methods they're using * to inject markup. *

*

* When all method are called, they are called with (at least) an * {@link IonType} that represents either the type of data being written or the * container type that the writer is writing, or currently inside. * before/afterFieldName and before/afterEachAnnotation get, respectively, the * field name and annotation that is being written. Methods can use * {@link #myAppendable} access the output stream. *

*

Example Calls

*

* Here are some example call patterns, using the following syntax to show where * calls will be executed (whitespace is used to increase readability): * *

 * <methodName TYPE>
 * 
* *

*

* Input: * *

 * { cookies:"Chocolate Chip" }
 * 
* * Output: * *
 * <beforeData STRUCT>{<afterStepIn STRUCT>
 *     <beforeFieldName STRING "cookies"> cookies <afterFieldName STRING "cookies">:<beforeData STRING> "Chocolate Chip" <afterData STRING>
 * <beforeStepOut STRUCT>}<afterData STRUCT>
 * 
* *

*

* Input: * *

 * anno1::anno2::{
 *   fname:"John",
 *   lname:"Smith",
 *   age:32.785
 * }
 * 
* * Output: * *
 * <beforeAnnotations STRUCT>
 *   <beforeEachAnnotation STRUCT "anno1">anno1<afterEachAnnotation STRUCT "anno1">::
 *   <beforeEachAnnotation STRUCT "anno2">anno2<afterEachAnnotation STRUCT "anno2">::
 * <afterAnnotations STRUCT>
 * <beforeData STRUCT>{<afterStepIn STRUCT>
 *     <beforeFieldName STRING "fname">fname<afterFieldName STRING "fname">:<beforeData STRING>"John"<afterData STRING><beforeSeparator STRUCT>,<afterSeparator STRUCT>
 *     <beforeFieldName STRING "lname">lname<afterFieldName STRING "lname">:<beforeData STRING>"Smith"<afterData STRING><beforeSeparator STRUCT>,<afterSeparator STRUCT>
 *     <beforeFieldName DECIMAL "age">age<afterFieldName DECIMAL "age">:<beforeData DECIMAL>32.785<afterData DECIMAL>
 * <beforeStepOut STRUCT>}<afterData STRUCT>
 * 
* *

*

* Input: * *

 * (where (field (this) result) (== (field (curr) majorVersionString) "1.0"))
 * 
* * Output: * *
 * <beforeData SEXP>(<afterStepIn SEXP>
 *     <beforeData SYMBOL>where<afterData SYMBOL><beforeSeparator SEXP> <afterSeparator SEXP>
 *     <beforeData SEXP>(<afterStepIn SEXP>
 *         <beforeData SYMBOL>field<afterData SYMBOL><beforeSeparator SEXP> <afterSeparator SEXP>
 *         <beforeData SEXP>(<afterStepIn SEXP>
 *             <beforeData SYMBOL>this<afterData SYMBOL>
 *         <beforeStepOut SEXP>)<afterData SEXP><beforeSeparator SEXP> <afterSeparator SEXP>
 *         <beforeData SYMBOL>result<afterData SYMBOL>
 *     <beforeStepOut SEXP>)<afterData SEXP><beforeSeparator SEXP> <afterSeparator SEXP>
 *     <beforeData SEXP>(<afterStepIn SEXP>
 *         <beforeData SYMBOL>==<afterData SYMBOL><beforeSeparator SEXP> <afterSeparator SEXP>
 *         <beforeData SEXP>(<afterStepIn SEXP>
 *             <beforeData SYMBOL>field<afterData SYMBOL><beforeSeparator SEXP> <afterSeparator SEXP>
 *             <beforeData SEXP>(<afterStepIn SEXP>
 *                 <beforeData SYMBOL>curr<afterData SYMBOL>
 *             <beforeStepOut SEXP>)<afterData SEXP><beforeSeparator SEXP> <afterSeparator SEXP>
 *             <beforeData SYMBOL>majorVersionString<afterData SYMBOL>
 *         <beforeStepOut SEXP>)<afterData SEXP><beforeSeparator SEXP> <afterSeparator SEXP>
 *         <beforeData STRING>"1.0"<afterData STRING>
 *     <beforeStepOut SEXP>)<afterData SEXP>
 * <beforeStepOut SEXP>)<afterData SEXP>
 * 
* *

*

* Input: * *

 * 1 5 "Cheesecake" 3.2 true null 'baby tigers' 47e1
 * 
* * Output: * *
 * <beforeData INT>1<afterData INT><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData INT>5<afterData INT><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData STRING>"Cheesecake"<afterData STRING><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData DECIMAL>3.2<afterData DECIMAL><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData BOOL>true<afterData BOOL><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData NULL>null<afterData NULL><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData SYMBOL>'baby tigers'<afterData SYMBOL><beforeSeparator DATAGRAM> <afterSeparator DATAGRAM>
 * <beforeData FLOAT>470.0e0<afterData FLOAT>
 * 
* *

*

* Input: * *

 * [true, 3.4, 3d6, 2.3e8, "string", '''multi-''' '''string''',Symbol, 'qSymbol',
 *     {{"clob data"}}, {{YmxvYiBkYXRh}}, 1970-06-06, null.struct]
 * 
* * Output: * *
 * <beforeData LIST>[<afterStepIn LIST>
 *     <beforeData BOOL>true<afterData BOOL><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData DECIMAL>3.4<afterData DECIMAL><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData DECIMAL>3d6<afterData DECIMAL><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData FLOAT>2.3E8<afterData FLOAT><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData STRING>"string"<afterData STRING><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData STRING>"multi-string"<afterData STRING><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData SYMBOL>Symbol<afterData SYMBOL><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData SYMBOL>qSymbol<afterData SYMBOL><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData CLOB>{{"clob data"}}<afterData CLOB><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData BLOB>{{YmxvYiBkYXRh}}<afterData BLOB><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData TIMESTAMP>1970-06-06<afterData TIMESTAMP><beforeSeparator LIST>,<afterSeparator LIST>
 *     <beforeData NULL>null.struct<afterData NULL>
 * <beforeStepOut LIST>]<afterData LIST>
 * 
*/ public abstract class _Private_MarkupCallback { private final _Private_FastAppendable myAppendable; public _Private_MarkupCallback(_Private_FastAppendable appendable) { this.myAppendable = appendable; } /** * Gets the {@link _Private_FastAppendable} that IonWriter will use to write its * output. */ public final _Private_FastAppendable getAppendable() { return myAppendable; } /** * Callback to be executed before an Ion value is written. If iType is a * container type, this is executed before the container's opening * delimiter. To write data after the opening delimiter use * {@link #afterStepIn(IonType)}. * @param iType * The type of data that will be written. */ public void beforeValue(IonType iType) throws IOException { } /** * Callback to be executed after an Ion value is written. If iType is a * container type, this is executed after the container's closing delimiter. * To write data before the closing delimiter, use * {@link #beforeStepOut(IonType)}. * @param iType * The type of data that was written. */ public void afterValue(IonType iType) throws IOException { } /** * Callback to be executed before a field name is written. * @param iType * The type of data in the field name's corresponding value. * @param name * The field name that is being written. */ public void beforeFieldName(IonType iType, SymbolToken name) throws IOException { } /** * Callback to be executed after a field name is written. * @param iType * The type of data in the field name's corresponding value. * @param name * The field name that is being written. */ public void afterFieldName(IonType iType, SymbolToken name) throws IOException { } /** * Callback to be executed after the opening delimiter of a container is * written. To write data before the opening delimiter, use * {@link #beforeValue(IonType)}. * @param containerType * The type of container that was just stepped into. */ public void afterStepIn(IonType containerType) throws IOException { } /** * Callback to be executed before the closing delimiter of a container is * written. To write data after the closing delimiter, use * {@link #afterValue(IonType)}. * @param containerType * The type of container that is about to be stepped out of. */ public void beforeStepOut(IonType containerType) throws IOException { } /** * Callback to be executed before a separator is written. Called after the * data has been written, and before the separator. It is called when inside * all container types, including Sexp, and when not inside a container. It * is not called after the last element in a container. * @param containerType * The type of container the writer is currently in. When writing * top-level values, the type is DATAGRAM. */ public void beforeSeparator(IonType containerType) throws IOException { } /** * Callback to be executed after a separator has been written. Called just * after the separator is written. It is called when inside all container * types, including Sexp, and when not inside a container. It is not called * after the last element in a container. * @param containerType * The type of container the writer is currently in. When writing * top-level values, the type is DATAGRAM. */ public void afterSeparator(IonType containerType) throws IOException { } /** * Callback to be executed before annotations are written. It is executed * once per set of annotations. * @param iType * The type of the data whose annotations are being written. */ public void beforeAnnotations(IonType iType) throws IOException { } /** * Callback to be executed after annotations are written. It is executed * once per set of annotations. * @param iType * The type of the data whose annotations are being written. */ public void afterAnnotations(IonType iType) throws IOException { } /** * Callback to be executed before each annotation is written. It is executed * once per annotation. * @param iType * The type of the data whose annotation is being written. * @param annotation * The annotation that is being written. */ public void beforeEachAnnotation(IonType iType, SymbolToken annotation) throws IOException { } /** * Callback to be executed after each annotation is written. It is executed * once per annotation, before the delimiter. * @param iType * The type of the data whose annotation is being written. * @param annotation * The annotation that is being written. */ public void afterEachAnnotation(IonType iType, SymbolToken annotation) throws IOException { } }




© 2015 - 2024 Weber Informatics LLC | Privacy Policy