/*
* Copyright (c) 2016 Couchbase, Inc.
*
* 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 com.couchbase.client.core.endpoint.util;
/**
* Base class for {@link io.netty.buffer.ByteBufProcessor} that need to take JSON string escaping
* into account, through the {@link #isEscaped(byte)} method.
*
* @author Simon Baslé
* @since 1.3
*/
public abstract class AbstractStringAwareBufProcessor {
/**
* Boolean to indicate we are reading escaped character
*/
private boolean escapedInString = false;
/** flag to indicate that we are currently reading a JSON string */
private boolean inString = false;
/**
* Detects opening and closing of JSON strings and keep track of it in order
* to mark characters in the string (delimiter quotes included) as escaped.
*
* Quotes escaped by a \ are correctly detected and do not mark a closing of
* a JSON string.
*
* @param nextByte the next byte to inspect.
* @return true if the byte should be ignored as part of a JSON string, false otherwise.
*/
protected boolean isEscaped(byte nextByte) {
boolean result = false;
if (inString) {
if (nextByte == '\"' && !escapedInString) {
inString = false;
}
if (nextByte == '\\' && !escapedInString) {
escapedInString = true;
} else if (escapedInString) {
escapedInString = false;
}
result = true;
} else {
if (nextByte == '\"') {
inString = true;
result = true;
}
}
return result;
}
}