blob: 5b09927380c8ac9a4103f6530bcff65fcadc13d5 [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.
*/
#include "../begin_native.hpp"
#include <PdxTypes.hpp>
#include "../end_native.hpp"
#include "PdxInstanceFactoryImpl.hpp"
#include "PdxInstanceImpl.hpp"
#include "DotNetTypes.hpp"
using namespace System::Text;
namespace Apache
{
namespace Geode
{
namespace Client
{
namespace Internal
{
namespace native = apache::geode::client;
PdxInstanceFactoryImpl::PdxInstanceFactoryImpl(String^ className, Cache^ cache)
{
if (className == nullptr)
throw gcnew IllegalStateException(
"Classname should not be null.");
m_pdxType = gcnew PdxType(className, false);
m_FieldVsValues = gcnew Dictionary<String^, Object^>();
m_created = false;
m_cache = cache;
}
IPdxInstance^ PdxInstanceFactoryImpl::Create()
{
if (m_created)
{
throw gcnew IllegalStateException(
"The IPdxInstanceFactory.Create() method can only be called once.");
}
//need to get typeid;
IPdxInstance^ pi = gcnew PdxInstanceImpl(m_FieldVsValues, m_pdxType, m_cache);
m_created = true;
return pi;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteChar(String^ fieldName, Char value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "char", PdxFieldTypes::CHAR, native::PdxTypes::CHAR_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteBoolean(String^ fieldName, Boolean value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "boolean", PdxFieldTypes::BOOLEAN, native::PdxTypes::BOOLEAN_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteByte(String^ fieldName, SByte value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "byte", PdxFieldTypes::BYTE, native::PdxTypes::BYTE_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteShort(String^ fieldName, Int16 value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "short", PdxFieldTypes::SHORT, native::PdxTypes::SHORT_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteInt(String^ fieldName, Int32 value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "int", PdxFieldTypes::INT, native::PdxTypes::INTEGER_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteLong(String^ fieldName, Int64 value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "long", PdxFieldTypes::LONG, native::PdxTypes::LONG_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteFloat(String^ fieldName, float value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "float", PdxFieldTypes::FLOAT, native::PdxTypes::FLOAT_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteDouble(String^ fieldName, double value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "double", PdxFieldTypes::DOUBLE, native::PdxTypes::DOUBLE_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteDate(String^ fieldName, System::DateTime value)
{
isFieldAdded(fieldName);
m_pdxType->AddFixedLengthTypeField(fieldName, "Date", PdxFieldTypes::DATE, native::PdxTypes::DATE_SIZE);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteString(String^ fieldName, String^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "String", PdxFieldTypes::STRING);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteObject(String^ fieldName, Object^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, /*obj->GetType()->FullName*/"Object", PdxFieldTypes::OBJECT);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteBooleanArray(String^ fieldName, array<Boolean>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "bool[]", PdxFieldTypes::BOOLEAN_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteCharArray(String^ fieldName, array<Char>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "char[]", PdxFieldTypes::CHAR_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteByteArray(String^ fieldName, array<Byte>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "byte[]", PdxFieldTypes::BYTE_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteShortArray(String^ fieldName, array<Int16>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "short[]", PdxFieldTypes::SHORT_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteIntArray(String^ fieldName, array<Int32>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "int[]", PdxFieldTypes::INT_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteLongArray(String^ fieldName, array<Int64>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "long[]", PdxFieldTypes::LONG_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteFloatArray(String^ fieldName, array<float>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "float[]", PdxFieldTypes::FLOAT_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteDoubleArray(String^ fieldName, array<double>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "double[]", PdxFieldTypes::DOUBLE_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteStringArray(String^ fieldName, array<String^>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "String[]", PdxFieldTypes::STRING_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteObjectArray(String^ fieldName, System::Collections::Generic::List<Object^>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "Object[]", PdxFieldTypes::OBJECT_ARRAY);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteArrayOfByteArrays(String^ fieldName, array<array<Byte>^>^ value)
{
isFieldAdded(fieldName);
m_pdxType->AddVariableLengthTypeField(fieldName, "byte[][]", PdxFieldTypes::ARRAY_OF_BYTE_ARRAYS);
m_FieldVsValues->Add(fieldName, value);
return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::WriteField(String^ fieldName, Object^ fieldValue, Type^ type)
{
isFieldAdded(fieldName);
if (type->Equals(DotNetTypes::IntType))
{
return this->WriteInt(fieldName, (int)fieldValue);
}
else if (type->Equals(DotNetTypes::StringType))
{
return this->WriteString(fieldName, (String^)fieldValue);
}
else if (type->Equals(DotNetTypes::BooleanType))
{
return this->WriteBoolean(fieldName, (bool)fieldValue);
}
else if (type->Equals(DotNetTypes::FloatType))
{
return this->WriteFloat(fieldName, (float)fieldValue);
}
else if (type->Equals(DotNetTypes::DoubleType))
{
return this->WriteDouble(fieldName, (double)fieldValue);
}
else if (type->Equals(DotNetTypes::CharType))
{
return this->WriteChar(fieldName, (Char)fieldValue);
}
else if (type->Equals(DotNetTypes::SByteType))
{
return this->WriteByte(fieldName, (SByte)fieldValue);
}
else if (type->Equals(DotNetTypes::ShortType))
{
return this->WriteShort(fieldName, (short)fieldValue);
}
else if (type->Equals(DotNetTypes::LongType))
{
return this->WriteLong(fieldName, (Int64)fieldValue);
}
else if (type->Equals(DotNetTypes::ByteArrayType))
{
return this->WriteByteArray(fieldName, (array<Byte>^)fieldValue);
}
else if (type->Equals(DotNetTypes::DoubleArrayType))
{
return this->WriteDoubleArray(fieldName, (array<double>^)fieldValue);
}
else if (type->Equals(DotNetTypes::FloatArrayType))
{
return this->WriteFloatArray(fieldName, (array<float>^)fieldValue);
}
else if (type->Equals(DotNetTypes::ShortArrayType))
{
return this->WriteShortArray(fieldName, (array<Int16>^)fieldValue);
}
else if (type->Equals(DotNetTypes::IntArrayType))
{
return this->WriteIntArray(fieldName, (array<System::Int32>^)fieldValue);
}
else if (type->Equals(DotNetTypes::LongArrayType))
{
return this->WriteLongArray(fieldName, (array<Int64>^)fieldValue);
}
else if (type->Equals(DotNetTypes::BoolArrayType))
{
return this->WriteBooleanArray(fieldName, (array<bool>^)fieldValue);
}
else if (type->Equals(DotNetTypes::CharArrayType))
{
return this->WriteCharArray(fieldName, (array<Char>^)fieldValue);
}
else if (type->Equals(DotNetTypes::StringArrayType))
{
return this->WriteStringArray(fieldName, (array<String^>^)fieldValue);
}
else if (type->Equals(DotNetTypes::DateType))
{
return this->WriteDate(fieldName, (DateTime)fieldValue);
}
else if (type->Equals(DotNetTypes::ByteArrayOfArrayType))
{
return this->WriteArrayOfByteArrays(fieldName, (array<array<Byte>^>^)fieldValue);
}
else if (type->Equals(DotNetTypes::ObjectArrayType))
{
return this->WriteObjectArray(fieldName, safe_cast<System::Collections::Generic::List<Object^>^>(fieldValue));
}
else
{
return this->WriteObject(fieldName, fieldValue);
//throw gcnew IllegalStateException("WriteField unable to serialize "
// + fieldName + " of " + type);
}
// return this;
}
IPdxInstanceFactory^ PdxInstanceFactoryImpl::MarkIdentityField(String^ fieldName)
{
PdxFieldType^ pft = m_pdxType->GetPdxField(fieldName);
if (pft == nullptr)
{
throw gcnew IllegalStateException(
"Field must be added before calling MarkIdentityField ");
}
pft->IdentityField = true;
return this;
}
void PdxInstanceFactoryImpl::isFieldAdded(String^ fieldName)
{
if (fieldName == nullptr || fieldName->Length == 0 || m_FieldVsValues->ContainsKey(fieldName))
{
throw gcnew IllegalStateException(
"Field: " + fieldName + " either already added into PdxInstanceFactory or it is null");
} // namespace Client
} // namespace Geode
} // namespace Apache
}
}
}