blob: f5add855dd2f4a51b375058c1cdd6c55df84bf16 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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.
*/
/*
* PdxWriterWithTypeCollector.cpp
*
* Created on: Nov 3, 2011
* Author: npatel
*/
#include "PdxWriterWithTypeCollector.hpp"
#include <geode/PdxFieldTypes.hpp>
#include "PdxHelper.hpp"
#include "PdxType.hpp"
#include "PdxTypes.hpp"
namespace apache {
namespace geode {
namespace client {
PdxWriterWithTypeCollector::PdxWriterWithTypeCollector(
DataOutput& output, std::string domainClassName,
std::shared_ptr<PdxTypeRegistry> pdxTypeRegistry)
: PdxLocalWriter(output, nullptr, pdxTypeRegistry) {
m_domainClassName = domainClassName;
initialize();
}
void PdxWriterWithTypeCollector::initialize() {
m_pdxType =
std::make_shared<PdxType>(*m_pdxTypeRegistry, m_domainClassName, true);
}
void PdxWriterWithTypeCollector::endObjectWriting() {
// Write header for PDX
PdxLocalWriter::writePdxHeader();
}
void PdxWriterWithTypeCollector::writeOffsets(int32_t len) {
if (len <= 0xff) {
for (int i = static_cast<int>(m_offsets.size()) - 1; i > 0; i--) {
m_dataOutput->write(static_cast<uint8_t>(m_offsets[i]));
}
} else if (len <= 0xffff) {
for (int i = static_cast<int>(m_offsets.size()) - 1; i > 0; i--) {
m_dataOutput->writeInt(static_cast<uint16_t>(m_offsets[i]));
}
} else {
for (int i = static_cast<int>(m_offsets.size()) - 1; i > 0; i--) {
m_dataOutput->writeInt(static_cast<uint32_t>(m_offsets[i]));
}
}
}
int32_t PdxWriterWithTypeCollector::calculateLenWithOffsets() {
int bufferLen = static_cast<int32_t>(m_dataOutput->getBufferLength()) -
m_startPositionOffset;
int32_t totalOffsets = 0;
if (m_offsets.size() > 0) {
totalOffsets = static_cast<int32_t>(m_offsets.size()) -
1; // for first var len no need to append offset
}
int32_t totalLen = bufferLen - PdxHelper::PdxHeader + totalOffsets;
if (totalLen <= 0xff) {
return totalLen;
} else if (totalLen + totalOffsets <= 0xffff) {
return totalLen + totalOffsets;
} else {
return totalLen + totalOffsets * 3;
}
}
void PdxWriterWithTypeCollector::addOffset() {
int bufferLen = static_cast<int32_t>(m_dataOutput->getBufferLength()) -
m_startPositionOffset;
int offset = bufferLen - PdxHelper::PdxHeader;
m_offsets.push_back(offset);
}
bool PdxWriterWithTypeCollector::isFieldWritingStarted() {
return m_pdxType->getTotalFields() > 0;
}
PdxWriter& PdxWriterWithTypeCollector::writeUnreadFields(
std::shared_ptr<PdxUnreadFields> unread) {
PdxLocalWriter::writeUnreadFields(unread);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeChar(const std::string& fieldName,
char16_t value) {
m_pdxType->addFixedLengthTypeField(fieldName, "char", PdxFieldTypes::CHAR,
PdxTypes::CHAR_SIZE);
PdxLocalWriter::writeChar(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeBoolean(
const std::string& fieldName, bool value) {
m_pdxType->addFixedLengthTypeField(
fieldName, "boolean", PdxFieldTypes::BOOLEAN, PdxTypes::BOOLEAN_SIZE);
PdxLocalWriter::writeBoolean(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeByte(const std::string& fieldName,
int8_t value) {
m_pdxType->addFixedLengthTypeField(fieldName, "byte", PdxFieldTypes::BYTE,
PdxTypes::BYTE_SIZE);
PdxLocalWriter::writeByte(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeShort(const std::string& fieldName,
int16_t value) {
m_pdxType->addFixedLengthTypeField(fieldName, "short", PdxFieldTypes::SHORT,
PdxTypes::SHORT_SIZE);
PdxLocalWriter::writeShort(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeInt(const std::string& fieldName,
int32_t value) {
m_pdxType->addFixedLengthTypeField(fieldName, "int", PdxFieldTypes::INT,
PdxTypes::INTEGER_SIZE);
PdxLocalWriter::writeInt(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeLong(const std::string& fieldName,
int64_t value) {
m_pdxType->addFixedLengthTypeField(fieldName, "long", PdxFieldTypes::LONG,
PdxTypes::LONG_SIZE);
PdxLocalWriter::writeLong(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeFloat(const std::string& fieldName,
float value) {
m_pdxType->addFixedLengthTypeField(fieldName, "float", PdxFieldTypes::FLOAT,
PdxTypes::FLOAT_SIZE);
PdxLocalWriter::writeFloat(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeDouble(const std::string& fieldName,
double value) {
m_pdxType->addFixedLengthTypeField(fieldName, "double", PdxFieldTypes::DOUBLE,
PdxTypes::DOUBLE_SIZE);
PdxLocalWriter::writeDouble(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeDate(
const std::string& fieldName, std::shared_ptr<CacheableDate> date) {
m_pdxType->addFixedLengthTypeField(fieldName, "Date", PdxFieldTypes::DATE,
PdxTypes::DATE_SIZE);
PdxLocalWriter::writeDate(fieldName, date);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeString(const std::string& fieldName,
const std::string& value) {
m_pdxType->addVariableLengthTypeField(fieldName, "String",
PdxFieldTypes::STRING);
PdxLocalWriter::writeString(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeObject(
const std::string& fieldName, std::shared_ptr<Serializable> value) {
m_pdxType->addVariableLengthTypeField(fieldName, "Serializable",
PdxFieldTypes::OBJECT);
PdxLocalWriter::writeObject(fieldName, value);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeBooleanArray(
const std::string& fieldName, const std::vector<bool>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "bool[]",
PdxFieldTypes::BOOLEAN_ARRAY);
PdxLocalWriter::writeBooleanArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeCharArray(
const std::string& fieldName, const std::vector<char16_t>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "char[]",
PdxFieldTypes::CHAR_ARRAY);
PdxLocalWriter::writeCharArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeByteArray(
const std::string& fieldName, const std::vector<int8_t>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "byte[]",
PdxFieldTypes::BYTE_ARRAY);
PdxLocalWriter::writeByteArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeShortArray(
const std::string& fieldName, const std::vector<int16_t>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "short[]",
PdxFieldTypes::SHORT_ARRAY);
PdxLocalWriter::writeShortArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeIntArray(
const std::string& fieldName, const std::vector<int32_t>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "int[]",
PdxFieldTypes::INT_ARRAY);
PdxLocalWriter::writeIntArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeLongArray(
const std::string& fieldName, const std::vector<int64_t>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "long[]",
PdxFieldTypes::LONG_ARRAY);
PdxLocalWriter::writeLongArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeFloatArray(
const std::string& fieldName, const std::vector<float>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "float[]",
PdxFieldTypes::FLOAT_ARRAY);
PdxLocalWriter::writeFloatArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeDoubleArray(
const std::string& fieldName, const std::vector<double>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "double[]",
PdxFieldTypes::DOUBLE_ARRAY);
PdxLocalWriter::writeDoubleArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeStringArray(
const std::string& fieldName, const std::vector<std::string>& array) {
m_pdxType->addVariableLengthTypeField(fieldName, "String[]",
PdxFieldTypes::STRING_ARRAY);
PdxLocalWriter::writeStringArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeObjectArray(
const std::string& fieldName, std::shared_ptr<CacheableObjectArray> array) {
m_pdxType->addVariableLengthTypeField(fieldName, "Object[]",
PdxFieldTypes::OBJECT_ARRAY);
PdxLocalWriter::writeObjectArray(fieldName, array);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::writeArrayOfByteArrays(
const std::string& fieldName, int8_t* const* const byteArrays,
int arrayLength, const int* elementLength) {
m_pdxType->addVariableLengthTypeField(fieldName, "byte[][]",
PdxFieldTypes::ARRAY_OF_BYTE_ARRAYS);
PdxLocalWriter::writeArrayOfByteArrays(fieldName, byteArrays, arrayLength,
elementLength);
return *this;
}
PdxWriter& PdxWriterWithTypeCollector::markIdentityField(
const std::string& fieldName) {
auto pft = m_pdxType->getPdxField(fieldName);
if (pft == nullptr) {
throw IllegalStateException(
"Field, must be written to PdxWriter before calling "
"MarkIdentityField ");
}
pft->setIdentityField(true);
return *this;
}
} // namespace client
} // namespace geode
} // namespace apache