blob: 864f3deffdf097d64dba08530e7aff95be065415 [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.
*/
#pragma once
#include "PdxFieldType.hpp"
using namespace System;
using namespace System::Collections::Generic;
namespace Apache
{
namespace Geode
{
namespace Client
{
ref class DataOutput;
ref class DataInput;
namespace Internal
{
private ref class PdxType : public IDataSerializableInternal
{
private:
Object^ m_lockObj;
static const String^ m_javaPdxClass = "org.apache.geode.pdx.internal.PdxType";
IList<PdxFieldType^>^ m_pdxFieldTypes;
IList<PdxType^>^ m_otherVersions;
Int32 m_cachedHashcode;
//Type^ m_pdxDomainType;
String^ m_className;
Int32 m_geodeTypeId;
bool m_isLocal;
Int32 m_numberOfVarLenFields;
Int32 m_varLenFieldIdx;
Int32 m_numberOfFieldsExtra;
array<Int32>^ m_remoteToLocalFieldMap;
array<Int32>^ m_localToRemoteFieldMap;
array<Int32, 2>^ m_positionMap;
IDictionary<String^, PdxFieldType^>^ m_fieldNameVsPdxType;
bool m_isVarLenFieldAdded;
bool m_noJavaClass;
void initRemoteToLocal(Cache^ cache);
void initLocalToRemote(Cache^ cache);
//first has more fields than second
PdxType^ isContains(PdxType^ first, PdxType^ second);
PdxType^ clone();
void generatePositionMap();
Int32 variableLengthFieldPosition(PdxFieldType^ varLenField, System::Byte* offsetPosition, Int32 offsetSize, Int32 pdxStreamlen);
Int32 fixedLengthFieldPosition(PdxFieldType^ fixLenField, System::Byte* offsetPosition, Int32 offsetSize, Int32 pdxStreamlen);
PdxType^ isLocalTypeContains(PdxType^ otherType);
PdxType^ isRemoteTypeContains(PdxType^ localType);
public:
PdxType()
{
m_cachedHashcode = 0;
m_lockObj = gcnew Object();
m_pdxFieldTypes = gcnew List<PdxFieldType^>();
m_otherVersions = gcnew List<PdxType^>();
m_isLocal = false;
m_numberOfVarLenFields = 0;
m_varLenFieldIdx = 0;//start with 0
m_isVarLenFieldAdded = false;
m_fieldNameVsPdxType = gcnew Dictionary<String^, PdxFieldType^>();
m_noJavaClass = false;
m_geodeTypeId = 0;
// m_pdxDomainType = nullptr;
}
PdxType(String^ pdxDomainClassName,
bool isLocal)
{
m_cachedHashcode = 0;
m_lockObj = gcnew Object();
m_pdxFieldTypes = gcnew List<PdxFieldType^>();
m_otherVersions = gcnew List<PdxType^>();
// m_className = className;
// m_pdxDomainType = pdxDomainType;
m_className = pdxDomainClassName;
m_isLocal = isLocal;
m_numberOfVarLenFields = 0;
m_varLenFieldIdx = 0;//start with 0
m_isVarLenFieldAdded = false;
m_fieldNameVsPdxType = gcnew Dictionary<String^, PdxFieldType^>();
m_noJavaClass = false;
m_geodeTypeId = 0;
}
static ISerializable^ CreateDeserializable()
{
return gcnew PdxType();
}
property Int32 TotalVarLenFields
{
Int32 get() { return m_numberOfVarLenFields; };
}
property Int32 Totalfields
{
Int32 get() { return m_pdxFieldTypes->Count; };
}
property IList<PdxFieldType^>^ PdxFieldList
{
IList<PdxFieldType^>^ get(){ return m_pdxFieldTypes; }
}
property Int32 TypeId
{
Int32 get() { return m_geodeTypeId; }
void set(Int32 value) { m_geodeTypeId = value; }
}
/* property Type^ PdxDomainType
{
Type^ get() {return m_pdxDomainType;}
void set(Type^ type) {m_pdxDomainType = type;}
}*/
property String^ PdxClassName
{
String^ get() { return m_className; }
void set(String^ className) { m_className = className; }
}
property Int32 NumberOfFieldsExtra
{
Int32 get(){ return m_numberOfFieldsExtra; }
}
PdxFieldType^ GetPdxField(String^ fieldName)
{
PdxFieldType^ retVal = nullptr;
m_fieldNameVsPdxType->TryGetValue(fieldName, retVal);
return retVal;
}
void AddOtherVersion(PdxType^ otherVersion)
{
m_otherVersions->Add(otherVersion);
}
array<int>^ GetLocalToRemoteMap(Cache^ cache);
array<int>^ GetRemoteToLocalMap(Cache^ cache);
property Int32 NumberOfVarLenFields
{
Int32 get(){ return m_numberOfVarLenFields; }
}
property bool IsLocal
{
bool get() { return m_isLocal; }
void set(bool val) { m_isLocal = val; }
}
virtual void ToData(DataOutput^ output);
virtual void FromData(DataInput^ input);
virtual property System::UInt64 ObjectSize
{
System::UInt64 get(){ return 0; }
}
virtual String^ ToString() override
{
return "PdxType";
}
void AddFixedLengthTypeField(String^ fieldName, String^ className, PdxFieldTypes typeId, Int32 size);
void AddVariableLengthTypeField(String^ fieldName, String^ className, PdxFieldTypes typeId);
void InitializeType(Cache^ cache);
PdxType^ MergeVersion(PdxType^ otherVersion);
Int32 GetFieldPosition(String^ fieldName, System::Byte* offsetPosition, Int32 offsetSize, Int32 pdxStreamlen);
Int32 GetFieldPosition(Int32 fieldIdx, System::Byte* offsetPosition, Int32 offsetSize, Int32 pdxStreamlen);
virtual bool Equals(Object^ otherType) override;
virtual Int32 GetHashCode() override;
};
} // namespace Client
} // namespace Geode
} // namespace Apache
}